diff options
Diffstat (limited to 'MediaBrowser.Server.Implementations')
6 files changed, 171 insertions, 18 deletions
diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index 2e0b3cb17..02da776bd 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -8,6 +8,7 @@ using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.LiveTv; using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Session; @@ -1064,7 +1065,7 @@ namespace MediaBrowser.Server.Implementations.Dto dto.AlbumPrimaryImageTag = GetImageCacheTag(albumParent, ImageType.Primary); } - dto.MediaSources = GetMediaSources(audio); + dto.MediaSources = GetAudioMediaSources(audio); dto.MediaSourceCount = 1; } @@ -1100,7 +1101,7 @@ namespace MediaBrowser.Server.Implementations.Dto if (fields.Contains(ItemFields.MediaSources)) { - dto.MediaSources = GetMediaSources(video); + dto.MediaSources = GetVideoMediaSources(video); } if (fields.Contains(ItemFields.Chapters)) @@ -1266,9 +1267,48 @@ namespace MediaBrowser.Server.Implementations.Dto { SetBookProperties(dto, book); } + + var tvChannel = item as LiveTvChannel; + + if (tvChannel != null) + { + dto.MediaSources = GetMediaSources(tvChannel); + } + } + + public List<MediaSourceInfo> GetMediaSources(BaseItem item) + { + var video = item as Video; + + if (video != null) + { + return GetVideoMediaSources(video); + } + + var audio = item as Audio; + + if (audio != null) + { + return GetAudioMediaSources(audio); + } + + var result = new List<MediaSourceInfo> + { + new MediaSourceInfo + { + Id = item.Id.ToString("N"), + LocationType = item.LocationType, + Name = item.Name, + Path = GetMappedPath(item), + MediaStreams = _itemRepo.GetMediaStreams(new MediaStreamQuery { ItemId = item.Id }).ToList(), + RunTimeTicks = item.RunTimeTicks + } + }; + + return result; } - private List<MediaSourceInfo> GetMediaSources(Video item) + private List<MediaSourceInfo> GetVideoMediaSources(Video item) { var result = item.GetAlternateVersions().Select(GetVersionInfo).ToList(); @@ -1293,7 +1333,7 @@ namespace MediaBrowser.Server.Implementations.Dto .ToList(); } - private List<MediaSourceInfo> GetMediaSources(Audio item) + private List<MediaSourceInfo> GetAudioMediaSources(Audio item) { var result = new List<MediaSourceInfo> { diff --git a/MediaBrowser.Server.Implementations/Library/MusicManager.cs b/MediaBrowser.Server.Implementations/Library/MusicManager.cs new file mode 100644 index 000000000..9d5826454 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Library/MusicManager.cs @@ -0,0 +1,67 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Library; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MediaBrowser.Server.Implementations.Library +{ + public class MusicManager : IMusicManager + { + private readonly ILibraryManager _libraryManager; + + public MusicManager(ILibraryManager libraryManager) + { + _libraryManager = libraryManager; + } + + public IEnumerable<Audio> GetInstantMixFromSong(Audio item, User user) + { + return GetInstantMixFromGenres(item.Genres, user); + } + + public IEnumerable<Audio> GetInstantMixFromArtist(string name, User user) + { + var artist = _libraryManager.GetArtist(name); + + var genres = _libraryManager.RootFolder + .RecursiveChildren + .OfType<Audio>() + .Where(i => i.HasArtist(name)) + .SelectMany(i => i.Genres) + .Concat(artist.Genres) + .Distinct(StringComparer.OrdinalIgnoreCase); + + return GetInstantMixFromGenres(genres, user); + } + + public IEnumerable<Audio> GetInstantMixFromAlbum(MusicAlbum item, User user) + { + var genres = item + .RecursiveChildren + .OfType<Audio>() + .SelectMany(i => i.Genres) + .Concat(item.Genres) + .Distinct(StringComparer.OrdinalIgnoreCase); + + return GetInstantMixFromGenres(genres, user); + } + + public IEnumerable<Audio> GetInstantMixFromGenres(IEnumerable<string> genres, User user) + { + var inputItems = user.RootFolder.GetRecursiveChildren(user); + + var genresDictionary = genres.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase); + + return inputItems + .OfType<Audio>() + .Select(i => new Tuple<Audio, int>(i, i.Genres.Count(genresDictionary.ContainsKey))) + .OrderByDescending(i => i.Item2) + .ThenBy(i => Guid.NewGuid()) + .Select(i => i.Item1) + .Take(100) + .OrderBy(i => Guid.NewGuid()); + } + } +} diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs index 67c011a1f..b92e82385 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs @@ -34,8 +34,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio { var collectionType = args.GetCollectionType(); - if (string.Equals(collectionType, CollectionType.Music, StringComparison.OrdinalIgnoreCase) || - string.IsNullOrEmpty(collectionType)) + if (string.Equals(collectionType, CollectionType.Music, StringComparison.OrdinalIgnoreCase)) { return new Controller.Entities.Audio.Audio(); } diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs index 4e1bd860b..cf7358cce 100644 --- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs +++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs @@ -222,13 +222,11 @@ namespace MediaBrowser.Server.Implementations.LiveTv RunTimeTicks = (info.EndDate - info.StartDate).Ticks, OriginalAirDate = info.OriginalAirDate, - MediaStreams = _itemRepo.GetMediaStreams(new MediaStreamQuery - { - ItemId = recording.Id - - }).ToList() + MediaSources = _dtoService.GetMediaSources((BaseItem)recording) }; + dto.MediaStreams = dto.MediaSources.SelectMany(i => i.MediaStreams).ToList(); + if (info.Status == RecordingStatus.InProgress) { var now = DateTime.UtcNow.Ticks; @@ -317,7 +315,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv Type = info.GetClientTypeName(), Id = info.Id.ToString("N"), MediaType = info.MediaType, - ExternalId = info.ExternalId + ExternalId = info.ExternalId, + MediaSources = _dtoService.GetMediaSources(info) }; if (user != null) diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index ea7ef2ed6..115bc0136 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -141,6 +141,7 @@ <Compile Include="IO\LibraryMonitor.cs" /> <Compile Include="Library\CoreResolutionIgnoreRule.cs" /> <Compile Include="Library\LibraryManager.cs" /> + <Compile Include="Library\MusicManager.cs" /> <Compile Include="Library\Resolvers\PhotoResolver.cs" /> <Compile Include="Library\SearchEngine.cs" /> <Compile Include="Library\ResolverHelper.cs" /> diff --git a/MediaBrowser.Server.Implementations/Session/SessionManager.cs b/MediaBrowser.Server.Implementations/Session/SessionManager.cs index 4f748a6a8..00d2aa992 100644 --- a/MediaBrowser.Server.Implementations/Session/SessionManager.cs +++ b/MediaBrowser.Server.Implementations/Session/SessionManager.cs @@ -3,8 +3,6 @@ using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; -using MediaBrowser.Controller.Entities.Movies; -using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Session; @@ -43,6 +41,7 @@ namespace MediaBrowser.Server.Implementations.Session private readonly ILibraryManager _libraryManager; private readonly IUserManager _userManager; + private readonly IMusicManager _musicManager; /// <summary> /// Gets or sets the configuration manager. @@ -688,9 +687,22 @@ namespace MediaBrowser.Server.Implementations.Session var user = session.UserId.HasValue ? _userManager.GetUserById(session.UserId.Value) : null; - var items = command.ItemIds.SelectMany(i => TranslateItemForPlayback(i, user)) - .Where(i => i.LocationType != LocationType.Virtual) - .ToList(); + List<BaseItem> items; + + if (command.PlayCommand == PlayCommand.PlayInstantMix) + { + items = command.ItemIds.SelectMany(i => TranslateItemForInstantMix(i, user)) + .Where(i => i.LocationType != LocationType.Virtual) + .ToList(); + + command.PlayCommand = PlayCommand.PlayNow; + } + else + { + items = command.ItemIds.SelectMany(i => TranslateItemForPlayback(i, user)) + .Where(i => i.LocationType != LocationType.Virtual) + .ToList(); + } if (command.PlayCommand == PlayCommand.PlayShuffle) { @@ -741,7 +753,7 @@ namespace MediaBrowser.Server.Implementations.Session { var folder = (Folder)item; - var items = user == null ? folder.RecursiveChildren: + var items = user == null ? folder.RecursiveChildren : folder.GetRecursiveChildren(user); items = items.Where(i => !i.IsFolder); @@ -754,6 +766,41 @@ namespace MediaBrowser.Server.Implementations.Session return new[] { item }; } + private IEnumerable<BaseItem> TranslateItemForInstantMix(string id, User user) + { + var item = _libraryManager.GetItemById(new Guid(id)); + + var audio = item as Audio; + + if (audio != null) + { + return _musicManager.GetInstantMixFromSong(audio, user); + } + + var artist = item as MusicArtist; + + if (artist != null) + { + return _musicManager.GetInstantMixFromArtist(artist.Name, user); + } + + var album = item as MusicAlbum; + + if (album != null) + { + return _musicManager.GetInstantMixFromAlbum(album, user); + } + + var genre = item as MusicGenre; + + if (genre != null) + { + return _musicManager.GetInstantMixFromGenres(new[] { genre.Name }, user); + } + + return new BaseItem[] { }; + } + public Task SendBrowseCommand(Guid controllingSessionId, Guid sessionId, BrowseRequest command, CancellationToken cancellationToken) { var session = GetSessionForRemoteControl(sessionId); |
