aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--BDInfo/BDInfo.csproj1
-rw-r--r--MediaBrowser.Api/EnvironmentService.cs20
-rw-r--r--MediaBrowser.Api/Images/ImageService.cs26
-rw-r--r--MediaBrowser.Api/Library/LibraryService.cs36
-rw-r--r--MediaBrowser.Api/Library/LibraryStructureService.cs14
-rw-r--r--MediaBrowser.Api/MediaBrowser.Api.csproj3
-rw-r--r--MediaBrowser.Api/Playback/BaseStreamingService.cs12
-rw-r--r--MediaBrowser.Api/Playback/Hls/AudioHlsService.cs3
-rw-r--r--MediaBrowser.Api/Playback/Hls/BaseHlsService.cs6
-rw-r--r--MediaBrowser.Api/Playback/Hls/VideoHlsService.cs4
-rw-r--r--MediaBrowser.Api/Playback/Progressive/AudioService.cs4
-rw-r--r--MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs4
-rw-r--r--MediaBrowser.Api/Playback/Progressive/VideoService.cs4
-rw-r--r--MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs8
-rw-r--r--MediaBrowser.Api/UserLibrary/GenresService.cs11
-rw-r--r--MediaBrowser.Api/UserLibrary/ItemsService.cs12
-rw-r--r--MediaBrowser.Api/UserLibrary/PersonsService.cs7
-rw-r--r--MediaBrowser.Api/UserLibrary/StudiosService.cs11
-rw-r--r--MediaBrowser.Api/UserLibrary/UserLibraryService.cs41
-rw-r--r--MediaBrowser.Api/UserLibrary/YearsService.cs13
-rw-r--r--MediaBrowser.Common.Implementations/NetworkManagement/NetworkManager.cs32
-rw-r--r--MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs44
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs3
-rw-r--r--MediaBrowser.Controller/Entities/CollectionFolder.cs2
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs12
-rw-r--r--MediaBrowser.Controller/Entities/Movies/Movie.cs2
-rw-r--r--MediaBrowser.Controller/Entities/User.cs2
-rw-r--r--MediaBrowser.Controller/Entities/UserRootFolder.cs2
-rw-r--r--MediaBrowser.Controller/IO/DirectoryWatchers.cs19
-rw-r--r--MediaBrowser.Controller/IO/FileSystemManager.cs6
-rw-r--r--MediaBrowser.Controller/Kernel.cs96
-rw-r--r--MediaBrowser.Controller/Library/DtoBuilder.cs34
-rw-r--r--MediaBrowser.Controller/Library/ILibraryManager.cs145
-rw-r--r--MediaBrowser.Controller/MediaBrowser.Controller.csproj2
-rw-r--r--MediaBrowser.Controller/ScheduledTasks/PeopleValidationTask.cs14
-rw-r--r--MediaBrowser.Controller/ScheduledTasks/RefreshMediaLibraryTask.cs13
-rw-r--r--MediaBrowser.Server.Implementations/BdInfo/BdInfoExaminer.cs (renamed from BDInfo/BdInfoExaminer.cs)5
-rw-r--r--MediaBrowser.Server.Implementations/Library/LibraryManager.cs (renamed from MediaBrowser.Controller/Library/LibraryManager.cs)114
-rw-r--r--MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj9
-rw-r--r--MediaBrowser.Server.Implementations/ScheduledTasks/Tasks/ChapterImagesTask.cs8
-rw-r--r--MediaBrowser.Server.Implementations/ScheduledTasks/Tasks/ImageCleanupTask.cs11
-rw-r--r--MediaBrowser.Server.Implementations/packages.config1
-rw-r--r--MediaBrowser.ServerApplication/ApplicationHost.cs26
-rw-r--r--MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs9
-rw-r--r--MediaBrowser.ServerApplication/MainWindow.xaml.cs9
-rw-r--r--MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj16
-rw-r--r--MediaBrowser.WebDashboard/Html/scripts/site.js3
-rw-r--r--MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj3
-rw-r--r--Nuget/MediaBrowser.ApiClient.nuspec2
-rw-r--r--Nuget/MediaBrowser.Common.Internal.nuspec4
-rw-r--r--Nuget/MediaBrowser.Common.nuspec2
-rw-r--r--Nuget/MediaBrowser.Server.Core.nuspec4
52 files changed, 557 insertions, 337 deletions
diff --git a/BDInfo/BDInfo.csproj b/BDInfo/BDInfo.csproj
index 234050ed3..a9ccada6e 100644
--- a/BDInfo/BDInfo.csproj
+++ b/BDInfo/BDInfo.csproj
@@ -35,7 +35,6 @@
<Reference Include="Microsoft.CSharp" />
</ItemGroup>
<ItemGroup>
- <Compile Include="BdInfoExaminer.cs" />
<Compile Include="BDInfoSettings.cs" />
<Compile Include="BDROM.cs" />
<Compile Include="LanguageCodes.cs" />
diff --git a/MediaBrowser.Api/EnvironmentService.cs b/MediaBrowser.Api/EnvironmentService.cs
index f3c5d70c0..56be18d86 100644
--- a/MediaBrowser.Api/EnvironmentService.cs
+++ b/MediaBrowser.Api/EnvironmentService.cs
@@ -97,18 +97,18 @@ namespace MediaBrowser.Api
throw new ArgumentNullException("Path");
}
- // Reject invalid input
- if (!Path.IsPathRooted(path))
+ if (path.StartsWith(NetworkPrefix, StringComparison.OrdinalIgnoreCase) && path.LastIndexOf('\\') == 1)
{
- throw new ArgumentException(string.Format("Invalid path: {0}", path));
+ return ToOptimizedResult(GetNetworkShares(path).ToList());
}
- if (path.StartsWith(NetworkPrefix, StringComparison.OrdinalIgnoreCase) && path.LastIndexOf('\\') == 1)
+ // Reject invalid input
+ if (!Path.IsPathRooted(path))
{
- return GetNetworkShares(path).ToList();
+ throw new ArgumentException(string.Format("Invalid path: {0}", path));
}
- return GetFileSystemEntries(request).ToList();
+ return ToOptimizedResult(GetFileSystemEntries(request).ToList());
}
/// <summary>
@@ -118,7 +118,9 @@ namespace MediaBrowser.Api
/// <returns>System.Object.</returns>
public object Get(GetDrives request)
{
- return GetDrives().ToList();
+ var result = GetDrives().ToList();
+
+ return ToOptimizedResult(result);
}
/// <summary>
@@ -128,7 +130,9 @@ namespace MediaBrowser.Api
/// <returns>System.Object.</returns>
public object Get(GetNetworkComputers request)
{
- return GetNetworkComputers().ToList();
+ var result = GetNetworkComputers().ToList();
+
+ return ToOptimizedResult(result);
}
/// <summary>
diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs
index 00e35428a..ac9a220b6 100644
--- a/MediaBrowser.Api/Images/ImageService.cs
+++ b/MediaBrowser.Api/Images/ImageService.cs
@@ -142,12 +142,18 @@ namespace MediaBrowser.Api.Images
private readonly IUserManager _userManager;
/// <summary>
+ /// The _library manager
+ /// </summary>
+ private readonly ILibraryManager _libraryManager;
+
+ /// <summary>
/// Initializes a new instance of the <see cref="ImageService" /> class.
/// </summary>
/// <param name="userManager">The user manager.</param>
- public ImageService(IUserManager userManager)
+ public ImageService(IUserManager userManager, ILibraryManager libraryManager)
{
_userManager = userManager;
+ _libraryManager = libraryManager;
}
/// <summary>
@@ -157,7 +163,7 @@ namespace MediaBrowser.Api.Images
/// <returns>System.Object.</returns>
public object Get(GetItemImage request)
{
- var item = DtoBuilder.GetItemByClientId(request.Id, _userManager);
+ var item = DtoBuilder.GetItemByClientId(request.Id, _userManager, _libraryManager);
return GetImage(request, item);
}
@@ -181,9 +187,7 @@ namespace MediaBrowser.Api.Images
/// <returns>System.Object.</returns>
public object Get(GetYearImage request)
{
- var kernel = (Kernel)Kernel;
-
- var item = kernel.LibraryManager.GetYear(request.Year).Result;
+ var item = _libraryManager.GetYear(request.Year).Result;
return GetImage(request, item);
}
@@ -195,9 +199,7 @@ namespace MediaBrowser.Api.Images
/// <returns>System.Object.</returns>
public object Get(GetStudioImage request)
{
- var kernel = (Kernel)Kernel;
-
- var item = kernel.LibraryManager.GetStudio(request.Name).Result;
+ var item = _libraryManager.GetStudio(request.Name).Result;
return GetImage(request, item);
}
@@ -209,9 +211,7 @@ namespace MediaBrowser.Api.Images
/// <returns>System.Object.</returns>
public object Get(GetPersonImage request)
{
- var kernel = (Kernel)Kernel;
-
- var item = kernel.LibraryManager.GetPerson(request.Name).Result;
+ var item = _libraryManager.GetPerson(request.Name).Result;
return GetImage(request, item);
}
@@ -223,9 +223,7 @@ namespace MediaBrowser.Api.Images
/// <returns>System.Object.</returns>
public object Get(GetGenreImage request)
{
- var kernel = (Kernel)Kernel;
-
- var item = kernel.LibraryManager.GetGenre(request.Name).Result;
+ var item = _libraryManager.GetGenre(request.Name).Result;
return GetImage(request, item);
}
diff --git a/MediaBrowser.Api/Library/LibraryService.cs b/MediaBrowser.Api/Library/LibraryService.cs
index adc267a00..11d877711 100644
--- a/MediaBrowser.Api/Library/LibraryService.cs
+++ b/MediaBrowser.Api/Library/LibraryService.cs
@@ -93,13 +93,14 @@ namespace MediaBrowser.Api.Library
/// The _app host
/// </summary>
private readonly IApplicationHost _appHost;
+ private readonly ILibraryManager _libraryManager;
/// <summary>
/// Initializes a new instance of the <see cref="LibraryService" /> class.
/// </summary>
/// <param name="appHost">The app host.</param>
/// <exception cref="System.ArgumentNullException">appHost</exception>
- public LibraryService(IApplicationHost appHost)
+ public LibraryService(IApplicationHost appHost, ILibraryManager libraryManager)
{
if (appHost == null)
{
@@ -107,6 +108,7 @@ namespace MediaBrowser.Api.Library
}
_appHost = appHost;
+ _libraryManager = libraryManager;
}
/// <summary>
@@ -116,14 +118,12 @@ namespace MediaBrowser.Api.Library
/// <returns>System.Object.</returns>
public object Get(GetPerson request)
{
- var kernel = (Kernel)Kernel;
-
- var item = kernel.LibraryManager.GetPerson(request.Name).Result;
+ var item = _libraryManager.GetPerson(request.Name).Result;
// Get everything
var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true));
-
- var result = new DtoBuilder(Logger).GetDtoBaseItem(item, fields.ToList()).Result;
+
+ var result = new DtoBuilder(Logger).GetDtoBaseItem(item, fields.ToList(), _libraryManager).Result;
return ToOptimizedResult(result);
}
@@ -135,14 +135,12 @@ namespace MediaBrowser.Api.Library
/// <returns>System.Object.</returns>
public object Get(GetGenre request)
{
- var kernel = (Kernel)Kernel;
-
- var item = kernel.LibraryManager.GetGenre(request.Name).Result;
+ var item = _libraryManager.GetGenre(request.Name).Result;
// Get everything
var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true));
- var result = new DtoBuilder(Logger).GetDtoBaseItem(item, fields.ToList()).Result;
+ var result = new DtoBuilder(Logger).GetDtoBaseItem(item, fields.ToList(), _libraryManager).Result;
return ToOptimizedResult(result);
}
@@ -154,14 +152,12 @@ namespace MediaBrowser.Api.Library
/// <returns>System.Object.</returns>
public object Get(GetStudio request)
{
- var kernel = (Kernel)Kernel;
-
- var item = kernel.LibraryManager.GetStudio(request.Name).Result;
+ var item = _libraryManager.GetStudio(request.Name).Result;
// Get everything
var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true));
- var result = new DtoBuilder(Logger).GetDtoBaseItem(item, fields.ToList()).Result;
+ var result = new DtoBuilder(Logger).GetDtoBaseItem(item, fields.ToList(), _libraryManager).Result;
return ToOptimizedResult(result);
}
@@ -173,14 +169,12 @@ namespace MediaBrowser.Api.Library
/// <returns>System.Object.</returns>
public object Get(GetYear request)
{
- var kernel = (Kernel)Kernel;
-
- var item = kernel.LibraryManager.GetYear(request.Year).Result;
+ var item = _libraryManager.GetYear(request.Year).Result;
// Get everything
var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true));
- var result = new DtoBuilder(Logger).GetDtoBaseItem(item, fields.ToList()).Result;
+ var result = new DtoBuilder(Logger).GetDtoBaseItem(item, fields.ToList(), _libraryManager).Result;
return ToOptimizedResult(result);
}
@@ -192,9 +186,7 @@ namespace MediaBrowser.Api.Library
/// <returns>System.Object.</returns>
public object Get(GetPhyscialPaths request)
{
- var kernel = (Kernel)Kernel;
-
- var result = kernel.RootFolder.Children.SelectMany(c => c.ResolveArgs.PhysicalLocations).ToList();
+ var result = _libraryManager.RootFolder.Children.SelectMany(c => c.ResolveArgs.PhysicalLocations).ToList();
return ToOptimizedResult(result);
}
@@ -206,8 +198,6 @@ namespace MediaBrowser.Api.Library
/// <returns>System.Object.</returns>
public object Get(GetItemTypes request)
{
- var kernel = (Kernel)Kernel;
-
var allTypes = _appHost.AllConcreteTypes.Where(t => t.IsSubclassOf(typeof(BaseItem)));
if (request.HasInternetProvider)
diff --git a/MediaBrowser.Api/Library/LibraryStructureService.cs b/MediaBrowser.Api/Library/LibraryStructureService.cs
index ef3b40478..df8b2907d 100644
--- a/MediaBrowser.Api/Library/LibraryStructureService.cs
+++ b/MediaBrowser.Api/Library/LibraryStructureService.cs
@@ -142,12 +142,17 @@ namespace MediaBrowser.Api.Library
private readonly IUserManager _userManager;
/// <summary>
+ /// The _library manager
+ /// </summary>
+ private readonly ILibraryManager _libraryManager;
+
+ /// <summary>
/// Initializes a new instance of the <see cref="LibraryService" /> class.
/// </summary>
/// <param name="appPaths">The app paths.</param>
/// <param name="userManager">The user manager.</param>
/// <exception cref="System.ArgumentNullException">appHost</exception>
- public LibraryStructureService(IServerApplicationPaths appPaths, IUserManager userManager)
+ public LibraryStructureService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager)
{
if (appPaths == null)
{
@@ -156,6 +161,7 @@ namespace MediaBrowser.Api.Library
_userManager = userManager;
_appPaths = appPaths;
+ _libraryManager = libraryManager;
}
/// <summary>
@@ -165,11 +171,9 @@ namespace MediaBrowser.Api.Library
/// <returns>System.Object.</returns>
public object Get(GetVirtualFolders request)
{
- var kernel = (Kernel)Kernel;
-
if (string.IsNullOrEmpty(request.UserId))
{
- var result = kernel.LibraryManager.GetDefaultVirtualFolders().ToList();
+ var result = _libraryManager.GetDefaultVirtualFolders().ToList();
return ToOptimizedResult(result);
}
@@ -177,7 +181,7 @@ namespace MediaBrowser.Api.Library
{
var user = _userManager.GetUserById(new Guid(request.UserId));
- var result = kernel.LibraryManager.GetVirtualFolders(user).ToList();
+ var result = _libraryManager.GetVirtualFolders(user).ToList();
return ToOptimizedResult(result);
}
diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj
index bebb4c94a..cf2a55695 100644
--- a/MediaBrowser.Api/MediaBrowser.Api.csproj
+++ b/MediaBrowser.Api/MediaBrowser.Api.csproj
@@ -140,7 +140,8 @@
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
- <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\MediaBrowser.ServerApplication\CorePlugins\" /y</PostBuildEvent>
+ <PostBuildEvent>
+ </PostBuildEvent>
</PropertyGroup>
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs
index d0388ed32..ce9fe0e0b 100644
--- a/MediaBrowser.Api/Playback/BaseStreamingService.cs
+++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs
@@ -34,6 +34,12 @@ namespace MediaBrowser.Api.Playback
/// </summary>
/// <value>The user manager.</value>
protected IUserManager UserManager { get; set; }
+
+ /// <summary>
+ /// Gets or sets the library manager.
+ /// </summary>
+ /// <value>The library manager.</value>
+ protected ILibraryManager LibraryManager { get; set; }
/// <summary>
/// Gets the server kernel.
@@ -49,10 +55,12 @@ namespace MediaBrowser.Api.Playback
/// </summary>
/// <param name="appPaths">The app paths.</param>
/// <param name="userManager">The user manager.</param>
- protected BaseStreamingService(IServerApplicationPaths appPaths, IUserManager userManager)
+ /// <param name="libraryManager">The library manager.</param>
+ protected BaseStreamingService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager)
{
ApplicationPaths = appPaths;
UserManager = userManager;
+ LibraryManager = libraryManager;
}
/// <summary>
@@ -614,7 +622,7 @@ namespace MediaBrowser.Api.Playback
/// <returns>StreamState.</returns>
protected StreamState GetState(StreamRequest request)
{
- var item = DtoBuilder.GetItemByClientId(request.Id, UserManager);
+ var item = DtoBuilder.GetItemByClientId(request.Id, UserManager, LibraryManager);
var media = (IHasMediaStreams)item;
diff --git a/MediaBrowser.Api/Playback/Hls/AudioHlsService.cs b/MediaBrowser.Api/Playback/Hls/AudioHlsService.cs
index cfd8767af..0735f3b62 100644
--- a/MediaBrowser.Api/Playback/Hls/AudioHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/AudioHlsService.cs
@@ -15,7 +15,8 @@ namespace MediaBrowser.Api.Playback.Hls
/// </summary>
/// <param name="appPaths">The app paths.</param>
/// <param name="userManager">The user manager.</param>
- public AudioHlsService(IServerApplicationPaths appPaths, IUserManager userManager) : base(appPaths, userManager)
+ public AudioHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager)
+ : base(appPaths, userManager, libraryManager)
{
}
diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
index 955b7159b..8c7edbe91 100644
--- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
@@ -16,9 +16,9 @@ namespace MediaBrowser.Api.Playback.Hls
/// The segment file prefix
/// </summary>
public const string SegmentFilePrefix = "segment-";
-
- protected BaseHlsService(IServerApplicationPaths appPaths, IUserManager userManager)
- : base(appPaths, userManager)
+
+ protected BaseHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager)
+ : base(appPaths, userManager, libraryManager)
{
}
diff --git a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
index a587ce8f2..41d818ce7 100644
--- a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
@@ -11,8 +11,8 @@ namespace MediaBrowser.Api.Playback.Hls
/// </summary>
/// <param name="appPaths">The app paths.</param>
/// <param name="userManager">The user manager.</param>
- public VideoHlsService(IServerApplicationPaths appPaths, IUserManager userManager)
- : base(appPaths, userManager)
+ public VideoHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager)
+ : base(appPaths, userManager, libraryManager)
{
}
diff --git a/MediaBrowser.Api/Playback/Progressive/AudioService.cs b/MediaBrowser.Api/Playback/Progressive/AudioService.cs
index 8f831a504..e81f0ac0d 100644
--- a/MediaBrowser.Api/Playback/Progressive/AudioService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/AudioService.cs
@@ -28,8 +28,8 @@ namespace MediaBrowser.Api.Playback.Progressive
/// Initializes a new instance of the <see cref="BaseProgressiveStreamingService" /> class.
/// </summary>
/// <param name="appPaths">The app paths.</param>
- public AudioService(IServerApplicationPaths appPaths, IUserManager userManager)
- : base(appPaths, userManager)
+ public AudioService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager)
+ : base(appPaths, userManager, libraryManager)
{
}
diff --git a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
index f02b37b6c..08e66c387 100644
--- a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
@@ -18,8 +18,8 @@ namespace MediaBrowser.Api.Playback.Progressive
/// Initializes a new instance of the <see cref="BaseProgressiveStreamingService" /> class.
/// </summary>
/// <param name="appPaths">The app paths.</param>
- protected BaseProgressiveStreamingService(IServerApplicationPaths appPaths, IUserManager userManager)
- : base(appPaths, userManager)
+ protected BaseProgressiveStreamingService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager)
+ : base(appPaths, userManager, libraryManager)
{
}
diff --git a/MediaBrowser.Api/Playback/Progressive/VideoService.cs b/MediaBrowser.Api/Playback/Progressive/VideoService.cs
index 8dca6b24c..6261d32ee 100644
--- a/MediaBrowser.Api/Playback/Progressive/VideoService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/VideoService.cs
@@ -34,8 +34,8 @@ namespace MediaBrowser.Api.Playback.Progressive
/// Initializes a new instance of the <see cref="BaseProgressiveStreamingService" /> class.
/// </summary>
/// <param name="appPaths">The app paths.</param>
- public VideoService(IServerApplicationPaths appPaths, IUserManager userManager)
- : base(appPaths, userManager)
+ public VideoService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager)
+ : base(appPaths, userManager, libraryManager)
{
}
diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs
index 3cb17ff35..ce3d9d8e0 100644
--- a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs
+++ b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs
@@ -24,14 +24,16 @@ namespace MediaBrowser.Api.UserLibrary
/// The _user manager
/// </summary>
protected readonly IUserManager UserManager;
+ protected readonly ILibraryManager LibraryManager;
/// <summary>
/// Initializes a new instance of the <see cref="BaseItemsByNameService{TItemType}" /> class.
/// </summary>
/// <param name="userManager">The user manager.</param>
- protected BaseItemsByNameService(IUserManager userManager)
+ protected BaseItemsByNameService(IUserManager userManager, ILibraryManager libraryManager)
{
UserManager = userManager;
+ LibraryManager = libraryManager;
}
/// <summary>
@@ -43,7 +45,7 @@ namespace MediaBrowser.Api.UserLibrary
{
var user = UserManager.GetUserById(request.UserId);
- var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : DtoBuilder.GetItemByClientId(request.Id, UserManager, user.Id);
+ var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : DtoBuilder.GetItemByClientId(request.Id, UserManager, LibraryManager, user.Id);
IEnumerable<BaseItem> items;
@@ -126,7 +128,7 @@ namespace MediaBrowser.Api.UserLibrary
return null;
}
- var dto = await new DtoBuilder(Logger).GetDtoBaseItem(item, user, fields).ConfigureAwait(false);
+ var dto = await new DtoBuilder(Logger).GetDtoBaseItem(item, user, fields, LibraryManager).ConfigureAwait(false);
dto.ChildCount = stub.Item2();
diff --git a/MediaBrowser.Api/UserLibrary/GenresService.cs b/MediaBrowser.Api/UserLibrary/GenresService.cs
index 1c002a7c9..a3b471d54 100644
--- a/MediaBrowser.Api/UserLibrary/GenresService.cs
+++ b/MediaBrowser.Api/UserLibrary/GenresService.cs
@@ -1,6 +1,4 @@
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller;
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using ServiceStack.ServiceHost;
using System;
@@ -24,7 +22,8 @@ namespace MediaBrowser.Api.UserLibrary
/// </summary>
public class GenresService : BaseItemsByNameService<Genre>
{
- public GenresService(IUserManager userManager) : base(userManager)
+ public GenresService(IUserManager userManager, ILibraryManager libraryManager)
+ : base(userManager, libraryManager)
{
}
@@ -64,9 +63,7 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>Task{Genre}.</returns>
protected override Task<Genre> GetEntity(string name)
{
- var kernel = (Kernel)Kernel;
-
- return kernel.LibraryManager.GetGenre(name);
+ return LibraryManager.GetGenre(name);
}
}
}
diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs
index efc97651b..c248ae582 100644
--- a/MediaBrowser.Api/UserLibrary/ItemsService.cs
+++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs
@@ -151,12 +151,18 @@ namespace MediaBrowser.Api.UserLibrary
private readonly IUserManager _userManager;
/// <summary>
+ /// The _library manager
+ /// </summary>
+ private readonly ILibraryManager _libraryManager;
+
+ /// <summary>
/// Initializes a new instance of the <see cref="ItemsService" /> class.
/// </summary>
/// <param name="userManager">The user manager.</param>
- public ItemsService(IUserManager userManager)
+ public ItemsService(IUserManager userManager, ILibraryManager libraryManager)
{
_userManager = userManager;
+ _libraryManager = libraryManager;
}
/// <summary>
@@ -203,7 +209,7 @@ namespace MediaBrowser.Api.UserLibrary
var dtoBuilder = new DtoBuilder(Logger);
- var returnItems = await Task.WhenAll(pagedItems.Select(i => dtoBuilder.GetDtoBaseItem(i, user, fields))).ConfigureAwait(false);
+ var returnItems = await Task.WhenAll(pagedItems.Select(i => dtoBuilder.GetDtoBaseItem(i, user, fields, _libraryManager))).ConfigureAwait(false);
return new ItemsResult
{
@@ -221,7 +227,7 @@ namespace MediaBrowser.Api.UserLibrary
/// <exception cref="System.InvalidOperationException"></exception>
private IEnumerable<BaseItem> GetItemsToSerialize(GetItems request, User user)
{
- var item = string.IsNullOrEmpty(request.ParentId) ? user.RootFolder : DtoBuilder.GetItemByClientId(request.ParentId, _userManager, user.Id);
+ var item = string.IsNullOrEmpty(request.ParentId) ? user.RootFolder : DtoBuilder.GetItemByClientId(request.ParentId, _userManager, _libraryManager, user.Id);
// Default list type = children
diff --git a/MediaBrowser.Api/UserLibrary/PersonsService.cs b/MediaBrowser.Api/UserLibrary/PersonsService.cs
index 4528cb2bc..21e6a9049 100644
--- a/MediaBrowser.Api/UserLibrary/PersonsService.cs
+++ b/MediaBrowser.Api/UserLibrary/PersonsService.cs
@@ -29,7 +29,8 @@ namespace MediaBrowser.Api.UserLibrary
/// </summary>
public class PersonsService : BaseItemsByNameService<Person>
{
- public PersonsService(IUserManager userManager) : base(userManager)
+ public PersonsService(IUserManager userManager, ILibraryManager libraryManager)
+ : base(userManager, libraryManager)
{
}
@@ -98,9 +99,7 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>Task{Genre}.</returns>
protected override Task<Person> GetEntity(string name)
{
- var kernel = (Kernel)Kernel;
-
- return kernel.LibraryManager.GetPerson(name);
+ return LibraryManager.GetPerson(name);
}
}
}
diff --git a/MediaBrowser.Api/UserLibrary/StudiosService.cs b/MediaBrowser.Api/UserLibrary/StudiosService.cs
index cfb0179a2..7e9a0445d 100644
--- a/MediaBrowser.Api/UserLibrary/StudiosService.cs
+++ b/MediaBrowser.Api/UserLibrary/StudiosService.cs
@@ -1,5 +1,4 @@
-using MediaBrowser.Controller;
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using ServiceStack.ServiceHost;
using System;
@@ -23,8 +22,8 @@ namespace MediaBrowser.Api.UserLibrary
/// </summary>
public class StudiosService : BaseItemsByNameService<Studio>
{
- public StudiosService(IUserManager userManager)
- : base(userManager)
+ public StudiosService(IUserManager userManager, ILibraryManager libraryManager)
+ : base(userManager, libraryManager)
{
}
@@ -64,9 +63,7 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>Task{Studio}.</returns>
protected override Task<Studio> GetEntity(string name)
{
- var kernel = (Kernel)Kernel;
-
- return kernel.LibraryManager.GetStudio(name);
+ return LibraryManager.GetStudio(name);
}
}
}
diff --git a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs
index 1ca72b24f..920532609 100644
--- a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs
+++ b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs
@@ -316,13 +316,15 @@ namespace MediaBrowser.Api.UserLibrary
/// The _user manager
/// </summary>
private readonly IUserManager _userManager;
+
+ private readonly ILibraryManager _libraryManager;
/// <summary>
/// Initializes a new instance of the <see cref="UserLibraryService" /> class.
/// </summary>
/// <param name="jsonSerializer">The json serializer.</param>
/// <exception cref="System.ArgumentNullException">jsonSerializer</exception>
- public UserLibraryService(IJsonSerializer jsonSerializer, IUserManager userManager)
+ public UserLibraryService(IJsonSerializer jsonSerializer, IUserManager userManager, ILibraryManager libraryManager)
: base()
{
if (jsonSerializer == null)
@@ -332,6 +334,7 @@ namespace MediaBrowser.Api.UserLibrary
_jsonSerializer = jsonSerializer;
_userManager = userManager;
+ _libraryManager = libraryManager;
}
/// <summary>
@@ -343,7 +346,7 @@ namespace MediaBrowser.Api.UserLibrary
{
var user = _userManager.GetUserById(request.UserId);
- var item = DtoBuilder.GetItemByClientId(request.Id, _userManager, user.Id);
+ var item = DtoBuilder.GetItemByClientId(request.Id, _userManager, _libraryManager, user.Id);
// Get everything
var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)).ToList();
@@ -352,7 +355,7 @@ namespace MediaBrowser.Api.UserLibrary
var dtoBuilder = new DtoBuilder(Logger);
- var items = movie.SpecialFeatures.Select(i => dtoBuilder.GetDtoBaseItem(item, user, fields)).AsParallel().Select(t => t.Result).ToList();
+ var items = movie.SpecialFeatures.Select(i => dtoBuilder.GetDtoBaseItem(item, user, fields, _libraryManager)).AsParallel().Select(t => t.Result).ToList();
return ToOptimizedResult(items);
}
@@ -366,14 +369,14 @@ namespace MediaBrowser.Api.UserLibrary
{
var user = _userManager.GetUserById(request.UserId);
- var item = DtoBuilder.GetItemByClientId(request.Id, _userManager, user.Id);
+ var item = DtoBuilder.GetItemByClientId(request.Id, _userManager, _libraryManager, user.Id);
// Get everything
var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)).ToList();
var dtoBuilder = new DtoBuilder(Logger);
- var items = item.LocalTrailers.Select(i => dtoBuilder.GetDtoBaseItem(item, user, fields)).AsParallel().Select(t => t.Result).ToList();
+ var items = item.LocalTrailers.Select(i => dtoBuilder.GetDtoBaseItem(item, user, fields, _libraryManager)).AsParallel().Select(t => t.Result).ToList();
return ToOptimizedResult(items);
}
@@ -387,14 +390,14 @@ namespace MediaBrowser.Api.UserLibrary
{
var user = _userManager.GetUserById(request.UserId);
- var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : DtoBuilder.GetItemByClientId(request.Id, _userManager, user.Id);
+ var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : DtoBuilder.GetItemByClientId(request.Id, _userManager, _libraryManager, user.Id);
// Get everything
var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)).ToList();
var dtoBuilder = new DtoBuilder(Logger);
- var result = dtoBuilder.GetDtoBaseItem(item, user, fields).Result;
+ var result = dtoBuilder.GetDtoBaseItem(item, user, fields, _libraryManager).Result;
return ToOptimizedResult(result);
}
@@ -410,7 +413,7 @@ namespace MediaBrowser.Api.UserLibrary
var user = _userManager.GetUserById(request.UserId);
- var item = DtoBuilder.GetItemByClientId(request.Id, _userManager, user.Id);
+ var item = DtoBuilder.GetItemByClientId(request.Id, _userManager, _libraryManager, user.Id);
var result = kernel.IntroProviders.SelectMany(i => i.GetIntros(item, user));
@@ -429,15 +432,13 @@ namespace MediaBrowser.Api.UserLibrary
var userId = new Guid(pathInfo.GetArgumentValue<string>(1));
var itemId = pathInfo.GetArgumentValue<string>(3);
- var kernel = (Kernel)Kernel;
-
var user = _userManager.GetUserById(userId);
- var item = (Folder)DtoBuilder.GetItemByClientId(itemId, _userManager, user.Id);
+ var item = (Folder)DtoBuilder.GetItemByClientId(itemId, _userManager, _libraryManager, user.Id);
var displayPreferences = _jsonSerializer.DeserializeFromStream<DisplayPreferences>(request.RequestStream);
- var task = kernel.LibraryManager.SaveDisplayPreferencesForFolder(user, item, displayPreferences);
+ var task = _libraryManager.SaveDisplayPreferencesForFolder(user, item, displayPreferences);
Task.WaitAll(task);
}
@@ -450,7 +451,7 @@ namespace MediaBrowser.Api.UserLibrary
{
var user = _userManager.GetUserById(request.UserId);
- var item = (Folder)DtoBuilder.GetItemByClientId(request.Id, _userManager, user.Id);
+ var item = (Folder)DtoBuilder.GetItemByClientId(request.Id, _userManager, _libraryManager, user.Id);
// Get the user data for this item
var data = item.GetUserData(user, true);
@@ -471,7 +472,7 @@ namespace MediaBrowser.Api.UserLibrary
{
var user = _userManager.GetUserById(request.UserId);
- var item = (Folder)DtoBuilder.GetItemByClientId(request.Id, _userManager, user.Id);
+ var item = (Folder)DtoBuilder.GetItemByClientId(request.Id, _userManager, _libraryManager, user.Id);
// Get the user data for this item
var data = item.GetUserData(user, true);
@@ -492,7 +493,7 @@ namespace MediaBrowser.Api.UserLibrary
{
var user = _userManager.GetUserById(request.UserId);
- var item = (Folder)DtoBuilder.GetItemByClientId(request.Id, _userManager, user.Id);
+ var item = (Folder)DtoBuilder.GetItemByClientId(request.Id, _userManager, _libraryManager, user.Id);
// Get the user data for this item
var data = item.GetUserData(user, true);
@@ -512,7 +513,7 @@ namespace MediaBrowser.Api.UserLibrary
{
var user = _userManager.GetUserById(request.UserId);
- var item = (Folder)DtoBuilder.GetItemByClientId(request.Id, _userManager, user.Id);
+ var item = (Folder)DtoBuilder.GetItemByClientId(request.Id, _userManager, _libraryManager, user.Id);
// Get the user data for this item
var data = item.GetUserData(user, true);
@@ -545,7 +546,7 @@ namespace MediaBrowser.Api.UserLibrary
{
var user = _userManager.GetUserById(request.UserId);
- var item = DtoBuilder.GetItemByClientId(request.Id, _userManager, user.Id);
+ var item = DtoBuilder.GetItemByClientId(request.Id, _userManager, _libraryManager, user.Id);
_userManager.OnPlaybackStart(user, item, ClientType.Other, string.Empty);
}
@@ -558,7 +559,7 @@ namespace MediaBrowser.Api.UserLibrary
{
var user = _userManager.GetUserById(request.UserId);
- var item = DtoBuilder.GetItemByClientId(request.Id, _userManager, user.Id);
+ var item = DtoBuilder.GetItemByClientId(request.Id, _userManager, _libraryManager, user.Id);
var task = _userManager.OnPlaybackProgress(user, item, request.PositionTicks, ClientType.Other, string.Empty);
@@ -573,7 +574,7 @@ namespace MediaBrowser.Api.UserLibrary
{
var user = _userManager.GetUserById(request.UserId);
- var item = DtoBuilder.GetItemByClientId(request.Id, _userManager, user.Id);
+ var item = DtoBuilder.GetItemByClientId(request.Id, _userManager, _libraryManager, user.Id);
var task = _userManager.OnPlaybackStopped(user, item, request.PositionTicks, ClientType.Other, string.Empty);
@@ -602,7 +603,7 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>Task.</returns>
private Task UpdatePlayedStatus(User user, string itemId, bool wasPlayed)
{
- var item = DtoBuilder.GetItemByClientId(itemId, _userManager, user.Id);
+ var item = DtoBuilder.GetItemByClientId(itemId, _userManager, _libraryManager, user.Id);
return item.SetPlayedStatus(user, wasPlayed, _userManager);
}
diff --git a/MediaBrowser.Api/UserLibrary/YearsService.cs b/MediaBrowser.Api/UserLibrary/YearsService.cs
index 8112b2da9..07b08eb54 100644
--- a/MediaBrowser.Api/UserLibrary/YearsService.cs
+++ b/MediaBrowser.Api/UserLibrary/YearsService.cs
@@ -1,6 +1,4 @@
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller;
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using ServiceStack.ServiceHost;
using System;
@@ -29,8 +27,9 @@ namespace MediaBrowser.Api.UserLibrary
/// The us culture
/// </summary>
private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
-
- public YearsService(IUserManager userManager) : base(userManager)
+
+ public YearsService(IUserManager userManager, ILibraryManager libraryManager)
+ : base(userManager, libraryManager)
{
}
@@ -70,9 +69,7 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>Task{Studio}.</returns>
protected override Task<Year> GetEntity(string name)
{
- var kernel = (Kernel)Kernel;
-
- return kernel.LibraryManager.GetYear(int.Parse(name, UsCulture));
+ return LibraryManager.GetYear(int.Parse(name, UsCulture));
}
}
}
diff --git a/MediaBrowser.Common.Implementations/NetworkManagement/NetworkManager.cs b/MediaBrowser.Common.Implementations/NetworkManagement/NetworkManager.cs
index 51b37944c..c0038de2e 100644
--- a/MediaBrowser.Common.Implementations/NetworkManagement/NetworkManager.cs
+++ b/MediaBrowser.Common.Implementations/NetworkManagement/NetworkManager.cs
@@ -244,21 +244,27 @@ namespace MediaBrowser.Common.Implementations.NetworkManagement
/// <exception cref="System.ArgumentException">Unknown share type</exception>
private NetworkShareType ToNetworkShareType(ShareType shareType)
{
- switch (shareType)
+ if (shareType.HasFlag(ShareType.Special))
{
- case ShareType.Device:
- return NetworkShareType.Device;
- case ShareType.Disk :
- return NetworkShareType.Disk;
- case ShareType.IPC :
- return NetworkShareType.Ipc;
- case ShareType.Printer :
- return NetworkShareType.Printer;
- case ShareType.Special:
- return NetworkShareType.Special;
- default:
- throw new ArgumentException("Unknown share type");
+ return NetworkShareType.Special;
}
+ if (shareType.HasFlag(ShareType.Device))
+ {
+ return NetworkShareType.Device;
+ }
+ if (shareType.HasFlag(ShareType.Disk))
+ {
+ return NetworkShareType.Disk;
+ }
+ if (shareType.HasFlag(ShareType.IPC))
+ {
+ return NetworkShareType.Ipc;
+ }
+ if (shareType.HasFlag(ShareType.Printer))
+ {
+ return NetworkShareType.Printer;
+ }
+ throw new ArgumentException("Unknown share type");
}
/// <summary>
diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs
index 4ecb8f0ef..e618b6f55 100644
--- a/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs
+++ b/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs
@@ -65,6 +65,31 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
/// <param name="serverManager">The server manager.</param>
public ScheduledTaskWorker(IScheduledTask scheduledTask, IApplicationPaths applicationPaths, ITaskManager taskManager, IJsonSerializer jsonSerializer, ILogger logger, IServerManager serverManager)
{
+ if (scheduledTask == null)
+ {
+ throw new ArgumentNullException("scheduledTask");
+ }
+ if (applicationPaths == null)
+ {
+ throw new ArgumentNullException("applicationPaths");
+ }
+ if (taskManager == null)
+ {
+ throw new ArgumentNullException("taskManager");
+ }
+ if (jsonSerializer == null)
+ {
+ throw new ArgumentNullException("jsonSerializer");
+ }
+ if (logger == null)
+ {
+ throw new ArgumentNullException("logger");
+ }
+ if (serverManager == null)
+ {
+ throw new ArgumentNullException("serverManager");
+ }
+
ScheduledTask = scheduledTask;
ApplicationPaths = applicationPaths;
TaskManager = taskManager;
@@ -316,7 +341,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
try
{
- await System.Threading.Tasks.Task.Run(async () => await ScheduledTask.Execute(CurrentCancellationTokenSource.Token, progress).ConfigureAwait(false)).ConfigureAwait(false);
+ await ExecuteTask(CurrentCancellationTokenSource.Token, progress).ConfigureAwait(false);
status = TaskCompletionStatus.Completed;
}
@@ -334,8 +359,6 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
var startTime = CurrentExecutionStartTime;
var endTime = DateTime.UtcNow;
- ServerManager.SendWebSocketMessage("ScheduledTaskEndExecute", LastExecutionResult);
-
progress.ProgressChanged -= progress_ProgressChanged;
CurrentCancellationTokenSource.Dispose();
CurrentCancellationTokenSource = null;
@@ -344,6 +367,11 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
OnTaskCompleted(startTime, endTime, status);
}
+ private Task ExecuteTask(CancellationToken cancellationToken, IProgress<double> progress)
+ {
+ return Task.Run(async () => await ScheduledTask.Execute(cancellationToken, progress).ConfigureAwait(false));
+ }
+
/// <summary>
/// Progress_s the progress changed.
/// </summary>
@@ -482,7 +510,8 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
/// <param name="startTime">The start time.</param>
/// <param name="endTime">The end time.</param>
/// <param name="status">The status.</param>
- private void OnTaskCompleted(DateTime startTime, DateTime endTime, TaskCompletionStatus status)
+ /// <param name="sendNotification">if set to <c>true</c> [send notification].</param>
+ private void OnTaskCompleted(DateTime startTime, DateTime endTime, TaskCompletionStatus status, bool sendNotification = true)
{
var elapsedTime = endTime - startTime;
@@ -500,6 +529,11 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
JsonSerializer.SerializeToFile(result, GetHistoryFilePath());
LastExecutionResult = result;
+
+ if (sendNotification)
+ {
+ ServerManager.SendWebSocketMessage("ScheduledTaskEndExecute", result);
+ }
}
/// <summary>
@@ -523,7 +557,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
if (State == TaskState.Running)
{
- OnTaskCompleted(CurrentExecutionStartTime, DateTime.UtcNow, TaskCompletionStatus.Aborted);
+ OnTaskCompleted(CurrentExecutionStartTime, DateTime.UtcNow, TaskCompletionStatus.Aborted, false);
}
if (CurrentCancellationTokenSource != null)
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index e462ac9e2..47c129dea 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -95,6 +95,7 @@ namespace MediaBrowser.Controller.Entities
/// The logger
/// </summary>
protected static internal ILogger Logger { get; internal set; }
+ protected static internal ILibraryManager LibraryManager { get; internal set; }
/// <summary>
/// Returns a <see cref="System.String" /> that represents this instance.
@@ -613,7 +614,7 @@ namespace MediaBrowser.Controller.Entities
return new List<Video> { };
}
- return Kernel.Instance.LibraryManager.GetItems<Video>(files, null).Select(video =>
+ return LibraryManager.ResolvePaths<Video>(files, null).Select(video =>
{
// Try to retrieve it from the db. If we don't find it, use the resolved version
var dbItem = Kernel.Instance.ItemRepository.RetrieveItem(video.Id) as Video;
diff --git a/MediaBrowser.Controller/Entities/CollectionFolder.cs b/MediaBrowser.Controller/Entities/CollectionFolder.cs
index fbcd2f589..a3db5ca26 100644
--- a/MediaBrowser.Controller/Entities/CollectionFolder.cs
+++ b/MediaBrowser.Controller/Entities/CollectionFolder.cs
@@ -88,7 +88,7 @@ namespace MediaBrowser.Controller.Entities
}
var ourChildren =
- Kernel.Instance.RootFolder.Children.OfType<Folder>()
+ LibraryManager.RootFolder.Children.OfType<Folder>()
.Where(i => folderIds.Contains(i.Id))
.SelectMany(c => c.Children);
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index 28075b9a1..c6f479029 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -317,7 +317,7 @@ namespace MediaBrowser.Controller.Entities
{
try
{
- return Kernel.Instance.LibraryManager.GetPerson(i).Result;
+ return LibraryManager.GetPerson(i).Result;
}
catch (IOException ex)
{
@@ -359,7 +359,7 @@ namespace MediaBrowser.Controller.Entities
{
try
{
- return Kernel.Instance.LibraryManager.GetStudio(i).Result;
+ return LibraryManager.GetStudio(i).Result;
}
catch (IOException ex)
{
@@ -399,7 +399,7 @@ namespace MediaBrowser.Controller.Entities
{
try
{
- return Kernel.Instance.LibraryManager.GetGenre(i).Result;
+ return LibraryManager.GetGenre(i).Result;
}
catch (IOException ex)
{
@@ -440,7 +440,7 @@ namespace MediaBrowser.Controller.Entities
{
try
{
- return Kernel.Instance.LibraryManager.GetYear(i).Result;
+ return LibraryManager.GetYear(i).Result;
}
catch (IOException ex)
{
@@ -768,7 +768,7 @@ namespace MediaBrowser.Controller.Entities
IndexCache.Clear();
//and fire event
- Kernel.Instance.LibraryManager.OnLibraryChanged(changedArgs);
+ LibraryManager.ReportLibraryChanged(changedArgs);
}
progress.Report(15);
@@ -860,7 +860,7 @@ namespace MediaBrowser.Controller.Entities
return new List<BaseItem> { };
}
- return Kernel.Instance.LibraryManager.GetItems<BaseItem>(fileSystemChildren, this);
+ return LibraryManager.ResolvePaths<BaseItem>(fileSystemChildren, this);
}
/// <summary>
diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs
index 92177f916..5d8ada21f 100644
--- a/MediaBrowser.Controller/Entities/Movies/Movie.cs
+++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs
@@ -181,7 +181,7 @@ namespace MediaBrowser.Controller.Entities.Movies
return new List<Video> { };
}
- return Kernel.Instance.LibraryManager.GetItems<Video>(files, null).Select(video =>
+ return LibraryManager.ResolvePaths<Video>(files, null).Select(video =>
{
// Try to retrieve it from the db. If we don't find it, use the resolved version
var dbItem = Kernel.Instance.ItemRepository.RetrieveItem(video.Id) as Video;
diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs
index 7196b68b8..bf77cdc95 100644
--- a/MediaBrowser.Controller/Entities/User.cs
+++ b/MediaBrowser.Controller/Entities/User.cs
@@ -124,7 +124,7 @@ namespace MediaBrowser.Controller.Entities
{
get
{
- LazyInitializer.EnsureInitialized(ref _rootFolder, ref _userRootFolderInitialized, ref _userRootFolderSyncLock, () => (UserRootFolder)Kernel.Instance.LibraryManager.GetItem(RootFolderPath));
+ LazyInitializer.EnsureInitialized(ref _rootFolder, ref _userRootFolderInitialized, ref _userRootFolderSyncLock, () => (UserRootFolder)LibraryManager.ResolvePath(RootFolderPath));
return _rootFolder;
}
private set
diff --git a/MediaBrowser.Controller/Entities/UserRootFolder.cs b/MediaBrowser.Controller/Entities/UserRootFolder.cs
index 4ffd3468d..8fe5f43f1 100644
--- a/MediaBrowser.Controller/Entities/UserRootFolder.cs
+++ b/MediaBrowser.Controller/Entities/UserRootFolder.cs
@@ -15,7 +15,7 @@ namespace MediaBrowser.Controller.Entities
/// <returns>IEnumerable{BaseItem}.</returns>
protected override IEnumerable<BaseItem> GetNonCachedChildren()
{
- return base.GetNonCachedChildren().Concat(Kernel.Instance.RootFolder.VirtualChildren);
+ return base.GetNonCachedChildren().Concat(LibraryManager.RootFolder.VirtualChildren);
}
}
}
diff --git a/MediaBrowser.Controller/IO/DirectoryWatchers.cs b/MediaBrowser.Controller/IO/DirectoryWatchers.cs
index 06ce95ec9..991e4ba43 100644
--- a/MediaBrowser.Controller/IO/DirectoryWatchers.cs
+++ b/MediaBrowser.Controller/IO/DirectoryWatchers.cs
@@ -72,11 +72,13 @@ namespace MediaBrowser.Controller.IO
/// </summary>
/// <value>The task manager.</value>
private ITaskManager TaskManager { get; set; }
-
+
+ private ILibraryManager LibraryManager { get; set; }
+
/// <summary>
/// Initializes a new instance of the <see cref="DirectoryWatchers" /> class.
/// </summary>
- public DirectoryWatchers(ILogger logger, ITaskManager taskManager)
+ public DirectoryWatchers(ILogger logger, ITaskManager taskManager, ILibraryManager libraryManager)
{
if (logger == null)
{
@@ -87,6 +89,7 @@ namespace MediaBrowser.Controller.IO
throw new ArgumentNullException("taskManager");
}
+ LibraryManager = libraryManager;
TaskManager = taskManager;
Logger = logger;
}
@@ -96,11 +99,11 @@ namespace MediaBrowser.Controller.IO
/// </summary>
internal void Start()
{
- Kernel.Instance.LibraryManager.LibraryChanged += Instance_LibraryChanged;
-
- var pathsToWatch = new List<string> { Kernel.Instance.RootFolder.Path };
+ LibraryManager.LibraryChanged += Instance_LibraryChanged;
+
+ var pathsToWatch = new List<string> { LibraryManager.RootFolder.Path };
- var paths = Kernel.Instance.RootFolder.Children.OfType<Folder>()
+ var paths = LibraryManager.RootFolder.Children.OfType<Folder>()
.SelectMany(f =>
{
try
@@ -467,7 +470,7 @@ namespace MediaBrowser.Controller.IO
while (item == null && !string.IsNullOrEmpty(path))
{
- item = Kernel.Instance.RootFolder.FindByPath(path);
+ item = LibraryManager.RootFolder.FindByPath(path);
path = Path.GetDirectoryName(path);
}
@@ -494,7 +497,7 @@ namespace MediaBrowser.Controller.IO
/// </summary>
private void Stop()
{
- Kernel.Instance.LibraryManager.LibraryChanged -= Instance_LibraryChanged;
+ LibraryManager.LibraryChanged -= Instance_LibraryChanged;
FileSystemWatcher watcher;
diff --git a/MediaBrowser.Controller/IO/FileSystemManager.cs b/MediaBrowser.Controller/IO/FileSystemManager.cs
index 611b402d8..b1695e7b5 100644
--- a/MediaBrowser.Controller/IO/FileSystemManager.cs
+++ b/MediaBrowser.Controller/IO/FileSystemManager.cs
@@ -2,6 +2,7 @@
using MediaBrowser.Common.Kernel;
using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Logging;
using System;
using System.IO;
@@ -34,11 +35,12 @@ namespace MediaBrowser.Controller.IO
/// <param name="kernel">The kernel.</param>
/// <param name="logger">The logger.</param>
/// <param name="taskManager">The task manager.</param>
- public FileSystemManager(Kernel kernel, ILogger logger, ITaskManager taskManager)
+ /// <param name="libraryManager">The library manager.</param>
+ public FileSystemManager(Kernel kernel, ILogger logger, ITaskManager taskManager, ILibraryManager libraryManager)
: base(kernel)
{
_logger = logger;
- DirectoryWatchers = new DirectoryWatchers(logger, taskManager);
+ DirectoryWatchers = new DirectoryWatchers(logger, taskManager, libraryManager);
}
/// <summary>
diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs
index e41b7c487..46f4a3329 100644
--- a/MediaBrowser.Controller/Kernel.cs
+++ b/MediaBrowser.Controller/Kernel.cs
@@ -37,12 +37,6 @@ namespace MediaBrowser.Controller
public static Kernel Instance { get; private set; }
/// <summary>
- /// Gets the library manager.
- /// </summary>
- /// <value>The library manager.</value>
- public LibraryManager LibraryManager { get; private set; }
-
- /// <summary>
/// Gets the image manager.
/// </summary>
/// <value>The image manager.</value>
@@ -73,40 +67,6 @@ namespace MediaBrowser.Controller
public ProviderManager ProviderManager { get; private set; }
/// <summary>
- /// The _root folder
- /// </summary>
- private AggregateFolder _rootFolder;
- /// <summary>
- /// The _root folder sync lock
- /// </summary>
- private object _rootFolderSyncLock = new object();
- /// <summary>
- /// The _root folder initialized
- /// </summary>
- private bool _rootFolderInitialized;
- /// <summary>
- /// Gets the root folder.
- /// </summary>
- /// <value>The root folder.</value>
- public AggregateFolder RootFolder
- {
- get
- {
- LazyInitializer.EnsureInitialized(ref _rootFolder, ref _rootFolderInitialized, ref _rootFolderSyncLock, LibraryManager.CreateRootFolder);
- return _rootFolder;
- }
- private set
- {
- _rootFolder = value;
-
- if (value == null)
- {
- _rootFolderInitialized = false;
- }
- }
- }
-
- /// <summary>
/// Gets the kernel context.
/// </summary>
/// <value>The kernel context.</value>
@@ -156,13 +116,13 @@ namespace MediaBrowser.Controller
/// Gets the list of currently registered entity resolvers
/// </summary>
/// <value>The entity resolvers enumerable.</value>
- internal IEnumerable<IBaseItemResolver> EntityResolvers { get; private set; }
+ public IEnumerable<IBaseItemResolver> EntityResolvers { get; private set; }
/// <summary>
/// Gets the list of BasePluginFolders added by plugins
/// </summary>
/// <value>The plugin folders.</value>
- internal IEnumerable<IVirtualFolderCreator> PluginFolderCreators { get; private set; }
+ public IEnumerable<IVirtualFolderCreator> PluginFolderCreators { get; private set; }
/// <summary>
/// Gets the list of available user repositories
@@ -210,7 +170,7 @@ namespace MediaBrowser.Controller
/// Gets the list of entity resolution ignore rules
/// </summary>
/// <value>The entity resolution ignore rules.</value>
- internal IEnumerable<IResolutionIgnoreRule> EntityResolutionIgnoreRules { get; private set; }
+ public IEnumerable<IResolutionIgnoreRule> EntityResolutionIgnoreRules { get; private set; }
/// <summary>
/// Gets the active user data repository
@@ -233,7 +193,6 @@ namespace MediaBrowser.Controller
/// <param name="appHost">The app host.</param>
/// <param name="appPaths">The app paths.</param>
/// <param name="xmlSerializer">The XML serializer.</param>
- /// <param name="taskManager">The task manager.</param>
/// <param name="logger">The logger.</param>
/// <exception cref="System.ArgumentNullException">isoManager</exception>
public Kernel(IApplicationHost appHost, IServerApplicationPaths appPaths, IXmlSerializer xmlSerializer, ILogger logger)
@@ -255,11 +214,11 @@ namespace MediaBrowser.Controller
protected override void FindParts()
{
// For now there's no real way to inject this properly
+ BaseItem.LibraryManager = ApplicationHost.Resolve<ILibraryManager>();
User.UserManager = ApplicationHost.Resolve<IUserManager>();
InstallationManager = (InstallationManager)ApplicationHost.CreateInstance(typeof(InstallationManager));
FFMpegManager = (FFMpegManager)ApplicationHost.CreateInstance(typeof(FFMpegManager));
- LibraryManager = (LibraryManager)ApplicationHost.CreateInstance(typeof(LibraryManager));
ImageManager = (ImageManager)ApplicationHost.CreateInstance(typeof(ImageManager));
ProviderManager = (ProviderManager)ApplicationHost.CreateInstance(typeof(ProviderManager));
SecurityManager = (PluginSecurityManager)ApplicationHost.CreateInstance(typeof(PluginSecurityManager));
@@ -287,9 +246,6 @@ namespace MediaBrowser.Controller
/// <returns>Task.</returns>
protected override async Task ReloadInternal()
{
- // Reset these so that they can be lazy loaded again
- RootFolder = null;
-
await base.ReloadInternal().ConfigureAwait(false);
ReloadResourcePools();
@@ -399,53 +355,11 @@ namespace MediaBrowser.Controller
{
DisposeFileSystemManager();
- FileSystemManager = new FileSystemManager(this, Logger, ApplicationHost.Resolve<ITaskManager>());
+ FileSystemManager = new FileSystemManager(this, Logger, ApplicationHost.Resolve<ITaskManager>(), ApplicationHost.Resolve<ILibraryManager>());
FileSystemManager.StartWatchers();
}
/// <summary>
- /// Finds a library item by Id and UserId.
- /// </summary>
- /// <param name="id">The id.</param>
- /// <param name="userId">The user id.</param>
- /// <param name="userManager">The user manager.</param>
- /// <returns>BaseItem.</returns>
- /// <exception cref="System.ArgumentNullException">id</exception>
- public BaseItem GetItemById(Guid id, Guid userId, IUserManager userManager)
- {
- if (id == Guid.Empty)
- {
- throw new ArgumentNullException("id");
- }
-
- if (userId == Guid.Empty)
- {
- throw new ArgumentNullException("userId");
- }
-
- var user = userManager.GetUserById(userId);
- var userRoot = user.RootFolder;
-
- return userRoot.FindItemById(id, user);
- }
-
- /// <summary>
- /// Gets the item by id.
- /// </summary>
- /// <param name="id">The id.</param>
- /// <returns>BaseItem.</returns>
- /// <exception cref="System.ArgumentNullException">id</exception>
- public BaseItem GetItemById(Guid id)
- {
- if (id == Guid.Empty)
- {
- throw new ArgumentNullException("id");
- }
-
- return RootFolder.FindItemById(id, null);
- }
-
- /// <summary>
/// Completely overwrites the current configuration with a new copy
/// </summary>
/// <param name="config">The config.</param>
diff --git a/MediaBrowser.Controller/Library/DtoBuilder.cs b/MediaBrowser.Controller/Library/DtoBuilder.cs
index 30a14bf97..c3fa38ebf 100644
--- a/MediaBrowser.Controller/Library/DtoBuilder.cs
+++ b/MediaBrowser.Controller/Library/DtoBuilder.cs
@@ -38,7 +38,7 @@ namespace MediaBrowser.Controller.Library
/// <param name="fields">The fields.</param>
/// <returns>Task{DtoBaseItem}.</returns>
/// <exception cref="System.ArgumentNullException">item</exception>
- public async Task<BaseItemDto> GetDtoBaseItem(BaseItem item, List<ItemFields> fields)
+ public async Task<BaseItemDto> GetDtoBaseItem(BaseItem item, List<ItemFields> fields, ILibraryManager libraryManager)
{
if (item == null)
{
@@ -73,7 +73,7 @@ namespace MediaBrowser.Controller.Library
if (fields.Contains(ItemFields.People))
{
- tasks.Add(AttachPeople(dto, item));
+ tasks.Add(AttachPeople(dto, item, libraryManager));
}
AttachBasicFields(dto, item, fields);
@@ -86,16 +86,17 @@ namespace MediaBrowser.Controller.Library
return dto;
}
-
+
/// <summary>
/// Converts a BaseItem to a DTOBaseItem
/// </summary>
/// <param name="item">The item.</param>
/// <param name="user">The user.</param>
/// <param name="fields">The fields.</param>
+ /// <param name="libraryManager">The library manager.</param>
/// <returns>Task{DtoBaseItem}.</returns>
- /// <exception cref="System.ArgumentNullException"></exception>
- public async Task<BaseItemDto> GetDtoBaseItem(BaseItem item, User user, List<ItemFields> fields)
+ /// <exception cref="System.ArgumentNullException">item</exception>
+ public async Task<BaseItemDto> GetDtoBaseItem(BaseItem item, User user, List<ItemFields> fields, ILibraryManager libraryManager)
{
if (item == null)
{
@@ -134,7 +135,7 @@ namespace MediaBrowser.Controller.Library
if (fields.Contains(ItemFields.People))
{
- tasks.Add(AttachPeople(dto, item));
+ tasks.Add(AttachPeople(dto, item, libraryManager));
}
AttachBasicFields(dto, item, fields);
@@ -558,8 +559,9 @@ namespace MediaBrowser.Controller.Library
/// </summary>
/// <param name="dto">The dto.</param>
/// <param name="item">The item.</param>
+ /// <param name="libraryManager">The library manager.</param>
/// <returns>Task.</returns>
- private async Task AttachPeople(BaseItemDto dto, BaseItem item)
+ private async Task AttachPeople(BaseItemDto dto, BaseItem item, ILibraryManager libraryManager)
{
if (item.People == null)
{
@@ -575,7 +577,7 @@ namespace MediaBrowser.Controller.Library
{
try
{
- return await Kernel.Instance.LibraryManager.GetPerson(c.Name).ConfigureAwait(false);
+ return await libraryManager.GetPerson(c.Name).ConfigureAwait(false);
}
catch (IOException ex)
{
@@ -662,7 +664,7 @@ namespace MediaBrowser.Controller.Library
/// </summary>
/// <param name="changeEvent">The <see cref="ChildrenChangedEventArgs" /> instance containing the event data.</param>
/// <returns>LibraryUpdateInfo.</returns>
- internal static LibraryUpdateInfo GetLibraryUpdateInfo(ChildrenChangedEventArgs changeEvent)
+ public static LibraryUpdateInfo GetLibraryUpdateInfo(ChildrenChangedEventArgs changeEvent)
{
return new LibraryUpdateInfo
{
@@ -823,7 +825,7 @@ namespace MediaBrowser.Controller.Library
/// <param name="id">The id.</param>
/// <param name="userId">The user id.</param>
/// <returns>BaseItem.</returns>
- public static BaseItem GetItemByClientId(string id, IUserManager userManager, Guid? userId = null)
+ public static BaseItem GetItemByClientId(string id, IUserManager userManager, ILibraryManager libraryManager, Guid? userId = null)
{
var isIdEmpty = string.IsNullOrEmpty(id);
@@ -835,7 +837,7 @@ namespace MediaBrowser.Controller.Library
{
if (userId.HasValue)
{
- return GetIndexFolder(id, userId.Value, userManager);
+ return GetIndexFolder(id, userId.Value, userManager, libraryManager);
}
}
@@ -845,11 +847,11 @@ namespace MediaBrowser.Controller.Library
{
item = isIdEmpty
? userManager.GetUserById(userId.Value).RootFolder
- : Kernel.Instance.GetItemById(new Guid(id), userId.Value, userManager);
+ : libraryManager.GetItemById(new Guid(id), userId.Value);
}
else if (!isIndexFolder)
{
- item = Kernel.Instance.GetItemById(new Guid(id));
+ item = libraryManager.GetItemById(new Guid(id));
}
// If we still don't find it, look within individual user views
@@ -857,7 +859,7 @@ namespace MediaBrowser.Controller.Library
{
foreach (var user in userManager.Users)
{
- item = GetItemByClientId(id, userManager, user.Id);
+ item = GetItemByClientId(id, userManager, libraryManager, user.Id);
if (item != null)
{
@@ -875,7 +877,7 @@ namespace MediaBrowser.Controller.Library
/// <param name="id">The id.</param>
/// <param name="userId">The user id.</param>
/// <returns>BaseItem.</returns>
- private static BaseItem GetIndexFolder(string id, Guid userId, IUserManager userManager)
+ private static BaseItem GetIndexFolder(string id, Guid userId, IUserManager userManager, ILibraryManager libraryManager)
{
var user = userManager.GetUserById(userId);
@@ -885,7 +887,7 @@ namespace MediaBrowser.Controller.Library
var values = id.Split(stringSeparators, StringSplitOptions.None).ToList();
// Get the top folder normally using the first id
- var folder = GetItemByClientId(values[0], userManager, userId) as Folder;
+ var folder = GetItemByClientId(values[0], userManager, libraryManager, userId) as Folder;
values.RemoveAt(0);
diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs
new file mode 100644
index 000000000..a013b2b47
--- /dev/null
+++ b/MediaBrowser.Controller/Library/ILibraryManager.cs
@@ -0,0 +1,145 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.Entities;
+
+namespace MediaBrowser.Controller.Library
+{
+ public interface ILibraryManager
+ {
+ /// <summary>
+ /// Fires whenever any validation routine adds or removes items. The added and removed items are properties of the args.
+ /// *** Will fire asynchronously. ***
+ /// </summary>
+ event EventHandler<ChildrenChangedEventArgs> LibraryChanged;
+
+ /// <summary>
+ /// Raises the <see cref="E:LibraryChanged" /> event.
+ /// </summary>
+ /// <param name="args">The <see cref="ChildrenChangedEventArgs" /> instance containing the event data.</param>
+ void ReportLibraryChanged(ChildrenChangedEventArgs args);
+
+ /// <summary>
+ /// Resolves the item.
+ /// </summary>
+ /// <param name="args">The args.</param>
+ /// <returns>BaseItem.</returns>
+ BaseItem ResolveItem(ItemResolveArgs args);
+
+ /// <summary>
+ /// Resolves a path into a BaseItem
+ /// </summary>
+ /// <param name="path">The path.</param>
+ /// <param name="parent">The parent.</param>
+ /// <param name="fileInfo">The file info.</param>
+ /// <returns>BaseItem.</returns>
+ /// <exception cref="System.ArgumentNullException"></exception>
+ BaseItem ResolvePath(string path, Folder parent = null, WIN32_FIND_DATA? fileInfo = null);
+
+ /// <summary>
+ /// Resolves a set of files into a list of BaseItem
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <param name="files">The files.</param>
+ /// <param name="parent">The parent.</param>
+ /// <returns>List{``0}.</returns>
+ List<T> ResolvePaths<T>(IEnumerable<WIN32_FIND_DATA> files, Folder parent)
+ where T : BaseItem;
+
+ /// <summary>
+ /// Gets the root folder.
+ /// </summary>
+ /// <value>The root folder.</value>
+ AggregateFolder RootFolder { get; }
+
+ /// <summary>
+ /// Gets a Person
+ /// </summary>
+ /// <param name="name">The name.</param>
+ /// <param name="allowSlowProviders">if set to <c>true</c> [allow slow providers].</param>
+ /// <returns>Task{Person}.</returns>
+ Task<Person> GetPerson(string name, bool allowSlowProviders = false);
+
+ /// <summary>
+ /// Gets a Studio
+ /// </summary>
+ /// <param name="name">The name.</param>
+ /// <param name="allowSlowProviders">if set to <c>true</c> [allow slow providers].</param>
+ /// <returns>Task{Studio}.</returns>
+ Task<Studio> GetStudio(string name, bool allowSlowProviders = false);
+
+ /// <summary>
+ /// Gets a Genre
+ /// </summary>
+ /// <param name="name">The name.</param>
+ /// <param name="allowSlowProviders">if set to <c>true</c> [allow slow providers].</param>
+ /// <returns>Task{Genre}.</returns>
+ Task<Genre> GetGenre(string name, bool allowSlowProviders = false);
+
+ /// <summary>
+ /// Gets a Year
+ /// </summary>
+ /// <param name="value">The value.</param>
+ /// <param name="allowSlowProviders">if set to <c>true</c> [allow slow providers].</param>
+ /// <returns>Task{Year}.</returns>
+ /// <exception cref="System.ArgumentOutOfRangeException"></exception>
+ Task<Year> GetYear(int value, bool allowSlowProviders = false);
+
+ /// <summary>
+ /// Validate and refresh the People sub-set of the IBN.
+ /// The items are stored in the db but not loaded into memory until actually requested by an operation.
+ /// </summary>
+ /// <param name="cancellationToken">The cancellation token.</param>
+ /// <param name="progress">The progress.</param>
+ /// <returns>Task.</returns>
+ Task ValidatePeople(CancellationToken cancellationToken, IProgress<double> progress);
+
+ /// <summary>
+ /// Reloads the root media folder
+ /// </summary>
+ /// <param name="progress">The progress.</param>
+ /// <param name="cancellationToken">The cancellation token.</param>
+ /// <returns>Task.</returns>
+ Task ValidateMediaLibrary(IProgress<double> progress, CancellationToken cancellationToken);
+
+ /// <summary>
+ /// Saves display preferences for a Folder
+ /// </summary>
+ /// <param name="user">The user.</param>
+ /// <param name="folder">The folder.</param>
+ /// <param name="data">The data.</param>
+ /// <returns>Task.</returns>
+ Task SaveDisplayPreferencesForFolder(User user, Folder folder, DisplayPreferences data);
+
+ /// <summary>
+ /// Gets the default view.
+ /// </summary>
+ /// <returns>IEnumerable{VirtualFolderInfo}.</returns>
+ IEnumerable<VirtualFolderInfo> GetDefaultVirtualFolders();
+
+ /// <summary>
+ /// Gets the view.
+ /// </summary>
+ /// <param name="user">The user.</param>
+ /// <returns>IEnumerable{VirtualFolderInfo}.</returns>
+ IEnumerable<VirtualFolderInfo> GetVirtualFolders(User user);
+
+ /// <summary>
+ /// Gets the item by id.
+ /// </summary>
+ /// <param name="id">The id.</param>
+ /// <returns>BaseItem.</returns>
+ BaseItem GetItemById(Guid id);
+
+ /// <summary>
+ /// Gets the item by id.
+ /// </summary>
+ /// <param name="id">The id.</param>
+ /// <param name="userId">The user id.</param>
+ /// <returns>BaseItem.</returns>
+ BaseItem GetItemById(Guid id, Guid userId);
+ }
+} \ No newline at end of file
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index eedc5f79d..3806defe7 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -113,6 +113,7 @@
<Compile Include="IServerApplicationPaths.cs" />
<Compile Include="Library\ChildrenChangedEventArgs.cs" />
<Compile Include="Library\DtoBuilder.cs" />
+ <Compile Include="Library\ILibraryManager.cs" />
<Compile Include="Library\IUserManager.cs" />
<Compile Include="Library\Profiler.cs" />
<Compile Include="Localization\AURatingsDictionary.cs" />
@@ -181,7 +182,6 @@
<Compile Include="Library\ItemResolveArgs.cs" />
<Compile Include="IO\DirectoryWatchers.cs" />
<Compile Include="IO\FileData.cs" />
- <Compile Include="Library\LibraryManager.cs" />
<Compile Include="Kernel.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Providers\BaseMetadataProvider.cs" />
diff --git a/MediaBrowser.Controller/ScheduledTasks/PeopleValidationTask.cs b/MediaBrowser.Controller/ScheduledTasks/PeopleValidationTask.cs
index 4448b7439..24e0c8542 100644
--- a/MediaBrowser.Controller/ScheduledTasks/PeopleValidationTask.cs
+++ b/MediaBrowser.Controller/ScheduledTasks/PeopleValidationTask.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Common.ScheduledTasks;
+using MediaBrowser.Controller.Library;
using System;
using System.Collections.Generic;
using System.Threading;
@@ -11,15 +12,18 @@ namespace MediaBrowser.Controller.ScheduledTasks
/// </summary>
public class PeopleValidationTask : IScheduledTask
{
- private readonly Kernel _kernel;
+ /// <summary>
+ /// The _library manager
+ /// </summary>
+ private readonly ILibraryManager _libraryManager;
/// <summary>
/// Initializes a new instance of the <see cref="PeopleValidationTask" /> class.
/// </summary>
- /// <param name="kernel">The kernel.</param>
- public PeopleValidationTask(Kernel kernel)
+ /// <param name="libraryManager">The library manager.</param>
+ public PeopleValidationTask(ILibraryManager libraryManager)
{
- _kernel = kernel;
+ _libraryManager = libraryManager;
}
/// <summary>
@@ -44,7 +48,7 @@ namespace MediaBrowser.Controller.ScheduledTasks
/// <returns>Task.</returns>
public Task Execute(CancellationToken cancellationToken, IProgress<double> progress)
{
- return _kernel.LibraryManager.ValidatePeople(cancellationToken, progress);
+ return _libraryManager.ValidatePeople(cancellationToken, progress);
}
/// <summary>
diff --git a/MediaBrowser.Controller/ScheduledTasks/RefreshMediaLibraryTask.cs b/MediaBrowser.Controller/ScheduledTasks/RefreshMediaLibraryTask.cs
index c5e36afb8..6b06ca944 100644
--- a/MediaBrowser.Controller/ScheduledTasks/RefreshMediaLibraryTask.cs
+++ b/MediaBrowser.Controller/ScheduledTasks/RefreshMediaLibraryTask.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Common.ScheduledTasks;
+using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Tasks;
using System;
using System.Collections.Generic;
@@ -13,17 +14,17 @@ namespace MediaBrowser.Controller.ScheduledTasks
public class RefreshMediaLibraryTask : IScheduledTask
{
/// <summary>
- /// The _kernel
+ /// The _library manager
/// </summary>
- private readonly Kernel _kernel;
+ private readonly ILibraryManager _libraryManager;
/// <summary>
/// Initializes a new instance of the <see cref="RefreshMediaLibraryTask" /> class.
/// </summary>
- /// <param name="kernel">The kernel.</param>
- public RefreshMediaLibraryTask(Kernel kernel)
+ /// <param name="libraryManager">The library manager.</param>
+ public RefreshMediaLibraryTask(ILibraryManager libraryManager)
{
- _kernel = kernel;
+ _libraryManager = libraryManager;
}
/// <summary>
@@ -54,7 +55,7 @@ namespace MediaBrowser.Controller.ScheduledTasks
progress.Report(0);
- return _kernel.LibraryManager.ValidateMediaLibrary(progress, cancellationToken);
+ return _libraryManager.ValidateMediaLibrary(progress, cancellationToken);
}
/// <summary>
diff --git a/BDInfo/BdInfoExaminer.cs b/MediaBrowser.Server.Implementations/BdInfo/BdInfoExaminer.cs
index cfa9a946b..f33682f12 100644
--- a/BDInfo/BdInfoExaminer.cs
+++ b/MediaBrowser.Server.Implementations/BdInfo/BdInfoExaminer.cs
@@ -1,10 +1,11 @@
-using MediaBrowser.Model.Entities;
+using BDInfo;
+using MediaBrowser.Model.Entities;
using MediaBrowser.Model.MediaInfo;
using System;
using System.Collections.Generic;
using System.Linq;
-namespace BDInfo
+namespace MediaBrowser.Server.Implementations.BdInfo
{
/// <summary>
/// Class BdInfoExaminer
diff --git a/MediaBrowser.Controller/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index 5dbf5c72d..73eed018d 100644
--- a/MediaBrowser.Controller/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -1,8 +1,10 @@
using MediaBrowser.Common.Events;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.ScheduledTasks;
+using MediaBrowser.Controller;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
+using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Resolvers;
using MediaBrowser.Controller.ScheduledTasks;
using MediaBrowser.Model.Entities;
@@ -17,12 +19,12 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-namespace MediaBrowser.Controller.Library
+namespace MediaBrowser.Server.Implementations.Library
{
/// <summary>
/// Class LibraryManager
/// </summary>
- public class LibraryManager
+ public class LibraryManager : ILibraryManager
{
#region LibraryChanged Event
/// <summary>
@@ -35,7 +37,7 @@ namespace MediaBrowser.Controller.Library
/// Raises the <see cref="E:LibraryChanged" /> event.
/// </summary>
/// <param name="args">The <see cref="ChildrenChangedEventArgs" /> instance containing the event data.</param>
- internal void OnLibraryChanged(ChildrenChangedEventArgs args)
+ public void ReportLibraryChanged(ChildrenChangedEventArgs args)
{
EventHelper.QueueEventIfNotNull(LibraryChanged, this, args, _logger);
@@ -64,8 +66,11 @@ namespace MediaBrowser.Controller.Library
/// </summary>
private readonly ITaskManager _taskManager;
+ /// <summary>
+ /// The _user manager
+ /// </summary>
private readonly IUserManager _userManager;
-
+
/// <summary>
/// Gets or sets the kernel.
/// </summary>
@@ -78,6 +83,7 @@ namespace MediaBrowser.Controller.Library
/// <param name="kernel">The kernel.</param>
/// <param name="logger">The logger.</param>
/// <param name="taskManager">The task manager.</param>
+ /// <param name="userManager">The user manager.</param>
public LibraryManager(Kernel kernel, ILogger logger, ITaskManager taskManager, IUserManager userManager)
{
Kernel = kernel;
@@ -89,6 +95,40 @@ namespace MediaBrowser.Controller.Library
}
/// <summary>
+ /// The _root folder
+ /// </summary>
+ private AggregateFolder _rootFolder;
+ /// <summary>
+ /// The _root folder sync lock
+ /// </summary>
+ private object _rootFolderSyncLock = new object();
+ /// <summary>
+ /// The _root folder initialized
+ /// </summary>
+ private bool _rootFolderInitialized;
+ /// <summary>
+ /// Gets the root folder.
+ /// </summary>
+ /// <value>The root folder.</value>
+ public AggregateFolder RootFolder
+ {
+ get
+ {
+ LazyInitializer.EnsureInitialized(ref _rootFolder, ref _rootFolderInitialized, ref _rootFolderSyncLock, CreateRootFolder);
+ return _rootFolder;
+ }
+ private set
+ {
+ _rootFolder = value;
+
+ if (value == null)
+ {
+ _rootFolderInitialized = false;
+ }
+ }
+ }
+
+ /// <summary>
/// Handles the ConfigurationUpdated event of the kernel control.
/// </summary>
/// <param name="sender">The source of the event.</param>
@@ -133,7 +173,7 @@ namespace MediaBrowser.Controller.Library
/// <param name="fileInfo">The file info.</param>
/// <returns>BaseItem.</returns>
/// <exception cref="System.ArgumentNullException"></exception>
- public BaseItem GetItem(string path, Folder parent = null, WIN32_FIND_DATA? fileInfo = null)
+ public BaseItem ResolvePath(string path, Folder parent = null, WIN32_FIND_DATA? fileInfo = null)
{
if (string.IsNullOrEmpty(path))
{
@@ -185,7 +225,7 @@ namespace MediaBrowser.Controller.Library
/// <param name="files">The files.</param>
/// <param name="parent">The parent.</param>
/// <returns>List{``0}.</returns>
- public List<T> GetItems<T>(IEnumerable<WIN32_FIND_DATA> files, Folder parent)
+ public List<T> ResolvePaths<T>(IEnumerable<WIN32_FIND_DATA> files, Folder parent)
where T : BaseItem
{
var list = new List<T>();
@@ -194,7 +234,7 @@ namespace MediaBrowser.Controller.Library
{
try
{
- var item = GetItem(f.Path, parent, f) as T;
+ var item = ResolvePath(f.Path, parent, f) as T;
if (item != null)
{
@@ -218,7 +258,7 @@ namespace MediaBrowser.Controller.Library
/// </summary>
/// <returns>AggregateFolder.</returns>
/// <exception cref="System.InvalidOperationException">Cannot create the root folder until plugins have loaded</exception>
- internal AggregateFolder CreateRootFolder()
+ public AggregateFolder CreateRootFolder()
{
if (Kernel.Plugins == null)
{
@@ -226,7 +266,7 @@ namespace MediaBrowser.Controller.Library
}
var rootFolderPath = Kernel.ApplicationPaths.RootFolderPath;
- var rootFolder = Kernel.ItemRepository.RetrieveItem(rootFolderPath.GetMBId(typeof(AggregateFolder))) as AggregateFolder ?? (AggregateFolder)GetItem(rootFolderPath);
+ var rootFolder = Kernel.ItemRepository.RetrieveItem(rootFolderPath.GetMBId(typeof(AggregateFolder))) as AggregateFolder ?? (AggregateFolder)ResolvePath(rootFolderPath);
// Add in the plug-in folders
foreach (var child in Kernel.PluginFolderCreators)
@@ -412,7 +452,7 @@ namespace MediaBrowser.Controller.Library
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress.</param>
/// <returns>Task.</returns>
- internal async Task ValidatePeople(CancellationToken cancellationToken, IProgress<double> progress)
+ public async Task ValidatePeople(CancellationToken cancellationToken, IProgress<double> progress)
{
// Clear the IBN cache
ImagesByNameItemCache.Clear();
@@ -423,7 +463,7 @@ namespace MediaBrowser.Controller.Library
var includedPersonTypes = new[] { PersonType.Actor, PersonType.Director };
- var people = Kernel.RootFolder.RecursiveChildren
+ var people = RootFolder.RecursiveChildren
.Where(c => c.People != null)
.SelectMany(c => c.People.Where(p => includedPersonTypes.Contains(p.Type)))
.DistinctBy(p => p.Name, StringComparer.OrdinalIgnoreCase)
@@ -483,21 +523,21 @@ namespace MediaBrowser.Controller.Library
/// <param name="progress">The progress.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task.</returns>
- internal async Task ValidateMediaLibrary(IProgress<double> progress, CancellationToken cancellationToken)
+ public async Task ValidateMediaLibrary(IProgress<double> progress, CancellationToken cancellationToken)
{
_logger.Info("Validating media library");
- await Kernel.RootFolder.RefreshMetadata(cancellationToken).ConfigureAwait(false);
+ await RootFolder.RefreshMetadata(cancellationToken).ConfigureAwait(false);
// Start by just validating the children of the root, but go no further
- await Kernel.RootFolder.ValidateChildren(new Progress<double> { }, cancellationToken, recursive: false);
+ await RootFolder.ValidateChildren(new Progress<double> { }, cancellationToken, recursive: false);
// Validate only the collection folders for each user, just to make them available as quickly as possible
var userCollectionFolderTasks = _userManager.Users.AsParallel().Select(user => user.ValidateCollectionFolders(new Progress<double> { }, cancellationToken));
await Task.WhenAll(userCollectionFolderTasks).ConfigureAwait(false);
// Now validate the entire media library
- await Kernel.RootFolder.ValidateChildren(progress, cancellationToken, recursive: true).ConfigureAwait(false);
+ await RootFolder.ValidateChildren(progress, cancellationToken, recursive: true).ConfigureAwait(false);
foreach (var user in _userManager.Users)
{
@@ -515,7 +555,7 @@ namespace MediaBrowser.Controller.Library
public Task SaveDisplayPreferencesForFolder(User user, Folder folder, DisplayPreferences data)
{
// Need to update all items with the same DisplayPrefsId
- foreach (var child in Kernel.RootFolder.GetRecursiveChildren(user)
+ foreach (var child in RootFolder.GetRecursiveChildren(user)
.OfType<Folder>()
.Where(i => i.DisplayPrefsId == folder.DisplayPrefsId))
{
@@ -558,5 +598,47 @@ namespace MediaBrowser.Controller.Library
Locations = Directory.EnumerateFiles(dir, "*.lnk", SearchOption.TopDirectoryOnly).Select(FileSystem.ResolveShortcut).ToList()
});
}
+
+ /// <summary>
+ /// Finds a library item by Id and UserId.
+ /// </summary>
+ /// <param name="id">The id.</param>
+ /// <param name="userId">The user id.</param>
+ /// <param name="userManager">The user manager.</param>
+ /// <returns>BaseItem.</returns>
+ /// <exception cref="System.ArgumentNullException">id</exception>
+ public BaseItem GetItemById(Guid id, Guid userId)
+ {
+ if (id == Guid.Empty)
+ {
+ throw new ArgumentNullException("id");
+ }
+
+ if (userId == Guid.Empty)
+ {
+ throw new ArgumentNullException("userId");
+ }
+
+ var user = _userManager.GetUserById(userId);
+ var userRoot = user.RootFolder;
+
+ return userRoot.FindItemById(id, user);
+ }
+
+ /// <summary>
+ /// Gets the item by id.
+ /// </summary>
+ /// <param name="id">The id.</param>
+ /// <returns>BaseItem.</returns>
+ /// <exception cref="System.ArgumentNullException">id</exception>
+ public BaseItem GetItemById(Guid id)
+ {
+ if (id == Guid.Empty)
+ {
+ throw new ArgumentNullException("id");
+ }
+ return null;
+ //return RootFolder.FindItemById(id, null);
+ }
}
}
diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
index 4fba9da43..d59335837 100644
--- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
+++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
@@ -32,6 +32,9 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
+ <Reference Include="MoreLinq">
+ <HintPath>..\packages\morelinq.1.0.15631-beta\lib\net35\MoreLinq.dll</HintPath>
+ </Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data.SQLite">
@@ -50,6 +53,8 @@
<Compile Include="..\SharedVersion.cs">
<Link>Properties\SharedVersion.cs</Link>
</Compile>
+ <Compile Include="BdInfo\BdInfoExaminer.cs" />
+ <Compile Include="Library\LibraryManager.cs" />
<Compile Include="Library\UserManager.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Reflection\TypeMapper.cs" />
@@ -66,6 +71,10 @@
<Compile Include="WorldWeatherOnline\WeatherProvider.cs" />
</ItemGroup>
<ItemGroup>
+ <ProjectReference Include="..\BDInfo\BDInfo.csproj">
+ <Project>{07b509c0-0c28-4f3f-8963-5263281f7e3d}</Project>
+ <Name>BDInfo</Name>
+ </ProjectReference>
<ProjectReference Include="..\MediaBrowser.Common.Implementations\MediaBrowser.Common.Implementations.csproj">
<Project>{c4d2573a-3fd3-441f-81af-174ac4cd4e1d}</Project>
<Name>MediaBrowser.Common.Implementations</Name>
diff --git a/MediaBrowser.Server.Implementations/ScheduledTasks/Tasks/ChapterImagesTask.cs b/MediaBrowser.Server.Implementations/ScheduledTasks/Tasks/ChapterImagesTask.cs
index d3854f9d7..3ad1f1700 100644
--- a/MediaBrowser.Server.Implementations/ScheduledTasks/Tasks/ChapterImagesTask.cs
+++ b/MediaBrowser.Server.Implementations/ScheduledTasks/Tasks/ChapterImagesTask.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
@@ -23,16 +24,19 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks.Tasks
/// The _logger
/// </summary>
private readonly ILogger _logger;
+ private readonly ILibraryManager _libraryManager;
/// <summary>
/// Initializes a new instance of the <see cref="ChapterImagesTask" /> class.
/// </summary>
/// <param name="kernel">The kernel.</param>
/// <param name="logger">The logger.</param>
- public ChapterImagesTask(Kernel kernel, ILogger logger)
+ /// <param name="libraryManager">The library manager.</param>
+ public ChapterImagesTask(Kernel kernel, ILogger logger, ILibraryManager libraryManager)
{
_kernel = kernel;
_logger = logger;
+ _libraryManager = libraryManager;
}
/// <summary>
@@ -55,7 +59,7 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks.Tasks
/// <returns>Task.</returns>
public Task Execute(CancellationToken cancellationToken, IProgress<double> progress)
{
- var videos = _kernel.RootFolder.RecursiveChildren.OfType<Video>().Where(v => v.Chapters != null).ToList();
+ var videos = _libraryManager.RootFolder.RecursiveChildren.OfType<Video>().Where(v => v.Chapters != null).ToList();
var numComplete = 0;
diff --git a/MediaBrowser.Server.Implementations/ScheduledTasks/Tasks/ImageCleanupTask.cs b/MediaBrowser.Server.Implementations/ScheduledTasks/Tasks/ImageCleanupTask.cs
index 57f69e2e3..939ba9317 100644
--- a/MediaBrowser.Server.Implementations/ScheduledTasks/Tasks/ImageCleanupTask.cs
+++ b/MediaBrowser.Server.Implementations/ScheduledTasks/Tasks/ImageCleanupTask.cs
@@ -2,6 +2,7 @@
using MediaBrowser.Controller;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
+using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
@@ -25,16 +26,18 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks.Tasks
/// The _logger
/// </summary>
private readonly ILogger _logger;
+ private readonly ILibraryManager _libraryManager;
/// <summary>
/// Initializes a new instance of the <see cref="ImageCleanupTask" /> class.
/// </summary>
/// <param name="kernel">The kernel.</param>
/// <param name="logger">The logger.</param>
- public ImageCleanupTask(Kernel kernel, ILogger logger)
+ public ImageCleanupTask(Kernel kernel, ILogger logger, ILibraryManager libraryManager)
{
_kernel = kernel;
_logger = logger;
+ _libraryManager = libraryManager;
}
/// <summary>
@@ -66,8 +69,8 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks.Tasks
.ToList();
// Now gather all items
- var items = _kernel.RootFolder.RecursiveChildren.ToList();
- items.Add(_kernel.RootFolder);
+ var items = _libraryManager.RootFolder.RecursiveChildren.ToList();
+ items.Add(_libraryManager.RootFolder);
// Determine all possible image paths
var pathsInUse = items.SelectMany(GetPathsInUse)
@@ -115,7 +118,7 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks.Tasks
/// <returns>Task.</returns>
private Task EnsureChapterImages(CancellationToken cancellationToken)
{
- var videos = _kernel.RootFolder.RecursiveChildren.OfType<Video>().Where(v => v.Chapters != null).ToList();
+ var videos = _libraryManager.RootFolder.RecursiveChildren.OfType<Video>().Where(v => v.Chapters != null).ToList();
var tasks = videos.Select(v => Task.Run(async () =>
{
diff --git a/MediaBrowser.Server.Implementations/packages.config b/MediaBrowser.Server.Implementations/packages.config
index 106618814..270010817 100644
--- a/MediaBrowser.Server.Implementations/packages.config
+++ b/MediaBrowser.Server.Implementations/packages.config
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
+ <package id="morelinq" version="1.0.15631-beta" targetFramework="net45" />
<package id="System.Data.SQLite" version="1.0.84.0" targetFramework="net45" />
</packages> \ No newline at end of file
diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs
index 5ba0485ed..d97f4b53f 100644
--- a/MediaBrowser.ServerApplication/ApplicationHost.cs
+++ b/MediaBrowser.ServerApplication/ApplicationHost.cs
@@ -1,14 +1,12 @@
-using BDInfo;
+using MediaBrowser.Api;
using MediaBrowser.ClickOnce;
using MediaBrowser.Common.Implementations;
-using MediaBrowser.Common.Implementations.HttpClientManager;
using MediaBrowser.Common.Implementations.HttpServer;
using MediaBrowser.Common.Implementations.Logging;
using MediaBrowser.Common.Implementations.NetworkManagement;
using MediaBrowser.Common.Implementations.ScheduledTasks;
using MediaBrowser.Common.Implementations.Serialization;
using MediaBrowser.Common.Implementations.ServerManager;
-using MediaBrowser.Common.Implementations.Udp;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Kernel;
using MediaBrowser.Common.Net;
@@ -23,11 +21,12 @@ using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.System;
using MediaBrowser.Model.Updates;
using MediaBrowser.Server.Implementations;
+using MediaBrowser.Server.Implementations.BdInfo;
using MediaBrowser.Server.Implementations.Library;
using MediaBrowser.ServerApplication.Implementations;
+using MediaBrowser.WebDashboard.Api;
using System;
using System.Collections.Generic;
-using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
@@ -120,7 +119,6 @@ namespace MediaBrowser.ServerApplication
RegisterSingleInstance<IApplicationHost>(this);
- RegisterSingleInstance<IUserManager>(new UserManager(Kernel, Logger));
RegisterSingleInstance(ServerApplicationPaths);
RegisterSingleInstance<IIsoManager>(new PismoIsoManager(Logger));
@@ -129,6 +127,11 @@ namespace MediaBrowser.ServerApplication
RegisterSingleInstance(_jsonSerializer);
RegisterSingleInstance(_xmlSerializer);
RegisterSingleInstance(ServerFactory.CreateServer(this, ProtobufSerializer, Logger, "Media Browser", "index.html"), false);
+
+ var userManager = new UserManager(Kernel, Logger);
+ RegisterSingleInstance<IUserManager>(userManager);
+
+ RegisterSingleInstance<ILibraryManager>(new LibraryManager(Kernel, Logger, taskManager, userManager));
}
/// <summary>
@@ -186,16 +189,11 @@ namespace MediaBrowser.ServerApplication
yield return pluginAssembly;
}
- var runningDirectory = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
- var corePluginDirectory = Path.Combine(runningDirectory, "CorePlugins");
+ // Include composable parts in the Api assembly
+ yield return typeof(ApiService).Assembly;
- // This will prevent the .dll file from getting locked, and allow us to replace it when needed
- foreach (var pluginAssembly in Directory
- .EnumerateFiles(corePluginDirectory, "*.dll", SearchOption.TopDirectoryOnly)
- .Select(LoadAssembly).Where(a => a != null))
- {
- yield return pluginAssembly;
- }
+ // Include composable parts in the Dashboard assembly
+ yield return typeof(DashboardInfo).Assembly;
// Include composable parts in the Model assembly
yield return typeof(SystemInfo).Assembly;
diff --git a/MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs b/MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs
index b88b64988..2c07effde 100644
--- a/MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs
+++ b/MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs
@@ -31,7 +31,8 @@ namespace MediaBrowser.ServerApplication
private readonly ILogger _logger;
private readonly IJsonSerializer _jsonSerializer;
-
+ private readonly ILibraryManager _libraryManager;
+
/// <summary>
/// The current user
/// </summary>
@@ -39,7 +40,7 @@ namespace MediaBrowser.ServerApplication
/// <summary>
/// Initializes a new instance of the <see cref="LibraryExplorer" /> class.
/// </summary>
- public LibraryExplorer(IJsonSerializer jsonSerializer, ILogger logger, IApplicationHost appHost, IUserManager userManager)
+ public LibraryExplorer(IJsonSerializer jsonSerializer, ILogger logger, IApplicationHost appHost, IUserManager userManager, ILibraryManager libraryManager)
{
_logger = logger;
_jsonSerializer = jsonSerializer;
@@ -51,6 +52,8 @@ namespace MediaBrowser.ServerApplication
ddlProfile.Items.Insert(0,new User {Name = "Physical"});
ddlProfile.SelectedIndex = 0;
ddlIndexBy.Visibility = ddlSortBy.Visibility = lblIndexBy.Visibility = lblSortBy.Visibility = Visibility.Hidden;
+
+ _libraryManager = libraryManager;
}
/// <summary>
@@ -77,7 +80,7 @@ namespace MediaBrowser.ServerApplication
await Task.Run(() =>
{
IEnumerable<BaseItem> children;
- children = CurrentUser.Name == "Physical" ? Kernel.Instance.RootFolder.Children.OrderBy(i => i.SortName) : Kernel.Instance.RootFolder.GetChildren(CurrentUser, sortBy: LocalizedStrings.Instance.GetString("NameDispPref"));
+ children = CurrentUser.Name == "Physical" ? _libraryManager.RootFolder.Children.OrderBy(i => i.SortName) : _libraryManager.RootFolder.GetChildren(CurrentUser, sortBy: LocalizedStrings.Instance.GetString("NameDispPref"));
foreach (Folder folder in children)
{
diff --git a/MediaBrowser.ServerApplication/MainWindow.xaml.cs b/MediaBrowser.ServerApplication/MainWindow.xaml.cs
index dbb3c9842..4904eb0f7 100644
--- a/MediaBrowser.ServerApplication/MainWindow.xaml.cs
+++ b/MediaBrowser.ServerApplication/MainWindow.xaml.cs
@@ -54,6 +54,8 @@ namespace MediaBrowser.ServerApplication
/// The _log manager
/// </summary>
private readonly ILogManager _logManager;
+
+ private readonly ILibraryManager _libraryManager;
/// <summary>
/// Initializes a new instance of the <see cref="MainWindow" /> class.
@@ -62,7 +64,7 @@ namespace MediaBrowser.ServerApplication
/// <param name="logger">The logger.</param>
/// <param name="appHost">The app host.</param>
/// <exception cref="System.ArgumentNullException">logger</exception>
- public MainWindow(ILogManager logManager, IApplicationHost appHost)
+ public MainWindow(ILogManager logManager, IApplicationHost appHost, ILibraryManager libraryManager)
{
if (logManager == null)
{
@@ -72,6 +74,7 @@ namespace MediaBrowser.ServerApplication
_logger = logManager.GetLogger("MainWindow");
_appHost = appHost;
_logManager = logManager;
+ _libraryManager = libraryManager;
InitializeComponent();
@@ -231,8 +234,8 @@ namespace MediaBrowser.ServerApplication
/// <param name="e">The e.</param>
void KernelReloadCompleted(object sender, EventArgs e)
{
- Kernel.Instance.LibraryManager.LibraryChanged -= Instance_LibraryChanged;
- Kernel.Instance.LibraryManager.LibraryChanged += Instance_LibraryChanged;
+ _libraryManager.LibraryChanged -= Instance_LibraryChanged;
+ _libraryManager.LibraryChanged += Instance_LibraryChanged;
if (_appHost.IsFirstRun)
{
diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
index 30f956502..230b26fa7 100644
--- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
+++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
@@ -254,9 +254,9 @@
</None>
</ItemGroup>
<ItemGroup>
- <ProjectReference Include="..\BDInfo\BDInfo.csproj">
- <Project>{07b509c0-0c28-4f3f-8963-5263281f7e3d}</Project>
- <Name>BDInfo</Name>
+ <ProjectReference Include="..\MediaBrowser.Api\MediaBrowser.Api.csproj">
+ <Project>{4fd51ac5-2c16-4308-a993-c3a84f3b4582}</Project>
+ <Name>MediaBrowser.Api</Name>
</ProjectReference>
<ProjectReference Include="..\MediaBrowser.ClickOnce\MediaBrowser.ClickOnce.csproj">
<Project>{cc96bf3e-0bda-4809-bc4b-bb6d418f4a84}</Project>
@@ -286,6 +286,10 @@
<Project>{2e781478-814d-4a48-9d80-bff206441a65}</Project>
<Name>MediaBrowser.Server.Implementations</Name>
</ProjectReference>
+ <ProjectReference Include="..\MediaBrowser.WebDashboard\MediaBrowser.WebDashboard.csproj">
+ <Project>{5624b7b5-b5a7-41d8-9f10-cc5611109619}</Project>
+ <Name>MediaBrowser.WebDashboard</Name>
+ </ProjectReference>
</ItemGroup>
<ItemGroup>
<Resource Include="Resources\Images\icon.ico" />
@@ -364,12 +368,6 @@
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
- <Content Include="CorePlugins\MediaBrowser.Api.dll">
- <CopyToOutputDirectory>Always</CopyToOutputDirectory>
- </Content>
- <Content Include="CorePlugins\MediaBrowser.WebDashboard.dll">
- <CopyToOutputDirectory>Always</CopyToOutputDirectory>
- </Content>
<Content Include="x64\SQLite.Interop.dll">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
diff --git a/MediaBrowser.WebDashboard/Html/scripts/site.js b/MediaBrowser.WebDashboard/Html/scripts/site.js
index ae6cbbf05..c8ff13e18 100644
--- a/MediaBrowser.WebDashboard/Html/scripts/site.js
+++ b/MediaBrowser.WebDashboard/Html/scripts/site.js
@@ -1099,7 +1099,8 @@ var Dashboard = {
if (item.PrimaryImageTag) {
data.icon = ApiClient.getImageUrl(item.Id, {
width: 100,
- tag: item.PrimaryImageTag
+ tag: item.PrimaryImageTag,
+ type: "Primary"
});
}
diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
index ccee79f7e..a2a1269ee 100644
--- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
+++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
@@ -405,7 +405,8 @@
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
- <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\MediaBrowser.ServerApplication\CorePlugins\" /y</PostBuildEvent>
+ <PostBuildEvent>
+ </PostBuildEvent>
</PropertyGroup>
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
diff --git a/Nuget/MediaBrowser.ApiClient.nuspec b/Nuget/MediaBrowser.ApiClient.nuspec
index 01c5121b2..7f4894713 100644
--- a/Nuget/MediaBrowser.ApiClient.nuspec
+++ b/Nuget/MediaBrowser.ApiClient.nuspec
@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>MediaBrowser.ApiClient</id>
- <version>3.0.0.15-beta</version>
+ <version>3.0.0.17-beta</version>
<title>MediaBrowser.ApiClient</title>
<authors>Media Browser Team</authors>
<owners>scottisafool,Luke</owners>
diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec
index e690e6fdc..fd91c349f 100644
--- a/Nuget/MediaBrowser.Common.Internal.nuspec
+++ b/Nuget/MediaBrowser.Common.Internal.nuspec
@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>MediaBrowser.Common.Internal</id>
- <version>3.0.15</version>
+ <version>3.0.17</version>
<title />
<authors>Luke</authors>
<owners>Media Browser Team</owners>
@@ -10,7 +10,7 @@
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Contains common components shared by Media Browser Theatre and Media Browser Server. Not intended for plugin developer consumption.</description>
<dependencies>
- <dependency id="MediaBrowser.Common" version="3.0.15" />
+ <dependency id="MediaBrowser.Common" version="3.0.17" />
<dependency id="NLog" version="2.0.0.2000" />
<dependency id="ServiceStack" version="3.9.37" />
<dependency id="ServiceStack.Api.Swagger" version="3.9.35" />
diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec
index 2e22a6099..c22b3bda2 100644
--- a/Nuget/MediaBrowser.Common.nuspec
+++ b/Nuget/MediaBrowser.Common.nuspec
@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>MediaBrowser.Common</id>
- <version>3.0.15</version>
+ <version>3.0.17</version>
<title>MediaBrowser.Common</title>
<authors>Media Browser Team</authors>
<owners />
diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec
index 425b43fd3..3872e4c19 100644
--- a/Nuget/MediaBrowser.Server.Core.nuspec
+++ b/Nuget/MediaBrowser.Server.Core.nuspec
@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>MediaBrowser.Server.Core</id>
- <version>3.0.15</version>
+ <version>3.0.17</version>
<title>Media Browser.Server.Core</title>
<authors>Media Browser Team</authors>
<owners />
@@ -10,7 +10,7 @@
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Contains core components required to build plugins for Media Browser Server.</description>
<dependencies>
- <dependency id="MediaBrowser.Common" version="3.0.15" />
+ <dependency id="MediaBrowser.Common" version="3.0.17" />
</dependencies>
</metadata>
<files>