aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Dlna/Server/ContentDirectory.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Dlna/Server/ContentDirectory.cs')
-rw-r--r--MediaBrowser.Dlna/Server/ContentDirectory.cs151
1 files changed, 151 insertions, 0 deletions
diff --git a/MediaBrowser.Dlna/Server/ContentDirectory.cs b/MediaBrowser.Dlna/Server/ContentDirectory.cs
new file mode 100644
index 000000000..c5b336090
--- /dev/null
+++ b/MediaBrowser.Dlna/Server/ContentDirectory.cs
@@ -0,0 +1,151 @@
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Dlna;
+using MediaBrowser.Controller.Drawing;
+using MediaBrowser.Controller.Dto;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Model.Dlna;
+using MediaBrowser.Model.Logging;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Threading;
+
+namespace MediaBrowser.Dlna.Server
+{
+ public class ContentDirectory : IContentDirectory, IDisposable
+ {
+ private readonly ILogger _logger;
+ private readonly ILibraryManager _libraryManager;
+ private readonly IDtoService _dtoService;
+ private readonly IImageProcessor _imageProcessor;
+ private readonly IUserDataManager _userDataManager;
+ private readonly IDlnaManager _dlna;
+ private readonly IServerConfigurationManager _config;
+ private readonly IUserManager _userManager;
+
+ private readonly IEventManager _eventManager;
+
+ private int _systemUpdateId;
+ private Timer _systemUpdateTimer;
+
+ public ContentDirectory(IDlnaManager dlna,
+ IUserDataManager userDataManager,
+ IImageProcessor imageProcessor,
+ IDtoService dtoService,
+ ILibraryManager libraryManager,
+ ILogManager logManager,
+ IServerConfigurationManager config,
+ IUserManager userManager,
+ IEventManager eventManager)
+ {
+ _dlna = dlna;
+ _userDataManager = userDataManager;
+ _imageProcessor = imageProcessor;
+ _dtoService = dtoService;
+ _libraryManager = libraryManager;
+ _config = config;
+ _userManager = userManager;
+ _eventManager = eventManager;
+ _logger = logManager.GetLogger("DlnaContentDirectory");
+
+ _systemUpdateTimer = new Timer(SystemUdpateTimerCallback, null, Timeout.Infinite,
+ Convert.ToInt64(TimeSpan.FromMinutes(60).TotalMilliseconds));
+ }
+
+ public string GetContentDirectoryXml(IDictionary<string, string> headers)
+ {
+ var profile = _dlna.GetProfile(headers) ??
+ _dlna.GetDefaultProfile();
+
+ return new ContentDirectoryXmlBuilder(profile).GetXml();
+ }
+
+ public ControlResponse ProcessControlRequest(ControlRequest request)
+ {
+ var profile = _dlna.GetProfile(request.Headers) ??
+ _dlna.GetDefaultProfile();
+
+ var device = DlnaServerEntryPoint.Instance.GetServerUpnpDevice(request.TargetServerUuId);
+
+ var serverAddress = device.Descriptor.ToString().Substring(0, device.Descriptor.ToString().IndexOf("/dlna", StringComparison.OrdinalIgnoreCase));
+
+ var user = GetUser(profile);
+
+ return new ControlHandler(
+ _logger,
+ _libraryManager,
+ profile,
+ serverAddress,
+ _dtoService,
+ _imageProcessor,
+ _userDataManager,
+ user,
+ _systemUpdateId)
+ .ProcessControlRequest(request);
+ }
+
+ private User GetUser(DeviceProfile profile)
+ {
+ if (!string.IsNullOrEmpty(profile.UserId))
+ {
+ var user = _userManager.GetUserById(new Guid(profile.UserId));
+
+ if (user != null)
+ {
+ return user;
+ }
+ }
+
+ if (!string.IsNullOrEmpty(_config.Configuration.DlnaOptions.DefaultUserId))
+ {
+ var user = _userManager.GetUserById(new Guid(_config.Configuration.DlnaOptions.DefaultUserId));
+
+ if (user != null)
+ {
+ return user;
+ }
+ }
+
+ // No configuration so it's going to be pretty arbitrary
+ return _userManager.Users.First();
+ }
+
+ private readonly CultureInfo _usCulture = new CultureInfo("en-US");
+ private async void SystemUdpateTimerCallback(object state)
+ {
+ var values = new Dictionary<string, string>();
+
+ _systemUpdateId++;
+ values["SystemUpdateID"] = _systemUpdateId.ToString(_usCulture);
+
+ try
+ {
+ await _eventManager.TriggerEvent("upnp:event", values).ConfigureAwait(false);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error sending system update notification", ex);
+ }
+ }
+
+ private readonly object _disposeLock = new object();
+ public void Dispose()
+ {
+ lock (_disposeLock)
+ {
+ DisposeUpdateTimer();
+ }
+ }
+
+ private void DisposeUpdateTimer()
+ {
+ if (_systemUpdateTimer != null)
+ {
+ _systemUpdateTimer.Dispose();
+ _systemUpdateTimer = null;
+ }
+ }
+ }
+}