public async Task<EditablePlaylistViewModel> GetEditablePlaylistAsync(PlaylistViewModel playlistViewModel) { // Assume new playlist var editablePlaylist = new EditablePlaylistViewModel( await this.GetUniquePlaylistNameAsync(ResourceUtils.GetString("Language_New_Playlist")), PlaylistType.Static ); // Not a new playlist if (playlistViewModel != null) { editablePlaylist.Path = playlistViewModel.Path; editablePlaylist.PlaylistName = playlistViewModel.Name; editablePlaylist.Type = playlistViewModel.Type; if (playlistViewModel.Type.Equals(PlaylistType.Smart)) { await Task.Run(() => { var decoder = new SmartPlaylistDecoder(); DecodeSmartPlaylistResult result = decoder.DecodePlaylist(playlistViewModel.Path); editablePlaylist.Limit = new SmartPlaylistLimitViewModel(result.Limit.Type, result.Limit.Value); editablePlaylist.Limit.IsEnabled = result.Limit.Value > 0; editablePlaylist.SelectedLimitType = editablePlaylist.LimitTypes.Where(x => x.Type.Equals(result.Limit.Type)).FirstOrDefault(); editablePlaylist.MatchAnyRule = result.Match.Equals(SmartPlaylistDecoder.MatchAny) ? true : false; var ruleViewModels = new ObservableCollection<SmartPlaylistRuleViewModel>(); foreach (SmartPlaylistRule rule in result.Rules) { var ruleViewModel = new SmartPlaylistRuleViewModel(); ruleViewModel.SelectedField = ruleViewModel.Fields.Where(x => x.Name.Equals(rule.Field)).FirstOrDefault(); // If a invalid field was provided in the xml file, just take the first field. if (ruleViewModel.SelectedField == null) { ruleViewModel.SelectedField = ruleViewModel.Fields.First(); } ruleViewModel.SelectedOperator = ruleViewModel.Operators.Where(x => x.Name.Equals(rule.Operator)).FirstOrDefault(); // If a invalid operator was provided in the xml file, just take the first operator. if (ruleViewModel.SelectedOperator == null) { ruleViewModel.SelectedOperator = ruleViewModel.Operators.First(); } ruleViewModel.Value = rule.Value; ruleViewModels.Add(ruleViewModel); } editablePlaylist.Rules = ruleViewModels; }); } } return editablePlaylist; }
private string GetSmartPlaylistName(string smartPlaylistPath) { var decoder = new SmartPlaylistDecoder(); DecodeSmartPlaylistResult result = decoder.DecodePlaylist(smartPlaylistPath); return result.DecodeResult.Result ? result.PlaylistName : string.Empty; }
public override async Task <IList <TrackViewModel> > GetTracksAsync(PlaylistViewModel playlist) { if (playlist == null) { return(new List <TrackViewModel>()); } string whereClause = string.Empty; await Task.Run(() => { var decoder = new SmartPlaylistdecoder(); DecodeSmartPlaylistResult result = decoder.DecodePlaylist(playlist.Path); string sqlWhereOperator = this.GetWhereOperator(result.Match); string sqlLimit = this.GetLimit(result.Limit); string sqlOrder = this.GetOrder(result.Order); IList <string> whereClauseParts = new List <string>(); foreach (Rule rule in result.Rules) { string whereClausePart = this.GetWhereClausePart(rule); if (!string.IsNullOrWhiteSpace(whereClausePart)) { whereClauseParts.Add(whereClausePart); } } // TODO: orderby whereClause = string.Join($" {sqlWhereOperator} ", whereClauseParts.ToArray()); whereClause = $"({whereClause}) {sqlLimit}"; }); if (string.IsNullOrWhiteSpace(whereClause)) { return(new List <TrackViewModel>()); } var tracks = await this.trackRepository.GetTracksAsync(whereClause); IList <TrackViewModel> trackViewModels = new List <TrackViewModel>(); try { trackViewModels = await this.container.ResolveTrackViewModelsAsync(tracks); } catch (Exception ex) { LogClient.Error($"Unable to resolve TrackViewModels. Exception: {ex.Message}"); return(new List <TrackViewModel>()); } return(trackViewModels); }
private async Task<IList<TrackViewModel>> GetSmartPlaylistTracksAsync(PlaylistViewModel playlist) { string whereClause = string.Empty; SmartPlaylistLimit limit = null; await Task.Run(() => { var decoder = new SmartPlaylistDecoder(); DecodeSmartPlaylistResult result = decoder.DecodePlaylist(playlist.Path); limit = result.Limit; var builder = new SmartPlaylistWhereClauseBuilder(result); whereClause = builder.GetWhereClause(); }); if (string.IsNullOrWhiteSpace(whereClause)) { return new List<TrackViewModel>(); } IList<Track> tracks = await this.trackRepository.GetTracksAsync(whereClause); IList<TrackViewModel> trackViewModels = new List<TrackViewModel>(); try { // TODO: order by // No limit specified: add all tracks. if (limit.Value == 0) { trackViewModels = await this.container.ResolveTrackViewModelsAsync(tracks); } else { long sum = 0; // Add a subset of the tracks, depending on the limit type. switch (limit.Type) { case SmartPlaylistLimitType.Songs: trackViewModels = await this.container.ResolveTrackViewModelsAsync(tracks.Take(limit.Value).ToList()); break; case SmartPlaylistLimitType.GigaBytes: trackViewModels = await this.container.ResolveTrackViewModelsAsync(tracks.TakeWhile(x => { long temp = sum; sum += x.FileSize.HasValue ? x.FileSize.Value : 0; return temp <= limit.Value * 1024 * 1024 * 1024; }).ToList()); break; case SmartPlaylistLimitType.MegaBytes: trackViewModels = await this.container.ResolveTrackViewModelsAsync(tracks.TakeWhile(x => { long temp = sum; sum += x.FileSize.HasValue ? x.FileSize.Value : 0; return temp <= limit.Value * 1024 * 1024; }).ToList()); break; case SmartPlaylistLimitType.Minutes: trackViewModels = await this.container.ResolveTrackViewModelsAsync(tracks.TakeWhile(x => { long temp = sum; sum += x.Duration.HasValue ? x.Duration.Value : 0; return temp <= TimeSpan.FromMinutes(limit.Value).Ticks; }).ToList()); break; default: trackViewModels = await this.container.ResolveTrackViewModelsAsync(tracks); break; } } } catch (Exception ex) { LogClient.Error($"Unable to resolve TrackViewModels. Exception: {ex.Message}"); return new List<TrackViewModel>(); } return trackViewModels; }
public SmartPlaylistWhereClauseBuilder(DecodeSmartPlaylistResult result) { this.result = result; }