mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-03-26 20:16:33 +00:00
channel fixes
This commit is contained in:
@@ -98,7 +98,7 @@ namespace MediaBrowser.Server.Implementations.Channels
|
||||
{
|
||||
all = all.Take(query.Limit.Value).ToList();
|
||||
}
|
||||
|
||||
|
||||
// Get everything
|
||||
var fields = Enum.GetNames(typeof(ItemFields))
|
||||
.Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
|
||||
@@ -156,6 +156,23 @@ namespace MediaBrowser.Server.Implementations.Channels
|
||||
progress.Report(100);
|
||||
}
|
||||
|
||||
public Task<IEnumerable<ChannelMediaInfo>> GetChannelItemMediaSources(string id, CancellationToken cancellationToken)
|
||||
{
|
||||
var item = (IChannelMediaItem)_libraryManager.GetItemById(id);
|
||||
|
||||
var channelGuid = new Guid(item.ChannelId);
|
||||
var channel = _channelEntities.First(i => i.Id == channelGuid);
|
||||
|
||||
var requiresCallback = channel as IRequiresMediaInfoCallback;
|
||||
|
||||
if (requiresCallback != null)
|
||||
{
|
||||
return requiresCallback.GetChannelItemMediaInfo(item.ExternalId, cancellationToken);
|
||||
}
|
||||
|
||||
return Task.FromResult<IEnumerable<ChannelMediaInfo>>(item.ChannelMediaSources);
|
||||
}
|
||||
|
||||
private async Task<Channel> GetChannel(IChannel channelInfo, CancellationToken cancellationToken)
|
||||
{
|
||||
var path = Path.Combine(_config.ApplicationPaths.ItemsByNamePath, "channels", _fileSystem.GetValidFilename(channelInfo.Name));
|
||||
@@ -303,10 +320,16 @@ namespace MediaBrowser.Server.Implementations.Channels
|
||||
|
||||
var query = new InternalChannelItemQuery
|
||||
{
|
||||
User = user,
|
||||
CategoryId = categoryId
|
||||
User = user
|
||||
};
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(categoryId))
|
||||
{
|
||||
var categoryItem = (IChannelItem)_libraryManager.GetItemById(new Guid(categoryId));
|
||||
|
||||
query.CategoryId = categoryItem.ExternalId;
|
||||
}
|
||||
|
||||
var result = await channel.GetChannelItems(query, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
CacheResponse(result, cachePath);
|
||||
@@ -380,7 +403,7 @@ namespace MediaBrowser.Server.Implementations.Channels
|
||||
private string GetIdToHash(string externalId)
|
||||
{
|
||||
// Increment this as needed to force new downloads
|
||||
return externalId + "4";
|
||||
return externalId + "7";
|
||||
}
|
||||
|
||||
private async Task<BaseItem> GetChannelItemEntity(ChannelItemInfo info, string internalChannnelId, CancellationToken cancellationToken)
|
||||
@@ -434,10 +457,6 @@ namespace MediaBrowser.Server.Implementations.Channels
|
||||
item.Id = id;
|
||||
item.RunTimeTicks = info.RunTimeTicks;
|
||||
|
||||
var mediaSource = info.MediaSources.FirstOrDefault();
|
||||
|
||||
item.Path = mediaSource == null ? null : mediaSource.Path;
|
||||
|
||||
if (isNew)
|
||||
{
|
||||
item.Name = info.Name;
|
||||
@@ -464,12 +483,22 @@ namespace MediaBrowser.Server.Implementations.Channels
|
||||
channelItem.ChannelId = internalChannnelId;
|
||||
channelItem.ChannelItemType = info.Type;
|
||||
|
||||
if (isNew)
|
||||
{
|
||||
channelItem.Tags = info.Tags;
|
||||
}
|
||||
|
||||
var channelMediaItem = item as IChannelMediaItem;
|
||||
|
||||
if (channelMediaItem != null)
|
||||
{
|
||||
channelMediaItem.IsInfiniteStream = info.IsInfiniteStream;
|
||||
channelMediaItem.ContentType = info.ContentType;
|
||||
channelMediaItem.ChannelMediaSources = info.MediaSources;
|
||||
|
||||
var mediaSource = info.MediaSources.FirstOrDefault();
|
||||
|
||||
item.Path = mediaSource == null ? null : mediaSource.Path;
|
||||
}
|
||||
|
||||
if (isNew)
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
using MediaBrowser.Common.Net;
|
||||
using MediaBrowser.Controller;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using MediaBrowser.Common.Net;
|
||||
using MediaBrowser.Controller.Session;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.Net;
|
||||
@@ -16,23 +19,18 @@ namespace MediaBrowser.Server.Implementations.Session
|
||||
{
|
||||
private readonly IHttpClient _httpClient;
|
||||
private readonly IJsonSerializer _json;
|
||||
private readonly IServerApplicationHost _appHost;
|
||||
|
||||
public SessionInfo Session { get; private set; }
|
||||
|
||||
//var postUrl = string.Format("http://{0}/mediabrowser/message", session.RemoteEndPoint);
|
||||
|
||||
private readonly string _postUrl;
|
||||
|
||||
public HttpSessionController(IHttpClient httpClient,
|
||||
IJsonSerializer json,
|
||||
IServerApplicationHost appHost,
|
||||
SessionInfo session,
|
||||
public HttpSessionController(IHttpClient httpClient,
|
||||
IJsonSerializer json,
|
||||
SessionInfo session,
|
||||
string postUrl)
|
||||
{
|
||||
_httpClient = httpClient;
|
||||
_json = json;
|
||||
_appHost = appHost;
|
||||
Session = session;
|
||||
_postUrl = postUrl;
|
||||
}
|
||||
@@ -63,6 +61,21 @@ namespace MediaBrowser.Server.Implementations.Session
|
||||
});
|
||||
}
|
||||
|
||||
private Task SendMessage(string name, CancellationToken cancellationToken)
|
||||
{
|
||||
return SendMessage(name, new NameValueCollection(), cancellationToken);
|
||||
}
|
||||
|
||||
private Task SendMessage(string name, NameValueCollection args, CancellationToken cancellationToken)
|
||||
{
|
||||
return SendMessage(new WebSocketMessage<string>
|
||||
{
|
||||
MessageType = name,
|
||||
Data = string.Empty
|
||||
|
||||
}, cancellationToken);
|
||||
}
|
||||
|
||||
public Task SendSessionEndedNotification(SessionInfoDto sessionInfo, CancellationToken cancellationToken)
|
||||
{
|
||||
return Task.FromResult(true);
|
||||
@@ -80,22 +93,25 @@ namespace MediaBrowser.Server.Implementations.Session
|
||||
|
||||
public Task SendPlayCommand(PlayRequest command, CancellationToken cancellationToken)
|
||||
{
|
||||
return SendMessage(new WebSocketMessage<PlayRequest>
|
||||
{
|
||||
MessageType = "Play",
|
||||
Data = command
|
||||
return Task.FromResult(true);
|
||||
//return SendMessage(new WebSocketMessage<PlayRequest>
|
||||
//{
|
||||
// MessageType = "Play",
|
||||
// Data = command
|
||||
|
||||
}, cancellationToken);
|
||||
//}, cancellationToken);
|
||||
}
|
||||
|
||||
public Task SendPlaystateCommand(PlaystateRequest command, CancellationToken cancellationToken)
|
||||
{
|
||||
return SendMessage(new WebSocketMessage<PlaystateRequest>
|
||||
{
|
||||
MessageType = "Playstate",
|
||||
Data = command
|
||||
var args = new Dictionary<string, string>();
|
||||
|
||||
}, cancellationToken);
|
||||
if (command.Command == PlaystateCommand.Seek)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
return SendMessage(command.Command.ToString(), cancellationToken);
|
||||
}
|
||||
|
||||
public Task SendLibraryUpdateInfo(LibraryUpdateInfo info, CancellationToken cancellationToken)
|
||||
@@ -103,14 +119,9 @@ namespace MediaBrowser.Server.Implementations.Session
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
|
||||
public Task SendRestartRequiredNotification(CancellationToken cancellationToken)
|
||||
public Task SendRestartRequiredNotification(SystemInfo info, CancellationToken cancellationToken)
|
||||
{
|
||||
return SendMessage(new WebSocketMessage<SystemInfo>
|
||||
{
|
||||
MessageType = "RestartRequired",
|
||||
Data = _appHost.GetSystemInfo()
|
||||
|
||||
}, cancellationToken);
|
||||
return SendMessage("RestartRequired", cancellationToken);
|
||||
}
|
||||
|
||||
public Task SendUserDataChangeInfo(UserDataChangeInfo info, CancellationToken cancellationToken)
|
||||
@@ -120,22 +131,12 @@ namespace MediaBrowser.Server.Implementations.Session
|
||||
|
||||
public Task SendServerShutdownNotification(CancellationToken cancellationToken)
|
||||
{
|
||||
return SendMessage(new WebSocketMessage<string>
|
||||
{
|
||||
MessageType = "ServerShuttingDown",
|
||||
Data = string.Empty
|
||||
|
||||
}, cancellationToken);
|
||||
return SendMessage("ServerShuttingDown", cancellationToken);
|
||||
}
|
||||
|
||||
public Task SendServerRestartNotification(CancellationToken cancellationToken)
|
||||
{
|
||||
return SendMessage(new WebSocketMessage<string>
|
||||
{
|
||||
MessageType = "ServerRestarting",
|
||||
Data = string.Empty
|
||||
|
||||
}, cancellationToken);
|
||||
return SendMessage("ServerRestarting", cancellationToken);
|
||||
}
|
||||
|
||||
public Task SendGeneralCommand(GeneralCommand command, CancellationToken cancellationToken)
|
||||
@@ -147,5 +148,13 @@ namespace MediaBrowser.Server.Implementations.Session
|
||||
|
||||
}, cancellationToken);
|
||||
}
|
||||
|
||||
private string ToQueryString(Dictionary<string, string> nvc)
|
||||
{
|
||||
var array = (from item in nvc
|
||||
select string.Format("{0}={1}", WebUtility.UrlEncode(item.Key), WebUtility.UrlEncode(item.Value)))
|
||||
.ToArray();
|
||||
return "?" + string.Join("&", array);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.Globalization;
|
||||
using MediaBrowser.Common.Events;
|
||||
using MediaBrowser.Common.Events;
|
||||
using MediaBrowser.Common.Extensions;
|
||||
using MediaBrowser.Common.Net;
|
||||
using MediaBrowser.Controller;
|
||||
using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.Controller.Drawing;
|
||||
using MediaBrowser.Controller.Dto;
|
||||
@@ -14,10 +15,12 @@ using MediaBrowser.Controller.Session;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.Library;
|
||||
using MediaBrowser.Model.Logging;
|
||||
using MediaBrowser.Model.Serialization;
|
||||
using MediaBrowser.Model.Session;
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
@@ -51,6 +54,10 @@ namespace MediaBrowser.Server.Implementations.Session
|
||||
private readonly IImageProcessor _imageProcessor;
|
||||
private readonly IItemRepository _itemRepo;
|
||||
|
||||
private readonly IHttpClient _httpClient;
|
||||
private readonly IJsonSerializer _jsonSerializer;
|
||||
private readonly IServerApplicationHost _appHost;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the configuration manager.
|
||||
/// </summary>
|
||||
@@ -93,7 +100,7 @@ namespace MediaBrowser.Server.Implementations.Session
|
||||
/// <param name="logger">The logger.</param>
|
||||
/// <param name="userRepository">The user repository.</param>
|
||||
/// <param name="libraryManager">The library manager.</param>
|
||||
public SessionManager(IUserDataManager userDataRepository, IServerConfigurationManager configurationManager, ILogger logger, IUserRepository userRepository, ILibraryManager libraryManager, IUserManager userManager, IMusicManager musicManager, IDtoService dtoService, IImageProcessor imageProcessor, IItemRepository itemRepo)
|
||||
public SessionManager(IUserDataManager userDataRepository, IServerConfigurationManager configurationManager, ILogger logger, IUserRepository userRepository, ILibraryManager libraryManager, IUserManager userManager, IMusicManager musicManager, IDtoService dtoService, IImageProcessor imageProcessor, IItemRepository itemRepo, IJsonSerializer jsonSerializer, IServerApplicationHost appHost, IHttpClient httpClient)
|
||||
{
|
||||
_userDataRepository = userDataRepository;
|
||||
_configurationManager = configurationManager;
|
||||
@@ -105,6 +112,9 @@ namespace MediaBrowser.Server.Implementations.Session
|
||||
_dtoService = dtoService;
|
||||
_imageProcessor = imageProcessor;
|
||||
_itemRepo = itemRepo;
|
||||
_jsonSerializer = jsonSerializer;
|
||||
_appHost = appHost;
|
||||
_httpClient = httpClient;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -908,11 +918,13 @@ namespace MediaBrowser.Server.Implementations.Session
|
||||
{
|
||||
var sessions = Sessions.Where(i => i.IsActive && i.SessionController != null).ToList();
|
||||
|
||||
var info = _appHost.GetSystemInfo();
|
||||
|
||||
var tasks = sessions.Select(session => Task.Run(async () =>
|
||||
{
|
||||
try
|
||||
{
|
||||
await session.SessionController.SendRestartRequiredNotification(cancellationToken).ConfigureAwait(false);
|
||||
await session.SessionController.SendRestartRequiredNotification(info, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -1135,6 +1147,18 @@ namespace MediaBrowser.Server.Implementations.Session
|
||||
session.PlayableMediaTypes = capabilities.PlayableMediaTypes;
|
||||
session.SupportedCommands = capabilities.SupportedCommands;
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(capabilities.MessageCallbackUrl))
|
||||
{
|
||||
var postUrl = string.Format("http://{0}{1}", session.RemoteEndPoint, capabilities.MessageCallbackUrl);
|
||||
|
||||
var controller = session.SessionController as HttpSessionController;
|
||||
|
||||
if (controller == null)
|
||||
{
|
||||
session.SessionController = new HttpSessionController(_httpClient, _jsonSerializer, session, postUrl);
|
||||
}
|
||||
}
|
||||
|
||||
EventHelper.FireEventIfNotNull(CapabilitiesChanged, this, new SessionEventArgs
|
||||
{
|
||||
SessionInfo = session
|
||||
|
||||
@@ -35,19 +35,17 @@ namespace MediaBrowser.Server.Implementations.Session
|
||||
/// The _dto service
|
||||
/// </summary>
|
||||
private readonly IJsonSerializer _json;
|
||||
private readonly IServerApplicationHost _appHost;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="SessionWebSocketListener" /> class.
|
||||
/// </summary>
|
||||
/// <param name="sessionManager">The session manager.</param>
|
||||
/// <param name="logManager">The log manager.</param>
|
||||
/// <param name="appHost">The application host.</param>
|
||||
public SessionWebSocketListener(ISessionManager sessionManager, ILogManager logManager, IServerApplicationHost appHost, IJsonSerializer json)
|
||||
/// <param name="json">The json.</param>
|
||||
public SessionWebSocketListener(ISessionManager sessionManager, ILogManager logManager, IJsonSerializer json)
|
||||
{
|
||||
_sessionManager = sessionManager;
|
||||
_logger = logManager.GetLogger(GetType().Name);
|
||||
_appHost = appHost;
|
||||
_json = json;
|
||||
}
|
||||
|
||||
@@ -138,7 +136,7 @@ namespace MediaBrowser.Server.Implementations.Session
|
||||
|
||||
if (controller == null)
|
||||
{
|
||||
controller = new WebSocketController(session, _appHost, _logger, _sessionManager);
|
||||
controller = new WebSocketController(session, _logger, _sessionManager);
|
||||
}
|
||||
|
||||
controller.AddWebSocket(message.Connection);
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using MediaBrowser.Common.Net;
|
||||
using MediaBrowser.Controller;
|
||||
using MediaBrowser.Controller.Session;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.Logging;
|
||||
@@ -19,15 +18,13 @@ namespace MediaBrowser.Server.Implementations.Session
|
||||
public SessionInfo Session { get; private set; }
|
||||
public IReadOnlyList<IWebSocketConnection> Sockets { get; private set; }
|
||||
|
||||
private readonly IServerApplicationHost _appHost;
|
||||
private readonly ILogger _logger;
|
||||
|
||||
private readonly ISessionManager _sessionManager;
|
||||
|
||||
public WebSocketController(SessionInfo session, IServerApplicationHost appHost, ILogger logger, ISessionManager sessionManager)
|
||||
public WebSocketController(SessionInfo session, ILogger logger, ISessionManager sessionManager)
|
||||
{
|
||||
Session = session;
|
||||
_appHost = appHost;
|
||||
_logger = logger;
|
||||
_sessionManager = sessionManager;
|
||||
Sockets = new List<IWebSocketConnection>();
|
||||
@@ -121,14 +118,15 @@ namespace MediaBrowser.Server.Implementations.Session
|
||||
/// <summary>
|
||||
/// Sends the restart required message.
|
||||
/// </summary>
|
||||
/// <param name="info">The information.</param>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <returns>Task.</returns>
|
||||
public Task SendRestartRequiredNotification(CancellationToken cancellationToken)
|
||||
public Task SendRestartRequiredNotification(SystemInfo info, CancellationToken cancellationToken)
|
||||
{
|
||||
return SendMessages(new WebSocketMessage<SystemInfo>
|
||||
{
|
||||
MessageType = "RestartRequired",
|
||||
Data = _appHost.GetSystemInfo()
|
||||
Data = info
|
||||
|
||||
}, cancellationToken);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user