diff --git a/MediaBrowser.Api/ChannelService.cs b/MediaBrowser.Api/ChannelService.cs
index 2cc046f1d4..3736814e57 100644
--- a/MediaBrowser.Api/ChannelService.cs
+++ b/MediaBrowser.Api/ChannelService.cs
@@ -230,7 +230,7 @@ namespace MediaBrowser.Api
SortOrder = request.SortOrder,
SortBy = (request.SortBy ?? string.Empty).Split(',').Where(i => !string.IsNullOrWhiteSpace(i)).ToArray(),
Filters = request.GetFilters().ToArray(),
- Fields = request.GetItemFields().ToList()
+ Fields = request.GetItemFields().ToArray()
}, CancellationToken.None).Result;
diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs
index ea7eaa9471..43e9ad3efe 100644
--- a/MediaBrowser.Api/Images/ImageService.cs
+++ b/MediaBrowser.Api/Images/ImageService.cs
@@ -40,6 +40,7 @@ namespace MediaBrowser.Api.Images
[Route("/Items/{Id}/Images/{Type}", "GET")]
[Route("/Items/{Id}/Images/{Type}/{Index}", "GET")]
[Route("/Items/{Id}/Images/{Type}/{Index}/{Tag}/{Format}/{MaxWidth}/{MaxHeight}", "GET")]
+ [Route("/Items/{Id}/Images/{Type}/{Index}/{Tag}/{Format}/{MaxWidth}/{MaxHeight}", "HEAD")]
[Api(Description = "Gets an item image")]
public class GetItemImage : ImageRequest
{
diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj
index 9a7d28ec43..df689cb24d 100644
--- a/MediaBrowser.Api/MediaBrowser.Api.csproj
+++ b/MediaBrowser.Api/MediaBrowser.Api.csproj
@@ -118,10 +118,11 @@
-
+
-
+
+
@@ -139,8 +140,8 @@
-
-
+
+
@@ -173,4 +174,4 @@
-->
-
+
\ No newline at end of file
diff --git a/MediaBrowser.Api/WebSocket/SessionInfoWebSocketListener.cs b/MediaBrowser.Api/Session/SessionInfoWebSocketListener.cs
similarity index 99%
rename from MediaBrowser.Api/WebSocket/SessionInfoWebSocketListener.cs
rename to MediaBrowser.Api/Session/SessionInfoWebSocketListener.cs
index 600d9e405a..e6b525e534 100644
--- a/MediaBrowser.Api/WebSocket/SessionInfoWebSocketListener.cs
+++ b/MediaBrowser.Api/Session/SessionInfoWebSocketListener.cs
@@ -7,7 +7,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-namespace MediaBrowser.Api.WebSocket
+namespace MediaBrowser.Api.Session
{
///
/// Class SessionInfoWebSocketListener
diff --git a/MediaBrowser.Api/SessionsService.cs b/MediaBrowser.Api/Session/SessionsService.cs
similarity index 99%
rename from MediaBrowser.Api/SessionsService.cs
rename to MediaBrowser.Api/Session/SessionsService.cs
index 8017f35231..e2c95eba9c 100644
--- a/MediaBrowser.Api/SessionsService.cs
+++ b/MediaBrowser.Api/Session/SessionsService.cs
@@ -10,7 +10,7 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-namespace MediaBrowser.Api
+namespace MediaBrowser.Api.Session
{
///
/// Class GetSessions
diff --git a/MediaBrowser.Api/System/ActivityLogService.cs b/MediaBrowser.Api/System/ActivityLogService.cs
new file mode 100644
index 0000000000..0ccc28c6ff
--- /dev/null
+++ b/MediaBrowser.Api/System/ActivityLogService.cs
@@ -0,0 +1,44 @@
+using MediaBrowser.Controller.Activity;
+using MediaBrowser.Controller.Net;
+using MediaBrowser.Model.Activity;
+using MediaBrowser.Model.Querying;
+using ServiceStack;
+
+namespace MediaBrowser.Api.System
+{
+ [Route("/System/ActivityLog/Entries", "GET", Summary = "Gets activity log entries")]
+ public class GetActivityLogs : IReturn>
+ {
+ ///
+ /// Skips over a given number of items within the results. Use for paging.
+ ///
+ /// The start index.
+ [ApiMember(Name = "StartIndex", Description = "Optional. The record index to start at. All items with a lower index will be dropped from the results.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
+ public int? StartIndex { get; set; }
+
+ ///
+ /// The maximum number of items to return
+ ///
+ /// The limit.
+ [ApiMember(Name = "Limit", Description = "Optional. The maximum number of records to return", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
+ public int? Limit { get; set; }
+ }
+
+ [Authenticated]
+ public class ActivityLogService : BaseApiService
+ {
+ private readonly IActivityManager _activityManager;
+
+ public ActivityLogService(IActivityManager activityManager)
+ {
+ _activityManager = activityManager;
+ }
+
+ public object Get(GetActivityLogs request)
+ {
+ var result = _activityManager.GetActivityLogEntries(request.StartIndex, request.Limit);
+
+ return ToOptimizedResult(result);
+ }
+ }
+}
diff --git a/MediaBrowser.Api/WebSocket/SystemInfoWebSocketListener.cs b/MediaBrowser.Api/System/SystemInfoWebSocketListener.cs
similarity index 97%
rename from MediaBrowser.Api/WebSocket/SystemInfoWebSocketListener.cs
rename to MediaBrowser.Api/System/SystemInfoWebSocketListener.cs
index 2940bcef06..c20cef3b38 100644
--- a/MediaBrowser.Api/WebSocket/SystemInfoWebSocketListener.cs
+++ b/MediaBrowser.Api/System/SystemInfoWebSocketListener.cs
@@ -4,7 +4,7 @@ using MediaBrowser.Model.Logging;
using MediaBrowser.Model.System;
using System.Threading.Tasks;
-namespace MediaBrowser.Api.WebSocket
+namespace MediaBrowser.Api.System
{
///
/// Class SystemInfoWebSocketListener
diff --git a/MediaBrowser.Api/SystemService.cs b/MediaBrowser.Api/System/SystemService.cs
similarity index 95%
rename from MediaBrowser.Api/SystemService.cs
rename to MediaBrowser.Api/System/SystemService.cs
index 259b1d8921..3913275eee 100644
--- a/MediaBrowser.Api/SystemService.cs
+++ b/MediaBrowser.Api/System/SystemService.cs
@@ -4,12 +4,13 @@ using MediaBrowser.Controller;
using MediaBrowser.Controller.Net;
using MediaBrowser.Model.System;
using ServiceStack;
+using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
-namespace MediaBrowser.Api
+namespace MediaBrowser.Api.System
{
///
/// Class GetSystemInfo
@@ -73,7 +74,7 @@ namespace MediaBrowser.Api
/// The app host.
/// The application paths.
/// The file system.
- /// jsonSerializer
+ /// jsonSerializer
public SystemService(IServerApplicationHost appHost, IApplicationPaths appPaths, IFileSystem fileSystem)
{
_appHost = appHost;
@@ -89,7 +90,7 @@ namespace MediaBrowser.Api
{
files = new DirectoryInfo(_appPaths.LogDirectoryPath)
.EnumerateFiles("*", SearchOption.AllDirectories)
- .Where(i => string.Equals(i.Extension, ".txt", System.StringComparison.OrdinalIgnoreCase))
+ .Where(i => string.Equals(i.Extension, ".txt", global::System.StringComparison.OrdinalIgnoreCase))
.ToList();
}
catch (DirectoryNotFoundException)
@@ -116,7 +117,7 @@ namespace MediaBrowser.Api
{
var file = new DirectoryInfo(_appPaths.LogDirectoryPath)
.EnumerateFiles("*", SearchOption.AllDirectories)
- .First(i => string.Equals(i.Name, request.Name, System.StringComparison.OrdinalIgnoreCase));
+ .First(i => string.Equals(i.Name, request.Name, global::System.StringComparison.OrdinalIgnoreCase));
return ResultFactory.GetStaticFileResult(Request, file.FullName, FileShare.ReadWrite);
}
diff --git a/MediaBrowser.Api/UserService.cs b/MediaBrowser.Api/UserService.cs
index f5a1f54cbb..4ffe5b3911 100644
--- a/MediaBrowser.Api/UserService.cs
+++ b/MediaBrowser.Api/UserService.cs
@@ -195,7 +195,7 @@ namespace MediaBrowser.Api
var authInfo = AuthorizationContext.GetAuthorizationInfo(Request);
var isDashboard = string.Equals(authInfo.Client, "Dashboard", StringComparison.OrdinalIgnoreCase);
- if ((Request.IsLocal && isDashboard) ||
+ if ((Request.IsLocal && isDashboard) ||
!_config.Configuration.IsStartupWizardCompleted)
{
return Get(new GetUsers
@@ -327,7 +327,7 @@ namespace MediaBrowser.Api
var revokeTask = _sessionMananger.RevokeUserTokens(user.Id.ToString("N"));
Task.WaitAll(revokeTask);
-
+
var task = _userManager.DeleteUser(user);
Task.WaitAll(task);
@@ -374,8 +374,17 @@ namespace MediaBrowser.Api
auth.DeviceId = "Unknown device id";
}
- var result = _sessionMananger.AuthenticateNewSession(request.Username, request.Password, auth.Client, auth.Version,
- auth.DeviceId, auth.Device, Request.RemoteIp, Request.IsLocal).Result;
+ var result = _sessionMananger.AuthenticateNewSession(new AuthenticationRequest
+ {
+ App = auth.Client,
+ AppVersion = auth.Version,
+ DeviceId = auth.DeviceId,
+ DeviceName = auth.Device,
+ Password = request.Password,
+ RemoteEndPoint = Request.RemoteIp,
+ Username = request.Username
+
+ }, Request.IsLocal).Result;
return ToOptimizedResult(result);
}
@@ -457,8 +466,8 @@ namespace MediaBrowser.Api
Task.WaitAll(revokeTask);
}
- var task = user.Name.Equals(dtoUser.Name, StringComparison.Ordinal) ?
- _userManager.UpdateUser(user) :
+ var task = user.Name.Equals(dtoUser.Name, StringComparison.Ordinal) ?
+ _userManager.UpdateUser(user) :
_userManager.RenameUser(user, dtoUser.Name);
Task.WaitAll(task);
diff --git a/MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs b/MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs
index 60abc14f1a..cb6121c9ff 100644
--- a/MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs
+++ b/MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs
@@ -28,6 +28,11 @@ namespace MediaBrowser.Common.Implementations.Configuration
///
public event EventHandler ConfigurationUpdated;
+ ///
+ /// Occurs when [configuration updating].
+ ///
+ public event EventHandler NamedConfigurationUpdating;
+
///
/// Occurs when [named configuration updated].
///
@@ -217,6 +222,13 @@ namespace MediaBrowser.Common.Implementations.Configuration
throw new ArgumentException("Expected configuration type is " + configurationType.Name);
}
+ EventHelper.FireEventIfNotNull(NamedConfigurationUpdating, this, new ConfigurationUpdateEventArgs
+ {
+ Key = key,
+ NewConfiguration = configuration
+
+ }, Logger);
+
_configurations.AddOrUpdate(key, configuration, (k, v) => configuration);
var path = GetConfigurationFile(key);
diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs
index 68222d8436..0dc67f8c00 100644
--- a/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs
+++ b/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs
@@ -547,6 +547,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
if (ex != null)
{
result.ErrorMessage = ex.Message;
+ result.LongErrorMessage = ex.StackTrace;
}
var path = GetHistoryFilePath();
diff --git a/MediaBrowser.Common/Configuration/IConfigurationManager.cs b/MediaBrowser.Common/Configuration/IConfigurationManager.cs
index 25698d9729..d826a3ee78 100644
--- a/MediaBrowser.Common/Configuration/IConfigurationManager.cs
+++ b/MediaBrowser.Common/Configuration/IConfigurationManager.cs
@@ -6,6 +6,11 @@ namespace MediaBrowser.Common.Configuration
{
public interface IConfigurationManager
{
+ ///
+ /// Occurs when [configuration updating].
+ ///
+ event EventHandler NamedConfigurationUpdating;
+
///
/// Occurs when [configuration updated].
///
diff --git a/MediaBrowser.Common/ScheduledTasks/IConfigurableScheduledTask.cs b/MediaBrowser.Common/ScheduledTasks/IConfigurableScheduledTask.cs
index fc69630709..6989dea06b 100644
--- a/MediaBrowser.Common/ScheduledTasks/IConfigurableScheduledTask.cs
+++ b/MediaBrowser.Common/ScheduledTasks/IConfigurableScheduledTask.cs
@@ -13,4 +13,9 @@
/// true if this instance is enabled; otherwise, false.
bool IsEnabled { get; }
}
+
+ public interface IScheduledTaskActivityLog
+ {
+ bool IsActivityLogged { get; }
+ }
}
\ No newline at end of file
diff --git a/MediaBrowser.Controller/Activity/IActivityManager.cs b/MediaBrowser.Controller/Activity/IActivityManager.cs
new file mode 100644
index 0000000000..0c565ae36c
--- /dev/null
+++ b/MediaBrowser.Controller/Activity/IActivityManager.cs
@@ -0,0 +1,17 @@
+using MediaBrowser.Model.Activity;
+using MediaBrowser.Model.Events;
+using MediaBrowser.Model.Querying;
+using System;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Controller.Activity
+{
+ public interface IActivityManager
+ {
+ event EventHandler> EntryCreated;
+
+ Task Create(ActivityLogEntry entry);
+
+ QueryResult GetActivityLogEntries(int? startIndex, int? limit);
+ }
+}
diff --git a/MediaBrowser.Controller/Activity/IActivityRepository.cs b/MediaBrowser.Controller/Activity/IActivityRepository.cs
new file mode 100644
index 0000000000..29e60ff1f0
--- /dev/null
+++ b/MediaBrowser.Controller/Activity/IActivityRepository.cs
@@ -0,0 +1,13 @@
+using MediaBrowser.Model.Activity;
+using MediaBrowser.Model.Querying;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Controller.Activity
+{
+ public interface IActivityRepository
+ {
+ Task Create(ActivityLogEntry entry);
+
+ QueryResult GetActivityLogEntries(int? startIndex, int? limit);
+ }
+}
diff --git a/MediaBrowser.Controller/Configuration/IServerConfigurationManager.cs b/MediaBrowser.Controller/Configuration/IServerConfigurationManager.cs
index aac8cda2eb..13c9f8d84b 100644
--- a/MediaBrowser.Controller/Configuration/IServerConfigurationManager.cs
+++ b/MediaBrowser.Controller/Configuration/IServerConfigurationManager.cs
@@ -1,7 +1,5 @@
using MediaBrowser.Common.Configuration;
using MediaBrowser.Model.Configuration;
-using MediaBrowser.Model.Events;
-using System;
namespace MediaBrowser.Controller.Configuration
{
@@ -10,11 +8,6 @@ namespace MediaBrowser.Controller.Configuration
///
public interface IServerConfigurationManager : IConfigurationManager
{
- ///
- /// Occurs when [configuration updating].
- ///
- event EventHandler> ConfigurationUpdating;
-
///
/// Gets the application paths.
///
diff --git a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
index 5e6bd97079..19c9601671 100644
--- a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
+++ b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
@@ -102,17 +102,9 @@ namespace MediaBrowser.Controller.Entities.Movies
var totalItems = items.Count;
var percentages = new Dictionary(totalItems);
- var tasks = new List();
-
// Refresh songs
foreach (var item in items)
{
- if (tasks.Count >= 3)
- {
- await Task.WhenAll(tasks).ConfigureAwait(false);
- tasks.Clear();
- }
-
cancellationToken.ThrowIfCancellationRequested();
var innerProgress = new ActionableProgress();
@@ -132,13 +124,9 @@ namespace MediaBrowser.Controller.Entities.Movies
});
// Avoid implicitly captured closure
- var taskChild = item;
- tasks.Add(Task.Run(async () => await RefreshItem(taskChild, refreshOptions, innerProgress, cancellationToken).ConfigureAwait(false), cancellationToken));
+ await RefreshItem(item, refreshOptions, innerProgress, cancellationToken).ConfigureAwait(false);
}
- await Task.WhenAll(tasks).ConfigureAwait(false);
- tasks.Clear();
-
// Refresh current item
await RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
diff --git a/MediaBrowser.Controller/Library/IUserManager.cs b/MediaBrowser.Controller/Library/IUserManager.cs
index 0da5f92728..c6bbf02ae7 100644
--- a/MediaBrowser.Controller/Library/IUserManager.cs
+++ b/MediaBrowser.Controller/Library/IUserManager.cs
@@ -31,6 +31,7 @@ namespace MediaBrowser.Controller.Library
event EventHandler> UserCreated;
event EventHandler> UserConfigurationUpdated;
+ event EventHandler> UserPasswordChanged;
///
/// Updates the configuration.
diff --git a/MediaBrowser.Controller/Library/TVUtils.cs b/MediaBrowser.Controller/Library/TVUtils.cs
index d8d836597b..34486182b7 100644
--- a/MediaBrowser.Controller/Library/TVUtils.cs
+++ b/MediaBrowser.Controller/Library/TVUtils.cs
@@ -269,7 +269,7 @@ namespace MediaBrowser.Controller.Library
if ((attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
{
- logger.Debug("Igoring series file or folder marked hidden: {0}", child.FullName);
+ //logger.Debug("Igoring series file or folder marked hidden: {0}", child.FullName);
continue;
}
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index 5243e1a2ae..28e1ffb1c8 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -68,6 +68,8 @@
Properties\SharedVersion.cs
+
+
@@ -241,6 +243,7 @@
+
@@ -320,6 +323,7 @@
+
@@ -360,4 +364,4 @@ xcopy "$(TargetPath)" "$(SolutionDir)\Nuget\dlls\" /y /d /r /i
-->
-
+
\ No newline at end of file
diff --git a/MediaBrowser.Controller/Notifications/INotificationsRepository.cs b/MediaBrowser.Controller/Notifications/INotificationsRepository.cs
index 87b89e79c8..254e56e059 100644
--- a/MediaBrowser.Controller/Notifications/INotificationsRepository.cs
+++ b/MediaBrowser.Controller/Notifications/INotificationsRepository.cs
@@ -16,10 +16,6 @@ namespace MediaBrowser.Controller.Notifications
///
event EventHandler NotificationAdded;
///
- /// Occurs when [notification updated].
- ///
- event EventHandler NotificationUpdated;
- ///
/// Occurs when [notifications marked read].
///
event EventHandler NotificationsMarkedRead;
@@ -37,14 +33,6 @@ namespace MediaBrowser.Controller.Notifications
/// NotificationResult.
NotificationResult GetNotifications(NotificationQuery query);
- ///
- /// Gets the notification.
- ///
- /// The id.
- /// The user id.
- /// Notification.
- Notification GetNotification(string id, string userId);
-
///
/// Adds the notification.
///
diff --git a/MediaBrowser.Controller/Session/AuthenticationRequest.cs b/MediaBrowser.Controller/Session/AuthenticationRequest.cs
new file mode 100644
index 0000000000..38871e8147
--- /dev/null
+++ b/MediaBrowser.Controller/Session/AuthenticationRequest.cs
@@ -0,0 +1,14 @@
+
+namespace MediaBrowser.Controller.Session
+{
+ public class AuthenticationRequest
+ {
+ public string Username { get; set; }
+ public string Password { get; set; }
+ public string App { get; set; }
+ public string AppVersion { get; set; }
+ public string DeviceId { get; set; }
+ public string DeviceName { get; set; }
+ public string RemoteEndPoint { get; set; }
+ }
+}
diff --git a/MediaBrowser.Controller/Session/ISessionManager.cs b/MediaBrowser.Controller/Session/ISessionManager.cs
index e37a139233..f715ce7703 100644
--- a/MediaBrowser.Controller/Session/ISessionManager.cs
+++ b/MediaBrowser.Controller/Session/ISessionManager.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Events;
using MediaBrowser.Model.Session;
using MediaBrowser.Model.Users;
using System;
@@ -46,6 +47,16 @@ namespace MediaBrowser.Controller.Session
/// Occurs when [capabilities changed].
///
event EventHandler CapabilitiesChanged;
+
+ ///
+ /// Occurs when [authentication failed].
+ ///
+ event EventHandler> AuthenticationFailed;
+
+ ///
+ /// Occurs when [authentication succeeded].
+ ///
+ event EventHandler> AuthenticationSucceeded;
///
/// Gets the sessions.
@@ -211,23 +222,10 @@ namespace MediaBrowser.Controller.Session
///
/// Authenticates the new session.
///
- /// The username.
- /// The password.
- /// Type of the client.
- /// The application version.
- /// The device identifier.
- /// Name of the device.
- /// The remote end point.
+ /// The request.
/// if set to true [is local].
/// Task{SessionInfo}.
- Task AuthenticateNewSession(string username,
- string password,
- string clientType,
- string appVersion,
- string deviceId,
- string deviceName,
- string remoteEndPoint,
- bool isLocal);
+ Task AuthenticateNewSession(AuthenticationRequest request, bool isLocal);
///
/// Reports the capabilities.
diff --git a/MediaBrowser.Controller/Subtitles/ISubtitleManager.cs b/MediaBrowser.Controller/Subtitles/ISubtitleManager.cs
index 1d66d1505b..0c814c0d4c 100644
--- a/MediaBrowser.Controller/Subtitles/ISubtitleManager.cs
+++ b/MediaBrowser.Controller/Subtitles/ISubtitleManager.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Providers;
+using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
@@ -8,6 +9,16 @@ namespace MediaBrowser.Controller.Subtitles
{
public interface ISubtitleManager
{
+ ///
+ /// Occurs when [subtitle download failure].
+ ///
+ event EventHandler SubtitleDownloadFailure;
+
+ ///
+ /// Occurs when [subtitles downloaded].
+ ///
+ event EventHandler SubtitlesDownloaded;
+
///
/// Adds the parts.
///
@@ -31,7 +42,7 @@ namespace MediaBrowser.Controller.Subtitles
/// The request.
/// The cancellation token.
/// Task{IEnumerable{RemoteSubtitleInfo}}.
- Task> SearchSubtitles(SubtitleSearchRequest request,
+ Task> SearchSubtitles(SubtitleSearchRequest request,
CancellationToken cancellationToken);
///
@@ -41,8 +52,8 @@ namespace MediaBrowser.Controller.Subtitles
/// The subtitle identifier.
/// The cancellation token.
/// Task.
- Task DownloadSubtitles(Video video,
- string subtitleId,
+ Task DownloadSubtitles(Video video,
+ string subtitleId,
CancellationToken cancellationToken);
///
diff --git a/MediaBrowser.Controller/Subtitles/SubtitleDownloadEventArgs.cs b/MediaBrowser.Controller/Subtitles/SubtitleDownloadEventArgs.cs
new file mode 100644
index 0000000000..1d204f2cbd
--- /dev/null
+++ b/MediaBrowser.Controller/Subtitles/SubtitleDownloadEventArgs.cs
@@ -0,0 +1,27 @@
+using System;
+using MediaBrowser.Controller.Entities;
+
+namespace MediaBrowser.Controller.Subtitles
+{
+ public class SubtitleDownloadEventArgs
+ {
+ public BaseItem Item { get; set; }
+
+ public string Format { get; set; }
+
+ public string Language { get; set; }
+
+ public bool IsForced { get; set; }
+
+ public string Provider { get; set; }
+ }
+
+ public class SubtitleDownloadFailureEventArgs
+ {
+ public BaseItem Item { get; set; }
+
+ public string Provider { get; set; }
+
+ public Exception Exception { get; set; }
+ }
+}
diff --git a/MediaBrowser.LocalMetadata/BaseXmlProvider.cs b/MediaBrowser.LocalMetadata/BaseXmlProvider.cs
index 62aec5ecbd..25778d036b 100644
--- a/MediaBrowser.LocalMetadata/BaseXmlProvider.cs
+++ b/MediaBrowser.LocalMetadata/BaseXmlProvider.cs
@@ -27,7 +27,7 @@ namespace MediaBrowser.LocalMetadata
var path = file.FullName;
- await XmlProviderUtils.XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
+ //await XmlProviderUtils.XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
try
{
@@ -46,7 +46,7 @@ namespace MediaBrowser.LocalMetadata
}
finally
{
- XmlProviderUtils.XmlParsingResourcePool.Release();
+ //XmlProviderUtils.XmlParsingResourcePool.Release();
}
return result;
diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
index ca48b88896..2a99076d42 100644
--- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
+++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
@@ -83,6 +83,9 @@
+
+ Activity\ActivityLogEntry.cs
+
ApiClient\ApiClientExtensions.cs
@@ -173,9 +176,6 @@
Configuration\ServerConfiguration.cs
-
- Configuration\SubtitleOptions.cs
-
Configuration\SubtitlePlaybackMode.cs
@@ -728,6 +728,9 @@
Providers\RemoteSubtitleInfo.cs
+
+ Providers\SubtitleOptions.cs
+
Querying\AllThemeMediaResult.cs
diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
index 1adf83d36a..72414d454c 100644
--- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
+++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
@@ -52,6 +52,9 @@
+
+ Activity\ActivityLogEntry.cs
+
ApiClient\GeneralCommandEventArgs.cs
@@ -136,9 +139,6 @@
Configuration\ServerConfiguration.cs
-
- Configuration\SubtitleOptions.cs
-
Configuration\SubtitlePlaybackMode.cs
@@ -685,6 +685,9 @@
Providers\RemoteSubtitleInfo.cs
+
+ Providers\SubtitleOptions.cs
+
Querying\AllThemeMediaResult.cs
diff --git a/MediaBrowser.Model/Activity/ActivityLogEntry.cs b/MediaBrowser.Model/Activity/ActivityLogEntry.cs
new file mode 100644
index 0000000000..8fad574618
--- /dev/null
+++ b/MediaBrowser.Model/Activity/ActivityLogEntry.cs
@@ -0,0 +1,62 @@
+using MediaBrowser.Model.Logging;
+using System;
+
+namespace MediaBrowser.Model.Activity
+{
+ public class ActivityLogEntry
+ {
+ ///
+ /// Gets or sets the identifier.
+ ///
+ /// The identifier.
+ public string Id { get; set; }
+
+ ///
+ /// Gets or sets the name.
+ ///
+ /// The name.
+ public string Name { get; set; }
+
+ ///
+ /// Gets or sets the overview.
+ ///
+ /// The overview.
+ public string Overview { get; set; }
+
+ ///
+ /// Gets or sets the short overview.
+ ///
+ /// The short overview.
+ public string ShortOverview { get; set; }
+
+ ///
+ /// Gets or sets the type.
+ ///
+ /// The type.
+ public string Type { get; set; }
+
+ ///
+ /// Gets or sets the item identifier.
+ ///
+ /// The item identifier.
+ public string ItemId { get; set; }
+
+ ///
+ /// Gets or sets the date.
+ ///
+ /// The date.
+ public DateTime Date { get; set; }
+
+ ///
+ /// Gets or sets the user identifier.
+ ///
+ /// The user identifier.
+ public string UserId { get; set; }
+
+ ///
+ /// Gets or sets the log severity.
+ ///
+ /// The log severity.
+ public LogSeverity Severity { get; set; }
+ }
+}
diff --git a/MediaBrowser.Model/ApiClient/IApiClient.cs b/MediaBrowser.Model/ApiClient/IApiClient.cs
index 363500954a..98b765e6bd 100644
--- a/MediaBrowser.Model/ApiClient/IApiClient.cs
+++ b/MediaBrowser.Model/ApiClient/IApiClient.cs
@@ -623,7 +623,7 @@ namespace MediaBrowser.Model.ApiClient
Task ReportPlaybackStoppedAsync(PlaybackStopInfo info);
///
- /// Instructs antoher client to browse to a library item.
+ /// Instructs another client to browse to a library item.
///
/// The session id.
/// The id of the item to browse to.
diff --git a/MediaBrowser.Model/Channels/ChannelItemQuery.cs b/MediaBrowser.Model/Channels/ChannelItemQuery.cs
index a76c6cd2d3..4aacc16194 100644
--- a/MediaBrowser.Model/Channels/ChannelItemQuery.cs
+++ b/MediaBrowser.Model/Channels/ChannelItemQuery.cs
@@ -1,6 +1,5 @@
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying;
-using System.Collections.Generic;
namespace MediaBrowser.Model.Channels
{
@@ -39,13 +38,13 @@ namespace MediaBrowser.Model.Channels
public SortOrder? SortOrder { get; set; }
public string[] SortBy { get; set; }
public ItemFilter[] Filters { get; set; }
- public List Fields { get; set; }
+ public ItemFields[] Fields { get; set; }
public ChannelItemQuery()
{
Filters = new ItemFilter[] { };
SortBy = new string[] { };
- Fields = new List();
+ Fields = new ItemFields[] { };
}
}
diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
index 4734e2af7d..6600a3e912 100644
--- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs
+++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
@@ -2,6 +2,7 @@
using MediaBrowser.Model.FileOrganization;
using MediaBrowser.Model.LiveTv;
using MediaBrowser.Model.Notifications;
+using MediaBrowser.Model.Providers;
namespace MediaBrowser.Model.Configuration
{
@@ -285,8 +286,6 @@ namespace MediaBrowser.Model.Configuration
new MetadataOptions(0, 1280) {ItemType = "Season"}
};
-
- SubtitleOptions = new SubtitleOptions();
}
}
}
diff --git a/MediaBrowser.Model/Events/GenericEventArgs.cs b/MediaBrowser.Model/Events/GenericEventArgs.cs
index 5a83419e19..3c558577ad 100644
--- a/MediaBrowser.Model/Events/GenericEventArgs.cs
+++ b/MediaBrowser.Model/Events/GenericEventArgs.cs
@@ -13,5 +13,21 @@ namespace MediaBrowser.Model.Events
///
/// The argument.
public T Argument { get; set; }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The argument.
+ public GenericEventArgs(T arg)
+ {
+ Argument = arg;
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public GenericEventArgs()
+ {
+ }
}
}
diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj
index 042828887f..75694cb04d 100644
--- a/MediaBrowser.Model/MediaBrowser.Model.csproj
+++ b/MediaBrowser.Model/MediaBrowser.Model.csproj
@@ -59,6 +59,7 @@
Properties\SharedVersion.cs
+
@@ -99,7 +100,7 @@
-
+
@@ -378,4 +379,4 @@ xcopy "$(TargetPath)" "$(SolutionDir)\Nuget\dlls\net45\" /y /d /r /i
-->
-
+
\ No newline at end of file
diff --git a/MediaBrowser.Model/Configuration/SubtitleOptions.cs b/MediaBrowser.Model/Providers/SubtitleOptions.cs
similarity index 93%
rename from MediaBrowser.Model/Configuration/SubtitleOptions.cs
rename to MediaBrowser.Model/Providers/SubtitleOptions.cs
index d50dba1b2e..84f01e0b7a 100644
--- a/MediaBrowser.Model/Configuration/SubtitleOptions.cs
+++ b/MediaBrowser.Model/Providers/SubtitleOptions.cs
@@ -1,4 +1,4 @@
-namespace MediaBrowser.Model.Configuration
+namespace MediaBrowser.Model.Providers
{
public class SubtitleOptions
{
diff --git a/MediaBrowser.Model/Tasks/TaskResult.cs b/MediaBrowser.Model/Tasks/TaskResult.cs
index e73b4c9a11..956d68ae4d 100644
--- a/MediaBrowser.Model/Tasks/TaskResult.cs
+++ b/MediaBrowser.Model/Tasks/TaskResult.cs
@@ -42,5 +42,11 @@ namespace MediaBrowser.Model.Tasks
///
/// The error message.
public string ErrorMessage { get; set; }
+
+ ///
+ /// Gets or sets the long error message.
+ ///
+ /// The long error message.
+ public string LongErrorMessage { get; set; }
}
}
diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj
index 76a1e52f5b..66188f796a 100644
--- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj
+++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj
@@ -152,6 +152,7 @@
+
@@ -213,4 +214,4 @@
-->
-
+
\ No newline at end of file
diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs
index a2e1ba05a7..f48707582c 100644
--- a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs
+++ b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs
@@ -13,10 +13,12 @@ using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Controller.Subtitles;
+using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.MediaInfo;
+using MediaBrowser.Model.Providers;
using MediaBrowser.Model.Serialization;
using System;
using System.Collections.Generic;
@@ -464,6 +466,11 @@ namespace MediaBrowser.Providers.MediaInfo
}
}
+ private SubtitleOptions GetOptions()
+ {
+ return _config.GetConfiguration("subtitles");
+ }
+
///
/// Adds the external subtitles.
///
@@ -484,9 +491,11 @@ namespace MediaBrowser.Providers.MediaInfo
var enableSubtitleDownloading = options.MetadataRefreshMode == MetadataRefreshMode.Default ||
options.MetadataRefreshMode == MetadataRefreshMode.FullRefresh;
- if (enableSubtitleDownloading && (_config.Configuration.SubtitleOptions.DownloadEpisodeSubtitles &&
+ var subtitleOptions = GetOptions();
+
+ if (enableSubtitleDownloading && (subtitleOptions.DownloadEpisodeSubtitles &&
video is Episode) ||
- (_config.Configuration.SubtitleOptions.DownloadMovieSubtitles &&
+ (subtitleOptions.DownloadMovieSubtitles &&
video is Movie))
{
var downloadedLanguages = await new SubtitleDownloader(_logger,
@@ -494,9 +503,9 @@ namespace MediaBrowser.Providers.MediaInfo
.DownloadSubtitles(video,
currentStreams,
externalSubtitleStreams,
- _config.Configuration.SubtitleOptions.SkipIfGraphicalSubtitlesPresent,
- _config.Configuration.SubtitleOptions.SkipIfAudioTrackMatches,
- _config.Configuration.SubtitleOptions.DownloadLanguages,
+ subtitleOptions.SkipIfGraphicalSubtitlesPresent,
+ subtitleOptions.SkipIfAudioTrackMatches,
+ subtitleOptions.DownloadLanguages,
cancellationToken).ConfigureAwait(false);
// Rescan
diff --git a/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs b/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs
index 361cc317c2..63df3f50d5 100644
--- a/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs
+++ b/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs
@@ -1,10 +1,12 @@
-using MediaBrowser.Common.ScheduledTasks;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Subtitles;
+using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using System;
@@ -12,6 +14,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
+using MediaBrowser.Model.Providers;
namespace MediaBrowser.Providers.MediaInfo
{
@@ -45,8 +48,15 @@ namespace MediaBrowser.Providers.MediaInfo
get { return "Library"; }
}
+ private SubtitleOptions GetOptions()
+ {
+ return _config.GetConfiguration("subtitles");
+ }
+
public async Task Execute(CancellationToken cancellationToken, IProgress progress)
{
+ var options = GetOptions();
+
var videos = _libraryManager.RootFolder
.RecursiveChildren
.OfType