restored live tv playback in the web client

This commit is contained in:
Luke Pulverenti
2014-03-30 12:49:40 -04:00
parent a90d892eca
commit f756e39b9d
31 changed files with 1373 additions and 192 deletions

View File

@@ -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);
}
}
private List<MediaSourceInfo> GetMediaSources(Video item)
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> 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>
{

View File

@@ -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());
}
}
}

View File

@@ -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();
}

View File

@@ -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)

View File

@@ -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" />

View File

@@ -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);