aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2016-11-03 18:06:00 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2016-11-03 18:06:00 -0400
commit1d62a88fd8147e9c1bf01cac2852b929b1737c17 (patch)
tree7fa1e7dd215551ca7e6fdfcf106dfb265500f5aa /MediaBrowser.Server.Implementations
parent13dcb5abb1682940a45e83e5a9f7b71289231986 (diff)
move classes to portable server project
Diffstat (limited to 'MediaBrowser.Server.Implementations')
-rw-r--r--MediaBrowser.Server.Implementations/EntryPoints/AutomaticRestartEntryPoint.cs121
-rw-r--r--MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs340
-rw-r--r--MediaBrowser.Server.Implementations/EntryPoints/LoadRegistrations.cs71
-rw-r--r--MediaBrowser.Server.Implementations/EntryPoints/RecordingNotifier.cs77
-rw-r--r--MediaBrowser.Server.Implementations/EntryPoints/RefreshUsersMetadata.cs41
-rw-r--r--MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs203
-rw-r--r--MediaBrowser.Server.Implementations/EntryPoints/UsageEntryPoint.cs133
-rw-r--r--MediaBrowser.Server.Implementations/EntryPoints/UsageReporter.cs138
-rw-r--r--MediaBrowser.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs162
-rw-r--r--MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj137
-rw-r--r--MediaBrowser.Server.Implementations/MediaEncoder/EncodingManager.cs236
-rw-r--r--MediaBrowser.Server.Implementations/News/NewsEntryPoint.cs170
-rw-r--r--MediaBrowser.Server.Implementations/packages.config3
13 files changed, 60 insertions, 1772 deletions
diff --git a/MediaBrowser.Server.Implementations/EntryPoints/AutomaticRestartEntryPoint.cs b/MediaBrowser.Server.Implementations/EntryPoints/AutomaticRestartEntryPoint.cs
deleted file mode 100644
index 1067e052d..000000000
--- a/MediaBrowser.Server.Implementations/EntryPoints/AutomaticRestartEntryPoint.cs
+++ /dev/null
@@ -1,121 +0,0 @@
-using MediaBrowser.Controller;
-using MediaBrowser.Controller.Configuration;
-using MediaBrowser.Controller.Plugins;
-using MediaBrowser.Controller.Session;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Tasks;
-using System;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Controller.LiveTv;
-using MediaBrowser.Model.LiveTv;
-
-namespace MediaBrowser.Server.Implementations.EntryPoints
-{
- public class AutomaticRestartEntryPoint : IServerEntryPoint
- {
- private readonly IServerApplicationHost _appHost;
- private readonly ILogger _logger;
- private readonly ITaskManager _iTaskManager;
- private readonly ISessionManager _sessionManager;
- private readonly IServerConfigurationManager _config;
- private readonly ILiveTvManager _liveTvManager;
-
- private Timer _timer;
-
- public AutomaticRestartEntryPoint(IServerApplicationHost appHost, ILogger logger, ITaskManager iTaskManager, ISessionManager sessionManager, IServerConfigurationManager config, ILiveTvManager liveTvManager)
- {
- _appHost = appHost;
- _logger = logger;
- _iTaskManager = iTaskManager;
- _sessionManager = sessionManager;
- _config = config;
- _liveTvManager = liveTvManager;
- }
-
- public void Run()
- {
- if (_appHost.CanSelfRestart)
- {
- _appHost.HasPendingRestartChanged += _appHost_HasPendingRestartChanged;
- }
- }
-
- void _appHost_HasPendingRestartChanged(object sender, EventArgs e)
- {
- DisposeTimer();
-
- if (_appHost.HasPendingRestart)
- {
- _timer = new Timer(TimerCallback, null, TimeSpan.FromMinutes(10), TimeSpan.FromMinutes(10));
- }
- }
-
- private async void TimerCallback(object state)
- {
- if (_config.Configuration.EnableAutomaticRestart)
- {
- var isIdle = await IsIdle().ConfigureAwait(false);
-
- if (isIdle)
- {
- DisposeTimer();
-
- try
- {
- _appHost.Restart();
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error restarting server", ex);
- }
- }
- }
- }
-
- private async Task<bool> IsIdle()
- {
- if (_iTaskManager.ScheduledTasks.Any(i => i.State != TaskState.Idle))
- {
- return false;
- }
-
- if (_liveTvManager.Services.Count == 1)
- {
- try
- {
- var timers = await _liveTvManager.GetTimers(new TimerQuery(), CancellationToken.None).ConfigureAwait(false);
- if (timers.Items.Any(i => i.Status == RecordingStatus.InProgress))
- {
- return false;
- }
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error getting timers", ex);
- }
- }
-
- var now = DateTime.UtcNow;
-
- return !_sessionManager.Sessions.Any(i => (now - i.LastActivityDate).TotalMinutes < 30);
- }
-
- public void Dispose()
- {
- _appHost.HasPendingRestartChanged -= _appHost_HasPendingRestartChanged;
-
- DisposeTimer();
- }
-
- private void DisposeTimer()
- {
- if (_timer != null)
- {
- _timer.Dispose();
- _timer = null;
- }
- }
- }
-}
diff --git a/MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs b/MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs
deleted file mode 100644
index 9f06a9860..000000000
--- a/MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs
+++ /dev/null
@@ -1,340 +0,0 @@
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.Plugins;
-using MediaBrowser.Controller.Session;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Logging;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading;
-using MediaBrowser.Controller.Entities.Audio;
-using MediaBrowser.Model.Extensions;
-
-namespace MediaBrowser.Server.Implementations.EntryPoints
-{
- public class LibraryChangedNotifier : IServerEntryPoint
- {
- /// <summary>
- /// The _library manager
- /// </summary>
- private readonly ILibraryManager _libraryManager;
-
- private readonly ISessionManager _sessionManager;
- private readonly IUserManager _userManager;
- private readonly ILogger _logger;
-
- /// <summary>
- /// The _library changed sync lock
- /// </summary>
- private readonly object _libraryChangedSyncLock = new object();
-
- private readonly List<Folder> _foldersAddedTo = new List<Folder>();
- private readonly List<Folder> _foldersRemovedFrom = new List<Folder>();
-
- private readonly List<BaseItem> _itemsAdded = new List<BaseItem>();
- private readonly List<BaseItem> _itemsRemoved = new List<BaseItem>();
- private readonly List<BaseItem> _itemsUpdated = new List<BaseItem>();
-
- /// <summary>
- /// Gets or sets the library update timer.
- /// </summary>
- /// <value>The library update timer.</value>
- private Timer LibraryUpdateTimer { get; set; }
-
- /// <summary>
- /// The library update duration
- /// </summary>
- private const int LibraryUpdateDuration = 5000;
-
- public LibraryChangedNotifier(ILibraryManager libraryManager, ISessionManager sessionManager, IUserManager userManager, ILogger logger)
- {
- _libraryManager = libraryManager;
- _sessionManager = sessionManager;
- _userManager = userManager;
- _logger = logger;
- }
-
- public void Run()
- {
- _libraryManager.ItemAdded += libraryManager_ItemAdded;
- _libraryManager.ItemUpdated += libraryManager_ItemUpdated;
- _libraryManager.ItemRemoved += libraryManager_ItemRemoved;
-
- }
-
- /// <summary>
- /// Handles the ItemAdded event of the libraryManager control.
- /// </summary>
- /// <param name="sender">The source of the event.</param>
- /// <param name="e">The <see cref="ItemChangeEventArgs"/> instance containing the event data.</param>
- void libraryManager_ItemAdded(object sender, ItemChangeEventArgs e)
- {
- if (!FilterItem(e.Item))
- {
- return;
- }
-
- lock (_libraryChangedSyncLock)
- {
- if (LibraryUpdateTimer == null)
- {
- LibraryUpdateTimer = new Timer(LibraryUpdateTimerCallback, null, LibraryUpdateDuration,
- Timeout.Infinite);
- }
- else
- {
- LibraryUpdateTimer.Change(LibraryUpdateDuration, Timeout.Infinite);
- }
-
- if (e.Item.Parent != null)
- {
- _foldersAddedTo.Add(e.Item.Parent);
- }
-
- _itemsAdded.Add(e.Item);
- }
- }
-
- /// <summary>
- /// Handles the ItemUpdated event of the libraryManager control.
- /// </summary>
- /// <param name="sender">The source of the event.</param>
- /// <param name="e">The <see cref="ItemChangeEventArgs"/> instance containing the event data.</param>
- void libraryManager_ItemUpdated(object sender, ItemChangeEventArgs e)
- {
- if (!FilterItem(e.Item))
- {
- return;
- }
-
- lock (_libraryChangedSyncLock)
- {
- if (LibraryUpdateTimer == null)
- {
- LibraryUpdateTimer = new Timer(LibraryUpdateTimerCallback, null, LibraryUpdateDuration,
- Timeout.Infinite);
- }
- else
- {
- LibraryUpdateTimer.Change(LibraryUpdateDuration, Timeout.Infinite);
- }
-
- _itemsUpdated.Add(e.Item);
- }
- }
-
- /// <summary>
- /// Handles the ItemRemoved event of the libraryManager control.
- /// </summary>
- /// <param name="sender">The source of the event.</param>
- /// <param name="e">The <see cref="ItemChangeEventArgs"/> instance containing the event data.</param>
- void libraryManager_ItemRemoved(object sender, ItemChangeEventArgs e)
- {
- if (!FilterItem(e.Item))
- {
- return;
- }
-
- lock (_libraryChangedSyncLock)
- {
- if (LibraryUpdateTimer == null)
- {
- LibraryUpdateTimer = new Timer(LibraryUpdateTimerCallback, null, LibraryUpdateDuration,
- Timeout.Infinite);
- }
- else
- {
- LibraryUpdateTimer.Change(LibraryUpdateDuration, Timeout.Infinite);
- }
-
- if (e.Item.Parent != null)
- {
- _foldersRemovedFrom.Add(e.Item.Parent);
- }
-
- _itemsRemoved.Add(e.Item);
- }
- }
-
- /// <summary>
- /// Libraries the update timer callback.
- /// </summary>
- /// <param name="state">The state.</param>
- private void LibraryUpdateTimerCallback(object state)
- {
- lock (_libraryChangedSyncLock)
- {
- // Remove dupes in case some were saved multiple times
- var foldersAddedTo = _foldersAddedTo.DistinctBy(i => i.Id).ToList();
-
- var foldersRemovedFrom = _foldersRemovedFrom.DistinctBy(i => i.Id).ToList();
-
- var itemsUpdated = _itemsUpdated
- .Where(i => !_itemsAdded.Contains(i))
- .DistinctBy(i => i.Id)
- .ToList();
-
- SendChangeNotifications(_itemsAdded.ToList(), itemsUpdated, _itemsRemoved.ToList(), foldersAddedTo, foldersRemovedFrom, CancellationToken.None);
-
- if (LibraryUpdateTimer != null)
- {
- LibraryUpdateTimer.Dispose();
- LibraryUpdateTimer = null;
- }
-
- _itemsAdded.Clear();
- _itemsRemoved.Clear();
- _itemsUpdated.Clear();
- _foldersAddedTo.Clear();
- _foldersRemovedFrom.Clear();
- }
- }
-
- /// <summary>
- /// Sends the change notifications.
- /// </summary>
- /// <param name="itemsAdded">The items added.</param>
- /// <param name="itemsUpdated">The items updated.</param>
- /// <param name="itemsRemoved">The items removed.</param>
- /// <param name="foldersAddedTo">The folders added to.</param>
- /// <param name="foldersRemovedFrom">The folders removed from.</param>
- /// <param name="cancellationToken">The cancellation token.</param>
- private async void SendChangeNotifications(List<BaseItem> itemsAdded, List<BaseItem> itemsUpdated, List<BaseItem> itemsRemoved, List<Folder> foldersAddedTo, List<Folder> foldersRemovedFrom, CancellationToken cancellationToken)
- {
- foreach (var user in _userManager.Users.ToList())
- {
- var id = user.Id;
- var userSessions = _sessionManager.Sessions
- .Where(u => u.UserId.HasValue && u.UserId.Value == id && u.SessionController != null && u.IsActive)
- .ToList();
-
- if (userSessions.Count > 0)
- {
- LibraryUpdateInfo info;
-
- try
- {
- info = GetLibraryUpdateInfo(itemsAdded, itemsUpdated, itemsRemoved, foldersAddedTo,
- foldersRemovedFrom, id);
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error in GetLibraryUpdateInfo", ex);
- return;
- }
-
- foreach (var userSession in userSessions)
- {
- try
- {
- await userSession.SessionController.SendLibraryUpdateInfo(info, cancellationToken).ConfigureAwait(false);
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error sending LibraryChanged message", ex);
- }
- }
- }
-
- }
- }
-
- /// <summary>
- /// Gets the library update info.
- /// </summary>
- /// <param name="itemsAdded">The items added.</param>
- /// <param name="itemsUpdated">The items updated.</param>
- /// <param name="itemsRemoved">The items removed.</param>
- /// <param name="foldersAddedTo">The folders added to.</param>
- /// <param name="foldersRemovedFrom">The folders removed from.</param>
- /// <param name="userId">The user id.</param>
- /// <returns>LibraryUpdateInfo.</returns>
- private LibraryUpdateInfo GetLibraryUpdateInfo(IEnumerable<BaseItem> itemsAdded, IEnumerable<BaseItem> itemsUpdated, IEnumerable<BaseItem> itemsRemoved, IEnumerable<Folder> foldersAddedTo, IEnumerable<Folder> foldersRemovedFrom, Guid userId)
- {
- var user = _userManager.GetUserById(userId);
-
- return new LibraryUpdateInfo
- {
- ItemsAdded = itemsAdded.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user)).Select(i => i.Id.ToString("N")).Distinct().ToList(),
-
- ItemsUpdated = itemsUpdated.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user)).Select(i => i.Id.ToString("N")).Distinct().ToList(),
-
- ItemsRemoved = itemsRemoved.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, true)).Select(i => i.Id.ToString("N")).Distinct().ToList(),
-
- FoldersAddedTo = foldersAddedTo.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user)).Select(i => i.Id.ToString("N")).Distinct().ToList(),
-
- FoldersRemovedFrom = foldersRemovedFrom.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user)).Select(i => i.Id.ToString("N")).Distinct().ToList()
- };
- }
-
- private bool FilterItem(BaseItem item)
- {
- if (!item.IsFolder && item.LocationType == LocationType.Virtual)
- {
- return false;
- }
-
- if (item is IItemByName && !(item is MusicArtist))
- {
- return false;
- }
-
- return item.SourceType == SourceType.Library;
- }
-
- /// <summary>
- /// Translates the physical item to user library.
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="item">The item.</param>
- /// <param name="user">The user.</param>
- /// <param name="includeIfNotFound">if set to <c>true</c> [include if not found].</param>
- /// <returns>IEnumerable{``0}.</returns>
- private IEnumerable<T> TranslatePhysicalItemToUserLibrary<T>(T item, User user, bool includeIfNotFound = false)
- where T : BaseItem
- {
- // If the physical root changed, return the user root
- if (item is AggregateFolder)
- {
- return new[] { user.RootFolder as T };
- }
-
- // Return it only if it's in the user's library
- if (includeIfNotFound || item.IsVisibleStandalone(user))
- {
- return new[] { item };
- }
-
- return new T[] { };
- }
-
- /// <summary>
- /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
- /// </summary>
- public void Dispose()
- {
- Dispose(true);
- }
-
- /// <summary>
- /// Releases unmanaged and - optionally - managed resources.
- /// </summary>
- /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
- protected virtual void Dispose(bool dispose)
- {
- if (dispose)
- {
- if (LibraryUpdateTimer != null)
- {
- LibraryUpdateTimer.Dispose();
- LibraryUpdateTimer = null;
- }
-
- _libraryManager.ItemAdded -= libraryManager_ItemAdded;
- _libraryManager.ItemUpdated -= libraryManager_ItemUpdated;
- _libraryManager.ItemRemoved -= libraryManager_ItemRemoved;
- }
- }
- }
-}
diff --git a/MediaBrowser.Server.Implementations/EntryPoints/LoadRegistrations.cs b/MediaBrowser.Server.Implementations/EntryPoints/LoadRegistrations.cs
deleted file mode 100644
index 47f22cae6..000000000
--- a/MediaBrowser.Server.Implementations/EntryPoints/LoadRegistrations.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-using MediaBrowser.Common.Security;
-using MediaBrowser.Controller.Plugins;
-using MediaBrowser.Model.Logging;
-using System;
-using System.Threading.Tasks;
-using MediaBrowser.Server.Implementations.Threading;
-
-namespace MediaBrowser.Server.Implementations.EntryPoints
-{
- /// <summary>
- /// Class LoadRegistrations
- /// </summary>
- public class LoadRegistrations : IServerEntryPoint
- {
- /// <summary>
- /// The _security manager
- /// </summary>
- private readonly ISecurityManager _securityManager;
-
- /// <summary>
- /// The _logger
- /// </summary>
- private readonly ILogger _logger;
-
- private PeriodicTimer _timer;
-
- /// <summary>
- /// Initializes a new instance of the <see cref="LoadRegistrations" /> class.
- /// </summary>
- /// <param name="securityManager">The security manager.</param>
- /// <param name="logManager">The log manager.</param>
- public LoadRegistrations(ISecurityManager securityManager, ILogManager logManager)
- {
- _securityManager = securityManager;
-
- _logger = logManager.GetLogger("Registration Loader");
- }
-
- /// <summary>
- /// Runs this instance.
- /// </summary>
- public void Run()
- {
- _timer = new PeriodicTimer(s => LoadAllRegistrations(), null, TimeSpan.FromMilliseconds(100), TimeSpan.FromHours(12));
- }
-
- private async Task LoadAllRegistrations()
- {
- try
- {
- await _securityManager.LoadAllRegistrationInfo().ConfigureAwait(false);
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error loading registration info", ex);
- }
- }
-
- /// <summary>
- /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
- /// </summary>
- public void Dispose()
- {
- if (_timer != null)
- {
- _timer.Dispose();
- _timer = null;
- }
- }
- }
-}
diff --git a/MediaBrowser.Server.Implementations/EntryPoints/RecordingNotifier.cs b/MediaBrowser.Server.Implementations/EntryPoints/RecordingNotifier.cs
deleted file mode 100644
index 414fda400..000000000
--- a/MediaBrowser.Server.Implementations/EntryPoints/RecordingNotifier.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using System;
-using System.Linq;
-using System.Threading;
-using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.LiveTv;
-using MediaBrowser.Controller.Plugins;
-using MediaBrowser.Controller.Session;
-using MediaBrowser.Model.Logging;
-
-namespace MediaBrowser.Server.Implementations.EntryPoints
-{
- public class RecordingNotifier : IServerEntryPoint
- {
- private readonly ILiveTvManager _liveTvManager;
- private readonly ISessionManager _sessionManager;
- private readonly IUserManager _userManager;
- private readonly ILogger _logger;
-
- public RecordingNotifier(ISessionManager sessionManager, IUserManager userManager, ILogger logger, ILiveTvManager liveTvManager)
- {
- _sessionManager = sessionManager;
- _userManager = userManager;
- _logger = logger;
- _liveTvManager = liveTvManager;
- }
-
- public void Run()
- {
- _liveTvManager.TimerCancelled += _liveTvManager_TimerCancelled;
- _liveTvManager.SeriesTimerCancelled += _liveTvManager_SeriesTimerCancelled;
- _liveTvManager.TimerCreated += _liveTvManager_TimerCreated;
- _liveTvManager.SeriesTimerCreated += _liveTvManager_SeriesTimerCreated;
- }
-
- private void _liveTvManager_SeriesTimerCreated(object sender, Model.Events.GenericEventArgs<TimerEventInfo> e)
- {
- SendMessage("SeriesTimerCreated", e.Argument);
- }
-
- private void _liveTvManager_TimerCreated(object sender, Model.Events.GenericEventArgs<TimerEventInfo> e)
- {
- SendMessage("TimerCreated", e.Argument);
- }
-
- private void _liveTvManager_SeriesTimerCancelled(object sender, Model.Events.GenericEventArgs<TimerEventInfo> e)
- {
- SendMessage("SeriesTimerCancelled", e.Argument);
- }
-
- private void _liveTvManager_TimerCancelled(object sender, Model.Events.GenericEventArgs<TimerEventInfo> e)
- {
- SendMessage("TimerCancelled", e.Argument);
- }
-
- private async void SendMessage(string name, TimerEventInfo info)
- {
- var users = _userManager.Users.Where(i => i.Policy.EnableLiveTvAccess).Select(i => i.Id.ToString("N")).ToList();
-
- try
- {
- await _sessionManager.SendMessageToUserSessions<TimerEventInfo>(users, name, info, CancellationToken.None);
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error sending message", ex);
- }
- }
-
- public void Dispose()
- {
- _liveTvManager.TimerCancelled -= _liveTvManager_TimerCancelled;
- _liveTvManager.SeriesTimerCancelled -= _liveTvManager_SeriesTimerCancelled;
- _liveTvManager.TimerCreated -= _liveTvManager_TimerCreated;
- _liveTvManager.SeriesTimerCreated -= _liveTvManager_SeriesTimerCreated;
- }
- }
-}
diff --git a/MediaBrowser.Server.Implementations/EntryPoints/RefreshUsersMetadata.cs b/MediaBrowser.Server.Implementations/EntryPoints/RefreshUsersMetadata.cs
deleted file mode 100644
index a0b7ff515..000000000
--- a/MediaBrowser.Server.Implementations/EntryPoints/RefreshUsersMetadata.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.Plugins;
-using System.Threading;
-
-namespace MediaBrowser.Server.Implementations.EntryPoints
-{
- /// <summary>
- /// Class RefreshUsersMetadata
- /// </summary>
- public class RefreshUsersMetadata : IServerEntryPoint
- {
- /// <summary>
- /// The _user manager
- /// </summary>
- private readonly IUserManager _userManager;
-
- /// <summary>
- /// Initializes a new instance of the <see cref="RefreshUsersMetadata" /> class.
- /// </summary>
- /// <param name="userManager">The user manager.</param>
- public RefreshUsersMetadata(IUserManager userManager)
- {
- _userManager = userManager;
- }
-
- /// <summary>
- /// Runs this instance.
- /// </summary>
- public async void Run()
- {
- await _userManager.RefreshUsersMetadata(CancellationToken.None).ConfigureAwait(false);
- }
-
- /// <summary>
- /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
- /// </summary>
- public void Dispose()
- {
- }
- }
-}
diff --git a/MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs b/MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs
deleted file mode 100644
index 0da48a2d8..000000000
--- a/MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs
+++ /dev/null
@@ -1,203 +0,0 @@
-using MediaBrowser.Common.Plugins;
-using MediaBrowser.Common.Updates;
-using MediaBrowser.Controller;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.Net;
-using MediaBrowser.Controller.Plugins;
-using MediaBrowser.Controller.Session;
-using MediaBrowser.Controller.Sync;
-using MediaBrowser.Model.Events;
-using MediaBrowser.Model.Sync;
-using System;
-using System.Collections.Generic;
-using System.Threading;
-using MediaBrowser.Model.Tasks;
-
-namespace MediaBrowser.Server.Implementations.EntryPoints
-{
- /// <summary>
- /// Class WebSocketEvents
- /// </summary>
- public class ServerEventNotifier : IServerEntryPoint
- {
- /// <summary>
- /// The _server manager
- /// </summary>
- private readonly IServerManager _serverManager;
-
- /// <summary>
- /// The _user manager
- /// </summary>
- private readonly IUserManager _userManager;
-
- /// <summary>
- /// The _installation manager
- /// </summary>
- private readonly IInstallationManager _installationManager;
-
- /// <summary>
- /// The _kernel
- /// </summary>
- private readonly IServerApplicationHost _appHost;
-
- /// <summary>
- /// The _task manager
- /// </summary>
- private readonly ITaskManager _taskManager;
-
- private readonly ISessionManager _sessionManager;
- private readonly ISyncManager _syncManager;
-
- public ServerEventNotifier(IServerManager serverManager, IServerApplicationHost appHost, IUserManager userManager, IInstallationManager installationManager, ITaskManager taskManager, ISessionManager sessionManager, ISyncManager syncManager)
- {
- _serverManager = serverManager;
- _userManager = userManager;
- _installationManager = installationManager;
- _appHost = appHost;
- _taskManager = taskManager;
- _sessionManager = sessionManager;
- _syncManager = syncManager;
- }
-
- public void Run()
- {
- _userManager.UserDeleted += userManager_UserDeleted;
- _userManager.UserUpdated += userManager_UserUpdated;
- _userManager.UserConfigurationUpdated += _userManager_UserConfigurationUpdated;
-
- _appHost.HasPendingRestartChanged += kernel_HasPendingRestartChanged;
-
- _installationManager.PluginUninstalled += InstallationManager_PluginUninstalled;
- _installationManager.PackageInstalling += _installationManager_PackageInstalling;
- _installationManager.PackageInstallationCancelled += _installationManager_PackageInstallationCancelled;
- _installationManager.PackageInstallationCompleted += _installationManager_PackageInstallationCompleted;
- _installationManager.PackageInstallationFailed += _installationManager_PackageInstallationFailed;
-
- _taskManager.TaskCompleted += _taskManager_TaskCompleted;
- _syncManager.SyncJobCreated += _syncManager_SyncJobCreated;
- _syncManager.SyncJobCancelled += _syncManager_SyncJobCancelled;
- }
-
- void _syncManager_SyncJobCancelled(object sender, GenericEventArgs<SyncJob> e)
- {
- _sessionManager.SendMessageToUserDeviceSessions(e.Argument.TargetId, "SyncJobCancelled", e.Argument, CancellationToken.None);
- }
-
- void _syncManager_SyncJobCreated(object sender, GenericEventArgs<SyncJobCreationResult> e)
- {
- _sessionManager.SendMessageToUserDeviceSessions(e.Argument.Job.TargetId, "SyncJobCreated", e.Argument, CancellationToken.None);
- }
-
- void _installationManager_PackageInstalling(object sender, InstallationEventArgs e)
- {
- _serverManager.SendWebSocketMessage("PackageInstalling", e.InstallationInfo);
- }
-
- void _installationManager_PackageInstallationCancelled(object sender, InstallationEventArgs e)
- {
- _serverManager.SendWebSocketMessage("PackageInstallationCancelled", e.InstallationInfo);
- }
-
- void _installationManager_PackageInstallationCompleted(object sender, InstallationEventArgs e)
- {
- _serverManager.SendWebSocketMessage("PackageInstallationCompleted", e.InstallationInfo);
- }
-
- void _installationManager_PackageInstallationFailed(object sender, InstallationFailedEventArgs e)
- {
- _serverManager.SendWebSocketMessage("PackageInstallationFailed", e.InstallationInfo);
- }
-
- void _taskManager_TaskCompleted(object sender, TaskCompletionEventArgs e)
- {
- _serverManager.SendWebSocketMessage("ScheduledTaskEnded", e.Result);
- }
-
- /// <summary>
- /// Installations the manager_ plugin uninstalled.
- /// </summary>
- /// <param name="sender">The sender.</param>
- /// <param name="e">The e.</param>
- void InstallationManager_PluginUninstalled(object sender, GenericEventArgs<IPlugin> e)
- {
- _serverManager.SendWebSocketMessage("PluginUninstalled", e.Argument.GetPluginInfo());
- }
-
- /// <summary>
- /// Handles the HasPendingRestartChanged event of the kernel control.
- /// </summary>
- /// <param name="sender">The source of the event.</param>
- /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
- void kernel_HasPendingRestartChanged(object sender, EventArgs e)
- {
- _sessionManager.SendRestartRequiredNotification(CancellationToken.None);
- }
-
- /// <summary>
- /// Users the manager_ user updated.
- /// </summary>
- /// <param name="sender">The sender.</param>
- /// <param name="e">The e.</param>
- void userManager_UserUpdated(object sender, GenericEventArgs<User> e)
- {
- var dto = _userManager.GetUserDto(e.Argument);
-
- SendMessageToUserSession(e.Argument, "UserUpdated", dto);
- }
-
- /// <summary>
- /// Users the manager_ user deleted.
- /// </summary>
- /// <param name="sender">The sender.</param>
- /// <param name="e">The e.</param>
- void userManager_UserDeleted(object sender, GenericEventArgs<User> e)
- {
- SendMessageToUserSession(e.Argument, "UserDeleted", e.Argument.Id.ToString("N"));
- }
-
- void _userManager_UserConfigurationUpdated(object sender, GenericEventArgs<User> e)
- {
- var dto = _userManager.GetUserDto(e.Argument);
-
- SendMessageToUserSession(e.Argument, "UserConfigurationUpdated", dto);
- }
-
- private async void SendMessageToUserSession<T>(User user, string name, T data)
- {
- await _sessionManager.SendMessageToUserSessions(new List<string> { user.Id.ToString("N") }, name, data, CancellationToken.None);
- }
-
- /// <summary>
- /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
- /// </summary>
- public void Dispose()
- {
- Dispose(true);
- }
-
- /// <summary>
- /// Releases unmanaged and - optionally - managed resources.
- /// </summary>
- /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
- protected virtual void Dispose(bool dispose)
- {
- if (dispose)
- {
- _userManager.UserDeleted -= userManager_UserDeleted;
- _userManager.UserUpdated -= userManager_UserUpdated;
- _userManager.UserConfigurationUpdated -= _userManager_UserConfigurationUpdated;
-
- _installationManager.PluginUninstalled -= InstallationManager_PluginUninstalled;
- _installationManager.PackageInstalling -= _installationManager_PackageInstalling;
- _installationManager.PackageInstallationCancelled -= _installationManager_PackageInstallationCancelled;
- _installationManager.PackageInstallationCompleted -= _installationManager_PackageInstallationCompleted;
- _installationManager.PackageInstallationFailed -= _installationManager_PackageInstallationFailed;
-
- _appHost.HasPendingRestartChanged -= kernel_HasPendingRestartChanged;
- _syncManager.SyncJobCreated -= _syncManager_SyncJobCreated;
- _syncManager.SyncJobCancelled -= _syncManager_SyncJobCancelled;
- }
- }
- }
-}
diff --git a/MediaBrowser.Server.Implementations/EntryPoints/UsageEntryPoint.cs b/MediaBrowser.Server.Implementations/EntryPoints/UsageEntryPoint.cs
deleted file mode 100644
index d14bd4368..000000000
--- a/MediaBrowser.Server.Implementations/EntryPoints/UsageEntryPoint.cs
+++ /dev/null
@@ -1,133 +0,0 @@
-using MediaBrowser.Common;
-using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.Plugins;
-using MediaBrowser.Controller.Session;
-using MediaBrowser.Model.Logging;
-using System;
-using System.Collections.Concurrent;
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Controller.Configuration;
-
-namespace MediaBrowser.Server.Implementations.EntryPoints
-{
- /// <summary>
- /// Class UsageEntryPoint
- /// </summary>
- public class UsageEntryPoint : IServerEntryPoint
- {
- private readonly IApplicationHost _applicationHost;
- private readonly IHttpClient _httpClient;
- private readonly ILogger _logger;
- private readonly ISessionManager _sessionManager;
- private readonly IUserManager _userManager;
- private readonly IServerConfigurationManager _config;
-
- private readonly ConcurrentDictionary<Guid, ClientInfo> _apps = new ConcurrentDictionary<Guid, ClientInfo>();
-
- public UsageEntryPoint(ILogger logger, IApplicationHost applicationHost, IHttpClient httpClient, ISessionManager sessionManager, IUserManager userManager, IServerConfigurationManager config)
- {
- _logger = logger;
- _applicationHost = applicationHost;
- _httpClient = httpClient;
- _sessionManager = sessionManager;
- _userManager = userManager;
- _config = config;
-
- _sessionManager.SessionStarted += _sessionManager_SessionStarted;
- }
-
- void _sessionManager_SessionStarted(object sender, SessionEventArgs e)
- {
- var session = e.SessionInfo;
-
- if (!string.IsNullOrEmpty(session.Client) &&
- !string.IsNullOrEmpty(session.DeviceName) &&
- !string.IsNullOrEmpty(session.DeviceId) &&
- !string.IsNullOrEmpty(session.ApplicationVersion))
- {
- var keys = new List<string>
- {
- session.Client,
- session.DeviceName,
- session.DeviceId,
- session.ApplicationVersion
- };
-
- var key = string.Join("_", keys.ToArray()).GetMD5();
-
- _apps.GetOrAdd(key, guid => GetNewClientInfo(session));
- }
- }
-
- private async void ReportNewSession(ClientInfo client)
- {
- if (!_config.Configuration.EnableAnonymousUsageReporting)
- {
- return;
- }
-
- try
- {
- await new UsageReporter(_applicationHost, _httpClient, _userManager, _logger)
- .ReportAppUsage(client, CancellationToken.None)
- .ConfigureAwait(false);
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error sending anonymous usage statistics.", ex);
- }
- }
-
- private ClientInfo GetNewClientInfo(SessionInfo session)
- {
- var info = new ClientInfo
- {
- AppName = session.Client,
- AppVersion = session.ApplicationVersion,
- DeviceName = session.DeviceName,
- DeviceId = session.DeviceId
- };
-
- ReportNewSession(info);
-
- return info;
- }
-
- public async void Run()
- {
- await Task.Delay(5000).ConfigureAwait(false);
- OnTimerFired();
- }
-
- /// <summary>
- /// Called when [timer fired].
- /// </summary>
- private async void OnTimerFired()
- {
- if (!_config.Configuration.EnableAnonymousUsageReporting)
- {
- return;
- }
-
- try
- {
- await new UsageReporter(_applicationHost, _httpClient, _userManager, _logger)
- .ReportServerUsage(CancellationToken.None)
- .ConfigureAwait(false);
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error sending anonymous usage statistics.", ex);
- }
- }
-
- public void Dispose()
- {
- _sessionManager.SessionStarted -= _sessionManager_SessionStarted;
- }
- }
-}
diff --git a/MediaBrowser.Server.Implementations/EntryPoints/UsageReporter.cs b/MediaBrowser.Server.Implementations/EntryPoints/UsageReporter.cs
deleted file mode 100644
index e445300e4..000000000
--- a/MediaBrowser.Server.Implementations/EntryPoints/UsageReporter.cs
+++ /dev/null
@@ -1,138 +0,0 @@
-using MediaBrowser.Common;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller.Library;
-using MediaBrowser.Model.Connect;
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Model.Logging;
-
-namespace MediaBrowser.Server.Implementations.EntryPoints
-{
- public class UsageReporter
- {
- private readonly IApplicationHost _applicationHost;
- private readonly IHttpClient _httpClient;
- private readonly IUserManager _userManager;
- private readonly ILogger _logger;
- private const string MbAdminUrl = "https://www.mb3admin.com/admin/";
-
- public UsageReporter(IApplicationHost applicationHost, IHttpClient httpClient, IUserManager userManager, ILogger logger)
- {
- _applicationHost = applicationHost;
- _httpClient = httpClient;
- _userManager = userManager;
- _logger = logger;
- }
-
- public async Task ReportServerUsage(CancellationToken cancellationToken)
- {
- cancellationToken.ThrowIfCancellationRequested();
-
- var data = new Dictionary<string, string>
- {
- { "feature", _applicationHost.Name },
- { "mac", _applicationHost.SystemId },
- { "serverid", _applicationHost.SystemId },
- { "deviceid", _applicationHost.SystemId },
- { "ver", _applicationHost.ApplicationVersion.ToString() },
- { "platform", _applicationHost.OperatingSystemDisplayName },
- { "isservice", _applicationHost.IsRunningAsService.ToString().ToLower()}
- };
-
- var users = _userManager.Users.ToList();
-
- data["localusers"] = users.Count(i => !i.ConnectLinkType.HasValue).ToString(CultureInfo.InvariantCulture);
- data["guests"] = users.Count(i => i.ConnectLinkType.HasValue && i.ConnectLinkType.Value == UserLinkType.Guest).ToString(CultureInfo.InvariantCulture);
- data["linkedusers"] = users.Count(i => i.ConnectLinkType.HasValue && i.ConnectLinkType.Value == UserLinkType.LinkedUser).ToString(CultureInfo.InvariantCulture);
-
- data["plugins"] = string.Join(",", _applicationHost.Plugins.Select(i => i.Id).ToArray());
-
- var logErrors = false;
-#if DEBUG
- logErrors = true;
-#endif
- var options = new HttpRequestOptions
- {
- Url = MbAdminUrl + "service/registration/ping",
- CancellationToken = cancellationToken,
-
- // Seeing block length errors
- EnableHttpCompression = false,
-
- LogRequest = false,
- LogErrors = logErrors,
- BufferContent = false
- };
-
- options.SetPostData(data);
-
- using (var response = await _httpClient.SendAsync(options, "POST").ConfigureAwait(false))
- {
-
- }
- }
-
- public async Task ReportAppUsage(ClientInfo app, CancellationToken cancellationToken)
- {
- if (string.IsNullOrWhiteSpace(app.DeviceId))
- {
- throw new ArgumentException("Client info must have a device Id");
- }
-
- _logger.Info("App Activity: app: {0}, version: {1}, deviceId: {2}, deviceName: {3}",
- app.AppName ?? "Unknown App",
- app.AppVersion ?? "Unknown",
- app.DeviceId,
- app.DeviceName ?? "Unknown");
-
- cancellationToken.ThrowIfCancellationRequested();
-
- var data = new Dictionary<string, string>
- {
- { "feature", app.AppName ?? "Unknown App" },
- { "serverid", _applicationHost.SystemId },
- { "deviceid", app.DeviceId },
- { "mac", app.DeviceId },
- { "ver", app.AppVersion ?? "Unknown" },
- { "platform", app.DeviceName },
- };
-
- var logErrors = false;
-
-#if DEBUG
- logErrors = true;
-#endif
- var options = new HttpRequestOptions
- {
- Url = MbAdminUrl + "service/registration/ping",
- CancellationToken = cancellationToken,
-
- // Seeing block length errors
- EnableHttpCompression = false,
-
- LogRequest = false,
- LogErrors = logErrors,
- BufferContent = false
- };
-
- options.SetPostData(data);
-
- using (var response = await _httpClient.SendAsync(options, "POST").ConfigureAwait(false))
- {
-
- }
- }
- }
-
- public class ClientInfo
- {
- public string AppName { get; set; }
- public string AppVersion { get; set; }
- public string DeviceName { get; set; }
- public string DeviceId { get; set; }
- }
-}
diff --git a/MediaBrowser.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs b/MediaBrowser.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs
deleted file mode 100644
index 8262048b1..000000000
--- a/MediaBrowser.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs
+++ /dev/null
@@ -1,162 +0,0 @@
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.Plugins;
-using MediaBrowser.Controller.Session;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Session;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Model.Extensions;
-
-namespace MediaBrowser.Server.Implementations.EntryPoints
-{
- class UserDataChangeNotifier : IServerEntryPoint
- {
- private readonly ISessionManager _sessionManager;
- private readonly ILogger _logger;
- private readonly IUserDataManager _userDataManager;
- private readonly IUserManager _userManager;
-
- private readonly object _syncLock = new object();
- private Timer UpdateTimer { get; set; }
- private const int UpdateDuration = 500;
-
- private readonly Dictionary<Guid, List<IHasUserData>> _changedItems = new Dictionary<Guid, List<IHasUserData>>();
-
- public UserDataChangeNotifier(IUserDataManager userDataManager, ISessionManager sessionManager, ILogger logger, IUserManager userManager)
- {
- _userDataManager = userDataManager;
- _sessionManager = sessionManager;
- _logger = logger;
- _userManager = userManager;
- }
-
- public void Run()
- {
- _userDataManager.UserDataSaved += _userDataManager_UserDataSaved;
- }
-
- void _userDataManager_UserDataSaved(object sender, UserDataSaveEventArgs e)
- {
- if (e.SaveReason == UserDataSaveReason.PlaybackProgress)
- {
- return;
- }
-
- lock (_syncLock)
- {
- if (UpdateTimer == null)
- {
- UpdateTimer = new Timer(UpdateTimerCallback, null, UpdateDuration,
- Timeout.Infinite);
- }
- else
- {
- UpdateTimer.Change(UpdateDuration, Timeout.Infinite);
- }
-
- List<IHasUserData> keys;
-
- if (!_changedItems.TryGetValue(e.UserId, out keys))
- {
- keys = new List<IHasUserData>();
- _changedItems[e.UserId] = keys;
- }
-
- keys.Add(e.Item);
-
- var baseItem = e.Item as BaseItem;
-
- // Go up one level for indicators
- if (baseItem != null)
- {
- var parent = baseItem.GetParent();
-
- if (parent != null)
- {
- keys.Add(parent);
- }
- }
- }
- }
-
- private void UpdateTimerCallback(object state)
- {
- lock (_syncLock)
- {
- // Remove dupes in case some were saved multiple times
- var changes = _changedItems.ToList();
- _changedItems.Clear();
-
- var task = SendNotifications(changes, CancellationToken.None);
-
- if (UpdateTimer != null)
- {
- UpdateTimer.Dispose();
- UpdateTimer = null;
- }
- }
- }
-
- private async Task SendNotifications(IEnumerable<KeyValuePair<Guid, List<IHasUserData>>> changes, CancellationToken cancellationToken)
- {
- foreach (var pair in changes)
- {
- var userId = pair.Key;
- var userSessions = _sessionManager.Sessions
- .Where(u => u.ContainsUser(userId) && u.SessionController != null && u.IsActive)
- .ToList();
-
- if (userSessions.Count > 0)
- {
- var user = _userManager.GetUserById(userId);
-
- var dtoList = pair.Value
- .DistinctBy(i => i.Id)
- .Select(i =>
- {
- var dto = _userDataManager.GetUserDataDto(i, user).Result;
- dto.ItemId = i.Id.ToString("N");
- return dto;
- })
- .ToList();
-
- var info = new UserDataChangeInfo
- {
- UserId = userId.ToString("N"),
-
- UserDataList = dtoList
- };
-
- foreach (var userSession in userSessions)
- {
- try
- {
- await userSession.SessionController.SendUserDataChangeInfo(info, cancellationToken).ConfigureAwait(false);
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error sending UserDataChanged message", ex);
- }
- }
- }
-
- }
- }
-
- public void Dispose()
- {
- if (UpdateTimer != null)
- {
- UpdateTimer.Dispose();
- UpdateTimer = null;
- }
-
- _userDataManager.UserDataSaved -= _userDataManager_UserDataSaved;
- }
- }
-}
diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
index 88e9478df..b31c8286c 100644
--- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
+++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
@@ -46,17 +46,13 @@
<HintPath>..\ThirdParty\emby\Emby.Common.Implementations.dll</HintPath>
</Reference>
<Reference Include="Emby.XmlTv, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
- <HintPath>..\packages\Emby.XmlTv.1.0.0.62\lib\portable-net45+win8\Emby.XmlTv.dll</HintPath>
+ <HintPath>..\packages\Emby.XmlTv.1.0.0.63\lib\portable-net45+win8\Emby.XmlTv.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="INIFileParser, Version=2.3.0.0, Culture=neutral, PublicKeyToken=79af7b307b65cf3c, processorArchitecture=MSIL">
<HintPath>..\packages\ini-parser.2.3.0\lib\net20\INIFileParser.dll</HintPath>
<Private>True</Private>
</Reference>
- <Reference Include="MediaBrowser.Naming, Version=1.0.6151.30291, Culture=neutral, processorArchitecture=MSIL">
- <HintPath>..\packages\MediaBrowser.Naming.1.0.0.59\lib\portable-net45+win8\MediaBrowser.Naming.dll</HintPath>
- <Private>True</Private>
- </Reference>
<Reference Include="Microsoft.IO.RecyclableMemoryStream, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.IO.RecyclableMemoryStream.1.1.0.0\lib\net45\Microsoft.IO.RecyclableMemoryStream.dll</HintPath>
<Private>True</Private>
@@ -120,17 +116,8 @@
<Compile Include="Connect\Validator.cs" />
<Compile Include="Devices\DeviceRepository.cs" />
<Compile Include="Devices\CameraUploadsFolder.cs" />
- <Compile Include="EntryPoints\AutomaticRestartEntryPoint.cs" />
<Compile Include="EntryPoints\ExternalPortForwarding.cs" />
- <Compile Include="EntryPoints\LibraryChangedNotifier.cs" />
- <Compile Include="EntryPoints\LoadRegistrations.cs" />
- <Compile Include="EntryPoints\RecordingNotifier.cs" />
- <Compile Include="EntryPoints\RefreshUsersMetadata.cs" />
- <Compile Include="EntryPoints\UsageEntryPoint.cs" />
- <Compile Include="EntryPoints\UsageReporter.cs" />
<Compile Include="EntryPoints\UdpServerEntryPoint.cs" />
- <Compile Include="EntryPoints\ServerEventNotifier.cs" />
- <Compile Include="EntryPoints\UserDataChangeNotifier.cs" />
<Compile Include="HttpServer\IHttpListener.cs" />
<Compile Include="HttpServer\Security\AuthorizationContext.cs" />
<Compile Include="HttpServer\ContainerAdapter.cs" />
@@ -211,8 +198,6 @@
<Compile Include="LiveTv\TunerHosts\SatIp\Utils.cs" />
<Compile Include="Localization\LocalizationManager.cs" />
<Compile Include="Logging\PatternsLogger.cs" />
- <Compile Include="MediaEncoder\EncodingManager.cs" />
- <Compile Include="News\NewsEntryPoint.cs" />
<Compile Include="Persistence\BaseSqliteRepository.cs" />
<Compile Include="Persistence\DataExtensions.cs" />
<Compile Include="Persistence\IDbConnector.cs" />
@@ -287,23 +272,6 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
- <EmbeddedResource Include="Localization\Ratings\us.txt" />
- <EmbeddedResource Include="Localization\Ratings\au.txt" />
- <EmbeddedResource Include="Localization\Ratings\gb.txt" />
- <EmbeddedResource Include="Localization\Ratings\nl.txt" />
- <EmbeddedResource Include="Localization\Ratings\br.txt" />
- <EmbeddedResource Include="Localization\Ratings\dk.txt" />
- <EmbeddedResource Include="Localization\Ratings\de.txt" />
- <EmbeddedResource Include="Localization\Ratings\mx.txt" />
- <EmbeddedResource Include="Localization\Ratings\co.txt" />
- <EmbeddedResource Include="Localization\Ratings\fr.txt" />
- <EmbeddedResource Include="Localization\Ratings\ie.txt" />
- <EmbeddedResource Include="Localization\Ratings\jp.txt" />
- <EmbeddedResource Include="Localization\Ratings\kz.txt" />
- <EmbeddedResource Include="Localization\Ratings\nz.txt" />
- <EmbeddedResource Include="Localization\Ratings\ru.txt" />
- </ItemGroup>
- <ItemGroup>
<Content Include="..\ThirdParty\ServiceStack\swagger-ui\lib\backbone-min.js">
<Link>swagger-ui\lib\backbone-min.js</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
@@ -368,7 +336,6 @@
<Link>swagger-ui\swagger-ui.min.js</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <EmbeddedResource Include="Localization\countries.json" />
<Content Include="..\ThirdParty\ServiceStack\swagger-ui\fonts\droid-sans-v6-latin-700.eot">
<Link>swagger-ui\fonts\droid-sans-v6-latin-700.eot</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
@@ -401,46 +368,25 @@
<Link>swagger-ui\fonts\droid-sans-v6-latin-regular.woff2</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
+ <EmbeddedResource Include="Localization\Ratings\us.txt" />
+ <EmbeddedResource Include="Localization\Ratings\ru.txt" />
+ <EmbeddedResource Include="Localization\Ratings\nz.txt" />
+ <EmbeddedResource Include="Localization\Ratings\nl.txt" />
+ <EmbeddedResource Include="Localization\Ratings\mx.txt" />
+ <EmbeddedResource Include="Localization\Ratings\kz.txt" />
+ <EmbeddedResource Include="Localization\Ratings\jp.txt" />
+ <EmbeddedResource Include="Localization\Ratings\ie.txt" />
+ <EmbeddedResource Include="Localization\Ratings\gb.txt" />
+ <EmbeddedResource Include="Localization\Ratings\fr.txt" />
+ <EmbeddedResource Include="Localization\Ratings\dk.txt" />
+ <EmbeddedResource Include="Localization\Ratings\de.txt" />
+ <EmbeddedResource Include="Localization\Ratings\co.txt" />
+ <EmbeddedResource Include="Localization\Ratings\ca.txt" />
+ <EmbeddedResource Include="Localization\Ratings\br.txt" />
+ <EmbeddedResource Include="Localization\Ratings\be.txt" />
+ <EmbeddedResource Include="Localization\Ratings\au.txt" />
+ <EmbeddedResource Include="Localization\iso6392.txt" />
<None Include="app.config" />
- <EmbeddedResource Include="Localization\Core\core.json" />
- <EmbeddedResource Include="Localization\Core\ar.json" />
- <EmbeddedResource Include="Localization\Core\bg-BG.json" />
- <EmbeddedResource Include="Localization\Core\ca.json" />
- <EmbeddedResource Include="Localization\Core\cs.json" />
- <EmbeddedResource Include="Localization\Core\da.json" />
- <EmbeddedResource Include="Localization\Core\de.json" />
- <EmbeddedResource Include="Localization\Core\el.json" />
- <EmbeddedResource Include="Localization\Core\en-GB.json" />
- <EmbeddedResource Include="Localization\Core\en-US.json" />
- <EmbeddedResource Include="Localization\Core\es-AR.json" />
- <EmbeddedResource Include="Localization\Core\es-MX.json" />
- <EmbeddedResource Include="Localization\Core\es.json" />
- <EmbeddedResource Include="Localization\Core\fi.json" />
- <EmbeddedResource Include="Localization\Core\fr.json" />
- <EmbeddedResource Include="Localization\Core\gsw.json" />
- <EmbeddedResource Include="Localization\Core\he.json" />
- <EmbeddedResource Include="Localization\Core\hr.json" />
- <EmbeddedResource Include="Localization\Core\it.json" />
- <EmbeddedResource Include="Localization\Core\kk.json" />
- <EmbeddedResource Include="Localization\Core\ko.json" />
- <EmbeddedResource Include="Localization\Core\ms.json" />
- <EmbeddedResource Include="Localization\Core\nb.json" />
- <EmbeddedResource Include="Localization\Core\nl.json" />
- <EmbeddedResource Include="Localization\Core\pl.json" />
- <EmbeddedResource Include="Localization\Core\pt-BR.json" />
- <EmbeddedResource Include="Localization\Core\pt-PT.json" />
- <EmbeddedResource Include="Localization\Core\ro.json" />
- <EmbeddedResource Include="Localization\Core\ru.json" />
- <EmbeddedResource Include="Localization\Core\sl-SI.json" />
- <EmbeddedResource Include="Localization\Core\sv.json" />
- <EmbeddedResource Include="Localization\Core\tr.json" />
- <EmbeddedResource Include="Localization\Core\uk.json" />
- <EmbeddedResource Include="Localization\Core\vi.json" />
- <EmbeddedResource Include="Localization\Core\zh-CN.json" />
- <EmbeddedResource Include="Localization\Core\zh-TW.json" />
- <EmbeddedResource Include="Localization\Core\zh-HK.json" />
- <EmbeddedResource Include="Localization\Core\hu.json" />
- <EmbeddedResource Include="Localization\Core\id.json" />
<EmbeddedResource Include="LiveTv\TunerHosts\SatIp\ini\satellite\0030.ini" />
<EmbeddedResource Include="LiveTv\TunerHosts\SatIp\ini\satellite\0049.ini" />
<EmbeddedResource Include="LiveTv\TunerHosts\SatIp\ini\satellite\0070.ini" />
@@ -610,13 +556,50 @@
<EmbeddedResource Include="LiveTv\TunerHosts\SatIp\ini\satellite\3560.ini" />
<EmbeddedResource Include="LiveTv\TunerHosts\SatIp\ini\satellite\3592.ini" />
<EmbeddedResource Include="LiveTv\TunerHosts\SatIp\ini\satellite\3594.ini" />
+ <EmbeddedResource Include="Localization\Core\ar.json" />
+ <EmbeddedResource Include="Localization\Core\bg-BG.json" />
+ <EmbeddedResource Include="Localization\Core\ca.json" />
+ <EmbeddedResource Include="Localization\Core\core.json" />
+ <EmbeddedResource Include="Localization\Core\cs.json" />
+ <EmbeddedResource Include="Localization\Core\da.json" />
+ <EmbeddedResource Include="Localization\Core\de.json" />
+ <EmbeddedResource Include="Localization\Core\el.json" />
+ <EmbeddedResource Include="Localization\Core\en-GB.json" />
+ <EmbeddedResource Include="Localization\Core\en-US.json" />
+ <EmbeddedResource Include="Localization\Core\es-AR.json" />
+ <EmbeddedResource Include="Localization\Core\es-MX.json" />
+ <EmbeddedResource Include="Localization\Core\es.json" />
+ <EmbeddedResource Include="Localization\Core\fi.json" />
<EmbeddedResource Include="Localization\Core\fr-CA.json" />
+ <EmbeddedResource Include="Localization\Core\fr.json" />
+ <EmbeddedResource Include="Localization\Core\gsw.json" />
+ <EmbeddedResource Include="Localization\Core\he.json" />
+ <EmbeddedResource Include="Localization\Core\hr.json" />
+ <EmbeddedResource Include="Localization\Core\hu.json" />
+ <EmbeddedResource Include="Localization\Core\id.json" />
+ <EmbeddedResource Include="Localization\Core\it.json" />
+ <EmbeddedResource Include="Localization\Core\kk.json" />
+ <EmbeddedResource Include="Localization\Core\ko.json" />
+ <EmbeddedResource Include="Localization\Core\ms.json" />
+ <EmbeddedResource Include="Localization\Core\nb.json" />
+ <EmbeddedResource Include="Localization\Core\nl.json" />
+ <EmbeddedResource Include="Localization\Core\pl.json" />
+ <EmbeddedResource Include="Localization\Core\pt-BR.json" />
+ <EmbeddedResource Include="Localization\Core\pt-PT.json" />
+ <EmbeddedResource Include="Localization\Core\ro.json" />
+ <EmbeddedResource Include="Localization\Core\ru.json" />
+ <EmbeddedResource Include="Localization\Core\sl-SI.json" />
+ <EmbeddedResource Include="Localization\Core\sv.json" />
+ <EmbeddedResource Include="Localization\Core\tr.json" />
+ <EmbeddedResource Include="Localization\Core\uk.json" />
+ <EmbeddedResource Include="Localization\Core\vi.json" />
+ <EmbeddedResource Include="Localization\Core\zh-CN.json" />
+ <EmbeddedResource Include="Localization\Core\zh-HK.json" />
+ <EmbeddedResource Include="Localization\Core\zh-TW.json" />
+ <EmbeddedResource Include="Localization\countries.json" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
- <EmbeddedResource Include="Localization\Ratings\ca.txt" />
- </ItemGroup>
- <ItemGroup>
<Content Include="..\ThirdParty\ServiceStack\swagger-ui\css\reset.css">
<Link>swagger-ui\css\reset.css</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
@@ -665,8 +648,6 @@
<Link>swagger-ui\lib\shred\content.js</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <EmbeddedResource Include="Localization\iso6392.txt" />
- <EmbeddedResource Include="Localization\Ratings\be.txt" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
diff --git a/MediaBrowser.Server.Implementations/MediaEncoder/EncodingManager.cs b/MediaBrowser.Server.Implementations/MediaEncoder/EncodingManager.cs
deleted file mode 100644
index 9f1744cc9..000000000
--- a/MediaBrowser.Server.Implementations/MediaEncoder/EncodingManager.cs
+++ /dev/null
@@ -1,236 +0,0 @@
-using MediaBrowser.Controller.Chapters;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Entities.Movies;
-using MediaBrowser.Controller.Entities.TV;
-using MediaBrowser.Controller.MediaEncoding;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.MediaInfo;
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.IO;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Controller.Library;
-
-namespace MediaBrowser.Server.Implementations.MediaEncoder
-{
- public class EncodingManager : IEncodingManager
- {
- private readonly CultureInfo _usCulture = new CultureInfo("en-US");
- private readonly IFileSystem _fileSystem;
- private readonly ILogger _logger;
- private readonly IMediaEncoder _encoder;
- private readonly IChapterManager _chapterManager;
- private readonly ILibraryManager _libraryManager;
-
- public EncodingManager(IFileSystem fileSystem,
- ILogger logger,
- IMediaEncoder encoder,
- IChapterManager chapterManager, ILibraryManager libraryManager)
- {
- _fileSystem = fileSystem;
- _logger = logger;
- _encoder = encoder;
- _chapterManager = chapterManager;
- _libraryManager = libraryManager;
- }
-
- /// <summary>
- /// Gets the chapter images data path.
- /// </summary>
- /// <value>The chapter images data path.</value>
- private string GetChapterImagesPath(IHasImages item)
- {
- return Path.Combine(item.GetInternalMetadataPath(), "chapters");
- }
-
- /// <summary>
- /// Determines whether [is eligible for chapter image extraction] [the specified video].
- /// </summary>
- /// <param name="video">The video.</param>
- /// <returns><c>true</c> if [is eligible for chapter image extraction] [the specified video]; otherwise, <c>false</c>.</returns>
- private bool IsEligibleForChapterImageExtraction(Video video)
- {
- if (video.IsPlaceHolder)
- {
- return false;
- }
-
- var libraryOptions = _libraryManager.GetLibraryOptions(video);
- if (libraryOptions != null)
- {
- if (!libraryOptions.EnableChapterImageExtraction)
- {
- return false;
- }
- }
- else
- {
- return false;
- }
-
- // Can't extract images if there are no video streams
- return video.DefaultVideoStreamIndex.HasValue;
- }
-
- /// <summary>
- /// The first chapter ticks
- /// </summary>
- private static readonly long FirstChapterTicks = TimeSpan.FromSeconds(15).Ticks;
-
- public async Task<bool> RefreshChapterImages(ChapterImageRefreshOptions options, CancellationToken cancellationToken)
- {
- var extractImages = options.ExtractImages;
- var video = options.Video;
- var chapters = options.Chapters;
- var saveChapters = options.SaveChapters;
-
- if (!IsEligibleForChapterImageExtraction(video))
- {
- extractImages = false;
- }
-
- var success = true;
- var changesMade = false;
-
- var runtimeTicks = video.RunTimeTicks ?? 0;
-
- var currentImages = GetSavedChapterImages(video);
-
- foreach (var chapter in chapters)
- {
- if (chapter.StartPositionTicks >= runtimeTicks)
- {
- _logger.Info("Stopping chapter extraction for {0} because a chapter was found with a position greater than the runtime.", video.Name);
- break;
- }
-
- var path = GetChapterImagePath(video, chapter.StartPositionTicks);
-
- if (!currentImages.Contains(path, StringComparer.OrdinalIgnoreCase))
- {
- if (extractImages)
- {
- if (video.VideoType == VideoType.HdDvd || video.VideoType == VideoType.Iso)
- {
- continue;
- }
- if (video.VideoType == VideoType.BluRay || video.VideoType == VideoType.Dvd)
- {
- if (video.PlayableStreamFileNames.Count != 1)
- {
- continue;
- }
- }
-
- try
- {
- // Add some time for the first chapter to make sure we don't end up with a black image
- var time = chapter.StartPositionTicks == 0 ? TimeSpan.FromTicks(Math.Min(FirstChapterTicks, video.RunTimeTicks ?? 0)) : TimeSpan.FromTicks(chapter.StartPositionTicks);
-
- var protocol = MediaProtocol.File;
-
- var inputPath = MediaEncoderHelpers.GetInputArgument(_fileSystem, video.Path, protocol, null, video.PlayableStreamFileNames);
-
- _fileSystem.CreateDirectory(Path.GetDirectoryName(path));
-
- var container = video.Container;
-
- var tempFile = await _encoder.ExtractVideoImage(inputPath, container, protocol, video.Video3DFormat, time, cancellationToken).ConfigureAwait(false);
- File.Copy(tempFile, path, true);
-
- try
- {
- File.Delete(tempFile);
- }
- catch
- {
-
- }
-
- chapter.ImagePath = path;
- chapter.ImageDateModified = _fileSystem.GetLastWriteTimeUtc(path);
- changesMade = true;
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error extracting chapter images for {0}", ex, string.Join(",", video.Path));
- success = false;
- break;
- }
- }
- else if (!string.IsNullOrEmpty(chapter.ImagePath))
- {
- chapter.ImagePath = null;
- changesMade = true;
- }
- }
- else if (!string.Equals(path, chapter.ImagePath, StringComparison.OrdinalIgnoreCase))
- {
- chapter.ImagePath = path;
- chapter.ImageDateModified = _fileSystem.GetLastWriteTimeUtc(path);
- changesMade = true;
- }
- }
-
- if (saveChapters && changesMade)
- {
- await _chapterManager.SaveChapters(video.Id.ToString(), chapters, cancellationToken).ConfigureAwait(false);
- }
-
- DeleteDeadImages(currentImages, chapters);
-
- return success;
- }
-
- private string GetChapterImagePath(Video video, long chapterPositionTicks)
- {
- var filename = video.DateModified.Ticks.ToString(_usCulture) + "_" + chapterPositionTicks.ToString(_usCulture) + ".jpg";
-
- return Path.Combine(GetChapterImagesPath(video), filename);
- }
-
- private List<string> GetSavedChapterImages(Video video)
- {
- var path = GetChapterImagesPath(video);
-
- try
- {
- return _fileSystem.GetFilePaths(path)
- .ToList();
- }
- catch (DirectoryNotFoundException)
- {
- return new List<string>();
- }
- }
-
- private void DeleteDeadImages(IEnumerable<string> images, IEnumerable<ChapterInfo> chapters)
- {
- var deadImages = images
- .Except(chapters.Select(i => i.ImagePath).Where(i => !string.IsNullOrEmpty(i)), StringComparer.OrdinalIgnoreCase)
- .Where(i => BaseItem.SupportedImageExtensions.Contains(Path.GetExtension(i), StringComparer.OrdinalIgnoreCase))
- .ToList();
-
- foreach (var image in deadImages)
- {
- _logger.Debug("Deleting dead chapter image {0}", image);
-
- try
- {
- _fileSystem.DeleteFile(image);
- }
- catch (IOException ex)
- {
- _logger.ErrorException("Error deleting {0}.", ex, image);
- }
- }
- }
- }
-}
diff --git a/MediaBrowser.Server.Implementations/News/NewsEntryPoint.cs b/MediaBrowser.Server.Implementations/News/NewsEntryPoint.cs
deleted file mode 100644
index 22cb4e86a..000000000
--- a/MediaBrowser.Server.Implementations/News/NewsEntryPoint.cs
+++ /dev/null
@@ -1,170 +0,0 @@
-using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.Notifications;
-using MediaBrowser.Controller.Plugins;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.News;
-using MediaBrowser.Model.Notifications;
-using MediaBrowser.Model.Serialization;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-using System.Xml;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Server.Implementations.Threading;
-
-namespace MediaBrowser.Server.Implementations.News
-{
- public class NewsEntryPoint : IServerEntryPoint
- {
- private PeriodicTimer _timer;
- private readonly IHttpClient _httpClient;
- private readonly IApplicationPaths _appPaths;
- private readonly IFileSystem _fileSystem;
- private readonly ILogger _logger;
- private readonly IJsonSerializer _json;
-
- private readonly INotificationManager _notifications;
- private readonly IUserManager _userManager;
-
- private readonly TimeSpan _frequency = TimeSpan.FromHours(24);
-
- public NewsEntryPoint(IHttpClient httpClient, IApplicationPaths appPaths, IFileSystem fileSystem, ILogger logger, IJsonSerializer json, INotificationManager notifications, IUserManager userManager)
- {
- _httpClient = httpClient;
- _appPaths = appPaths;
- _fileSystem = fileSystem;
- _logger = logger;
- _json = json;
- _notifications = notifications;
- _userManager = userManager;
- }
-
- public void Run()
- {
- _timer = new PeriodicTimer(OnTimerFired, null, TimeSpan.FromMilliseconds(500), _frequency);
- }
-
- /// <summary>
- /// Called when [timer fired].
- /// </summary>
- /// <param name="state">The state.</param>
- private async void OnTimerFired(object state)
- {
- var path = Path.Combine(_appPaths.CachePath, "news.json");
-
- try
- {
- await DownloadNews(path).ConfigureAwait(false);
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error downloading news", ex);
- }
- }
-
- private async Task DownloadNews(string path)
- {
- DateTime? lastUpdate = null;
-
- if (_fileSystem.FileExists(path))
- {
- lastUpdate = _fileSystem.GetLastWriteTimeUtc(path);
- }
-
- var requestOptions = new HttpRequestOptions
- {
- Url = "http://emby.media/community/index.php?/blog/rss/1-media-browser-developers-blog",
- Progress = new Progress<double>(),
- UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.42 Safari/537.36",
- BufferContent = false
- };
-
- using (var stream = await _httpClient.Get(requestOptions).ConfigureAwait(false))
- {
- var doc = new XmlDocument();
- doc.Load(stream);
-
- var news = ParseRssItems(doc).ToList();
-
- _json.SerializeToFile(news, path);
-
- await CreateNotifications(news, lastUpdate, CancellationToken.None).ConfigureAwait(false);
- }
- }
-
- private Task CreateNotifications(List<NewsItem> items, DateTime? lastUpdate, CancellationToken cancellationToken)
- {
- if (lastUpdate.HasValue)
- {
- items = items.Where(i => i.Date.ToUniversalTime() >= lastUpdate.Value)
- .ToList();
- }
-
- var tasks = items.Select(i => _notifications.SendNotification(new NotificationRequest
- {
- Date = i.Date,
- Name = i.Title,
- Description = i.Description,
- Url = i.Link,
- UserIds = _userManager.Users.Select(u => u.Id.ToString("N")).ToList()
-
- }, cancellationToken));
-
- return Task.WhenAll(tasks);
- }
-
- private IEnumerable<NewsItem> ParseRssItems(XmlDocument xmlDoc)
- {
- var nodes = xmlDoc.SelectNodes("rss/channel/item");
-
- if (nodes != null)
- {
- foreach (XmlNode node in nodes)
- {
- var newsItem = new NewsItem();
-
- newsItem.Title = ParseDocElements(node, "title");
-
- newsItem.DescriptionHtml = ParseDocElements(node, "description");
- newsItem.Description = newsItem.DescriptionHtml.StripHtml();
-
- newsItem.Link = ParseDocElements(node, "link");
-
- var date = ParseDocElements(node, "pubDate");
- DateTime parsedDate;
-
- if (DateTime.TryParse(date, out parsedDate))
- {
- newsItem.Date = parsedDate;
- }
-
- yield return newsItem;
- }
- }
- }
-
- private string ParseDocElements(XmlNode parent, string xPath)
- {
- var node = parent.SelectSingleNode(xPath);
-
- return node != null ? node.InnerText : string.Empty;
- }
-
- public void Dispose()
- {
- if (_timer != null)
- {
- _timer.Dispose();
- _timer = null;
- }
- }
- }
-}
diff --git a/MediaBrowser.Server.Implementations/packages.config b/MediaBrowser.Server.Implementations/packages.config
index cdfb48abe..5a43abe0f 100644
--- a/MediaBrowser.Server.Implementations/packages.config
+++ b/MediaBrowser.Server.Implementations/packages.config
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
- <package id="Emby.XmlTv" version="1.0.0.62" targetFramework="net46" />
+ <package id="Emby.XmlTv" version="1.0.0.63" targetFramework="net46" />
<package id="ini-parser" version="2.3.0" targetFramework="net45" />
- <package id="MediaBrowser.Naming" version="1.0.0.59" targetFramework="net46" />
<package id="Microsoft.IO.RecyclableMemoryStream" version="1.1.0.0" targetFramework="net46" />
<package id="Patterns.Logging" version="1.0.0.6" targetFramework="net46" />
<package id="SocketHttpListener" version="1.0.0.40" targetFramework="net45" />