public List <MusicPlaybackItem> GetHistory(int count)
        {
            if (!EnablePlaybackHistory)
            {
                return(new List <MusicPlaybackItem>());
            }

            if (_historyCache == null)
            {
                var query = context.PlaybackHistory
                            .Include(item => item.RelatedMediaFile)
                            .OrderByDescending(item => item.PlaybackTime);

                _historyCache = (count > 0 ? query.Take(count) : query)
                                .Where(x => x.RelatedMediaFile != null)
                                .Select(x => MusicPlaybackItem.CreateFromMediaFile(x.RelatedMediaFile))
                                .ToList();
            }

            if (_historyCache.Count < Math.Min(
                    count == 0 ? int.MaxValue : count,
                    context.PlaybackHistory.Count()))
            {
                _historyCache.AddRange(context.PlaybackHistory
                                       .Include(item => item.RelatedMediaFile)
                                       .OrderByDescending(item => item.PlaybackTime)
                                       .Skip(_historyCache.Count)
                                       .Where(x => x.RelatedMediaFile != null)
                                       .Select(x => MusicPlaybackItem.CreateFromMediaFile(x.RelatedMediaFile)));
            }


            return((count > 0 && _historyCache.Count > count ? _historyCache.Take(count) : _historyCache).ToList());
        }
示例#2
0
 public static async void Shuffle(this DbArtist artist)
 {
     if (artist?.MediaFiles != null)
     {
         var random        = new Random();
         var shuffledFiles = artist.MediaFiles
                             .OrderBy(file => random.Next())
                             .Select(file => MusicPlaybackItem.CreateFromMediaFile(file));
         PlaybackControl.Instance.Clear();
         await PlaybackControl.Instance.AddFile(shuffledFiles.ToList(), -1);
     }
 }
示例#3
0
 /// <summary>
 /// Play all songs by a specific artist.
 /// </summary>
 /// <param name="artist"></param>
 /// <param name="requireClear"></param>
 /// <param name="isInsert"></param>
 public static async void Play(this DbArtist artist, bool requireClear = false, bool isInsert = false)
 {
     if (artist?.MediaFiles != null)
     {
         var sortedFiles = artist.MediaFiles
                           .OrderBy(file => file.Title, new AlphabetAscendComparer())
                           .Select(file => MusicPlaybackItem.CreateFromMediaFile(file));
         if (requireClear)
         {
             PlaybackControl.Instance.Clear();
         }
         await PlaybackControl.Instance.AddFile(sortedFiles.ToList(), isInsert? -2 : -1);
     }
 }
示例#4
0
 /// <summary>
 /// Play an album.
 /// </summary>
 /// <param name="album"></param>
 /// <param name="requireClear"></param>
 /// <param name="isInsert"></param>
 public static async void Play(this DbAlbum album, bool requireClear = false, bool isInsert = false)
 {
     if (album?.MediaFiles != null)
     {
         var sortedFiles = album.MediaFiles
                           .OrderBy(file => ParseWithDefaultFallback(file.DiscNumber))
                           .ThenBy(file => ParseWithDefaultFallback(file.TrackNumber))
                           .Select(file => MusicPlaybackItem.CreateFromMediaFile(file));
         if (requireClear)
         {
             PlaybackControl.Instance.Clear();
         }
         await PlaybackControl.Instance.AddFile(sortedFiles.ToList(), isInsert? -2 : -1);
     }
 }
        public Task AddHistoryAsync(MusicPlaybackItem item)
        {
            if (!EnablePlaybackHistory)
            {
                // User disabled history.
                return(Task.CompletedTask);
            }

            if (LibraryService.IsIndexing)
            {
                return(Task.CompletedTask);
            }

            var file = item.File;

            if (!file.IsExternal)
            {
                var fileExist = context.MediaFiles.Any(f => f.Id == file.Id);

                if (!fileExist)
                {
                    return(Task.CompletedTask);
                }

                _historyCache.Insert(0, item);
                NewEntryAdded?.Invoke(this, item);
                return(AddHistoryInternal(new DbPlaybackHistory
                {
                    RelatedMediaFileId = file.Id,
                    PlaybackTime = DateTimeOffset.Now
                }));
            }
            else
            {
                return(Task.CompletedTask);
            }
        }