MusicManager.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #pragma warning disable CS1591
  2. #pragma warning disable SA1600
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using MediaBrowser.Controller.Dto;
  7. using MediaBrowser.Controller.Entities;
  8. using MediaBrowser.Controller.Entities.Audio;
  9. using MediaBrowser.Controller.Library;
  10. using MediaBrowser.Controller.Playlists;
  11. using MediaBrowser.Model.Entities;
  12. using MediaBrowser.Model.Querying;
  13. namespace Emby.Server.Implementations.Library
  14. {
  15. public class MusicManager : IMusicManager
  16. {
  17. private readonly ILibraryManager _libraryManager;
  18. public MusicManager(ILibraryManager libraryManager)
  19. {
  20. _libraryManager = libraryManager;
  21. }
  22. public List<BaseItem> GetInstantMixFromSong(Audio item, User user, DtoOptions dtoOptions)
  23. {
  24. var list = new List<Audio>
  25. {
  26. item
  27. };
  28. return list.Concat(GetInstantMixFromGenres(item.Genres, user, dtoOptions)).ToList();
  29. }
  30. public List<BaseItem> GetInstantMixFromArtist(MusicArtist item, User user, DtoOptions dtoOptions)
  31. {
  32. return GetInstantMixFromGenres(item.Genres, user, dtoOptions);
  33. }
  34. public List<BaseItem> GetInstantMixFromAlbum(MusicAlbum item, User user, DtoOptions dtoOptions)
  35. {
  36. return GetInstantMixFromGenres(item.Genres, user, dtoOptions);
  37. }
  38. public List<BaseItem> GetInstantMixFromFolder(Folder item, User user, DtoOptions dtoOptions)
  39. {
  40. var genres = item
  41. .GetRecursiveChildren(user, new InternalItemsQuery(user)
  42. {
  43. IncludeItemTypes = new[] { typeof(Audio).Name },
  44. DtoOptions = dtoOptions
  45. })
  46. .Cast<Audio>()
  47. .SelectMany(i => i.Genres)
  48. .Concat(item.Genres)
  49. .DistinctNames();
  50. return GetInstantMixFromGenres(genres, user, dtoOptions);
  51. }
  52. public List<BaseItem> GetInstantMixFromPlaylist(Playlist item, User user, DtoOptions dtoOptions)
  53. {
  54. return GetInstantMixFromGenres(item.Genres, user, dtoOptions);
  55. }
  56. public List<BaseItem> GetInstantMixFromGenres(IEnumerable<string> genres, User user, DtoOptions dtoOptions)
  57. {
  58. var genreIds = genres.DistinctNames().Select(i =>
  59. {
  60. try
  61. {
  62. return _libraryManager.GetMusicGenre(i).Id;
  63. }
  64. catch
  65. {
  66. return Guid.Empty;
  67. }
  68. }).Where(i => !i.Equals(Guid.Empty)).ToArray();
  69. return GetInstantMixFromGenreIds(genreIds, user, dtoOptions);
  70. }
  71. public List<BaseItem> GetInstantMixFromGenreIds(Guid[] genreIds, User user, DtoOptions dtoOptions)
  72. {
  73. return _libraryManager.GetItemList(new InternalItemsQuery(user)
  74. {
  75. IncludeItemTypes = new[] { typeof(Audio).Name },
  76. GenreIds = genreIds.ToArray(),
  77. Limit = 200,
  78. OrderBy = new[] { (ItemSortBy.Random, SortOrder.Ascending) },
  79. DtoOptions = dtoOptions
  80. });
  81. }
  82. public List<BaseItem> GetInstantMixFromItem(BaseItem item, User user, DtoOptions dtoOptions)
  83. {
  84. var genre = item as MusicGenre;
  85. if (genre != null)
  86. {
  87. return GetInstantMixFromGenreIds(new[] { item.Id }, user, dtoOptions);
  88. }
  89. var playlist = item as Playlist;
  90. if (playlist != null)
  91. {
  92. return GetInstantMixFromPlaylist(playlist, user, dtoOptions);
  93. }
  94. var album = item as MusicAlbum;
  95. if (album != null)
  96. {
  97. return GetInstantMixFromAlbum(album, user, dtoOptions);
  98. }
  99. var artist = item as MusicArtist;
  100. if (artist != null)
  101. {
  102. return GetInstantMixFromArtist(artist, user, dtoOptions);
  103. }
  104. var song = item as Audio;
  105. if (song != null)
  106. {
  107. return GetInstantMixFromSong(song, user, dtoOptions);
  108. }
  109. var folder = item as Folder;
  110. if (folder != null)
  111. {
  112. return GetInstantMixFromFolder(folder, user, dtoOptions);
  113. }
  114. return new List<BaseItem>();
  115. }
  116. }
  117. }