Merge pull request #10391 from barronpm/dlna-cleanup
This commit is contained in:
commit
5277339982
69
Emby.Dlna/Extensions/DlnaServiceCollectionExtensions.cs
Normal file
69
Emby.Dlna/Extensions/DlnaServiceCollectionExtensions.cs
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
using System;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Text;
|
||||||
|
using Emby.Dlna.ConnectionManager;
|
||||||
|
using Emby.Dlna.ContentDirectory;
|
||||||
|
using Emby.Dlna.MediaReceiverRegistrar;
|
||||||
|
using Emby.Dlna.Ssdp;
|
||||||
|
using MediaBrowser.Common.Net;
|
||||||
|
using MediaBrowser.Controller;
|
||||||
|
using MediaBrowser.Controller.Dlna;
|
||||||
|
using MediaBrowser.Model.Dlna;
|
||||||
|
using MediaBrowser.Model.Net;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Rssdp.Infrastructure;
|
||||||
|
|
||||||
|
namespace Emby.Dlna.Extensions;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Extension methods for adding DLNA services.
|
||||||
|
/// </summary>
|
||||||
|
public static class DlnaServiceCollectionExtensions
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Adds DLNA services to the provided <see cref="IServiceCollection"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="services">The <see cref="IServiceCollection"/>.</param>
|
||||||
|
/// <param name="applicationHost">The <see cref="IServerApplicationHost"/>.</param>
|
||||||
|
public static void AddDlnaServices(
|
||||||
|
this IServiceCollection services,
|
||||||
|
IServerApplicationHost applicationHost)
|
||||||
|
{
|
||||||
|
services.AddHttpClient(NamedClient.Dlna, c =>
|
||||||
|
{
|
||||||
|
c.DefaultRequestHeaders.UserAgent.ParseAdd(
|
||||||
|
string.Format(
|
||||||
|
CultureInfo.InvariantCulture,
|
||||||
|
"{0}/{1} UPnP/1.0 {2}/{3}",
|
||||||
|
Environment.OSVersion.Platform,
|
||||||
|
Environment.OSVersion,
|
||||||
|
applicationHost.Name,
|
||||||
|
applicationHost.ApplicationVersionString));
|
||||||
|
|
||||||
|
c.DefaultRequestHeaders.Add("CPFN.UPNP.ORG", applicationHost.FriendlyName); // Required for UPnP DeviceArchitecture v2.0
|
||||||
|
c.DefaultRequestHeaders.Add("FriendlyName.DLNA.ORG", applicationHost.FriendlyName); // REVIEW: where does this come from?
|
||||||
|
})
|
||||||
|
.ConfigurePrimaryHttpMessageHandler(_ => new SocketsHttpHandler
|
||||||
|
{
|
||||||
|
AutomaticDecompression = DecompressionMethods.All,
|
||||||
|
RequestHeaderEncodingSelector = (_, _) => Encoding.UTF8
|
||||||
|
});
|
||||||
|
|
||||||
|
services.AddSingleton<IDlnaManager, DlnaManager>();
|
||||||
|
services.AddSingleton<IDeviceDiscovery, DeviceDiscovery>();
|
||||||
|
services.AddSingleton<IContentDirectory, ContentDirectoryService>();
|
||||||
|
services.AddSingleton<IConnectionManager, ConnectionManagerService>();
|
||||||
|
services.AddSingleton<IMediaReceiverRegistrar, MediaReceiverRegistrarService>();
|
||||||
|
|
||||||
|
services.AddSingleton<ISsdpCommunicationsServer>(provider => new SsdpCommunicationsServer(
|
||||||
|
provider.GetRequiredService<ISocketFactory>(),
|
||||||
|
provider.GetRequiredService<INetworkManager>(),
|
||||||
|
provider.GetRequiredService<ILogger<SsdpCommunicationsServer>>())
|
||||||
|
{
|
||||||
|
IsShared = true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -23,10 +23,8 @@ using MediaBrowser.Controller.Library;
|
||||||
using MediaBrowser.Controller.MediaEncoding;
|
using MediaBrowser.Controller.MediaEncoding;
|
||||||
using MediaBrowser.Controller.Plugins;
|
using MediaBrowser.Controller.Plugins;
|
||||||
using MediaBrowser.Controller.Session;
|
using MediaBrowser.Controller.Session;
|
||||||
using MediaBrowser.Controller.TV;
|
|
||||||
using MediaBrowser.Model.Dlna;
|
using MediaBrowser.Model.Dlna;
|
||||||
using MediaBrowser.Model.Globalization;
|
using MediaBrowser.Model.Globalization;
|
||||||
using MediaBrowser.Model.Net;
|
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Rssdp;
|
using Rssdp;
|
||||||
using Rssdp.Infrastructure;
|
using Rssdp.Infrastructure;
|
||||||
|
@ -49,14 +47,13 @@ namespace Emby.Dlna.Main
|
||||||
private readonly IMediaSourceManager _mediaSourceManager;
|
private readonly IMediaSourceManager _mediaSourceManager;
|
||||||
private readonly IMediaEncoder _mediaEncoder;
|
private readonly IMediaEncoder _mediaEncoder;
|
||||||
private readonly IDeviceDiscovery _deviceDiscovery;
|
private readonly IDeviceDiscovery _deviceDiscovery;
|
||||||
private readonly ISocketFactory _socketFactory;
|
private readonly ISsdpCommunicationsServer _communicationsServer;
|
||||||
private readonly INetworkManager _networkManager;
|
private readonly INetworkManager _networkManager;
|
||||||
private readonly object _syncLock = new object();
|
private readonly object _syncLock = new();
|
||||||
private readonly bool _disabled;
|
private readonly bool _disabled;
|
||||||
|
|
||||||
private PlayToManager _manager;
|
private PlayToManager _manager;
|
||||||
private SsdpDevicePublisher _publisher;
|
private SsdpDevicePublisher _publisher;
|
||||||
private ISsdpCommunicationsServer _communicationsServer;
|
|
||||||
|
|
||||||
private bool _disposed;
|
private bool _disposed;
|
||||||
|
|
||||||
|
@ -75,10 +72,8 @@ namespace Emby.Dlna.Main
|
||||||
IMediaSourceManager mediaSourceManager,
|
IMediaSourceManager mediaSourceManager,
|
||||||
IDeviceDiscovery deviceDiscovery,
|
IDeviceDiscovery deviceDiscovery,
|
||||||
IMediaEncoder mediaEncoder,
|
IMediaEncoder mediaEncoder,
|
||||||
ISocketFactory socketFactory,
|
ISsdpCommunicationsServer communicationsServer,
|
||||||
INetworkManager networkManager,
|
INetworkManager networkManager)
|
||||||
IUserViewManager userViewManager,
|
|
||||||
ITVSeriesManager tvSeriesManager)
|
|
||||||
{
|
{
|
||||||
_config = config;
|
_config = config;
|
||||||
_appHost = appHost;
|
_appHost = appHost;
|
||||||
|
@ -93,37 +88,10 @@ namespace Emby.Dlna.Main
|
||||||
_mediaSourceManager = mediaSourceManager;
|
_mediaSourceManager = mediaSourceManager;
|
||||||
_deviceDiscovery = deviceDiscovery;
|
_deviceDiscovery = deviceDiscovery;
|
||||||
_mediaEncoder = mediaEncoder;
|
_mediaEncoder = mediaEncoder;
|
||||||
_socketFactory = socketFactory;
|
_communicationsServer = communicationsServer;
|
||||||
_networkManager = networkManager;
|
_networkManager = networkManager;
|
||||||
_logger = loggerFactory.CreateLogger<DlnaEntryPoint>();
|
_logger = loggerFactory.CreateLogger<DlnaEntryPoint>();
|
||||||
|
|
||||||
ContentDirectory = new ContentDirectory.ContentDirectoryService(
|
|
||||||
dlnaManager,
|
|
||||||
userDataManager,
|
|
||||||
imageProcessor,
|
|
||||||
libraryManager,
|
|
||||||
config,
|
|
||||||
userManager,
|
|
||||||
loggerFactory.CreateLogger<ContentDirectory.ContentDirectoryService>(),
|
|
||||||
httpClientFactory,
|
|
||||||
localizationManager,
|
|
||||||
mediaSourceManager,
|
|
||||||
userViewManager,
|
|
||||||
mediaEncoder,
|
|
||||||
tvSeriesManager);
|
|
||||||
|
|
||||||
ConnectionManager = new ConnectionManager.ConnectionManagerService(
|
|
||||||
dlnaManager,
|
|
||||||
config,
|
|
||||||
loggerFactory.CreateLogger<ConnectionManager.ConnectionManagerService>(),
|
|
||||||
httpClientFactory);
|
|
||||||
|
|
||||||
MediaReceiverRegistrar = new MediaReceiverRegistrar.MediaReceiverRegistrarService(
|
|
||||||
loggerFactory.CreateLogger<MediaReceiverRegistrar.MediaReceiverRegistrarService>(),
|
|
||||||
httpClientFactory,
|
|
||||||
config);
|
|
||||||
Current = this;
|
|
||||||
|
|
||||||
var netConfig = config.GetConfiguration<NetworkConfiguration>(NetworkConfigurationStore.StoreKey);
|
var netConfig = config.GetConfiguration<NetworkConfiguration>(NetworkConfigurationStore.StoreKey);
|
||||||
_disabled = appHost.ListenWithHttps && netConfig.RequireHttps;
|
_disabled = appHost.ListenWithHttps && netConfig.RequireHttps;
|
||||||
|
|
||||||
|
@ -133,19 +101,6 @@ namespace Emby.Dlna.Main
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static DlnaEntryPoint Current { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets a value indicating whether the dlna server is enabled.
|
|
||||||
/// </summary>
|
|
||||||
public static bool Enabled { get; private set; }
|
|
||||||
|
|
||||||
public IContentDirectory ContentDirectory { get; private set; }
|
|
||||||
|
|
||||||
public IConnectionManager ConnectionManager { get; private set; }
|
|
||||||
|
|
||||||
public IMediaReceiverRegistrar MediaReceiverRegistrar { get; private set; }
|
|
||||||
|
|
||||||
public async Task RunAsync()
|
public async Task RunAsync()
|
||||||
{
|
{
|
||||||
await ((DlnaManager)_dlnaManager).InitProfilesAsync().ConfigureAwait(false);
|
await ((DlnaManager)_dlnaManager).InitProfilesAsync().ConfigureAwait(false);
|
||||||
|
@ -172,9 +127,7 @@ namespace Emby.Dlna.Main
|
||||||
private void ReloadComponents()
|
private void ReloadComponents()
|
||||||
{
|
{
|
||||||
var options = _config.GetDlnaConfiguration();
|
var options = _config.GetDlnaConfiguration();
|
||||||
Enabled = options.EnableServer;
|
StartDeviceDiscovery();
|
||||||
|
|
||||||
StartSsdpHandler();
|
|
||||||
|
|
||||||
if (options.EnableServer)
|
if (options.EnableServer)
|
||||||
{
|
{
|
||||||
|
@ -195,37 +148,11 @@ namespace Emby.Dlna.Main
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void StartSsdpHandler()
|
private void StartDeviceDiscovery()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (_communicationsServer is null)
|
((DeviceDiscovery)_deviceDiscovery).Start(_communicationsServer);
|
||||||
{
|
|
||||||
_communicationsServer = new SsdpCommunicationsServer(
|
|
||||||
_socketFactory,
|
|
||||||
_networkManager,
|
|
||||||
_logger)
|
|
||||||
{
|
|
||||||
IsShared = true
|
|
||||||
};
|
|
||||||
|
|
||||||
StartDeviceDiscovery(_communicationsServer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogError(ex, "Error starting SSDP handlers");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void StartDeviceDiscovery(ISsdpCommunicationsServer communicationsServer)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (communicationsServer is not null)
|
|
||||||
{
|
|
||||||
((DeviceDiscovery)_deviceDiscovery).Start(communicationsServer);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
@ -233,19 +160,6 @@ namespace Emby.Dlna.Main
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DisposeDeviceDiscovery()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
_logger.LogInformation("Disposing DeviceDiscovery");
|
|
||||||
((DeviceDiscovery)_deviceDiscovery).Dispose();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogError(ex, "Error stopping device discovery");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void StartDevicePublisher(Configuration.DlnaOptions options)
|
public void StartDevicePublisher(Configuration.DlnaOptions options)
|
||||||
{
|
{
|
||||||
if (_publisher is not null)
|
if (_publisher is not null)
|
||||||
|
@ -318,7 +232,7 @@ namespace Emby.Dlna.Main
|
||||||
// This must be a globally unique value that survives reboots etc. Get from storage or embedded hardware etc.
|
// This must be a globally unique value that survives reboots etc. Get from storage or embedded hardware etc.
|
||||||
};
|
};
|
||||||
|
|
||||||
SetProperies(device, fullService);
|
SetProperties(device, fullService);
|
||||||
_publisher.AddDevice(device);
|
_publisher.AddDevice(device);
|
||||||
|
|
||||||
var embeddedDevices = new[]
|
var embeddedDevices = new[]
|
||||||
|
@ -339,13 +253,13 @@ namespace Emby.Dlna.Main
|
||||||
// This must be a globally unique value that survives reboots etc. Get from storage or embedded hardware etc.
|
// This must be a globally unique value that survives reboots etc. Get from storage or embedded hardware etc.
|
||||||
};
|
};
|
||||||
|
|
||||||
SetProperies(embeddedDevice, subDevice);
|
SetProperties(embeddedDevice, subDevice);
|
||||||
device.AddDevice(embeddedDevice);
|
device.AddDevice(embeddedDevice);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private string CreateUuid(string text)
|
private static string CreateUuid(string text)
|
||||||
{
|
{
|
||||||
if (!Guid.TryParse(text, out var guid))
|
if (!Guid.TryParse(text, out var guid))
|
||||||
{
|
{
|
||||||
|
@ -355,15 +269,14 @@ namespace Emby.Dlna.Main
|
||||||
return guid.ToString("D", CultureInfo.InvariantCulture);
|
return guid.ToString("D", CultureInfo.InvariantCulture);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetProperies(SsdpDevice device, string fullDeviceType)
|
private static void SetProperties(SsdpDevice device, string fullDeviceType)
|
||||||
{
|
{
|
||||||
var service = fullDeviceType.Replace("urn:", string.Empty, StringComparison.OrdinalIgnoreCase).Replace(":1", string.Empty, StringComparison.OrdinalIgnoreCase);
|
var serviceParts = fullDeviceType
|
||||||
|
.Replace("urn:", string.Empty, StringComparison.OrdinalIgnoreCase)
|
||||||
|
.Replace(":1", string.Empty, StringComparison.OrdinalIgnoreCase)
|
||||||
|
.Split(':');
|
||||||
|
|
||||||
var serviceParts = service.Split(':');
|
device.DeviceTypeNamespace = serviceParts[0].Replace('.', '-');
|
||||||
|
|
||||||
var deviceTypeNamespace = serviceParts[0].Replace('.', '-');
|
|
||||||
|
|
||||||
device.DeviceTypeNamespace = deviceTypeNamespace;
|
|
||||||
device.DeviceClass = serviceParts[1];
|
device.DeviceClass = serviceParts[1];
|
||||||
device.DeviceType = serviceParts[2];
|
device.DeviceType = serviceParts[2];
|
||||||
}
|
}
|
||||||
|
@ -444,20 +357,6 @@ namespace Emby.Dlna.Main
|
||||||
|
|
||||||
DisposeDevicePublisher();
|
DisposeDevicePublisher();
|
||||||
DisposePlayToManager();
|
DisposePlayToManager();
|
||||||
DisposeDeviceDiscovery();
|
|
||||||
|
|
||||||
if (_communicationsServer is not null)
|
|
||||||
{
|
|
||||||
_logger.LogInformation("Disposing SsdpCommunicationsServer");
|
|
||||||
_communicationsServer.Dispose();
|
|
||||||
_communicationsServer = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
ContentDirectory = null;
|
|
||||||
ConnectionManager = null;
|
|
||||||
MediaReceiverRegistrar = null;
|
|
||||||
Current = null;
|
|
||||||
|
|
||||||
_disposed = true;
|
_disposed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,9 +13,7 @@ using System.Net;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Security.Cryptography.X509Certificates;
|
using System.Security.Cryptography.X509Certificates;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Emby.Dlna;
|
|
||||||
using Emby.Dlna.Main;
|
using Emby.Dlna.Main;
|
||||||
using Emby.Dlna.Ssdp;
|
|
||||||
using Emby.Naming.Common;
|
using Emby.Naming.Common;
|
||||||
using Emby.Photos;
|
using Emby.Photos;
|
||||||
using Emby.Server.Implementations.Channels;
|
using Emby.Server.Implementations.Channels;
|
||||||
|
@ -58,7 +56,6 @@ using MediaBrowser.Controller.Chapters;
|
||||||
using MediaBrowser.Controller.ClientEvent;
|
using MediaBrowser.Controller.ClientEvent;
|
||||||
using MediaBrowser.Controller.Collections;
|
using MediaBrowser.Controller.Collections;
|
||||||
using MediaBrowser.Controller.Configuration;
|
using MediaBrowser.Controller.Configuration;
|
||||||
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;
|
||||||
|
@ -82,7 +79,6 @@ using MediaBrowser.LocalMetadata.Savers;
|
||||||
using MediaBrowser.MediaEncoding.BdInfo;
|
using MediaBrowser.MediaEncoding.BdInfo;
|
||||||
using MediaBrowser.MediaEncoding.Subtitles;
|
using MediaBrowser.MediaEncoding.Subtitles;
|
||||||
using MediaBrowser.Model.Cryptography;
|
using MediaBrowser.Model.Cryptography;
|
||||||
using MediaBrowser.Model.Dlna;
|
|
||||||
using MediaBrowser.Model.Globalization;
|
using MediaBrowser.Model.Globalization;
|
||||||
using MediaBrowser.Model.IO;
|
using MediaBrowser.Model.IO;
|
||||||
using MediaBrowser.Model.MediaInfo;
|
using MediaBrowser.Model.MediaInfo;
|
||||||
|
@ -563,8 +559,6 @@ namespace Emby.Server.Implementations
|
||||||
|
|
||||||
serviceCollection.AddSingleton<ISessionManager, SessionManager>();
|
serviceCollection.AddSingleton<ISessionManager, SessionManager>();
|
||||||
|
|
||||||
serviceCollection.AddSingleton<IDlnaManager, DlnaManager>();
|
|
||||||
|
|
||||||
serviceCollection.AddSingleton<ICollectionManager, CollectionManager>();
|
serviceCollection.AddSingleton<ICollectionManager, CollectionManager>();
|
||||||
|
|
||||||
serviceCollection.AddSingleton<IPlaylistManager, PlaylistManager>();
|
serviceCollection.AddSingleton<IPlaylistManager, PlaylistManager>();
|
||||||
|
@ -576,8 +570,6 @@ namespace Emby.Server.Implementations
|
||||||
|
|
||||||
serviceCollection.AddSingleton<IUserViewManager, UserViewManager>();
|
serviceCollection.AddSingleton<IUserViewManager, UserViewManager>();
|
||||||
|
|
||||||
serviceCollection.AddSingleton<IDeviceDiscovery, DeviceDiscovery>();
|
|
||||||
|
|
||||||
serviceCollection.AddSingleton<IChapterManager, ChapterManager>();
|
serviceCollection.AddSingleton<IChapterManager, ChapterManager>();
|
||||||
|
|
||||||
serviceCollection.AddSingleton<IEncodingManager, MediaEncoder.EncodingManager>();
|
serviceCollection.AddSingleton<IEncodingManager, MediaEncoder.EncodingManager>();
|
||||||
|
|
|
@ -5,7 +5,6 @@ using System.IO;
|
||||||
using System.Net.Mime;
|
using System.Net.Mime;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Emby.Dlna;
|
using Emby.Dlna;
|
||||||
using Emby.Dlna.Main;
|
|
||||||
using Jellyfin.Api.Attributes;
|
using Jellyfin.Api.Attributes;
|
||||||
using Jellyfin.Api.Constants;
|
using Jellyfin.Api.Constants;
|
||||||
using MediaBrowser.Controller.Dlna;
|
using MediaBrowser.Controller.Dlna;
|
||||||
|
@ -33,12 +32,19 @@ public class DlnaServerController : BaseJellyfinApiController
|
||||||
/// Initializes a new instance of the <see cref="DlnaServerController"/> class.
|
/// Initializes a new instance of the <see cref="DlnaServerController"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dlnaManager">Instance of the <see cref="IDlnaManager"/> interface.</param>
|
/// <param name="dlnaManager">Instance of the <see cref="IDlnaManager"/> interface.</param>
|
||||||
public DlnaServerController(IDlnaManager dlnaManager)
|
/// <param name="contentDirectory">Instance of the <see cref="IContentDirectory"/> interface.</param>
|
||||||
|
/// <param name="connectionManager">Instance of the <see cref="IConnectionManager"/> interface.</param>
|
||||||
|
/// <param name="mediaReceiverRegistrar">Instance of the <see cref="IMediaReceiverRegistrar"/> interface.</param>
|
||||||
|
public DlnaServerController(
|
||||||
|
IDlnaManager dlnaManager,
|
||||||
|
IContentDirectory contentDirectory,
|
||||||
|
IConnectionManager connectionManager,
|
||||||
|
IMediaReceiverRegistrar mediaReceiverRegistrar)
|
||||||
{
|
{
|
||||||
_dlnaManager = dlnaManager;
|
_dlnaManager = dlnaManager;
|
||||||
_contentDirectory = DlnaEntryPoint.Current.ContentDirectory;
|
_contentDirectory = contentDirectory;
|
||||||
_connectionManager = DlnaEntryPoint.Current.ConnectionManager;
|
_connectionManager = connectionManager;
|
||||||
_mediaReceiverRegistrar = DlnaEntryPoint.Current.MediaReceiverRegistrar;
|
_mediaReceiverRegistrar = mediaReceiverRegistrar;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Globalization;
|
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Net.Http.Headers;
|
using System.Net.Http.Headers;
|
||||||
using System.Net.Mime;
|
using System.Net.Mime;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using Emby.Dlna.Extensions;
|
||||||
using Jellyfin.Api.Middleware;
|
using Jellyfin.Api.Middleware;
|
||||||
using Jellyfin.MediaEncoding.Hls.Extensions;
|
using Jellyfin.MediaEncoding.Hls.Extensions;
|
||||||
using Jellyfin.Networking.Configuration;
|
using Jellyfin.Networking.Configuration;
|
||||||
|
@ -27,7 +27,6 @@ using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.FileProviders;
|
using Microsoft.Extensions.FileProviders;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using Microsoft.VisualBasic;
|
|
||||||
using Prometheus;
|
using Prometheus;
|
||||||
|
|
||||||
namespace Jellyfin.Server
|
namespace Jellyfin.Server
|
||||||
|
@ -120,26 +119,11 @@ namespace Jellyfin.Server
|
||||||
})
|
})
|
||||||
.ConfigurePrimaryHttpMessageHandler(defaultHttpClientHandlerDelegate);
|
.ConfigurePrimaryHttpMessageHandler(defaultHttpClientHandlerDelegate);
|
||||||
|
|
||||||
services.AddHttpClient(NamedClient.Dlna, c =>
|
|
||||||
{
|
|
||||||
c.DefaultRequestHeaders.UserAgent.ParseAdd(
|
|
||||||
string.Format(
|
|
||||||
CultureInfo.InvariantCulture,
|
|
||||||
"{0}/{1} UPnP/1.0 {2}/{3}",
|
|
||||||
Environment.OSVersion.Platform,
|
|
||||||
Environment.OSVersion,
|
|
||||||
_serverApplicationHost.Name,
|
|
||||||
_serverApplicationHost.ApplicationVersionString));
|
|
||||||
|
|
||||||
c.DefaultRequestHeaders.Add("CPFN.UPNP.ORG", _serverApplicationHost.FriendlyName); // Required for UPnP DeviceArchitecture v2.0
|
|
||||||
c.DefaultRequestHeaders.Add("FriendlyName.DLNA.ORG", _serverApplicationHost.FriendlyName); // REVIEW: where does this come from?
|
|
||||||
})
|
|
||||||
.ConfigurePrimaryHttpMessageHandler(defaultHttpClientHandlerDelegate);
|
|
||||||
|
|
||||||
services.AddHealthChecks()
|
services.AddHealthChecks()
|
||||||
.AddCheck<DbContextFactoryHealthCheck<JellyfinDbContext>>(nameof(JellyfinDbContext));
|
.AddCheck<DbContextFactoryHealthCheck<JellyfinDbContext>>(nameof(JellyfinDbContext));
|
||||||
|
|
||||||
services.AddHlsPlaylistGenerator();
|
services.AddHlsPlaylistGenerator();
|
||||||
|
services.AddDlnaServices(_serverApplicationHost);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user