aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations')
-rw-r--r--MediaBrowser.Server.Implementations/Dto/DtoService.cs48
-rw-r--r--MediaBrowser.Server.Implementations/Library/MusicManager.cs67
-rw-r--r--MediaBrowser.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs3
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs11
-rw-r--r--MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj1
-rw-r--r--MediaBrowser.Server.Implementations/Session/SessionManager.cs59
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);