mirror of
https://github.com/jellyfin/jellyfin.git
synced 2024-07-08 23:00:51 +02:00
re-enable mobile media controller
This commit is contained in:
parent
e9fb806478
commit
98c0b28d14
|
@ -350,11 +350,11 @@ namespace MediaBrowser.Api.Playback
|
||||||
switch (qualitySetting)
|
switch (qualitySetting)
|
||||||
{
|
{
|
||||||
case EncodingQuality.HighSpeed:
|
case EncodingQuality.HighSpeed:
|
||||||
crf = "12";
|
crf = "16";
|
||||||
profileScore = 2;
|
profileScore = 2;
|
||||||
break;
|
break;
|
||||||
case EncodingQuality.HighQuality:
|
case EncodingQuality.HighQuality:
|
||||||
crf = "8";
|
crf = "10";
|
||||||
profileScore = 1;
|
profileScore = 1;
|
||||||
break;
|
break;
|
||||||
case EncodingQuality.MaxQuality:
|
case EncodingQuality.MaxQuality:
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
using System.Text;
|
using MediaBrowser.Common.Configuration;
|
||||||
using MediaBrowser.Common.Configuration;
|
|
||||||
using MediaBrowser.Common.Events;
|
using MediaBrowser.Common.Events;
|
||||||
using MediaBrowser.Common.Implementations.Archiving;
|
using MediaBrowser.Common.Implementations.Archiving;
|
||||||
using MediaBrowser.Common.Implementations.IO;
|
using MediaBrowser.Common.Implementations.IO;
|
||||||
|
@ -26,6 +25,7 @@ using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ namespace MediaBrowser.Common.Implementations
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Occurs when [application updated].
|
/// Occurs when [application updated].
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public event EventHandler<GenericEventArgs<Version>> ApplicationUpdated;
|
public event EventHandler<GenericEventArgs<PackageVersionInfo>> ApplicationUpdated;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets a value indicating whether this instance has changes that require the entire application to restart.
|
/// Gets or sets a value indicating whether this instance has changes that require the entire application to restart.
|
||||||
|
@ -759,12 +759,16 @@ namespace MediaBrowser.Common.Implementations
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Called when [application updated].
|
/// Called when [application updated].
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="newVersion">The new version.</param>
|
/// <param name="package">The package.</param>
|
||||||
protected void OnApplicationUpdated(Version newVersion)
|
protected void OnApplicationUpdated(PackageVersionInfo package)
|
||||||
{
|
{
|
||||||
Logger.Info("Application has been updated to version {0}", newVersion);
|
Logger.Info("Application has been updated to version {0}", package.versionStr);
|
||||||
|
|
||||||
EventHelper.QueueEventIfNotNull(ApplicationUpdated, this, new GenericEventArgs<Version> { Argument = newVersion }, Logger);
|
EventHelper.QueueEventIfNotNull(ApplicationUpdated, this, new GenericEventArgs<PackageVersionInfo>
|
||||||
|
{
|
||||||
|
Argument = package
|
||||||
|
|
||||||
|
}, Logger);
|
||||||
|
|
||||||
NotifyPendingRestart();
|
NotifyPendingRestart();
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ namespace MediaBrowser.Common
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Occurs when [application updated].
|
/// Occurs when [application updated].
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event EventHandler<GenericEventArgs<Version>> ApplicationUpdated;
|
event EventHandler<GenericEventArgs<PackageVersionInfo>> ApplicationUpdated;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a value indicating whether this instance is running as service.
|
/// Gets a value indicating whether this instance is running as service.
|
||||||
|
|
|
@ -30,7 +30,6 @@ namespace MediaBrowser.Dlna.Main
|
||||||
private readonly IHttpClient _httpClient;
|
private readonly IHttpClient _httpClient;
|
||||||
private readonly IItemRepository _itemRepo;
|
private readonly IItemRepository _itemRepo;
|
||||||
private readonly ILibraryManager _libraryManager;
|
private readonly ILibraryManager _libraryManager;
|
||||||
private readonly INetworkManager _networkManager;
|
|
||||||
private readonly IUserManager _userManager;
|
private readonly IUserManager _userManager;
|
||||||
private readonly IDlnaManager _dlnaManager;
|
private readonly IDlnaManager _dlnaManager;
|
||||||
private readonly IDtoService _dtoService;
|
private readonly IDtoService _dtoService;
|
||||||
|
@ -41,7 +40,7 @@ namespace MediaBrowser.Dlna.Main
|
||||||
private readonly List<Guid> _registeredServerIds = new List<Guid>();
|
private readonly List<Guid> _registeredServerIds = new List<Guid>();
|
||||||
private bool _dlnaServerStarted;
|
private bool _dlnaServerStarted;
|
||||||
|
|
||||||
public DlnaEntryPoint(IServerConfigurationManager config, ILogManager logManager, IServerApplicationHost appHost, INetworkManager network, ISessionManager sessionManager, IHttpClient httpClient, IItemRepository itemRepo, ILibraryManager libraryManager, INetworkManager networkManager, IUserManager userManager, IDlnaManager dlnaManager, IDtoService dtoService, IImageProcessor imageProcessor)
|
public DlnaEntryPoint(IServerConfigurationManager config, ILogManager logManager, IServerApplicationHost appHost, INetworkManager network, ISessionManager sessionManager, IHttpClient httpClient, IItemRepository itemRepo, ILibraryManager libraryManager, IUserManager userManager, IDlnaManager dlnaManager, IDtoService dtoService, IImageProcessor imageProcessor)
|
||||||
{
|
{
|
||||||
_config = config;
|
_config = config;
|
||||||
_appHost = appHost;
|
_appHost = appHost;
|
||||||
|
@ -50,7 +49,6 @@ namespace MediaBrowser.Dlna.Main
|
||||||
_httpClient = httpClient;
|
_httpClient = httpClient;
|
||||||
_itemRepo = itemRepo;
|
_itemRepo = itemRepo;
|
||||||
_libraryManager = libraryManager;
|
_libraryManager = libraryManager;
|
||||||
_networkManager = networkManager;
|
|
||||||
_userManager = userManager;
|
_userManager = userManager;
|
||||||
_dlnaManager = dlnaManager;
|
_dlnaManager = dlnaManager;
|
||||||
_dtoService = dtoService;
|
_dtoService = dtoService;
|
||||||
|
@ -196,7 +194,6 @@ namespace MediaBrowser.Dlna.Main
|
||||||
_httpClient,
|
_httpClient,
|
||||||
_itemRepo,
|
_itemRepo,
|
||||||
_libraryManager,
|
_libraryManager,
|
||||||
_networkManager,
|
|
||||||
_userManager,
|
_userManager,
|
||||||
_dlnaManager,
|
_dlnaManager,
|
||||||
_appHost,
|
_appHost,
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
using MediaBrowser.Common.Net;
|
using MediaBrowser.Controller.Dlna;
|
||||||
using MediaBrowser.Controller;
|
|
||||||
using MediaBrowser.Controller.Dlna;
|
|
||||||
using MediaBrowser.Controller.Drawing;
|
using MediaBrowser.Controller.Drawing;
|
||||||
using MediaBrowser.Controller.Dto;
|
using MediaBrowser.Controller.Dto;
|
||||||
using MediaBrowser.Controller.Entities;
|
using MediaBrowser.Controller.Entities;
|
||||||
|
@ -31,15 +29,14 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
private readonly ISessionManager _sessionManager;
|
private readonly ISessionManager _sessionManager;
|
||||||
private readonly IItemRepository _itemRepository;
|
private readonly IItemRepository _itemRepository;
|
||||||
private readonly ILibraryManager _libraryManager;
|
private readonly ILibraryManager _libraryManager;
|
||||||
private readonly INetworkManager _networkManager;
|
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
private readonly IDlnaManager _dlnaManager;
|
private readonly IDlnaManager _dlnaManager;
|
||||||
private readonly IUserManager _userManager;
|
private readonly IUserManager _userManager;
|
||||||
private readonly IServerApplicationHost _appHost;
|
|
||||||
private readonly IDtoService _dtoService;
|
private readonly IDtoService _dtoService;
|
||||||
private readonly IImageProcessor _imageProcessor;
|
private readonly IImageProcessor _imageProcessor;
|
||||||
|
|
||||||
private readonly SsdpHandler _ssdpHandler;
|
private readonly SsdpHandler _ssdpHandler;
|
||||||
|
private readonly string _serverAddress;
|
||||||
|
|
||||||
public bool SupportsMediaRemoteControl
|
public bool SupportsMediaRemoteControl
|
||||||
{
|
{
|
||||||
|
@ -54,19 +51,18 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public PlayToController(SessionInfo session, ISessionManager sessionManager, IItemRepository itemRepository, ILibraryManager libraryManager, ILogger logger, INetworkManager networkManager, IDlnaManager dlnaManager, IUserManager userManager, IServerApplicationHost appHost, IDtoService dtoService, IImageProcessor imageProcessor, SsdpHandler ssdpHandler)
|
public PlayToController(SessionInfo session, ISessionManager sessionManager, IItemRepository itemRepository, ILibraryManager libraryManager, ILogger logger, IDlnaManager dlnaManager, IUserManager userManager, IDtoService dtoService, IImageProcessor imageProcessor, SsdpHandler ssdpHandler, string serverAddress)
|
||||||
{
|
{
|
||||||
_session = session;
|
_session = session;
|
||||||
_itemRepository = itemRepository;
|
_itemRepository = itemRepository;
|
||||||
_sessionManager = sessionManager;
|
_sessionManager = sessionManager;
|
||||||
_libraryManager = libraryManager;
|
_libraryManager = libraryManager;
|
||||||
_networkManager = networkManager;
|
|
||||||
_dlnaManager = dlnaManager;
|
_dlnaManager = dlnaManager;
|
||||||
_userManager = userManager;
|
_userManager = userManager;
|
||||||
_appHost = appHost;
|
|
||||||
_dtoService = dtoService;
|
_dtoService = dtoService;
|
||||||
_imageProcessor = imageProcessor;
|
_imageProcessor = imageProcessor;
|
||||||
_ssdpHandler = ssdpHandler;
|
_ssdpHandler = ssdpHandler;
|
||||||
|
_serverAddress = serverAddress;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,6 +77,11 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
_ssdpHandler.MessageReceived += _SsdpHandler_MessageReceived;
|
_ssdpHandler.MessageReceived += _SsdpHandler_MessageReceived;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private string GetServerAddress()
|
||||||
|
{
|
||||||
|
return _serverAddress;
|
||||||
|
}
|
||||||
|
|
||||||
async void _SsdpHandler_MessageReceived(object sender, SsdpMessageEventArgs e)
|
async void _SsdpHandler_MessageReceived(object sender, SsdpMessageEventArgs e)
|
||||||
{
|
{
|
||||||
string nts;
|
string nts;
|
||||||
|
@ -93,17 +94,20 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
if (!e.Headers.TryGetValue("NT", out nt)) nt = string.Empty;
|
if (!e.Headers.TryGetValue("NT", out nt)) nt = string.Empty;
|
||||||
|
|
||||||
if (string.Equals(e.Method, "NOTIFY", StringComparison.OrdinalIgnoreCase) &&
|
if (string.Equals(e.Method, "NOTIFY", StringComparison.OrdinalIgnoreCase) &&
|
||||||
string.Equals(nts, "ssdp:byebye", StringComparison.OrdinalIgnoreCase))
|
string.Equals(nts, "ssdp:byebye", StringComparison.OrdinalIgnoreCase) &&
|
||||||
|
usn.IndexOf(_device.Properties.UUID, StringComparison.OrdinalIgnoreCase) != -1 &&
|
||||||
|
!_disposed)
|
||||||
{
|
{
|
||||||
if (usn.IndexOf(_device.Properties.UUID, StringComparison.OrdinalIgnoreCase) != -1)
|
if (usn.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) != -1 ||
|
||||||
|
nt.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) != -1)
|
||||||
{
|
{
|
||||||
if (usn.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) != -1 ||
|
try
|
||||||
nt.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) != -1)
|
|
||||||
{
|
{
|
||||||
if (!_disposed)
|
await _sessionManager.ReportSessionEnded(_session.Id).ConfigureAwait(false);
|
||||||
{
|
}
|
||||||
await _sessionManager.ReportSessionEnded(_session.Id).ConfigureAwait(false);
|
catch
|
||||||
}
|
{
|
||||||
|
// Could throw if the session is already gone
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -368,16 +372,6 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetServerAddress()
|
|
||||||
{
|
|
||||||
return string.Format("{0}://{1}:{2}/mediabrowser",
|
|
||||||
|
|
||||||
"http",
|
|
||||||
_networkManager.GetLocalIpAddresses().FirstOrDefault() ?? "localhost",
|
|
||||||
_appHost.HttpServerPort
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PlaylistItem CreatePlaylistItem(BaseItem item, long startPostionTicks, string serverAddress)
|
private PlaylistItem CreatePlaylistItem(BaseItem item, long startPostionTicks, string serverAddress)
|
||||||
{
|
{
|
||||||
var deviceInfo = _device.Properties;
|
var deviceInfo = _device.Properties;
|
||||||
|
|
|
@ -32,7 +32,6 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
|
|
||||||
private readonly IItemRepository _itemRepository;
|
private readonly IItemRepository _itemRepository;
|
||||||
private readonly ILibraryManager _libraryManager;
|
private readonly ILibraryManager _libraryManager;
|
||||||
private readonly INetworkManager _networkManager;
|
|
||||||
private readonly IUserManager _userManager;
|
private readonly IUserManager _userManager;
|
||||||
private readonly IDlnaManager _dlnaManager;
|
private readonly IDlnaManager _dlnaManager;
|
||||||
private readonly IServerConfigurationManager _config;
|
private readonly IServerConfigurationManager _config;
|
||||||
|
@ -42,7 +41,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
|
|
||||||
private readonly SsdpHandler _ssdpHandler;
|
private readonly SsdpHandler _ssdpHandler;
|
||||||
|
|
||||||
public PlayToManager(ILogger logger, IServerConfigurationManager config, ISessionManager sessionManager, IHttpClient httpClient, IItemRepository itemRepository, ILibraryManager libraryManager, INetworkManager networkManager, IUserManager userManager, IDlnaManager dlnaManager, IServerApplicationHost appHost, IDtoService dtoService, IImageProcessor imageProcessor, SsdpHandler ssdpHandler)
|
public PlayToManager(ILogger logger, IServerConfigurationManager config, ISessionManager sessionManager, IHttpClient httpClient, IItemRepository itemRepository, ILibraryManager libraryManager, IUserManager userManager, IDlnaManager dlnaManager, IServerApplicationHost appHost, IDtoService dtoService, IImageProcessor imageProcessor, SsdpHandler ssdpHandler)
|
||||||
{
|
{
|
||||||
_tokenSource = new CancellationTokenSource();
|
_tokenSource = new CancellationTokenSource();
|
||||||
|
|
||||||
|
@ -51,7 +50,6 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
_httpClient = httpClient;
|
_httpClient = httpClient;
|
||||||
_itemRepository = itemRepository;
|
_itemRepository = itemRepository;
|
||||||
_libraryManager = libraryManager;
|
_libraryManager = libraryManager;
|
||||||
_networkManager = networkManager;
|
|
||||||
_userManager = userManager;
|
_userManager = userManager;
|
||||||
_dlnaManager = dlnaManager;
|
_dlnaManager = dlnaManager;
|
||||||
_appHost = appHost;
|
_appHost = appHost;
|
||||||
|
@ -137,7 +135,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
{
|
{
|
||||||
var args = SsdpHelper.ParseSsdpResponse(receiveBuffer, endPoint);
|
var args = SsdpHelper.ParseSsdpResponse(receiveBuffer, endPoint);
|
||||||
|
|
||||||
TryCreateController(args);
|
TryCreateController(args, localIp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,7 +152,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
}, _tokenSource.Token, TaskCreationOptions.LongRunning);
|
}, _tokenSource.Token, TaskCreationOptions.LongRunning);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void TryCreateController(SsdpMessageEventArgs args)
|
private void TryCreateController(SsdpMessageEventArgs args, IPAddress localIp)
|
||||||
{
|
{
|
||||||
string nts;
|
string nts;
|
||||||
args.Headers.TryGetValue("NTS", out nts);
|
args.Headers.TryGetValue("NTS", out nts);
|
||||||
|
@ -203,7 +201,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await CreateController(new Uri(location)).ConfigureAwait(false);
|
await CreateController(new Uri(location), localIp).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
catch (OperationCanceledException)
|
catch (OperationCanceledException)
|
||||||
{
|
{
|
||||||
|
@ -264,7 +262,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="uri">The URI.</param>
|
/// <param name="uri">The URI.</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private async Task CreateController(Uri uri)
|
private async Task CreateController(Uri uri, IPAddress localIp)
|
||||||
{
|
{
|
||||||
var device = await Device.CreateuPnpDeviceAsync(uri, _httpClient, _config, _logger).ConfigureAwait(false);
|
var device = await Device.CreateuPnpDeviceAsync(uri, _httpClient, _config, _logger).ConfigureAwait(false);
|
||||||
|
|
||||||
|
@ -277,7 +275,19 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
|
|
||||||
if (controller == null)
|
if (controller == null)
|
||||||
{
|
{
|
||||||
sessionInfo.SessionController = controller = new PlayToController(sessionInfo, _sessionManager, _itemRepository, _libraryManager, _logger, _networkManager, _dlnaManager, _userManager, _appHost, _dtoService, _imageProcessor, _ssdpHandler);
|
var serverAddress = GetServerAddress(localIp);
|
||||||
|
|
||||||
|
sessionInfo.SessionController = controller = new PlayToController(sessionInfo,
|
||||||
|
_sessionManager,
|
||||||
|
_itemRepository,
|
||||||
|
_libraryManager,
|
||||||
|
_logger,
|
||||||
|
_dlnaManager,
|
||||||
|
_userManager,
|
||||||
|
_dtoService,
|
||||||
|
_imageProcessor,
|
||||||
|
_ssdpHandler,
|
||||||
|
serverAddress);
|
||||||
|
|
||||||
controller.Init(device);
|
controller.Init(device);
|
||||||
|
|
||||||
|
@ -304,6 +314,16 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private string GetServerAddress(IPAddress localIp)
|
||||||
|
{
|
||||||
|
return string.Format("{0}://{1}:{2}/mediabrowser",
|
||||||
|
|
||||||
|
"http",
|
||||||
|
localIp,
|
||||||
|
_appHost.HttpServerPort
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
if (!_disposed)
|
if (!_disposed)
|
||||||
|
|
|
@ -551,9 +551,8 @@ namespace MediaBrowser.Model.ApiClient
|
||||||
/// <param name="itemId">The id of the item to browse to.</param>
|
/// <param name="itemId">The id of the item to browse to.</param>
|
||||||
/// <param name="itemName">The name of the item to browse to.</param>
|
/// <param name="itemName">The name of the item to browse to.</param>
|
||||||
/// <param name="itemType">The type of the item to browse to.</param>
|
/// <param name="itemType">The type of the item to browse to.</param>
|
||||||
/// <param name="context">Optional ui context (movies, music, tv, games, etc). The client is free to ignore this.</param>
|
|
||||||
/// <returns>Task.</returns>
|
/// <returns>Task.</returns>
|
||||||
Task SendBrowseCommandAsync(string sessionId, string itemId, string itemName, string itemType, string context);
|
Task SendBrowseCommandAsync(string sessionId, string itemId, string itemName, string itemType);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sends the playstate command async.
|
/// Sends the playstate command async.
|
||||||
|
|
|
@ -145,6 +145,12 @@ namespace MediaBrowser.Model.Configuration
|
||||||
/// <value>The title format string.</value>
|
/// <value>The title format string.</value>
|
||||||
public string Title { get; set; }
|
public string Title { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the description.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The description.</value>
|
||||||
|
public string Description { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the disabled services.
|
/// Gets or sets the disabled services.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
using MediaBrowser.Model.Dto;
|
using MediaBrowser.Model.Dto;
|
||||||
using MediaBrowser.Model.Entities;
|
using MediaBrowser.Model.Entities;
|
||||||
|
using MediaBrowser.Model.MediaInfo;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using MediaBrowser.Model.MediaInfo;
|
|
||||||
|
|
||||||
namespace MediaBrowser.Model.Dlna
|
namespace MediaBrowser.Model.Dlna
|
||||||
{
|
{
|
||||||
|
|
|
@ -78,6 +78,8 @@ namespace MediaBrowser.Model.Notifications
|
||||||
|
|
||||||
public string DefaultTitle { get; set; }
|
public string DefaultTitle { get; set; }
|
||||||
|
|
||||||
|
public string DefaultDescription { get; set; }
|
||||||
|
|
||||||
public List<string> Variables { get; set; }
|
public List<string> Variables { get; set; }
|
||||||
|
|
||||||
public NotificationTypeInfo()
|
public NotificationTypeInfo()
|
||||||
|
|
|
@ -70,7 +70,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications
|
||||||
_appHost.ApplicationUpdated += _appHost_ApplicationUpdated;
|
_appHost.ApplicationUpdated += _appHost_ApplicationUpdated;
|
||||||
}
|
}
|
||||||
|
|
||||||
async void _appHost_ApplicationUpdated(object sender, GenericEventArgs<Version> e)
|
async void _appHost_ApplicationUpdated(object sender, GenericEventArgs<PackageVersionInfo> e)
|
||||||
{
|
{
|
||||||
var type = NotificationType.ApplicationUpdateInstalled.ToString();
|
var type = NotificationType.ApplicationUpdateInstalled.ToString();
|
||||||
|
|
||||||
|
@ -79,7 +79,8 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications
|
||||||
NotificationType = type
|
NotificationType = type
|
||||||
};
|
};
|
||||||
|
|
||||||
notification.Variables["Version"] = e.Argument.ToString();
|
notification.Variables["Version"] = e.Argument.versionStr;
|
||||||
|
notification.Variables["ReleaseNotes"] = e.Argument.description;
|
||||||
|
|
||||||
await SendNotification(notification).ConfigureAwait(false);
|
await SendNotification(notification).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
@ -98,6 +99,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications
|
||||||
|
|
||||||
notification.Variables["Name"] = installationInfo.Name;
|
notification.Variables["Name"] = installationInfo.Name;
|
||||||
notification.Variables["Version"] = installationInfo.Version.ToString();
|
notification.Variables["Version"] = installationInfo.Version.ToString();
|
||||||
|
notification.Variables["ReleaseNotes"] = e.Argument.Item2.description;
|
||||||
|
|
||||||
await SendNotification(notification).ConfigureAwait(false);
|
await SendNotification(notification).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
@ -249,6 +251,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications
|
||||||
};
|
};
|
||||||
|
|
||||||
notification.Variables["Name"] = e.Argument.Name;
|
notification.Variables["Name"] = e.Argument.Name;
|
||||||
|
notification.Variables["ErrorMessage"] = e.Argument.ErrorMessage;
|
||||||
|
|
||||||
await SendNotification(notification).ConfigureAwait(false);
|
await SendNotification(notification).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -605,6 +605,7 @@
|
||||||
"LetterButtonAbbreviation": "A",
|
"LetterButtonAbbreviation": "A",
|
||||||
"TabNowPlaying": "Now Playing",
|
"TabNowPlaying": "Now Playing",
|
||||||
"TabNavigation": "Navigation",
|
"TabNavigation": "Navigation",
|
||||||
|
"TabControls": "Controls",
|
||||||
"ButtonFullscreen": "Toggle fullscreen",
|
"ButtonFullscreen": "Toggle fullscreen",
|
||||||
"ButtonScenes": "Scenes",
|
"ButtonScenes": "Scenes",
|
||||||
"ButtonSubtitles": "Subtitles",
|
"ButtonSubtitles": "Subtitles",
|
||||||
|
@ -616,5 +617,8 @@
|
||||||
"ButtonPause": "Pause",
|
"ButtonPause": "Pause",
|
||||||
"LabelGroupMoviesIntoCollections": "Group movies into collections",
|
"LabelGroupMoviesIntoCollections": "Group movies into collections",
|
||||||
"LabelGroupMoviesIntoCollectionsHelp": "When displaying movie lists, movies belonging to a collection will be displayed as one grouped item.",
|
"LabelGroupMoviesIntoCollectionsHelp": "When displaying movie lists, movies belonging to a collection will be displayed as one grouped item.",
|
||||||
"NotificationOptionPluginError": "Plugin failure"
|
"NotificationOptionPluginError": "Plugin failure",
|
||||||
|
"ButtonVolumeUp": "Volume up",
|
||||||
|
"ButtonVolumeDown": "Volume down",
|
||||||
|
"ButtonMute": "Mute"
|
||||||
}
|
}
|
|
@ -99,7 +99,7 @@ namespace MediaBrowser.Server.Implementations.News
|
||||||
{
|
{
|
||||||
if (lastUpdate.HasValue)
|
if (lastUpdate.HasValue)
|
||||||
{
|
{
|
||||||
items = items.Where(i => i.Date.ToUniversalTime() > lastUpdate.Value)
|
items = items.Where(i => i.Date.ToUniversalTime() >= lastUpdate.Value)
|
||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,8 +48,9 @@ namespace MediaBrowser.Server.Implementations.Notifications
|
||||||
new NotificationTypeInfo
|
new NotificationTypeInfo
|
||||||
{
|
{
|
||||||
Type = NotificationType.PluginError.ToString(),
|
Type = NotificationType.PluginError.ToString(),
|
||||||
DefaultTitle = "{Name} has encountered an error: {Message}",
|
DefaultTitle = "{Name} has encountered an error.",
|
||||||
Variables = new List<string>{"Name", "Message"}
|
DefaultDescription = "{ErrorMessage}",
|
||||||
|
Variables = new List<string>{"Name", "ErrorMessage"}
|
||||||
},
|
},
|
||||||
|
|
||||||
new NotificationTypeInfo
|
new NotificationTypeInfo
|
||||||
|
@ -63,7 +64,8 @@ namespace MediaBrowser.Server.Implementations.Notifications
|
||||||
{
|
{
|
||||||
Type = NotificationType.PluginUpdateInstalled.ToString(),
|
Type = NotificationType.PluginUpdateInstalled.ToString(),
|
||||||
DefaultTitle = "{Name} was updated.",
|
DefaultTitle = "{Name} was updated.",
|
||||||
Variables = new List<string>{"Name", "Version"}
|
DefaultDescription = "{ReleaseNotes}",
|
||||||
|
Variables = new List<string>{"Name", "ReleaseNotes", "Version"}
|
||||||
},
|
},
|
||||||
|
|
||||||
new NotificationTypeInfo
|
new NotificationTypeInfo
|
||||||
|
@ -76,7 +78,8 @@ namespace MediaBrowser.Server.Implementations.Notifications
|
||||||
{
|
{
|
||||||
Type = NotificationType.TaskFailed.ToString(),
|
Type = NotificationType.TaskFailed.ToString(),
|
||||||
DefaultTitle = "{Name} failed.",
|
DefaultTitle = "{Name} failed.",
|
||||||
Variables = new List<string>{"Name"}
|
DefaultDescription = "{ErrorMessage}",
|
||||||
|
Variables = new List<string>{"Name", "ErrorMessage"}
|
||||||
},
|
},
|
||||||
|
|
||||||
new NotificationTypeInfo
|
new NotificationTypeInfo
|
||||||
|
|
|
@ -39,13 +39,14 @@ namespace MediaBrowser.Server.Implementations.Notifications
|
||||||
_config.Configuration.NotificationOptions.GetOptions(notificationType);
|
_config.Configuration.NotificationOptions.GetOptions(notificationType);
|
||||||
|
|
||||||
var users = GetUserIds(request, options)
|
var users = GetUserIds(request, options)
|
||||||
.Except(request.UserIds)
|
.Except(request.ExcludeUserIds)
|
||||||
.Select(i => _userManager.GetUserById(new Guid(i)));
|
.Select(i => _userManager.GetUserById(new Guid(i)));
|
||||||
|
|
||||||
var title = GetTitle(request, options);
|
var title = GetTitle(request, options);
|
||||||
|
var description = GetDescription(request, options);
|
||||||
|
|
||||||
var tasks = _services.Where(i => IsEnabled(i, notificationType))
|
var tasks = _services.Where(i => IsEnabled(i, notificationType))
|
||||||
.Select(i => SendNotification(request, i, users, title, cancellationToken));
|
.Select(i => SendNotification(request, i, users, description, title, cancellationToken));
|
||||||
|
|
||||||
return Task.WhenAll(tasks);
|
return Task.WhenAll(tasks);
|
||||||
}
|
}
|
||||||
|
@ -54,12 +55,13 @@ namespace MediaBrowser.Server.Implementations.Notifications
|
||||||
INotificationService service,
|
INotificationService service,
|
||||||
IEnumerable<User> users,
|
IEnumerable<User> users,
|
||||||
string title,
|
string title,
|
||||||
|
string description,
|
||||||
CancellationToken cancellationToken)
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
users = users.Where(i => IsEnabledForUser(service, i))
|
users = users.Where(i => IsEnabledForUser(service, i))
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
var tasks = users.Select(i => SendNotification(request, service, title, i, cancellationToken));
|
var tasks = users.Select(i => SendNotification(request, service, title, description, i, cancellationToken));
|
||||||
|
|
||||||
return Task.WhenAll(tasks);
|
return Task.WhenAll(tasks);
|
||||||
|
|
||||||
|
@ -89,19 +91,20 @@ namespace MediaBrowser.Server.Implementations.Notifications
|
||||||
.Select(i => i.Id.ToString("N"));
|
.Select(i => i.Id.ToString("N"));
|
||||||
}
|
}
|
||||||
|
|
||||||
return new List<string>();
|
return request.UserIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SendNotification(NotificationRequest request,
|
private async Task SendNotification(NotificationRequest request,
|
||||||
INotificationService service,
|
INotificationService service,
|
||||||
string title,
|
string title,
|
||||||
|
string description,
|
||||||
User user,
|
User user,
|
||||||
CancellationToken cancellationToken)
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var notification = new UserNotification
|
var notification = new UserNotification
|
||||||
{
|
{
|
||||||
Date = request.Date,
|
Date = request.Date,
|
||||||
Description = request.Description,
|
Description = description,
|
||||||
Level = request.Level,
|
Level = request.Level,
|
||||||
Name = title,
|
Name = title,
|
||||||
Url = request.Url,
|
Url = request.Url,
|
||||||
|
@ -162,6 +165,48 @@ namespace MediaBrowser.Server.Implementations.Notifications
|
||||||
return title;
|
return title;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private string GetDescription(NotificationRequest request, NotificationOption options)
|
||||||
|
{
|
||||||
|
var text = request.Description;
|
||||||
|
|
||||||
|
// If empty, grab from options
|
||||||
|
if (string.IsNullOrEmpty(text))
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(request.NotificationType))
|
||||||
|
{
|
||||||
|
if (options != null)
|
||||||
|
{
|
||||||
|
text = options.Title;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If still empty, grab default
|
||||||
|
if (string.IsNullOrEmpty(text))
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(request.NotificationType))
|
||||||
|
{
|
||||||
|
var info = GetNotificationTypes().FirstOrDefault(i => string.Equals(i.Type, request.NotificationType, StringComparison.OrdinalIgnoreCase));
|
||||||
|
|
||||||
|
if (info != null)
|
||||||
|
{
|
||||||
|
text = info.DefaultDescription;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
text = text ?? string.Empty;
|
||||||
|
|
||||||
|
foreach (var pair in request.Variables)
|
||||||
|
{
|
||||||
|
var token = "{" + pair.Key + "}";
|
||||||
|
|
||||||
|
text = text.Replace(token, pair.Value, StringComparison.OrdinalIgnoreCase);
|
||||||
|
}
|
||||||
|
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
private bool IsEnabledForUser(INotificationService service, User user)
|
private bool IsEnabledForUser(INotificationService service, User user)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|
|
@ -1054,7 +1054,7 @@ namespace MediaBrowser.ServerApplication
|
||||||
|
|
||||||
HasUpdateAvailable = false;
|
HasUpdateAvailable = false;
|
||||||
|
|
||||||
OnApplicationUpdated(package.version);
|
OnApplicationUpdated(package);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -373,6 +373,8 @@ namespace MediaBrowser.WebDashboard.Api
|
||||||
sb.Append("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">");
|
sb.Append("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">");
|
||||||
sb.Append("<meta name=\"apple-mobile-web-app-capable\" content=\"yes\">");
|
sb.Append("<meta name=\"apple-mobile-web-app-capable\" content=\"yes\">");
|
||||||
sb.Append("<meta name=\"mobile-web-app-capable\" content=\"yes\">");
|
sb.Append("<meta name=\"mobile-web-app-capable\" content=\"yes\">");
|
||||||
|
//sb.Append("<meta name=\"application-name\" content=\"Media Browser\">");
|
||||||
|
//sb.Append("<meta name=\"msapplication-config\" content=\"config.xml\">");
|
||||||
//sb.Append("<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\">");
|
//sb.Append("<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\">");
|
||||||
|
|
||||||
sb.Append("<link rel=\"icon\" sizes=\"114x114\" href=\"css/images/touchicon114.png\" />");
|
sb.Append("<link rel=\"icon\" sizes=\"114x114\" href=\"css/images/touchicon114.png\" />");
|
||||||
|
@ -382,7 +384,7 @@ namespace MediaBrowser.WebDashboard.Api
|
||||||
sb.Append("<link rel=\"apple-touch-icon\" sizes=\"72x72\" href=\"css/images/touchicon72.png\" />");
|
sb.Append("<link rel=\"apple-touch-icon\" sizes=\"72x72\" href=\"css/images/touchicon72.png\" />");
|
||||||
sb.Append("<link rel=\"apple-touch-icon\" sizes=\"114x114\" href=\"css/images/touchicon114.png\" />");
|
sb.Append("<link rel=\"apple-touch-icon\" sizes=\"114x114\" href=\"css/images/touchicon114.png\" />");
|
||||||
sb.Append("<link rel=\"apple-touch-startup-image\" href=\"css/images/iossplash.png\" />");
|
sb.Append("<link rel=\"apple-touch-startup-image\" href=\"css/images/iossplash.png\" />");
|
||||||
sb.Append("<link rel=\"shortcut icon\" href=\"favicon.ico\" />");
|
sb.Append("<link rel=\"shortcut icon\" href=\"css/images/favicon.ico\" />");
|
||||||
|
|
||||||
return sb.ToString();
|
return sb.ToString();
|
||||||
}
|
}
|
||||||
|
|
|
@ -163,6 +163,7 @@
|
||||||
<Content Include="dashboard-ui\css\images\clients\xbmc.png">
|
<Content Include="dashboard-ui\css\images\clients\xbmc.png">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
<Content Include="dashboard-ui\css\images\favicon.ico" />
|
||||||
<Content Include="dashboard-ui\css\images\icons\audiocd.png">
|
<Content Include="dashboard-ui\css\images\icons\audiocd.png">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
|
Loading…
Reference in a new issue