Esempio n. 1
0
        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;
        }
Esempio n. 2
0
        private async Task<PlaylistViewModel> CreateNewSmartPlaylistAsync(EditablePlaylistViewModel editablePlaylist)
        {
            if (editablePlaylist == null)
            {
                LogClient.Error($"{nameof(editablePlaylist)} is null");
                return null;
            }

            if (string.IsNullOrEmpty(editablePlaylist.Path))
            {
                LogClient.Error($"{nameof(editablePlaylist.Path)} is null or empty");
                return null;
            }

            try
            {
                await Task.Run(() =>
                {
                    var decoder = new SmartPlaylistDecoder();
                    XDocument smartPlaylistDocument = decoder.EncodeSmartPlaylist(
                        editablePlaylist.PlaylistName,
                        editablePlaylist.MatchAnyRule,
                        editablePlaylist.Limit.ToSmartPlaylistLimit(),
                        editablePlaylist.Rules.Select(x => x.ToSmartPlaylistRule()).ToList());
                    smartPlaylistDocument.Save(editablePlaylist.Path);
                });
            }
            catch (Exception ex)
            {
                LogClient.Error($"Could not create playlist '{editablePlaylist.PlaylistName}' with filename '{editablePlaylist.Path}'. Exception: {ex.Message}");
                return null;
            }

            return new PlaylistViewModel(editablePlaylist.PlaylistName, editablePlaylist.Path, PlaylistType.Smart);
        }
Esempio n. 3
0
        private string GetSmartPlaylistName(string smartPlaylistPath)
        {
            var decoder = new SmartPlaylistDecoder();
            DecodeSmartPlaylistResult result = decoder.DecodePlaylist(smartPlaylistPath);

            return result.DecodeResult.Result ? result.PlaylistName : string.Empty;
        }
Esempio n. 4
0
        private async Task <IList <TrackViewModel> > GetSmartPlaylistTracksAsync(PlaylistViewModel playlist)
        {
            string whereClause = string.Empty;

            await Task.Run(() =>
            {
                var decoder = new SmartPlaylistDecoder();
                DecodeSmartPlaylistResult result = decoder.DecodePlaylist(playlist.Path);

                string sqlWhereOperator = decoder.GetWhereOperator(result.Match);
                string sqlLimit         = decoder.GetLimit(result.Limit);
                string sqlOrder         = decoder.GetOrder(result.Order);

                IList <string> whereClauseParts = new List <string>();

                foreach (Rule rule in result.Rules)
                {
                    string whereClausePart = decoder.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);
        }
Esempio n. 5
0
        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;
        }