MusicManager.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. return GetInstantMixFromGenres(item.Genres, user);
  19. }
  20. public IEnumerable<Audio> GetInstantMixFromArtist(string name, User user)
  21. {
  22. var artist = _libraryManager.GetArtist(name);
  23. var genres = _libraryManager.RootFolder
  24. .RecursiveChildren
  25. .OfType<Audio>()
  26. .Where(i => i.HasArtist(name))
  27. .SelectMany(i => i.Genres)
  28. .Concat(artist.Genres)
  29. .Distinct(StringComparer.OrdinalIgnoreCase);
  30. return GetInstantMixFromGenres(genres, user);
  31. }
  32. public IEnumerable<Audio> GetInstantMixFromAlbum(MusicAlbum item, User user)
  33. {
  34. var genres = item
  35. .RecursiveChildren
  36. .OfType<Audio>()
  37. .SelectMany(i => i.Genres)
  38. .Concat(item.Genres)
  39. .Distinct(StringComparer.OrdinalIgnoreCase);
  40. return GetInstantMixFromGenres(genres, user);
  41. }
  42. public IEnumerable<Audio> GetInstantMixFromGenres(IEnumerable<string> genres, User user)
  43. {
  44. var inputItems = user.RootFolder.GetRecursiveChildren(user);
  45. var genresDictionary = genres.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase);
  46. return inputItems
  47. .OfType<Audio>()
  48. .Select(i => new Tuple<Audio, int>(i, i.Genres.Count(genresDictionary.ContainsKey)))
  49. .OrderByDescending(i => i.Item2)
  50. .ThenBy(i => Guid.NewGuid())
  51. .Select(i => i.Item1)
  52. .Take(100)
  53. .OrderBy(i => Guid.NewGuid());
  54. }
  55. }
  56. }