mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-03-17 23:56:44 +00:00
restored live tv playback in the web client
This commit is contained in:
@@ -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>
|
||||
{
|
||||
|
||||
67
MediaBrowser.Server.Implementations/Library/MusicManager.cs
Normal file
67
MediaBrowser.Server.Implementations/Library/MusicManager.cs
Normal 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());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user