MusicManager.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using MediaBrowser.Controller.Entities;
  2. using MediaBrowser.Controller.Entities.Audio;
  3. using MediaBrowser.Controller.Library;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. namespace MediaBrowser.Server.Implementations.Library
  8. {
  9. public class MusicManager : IMusicManager
  10. {
  11. private readonly ILibraryManager _libraryManager;
  12. public MusicManager(ILibraryManager libraryManager)
  13. {
  14. _libraryManager = libraryManager;
  15. }
  16. public IEnumerable<Audio> GetInstantMixFromSong(Audio item, User user)
  17. {
  18. var list = new List<Audio>
  19. {
  20. item
  21. };
  22. return list.Concat(GetInstantMixFromGenres(item.Genres, user));
  23. }
  24. public IEnumerable<Audio> GetInstantMixFromArtist(string name, User user)
  25. {
  26. var artist = _libraryManager.GetArtist(name);
  27. var genres = user.RootFolder
  28. .GetRecursiveChildren(user)
  29. .OfType<Audio>()
  30. .Where(i => i.HasArtist(name))
  31. .SelectMany(i => i.Genres)
  32. .Concat(artist.Genres)
  33. .Distinct(StringComparer.OrdinalIgnoreCase);
  34. return GetInstantMixFromGenres(genres, user);
  35. }
  36. public IEnumerable<Audio> GetInstantMixFromAlbum(MusicAlbum item, User user)
  37. {
  38. var genres = item
  39. .GetRecursiveChildren(user, true)
  40. .OfType<Audio>()
  41. .SelectMany(i => i.Genres)
  42. .Concat(item.Genres)
  43. .Distinct(StringComparer.OrdinalIgnoreCase);
  44. return GetInstantMixFromGenres(genres, user);
  45. }
  46. public IEnumerable<Audio> GetInstantMixFromGenres(IEnumerable<string> genres, User user)
  47. {
  48. var inputItems = user.RootFolder.GetRecursiveChildren(user);
  49. var genresDictionary = genres.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase);
  50. return inputItems
  51. .OfType<Audio>()
  52. .Select(i => new Tuple<Audio, int>(i, i.Genres.Count(genresDictionary.ContainsKey)))
  53. .Where(i => i.Item2 > 0)
  54. .OrderByDescending(i => i.Item2)
  55. .ThenBy(i => Guid.NewGuid())
  56. .Select(i => i.Item1)
  57. .Take(100)
  58. .OrderBy(i => Guid.NewGuid());
  59. }
  60. }
  61. }