浏览代码

web client re-org

Luke Pulverenti 11 年之前
父节点
当前提交
c7c72dd1a8

+ 7 - 1
MediaBrowser.Api/BaseApiService.cs

@@ -154,8 +154,14 @@ namespace MediaBrowser.Api
             return libraryManager.GetPerson(DeSlugPersonName(name, libraryManager));
             return libraryManager.GetPerson(DeSlugPersonName(name, libraryManager));
         }
         }
 
 
-        protected IList<BaseItem> GetAllLibraryItems(Guid? userId, IUserManager userManager, ILibraryManager libraryManager)
+        protected IList<BaseItem> GetAllLibraryItems(Guid? userId, IUserManager userManager, ILibraryManager libraryManager, string parentId = null)
         {
         {
+            if (!string.IsNullOrEmpty(parentId))
+            {
+                var folder = (Folder) libraryManager.GetItemById(new Guid(parentId));
+
+                return folder.GetRecursiveChildren();
+            }
             if (userId.HasValue)
             if (userId.HasValue)
             {
             {
                 var user = userManager.GetUserById(userId.Value);
                 var user = userManager.GetUserById(userId.Value);

+ 10 - 1
MediaBrowser.Api/Movies/MoviesService.cs

@@ -45,6 +45,13 @@ namespace MediaBrowser.Api.Movies
         [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
         [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
         public Guid? UserId { get; set; }
         public Guid? UserId { get; set; }
 
 
+        /// <summary>
+        /// Specify this to localize the search to a specific item or folder. Omit to use the root.
+        /// </summary>
+        /// <value>The parent id.</value>
+        [ApiMember(Name = "ParentId", Description = "Specify this to localize the search to a specific item or folder. Omit to use the root", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
+        public string ParentId { get; set; }
+        
         public GetMovieRecommendations()
         public GetMovieRecommendations()
         {
         {
             CategoryLimit = 5;
             CategoryLimit = 5;
@@ -117,7 +124,9 @@ namespace MediaBrowser.Api.Movies
         {
         {
             var user = _userManager.GetUserById(request.UserId.Value);
             var user = _userManager.GetUserById(request.UserId.Value);
 
 
-            var movies = user.RootFolder.GetRecursiveChildren(user).OfType<Movie>().ToList();
+            var movies = GetAllLibraryItems(request.UserId, _userManager, _libraryManager, request.ParentId)
+                .OfType<Movie>()
+                .ToList();
 
 
             var result = GetRecommendationCategories(user, movies, request.CategoryLimit, request.ItemLimit, request.GetItemFields().ToList());
             var result = GetRecommendationCategories(user, movies, request.CategoryLimit, request.ItemLimit, request.GetItemFields().ToList());
 
 

+ 16 - 5
MediaBrowser.Api/TvShowsService.cs

@@ -50,6 +50,13 @@ namespace MediaBrowser.Api
 
 
         [ApiMember(Name = "SeriesId", Description = "Optional. Filter by series id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
         [ApiMember(Name = "SeriesId", Description = "Optional. Filter by series id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
         public string SeriesId { get; set; }
         public string SeriesId { get; set; }
+
+        /// <summary>
+        /// Specify this to localize the search to a specific item or folder. Omit to use the root.
+        /// </summary>
+        /// <value>The parent id.</value>
+        [ApiMember(Name = "ParentId", Description = "Specify this to localize the search to a specific item or folder. Omit to use the root", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
+        public string ParentId { get; set; }
     }
     }
 
 
     [Route("/Shows/Upcoming", "GET", Summary = "Gets a list of upcoming episodes")]
     [Route("/Shows/Upcoming", "GET", Summary = "Gets a list of upcoming episodes")]
@@ -82,6 +89,13 @@ namespace MediaBrowser.Api
         /// <value>The fields.</value>
         /// <value>The fields.</value>
         [ApiMember(Name = "Fields", Description = "Optional. Specify additional fields of information to return in the output. This allows multiple, comma delimeted. Options: Budget, Chapters, CriticRatingSummary, DateCreated, Genres, HomePageUrl, IndexOptions, MediaStreams, Overview, OverviewHtml, ParentId, Path, People, ProviderIds, PrimaryImageAspectRatio, Revenue, SortName, Studios, Taglines, TrailerUrls", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
         [ApiMember(Name = "Fields", Description = "Optional. Specify additional fields of information to return in the output. This allows multiple, comma delimeted. Options: Budget, Chapters, CriticRatingSummary, DateCreated, Genres, HomePageUrl, IndexOptions, MediaStreams, Overview, OverviewHtml, ParentId, Path, People, ProviderIds, PrimaryImageAspectRatio, Revenue, SortName, Studios, Taglines, TrailerUrls", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
         public string Fields { get; set; }
         public string Fields { get; set; }
+
+        /// <summary>
+        /// Specify this to localize the search to a specific item or folder. Omit to use the root.
+        /// </summary>
+        /// <value>The parent id.</value>
+        [ApiMember(Name = "ParentId", Description = "Specify this to localize the search to a specific item or folder. Omit to use the root", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
+        public string ParentId { get; set; }
     }
     }
 
 
     [Route("/Shows/{Id}/Similar", "GET", Summary = "Finds tv shows similar to a given one.")]
     [Route("/Shows/{Id}/Similar", "GET", Summary = "Finds tv shows similar to a given one.")]
@@ -218,7 +232,7 @@ namespace MediaBrowser.Api
         {
         {
             var user = _userManager.GetUserById(request.UserId);
             var user = _userManager.GetUserById(request.UserId);
 
 
-            var items = GetAllLibraryItems(request.UserId, _userManager, _libraryManager)
+            var items = GetAllLibraryItems(request.UserId, _userManager, _libraryManager, request.ParentId)
                 .OfType<Episode>();
                 .OfType<Episode>();
 
 
             var itemsList = _libraryManager.Sort(items, user, new[] { "PremiereDate", "AirTime", "SortName" }, SortOrder.Ascending)
             var itemsList = _libraryManager.Sort(items, user, new[] { "PremiereDate", "AirTime", "SortName" }, SortOrder.Ascending)
@@ -276,10 +290,7 @@ namespace MediaBrowser.Api
 
 
         public IEnumerable<Episode> GetNextUpEpisodes(GetNextUpEpisodes request)
         public IEnumerable<Episode> GetNextUpEpisodes(GetNextUpEpisodes request)
         {
         {
-            var user = _userManager.GetUserById(request.UserId);
-
-            var items = user.RootFolder
-                .GetRecursiveChildren(user)
+            var items = GetAllLibraryItems(request.UserId, _userManager, _libraryManager, request.ParentId)
                 .OfType<Series>();
                 .OfType<Series>();
 
 
             // Avoid implicitly captured closure
             // Avoid implicitly captured closure

+ 15 - 4
MediaBrowser.Controller/Providers/BaseItemXmlParser.cs

@@ -138,12 +138,23 @@ namespace MediaBrowser.Controller.Providers
             {
             {
                 // DateCreated
                 // DateCreated
                 case "Added":
                 case "Added":
-                    DateTime added;
-                    if (DateTime.TryParse(reader.ReadElementContentAsString() ?? string.Empty, out added))
                     {
                     {
-                        item.DateCreated = added.ToUniversalTime();
+                        var val = reader.ReadElementContentAsString();
+
+                        if (!string.IsNullOrWhiteSpace(val))
+                        {
+                            DateTime added;
+                            if (DateTime.TryParse(val, out added))
+                            {
+                                item.DateCreated = added.ToUniversalTime();
+                            }
+                            else
+                            {
+                                Logger.Warn("Invalid Added value found: " + val);
+                            }
+                        }
+                        break;
                     }
                     }
-                    break;
 
 
                 case "LocalTitle":
                 case "LocalTitle":
                     item.Name = reader.ReadElementContentAsString();
                     item.Name = reader.ReadElementContentAsString();

+ 7 - 1
MediaBrowser.MediaEncoding/MediaBrowser.MediaEncoding.csproj

@@ -80,7 +80,13 @@
     <None Include="packages.config" />
     <None Include="packages.config" />
   </ItemGroup>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-
+  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
+  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+    <PropertyGroup>
+      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
+    </PropertyGroup>
+    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
+  </Target>
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.
        Other similar extension points exist, see Microsoft.Common.targets.
   <Target Name="BeforeBuild">
   <Target Name="BeforeBuild">

+ 8 - 1
MediaBrowser.Providers/Manager/ProviderUtils.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Entities;
+using System;
+using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
 using System.Collections.Generic;
 using System.Collections.Generic;
@@ -186,6 +187,12 @@ namespace MediaBrowser.Providers.Manager
                 target.IsLocked = source.IsLocked;
                 target.IsLocked = source.IsLocked;
                 target.DisplayMediaType = source.DisplayMediaType;
                 target.DisplayMediaType = source.DisplayMediaType;
 
 
+                // Grab the value if it's there, but if not then don't overwrite the default
+                if (source.DateCreated != default(DateTime))
+                {
+                    target.DateCreated = source.DateCreated;
+                }
+
                 var sourceHasLanguageSettings = source as IHasPreferredMetadataLanguage;
                 var sourceHasLanguageSettings = source as IHasPreferredMetadataLanguage;
                 var targetHasLanguageSettings = target as IHasPreferredMetadataLanguage;
                 var targetHasLanguageSettings = target as IHasPreferredMetadataLanguage;
 
 

+ 2 - 4
MediaBrowser.Server.Implementations/EntryPoints/ExternalPortForwarding.cs

@@ -3,8 +3,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Plugins;
 using MediaBrowser.Controller.Plugins;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Logging;
 using Mono.Nat;
 using Mono.Nat;
-using Mono.Nat.Enums;
-using Mono.Nat.EventArgs;
 using System;
 using System;
 using System.IO;
 using System.IO;
 using System.Text;
 using System.Text;
@@ -19,9 +17,9 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
 
 
         private bool _isStarted;
         private bool _isStarted;
 
 
-        public ExternalPortForwarding(ILogger logger, IServerApplicationHost appHost, IServerConfigurationManager config)
+        public ExternalPortForwarding(ILogManager logmanager, IServerApplicationHost appHost, IServerConfigurationManager config)
         {
         {
-            _logger = logger;
+            _logger = logmanager.GetLogger("PortMapper");
             _appHost = appHost;
             _appHost = appHost;
             _config = config;
             _config = config;
 
 

+ 10 - 4
MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs

@@ -1,4 +1,5 @@
 using System.Net.Sockets;
 using System.Net.Sockets;
+using System.Runtime.Serialization;
 using Funq;
 using Funq;
 using MediaBrowser.Common;
 using MediaBrowser.Common;
 using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.Extensions;
@@ -246,8 +247,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer
                 _autoResetEvents[index].Set();
                 _autoResetEvents[index].Set();
             }
             }
 
 
-            if (context == null) return;
-
             var date = DateTime.Now;
             var date = DateTime.Now;
 
 
             Task.Factory.StartNew(async () =>
             Task.Factory.StartNew(async () =>
@@ -375,7 +374,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
                 };
                 };
 
 
                 var operationName = context.Request.GetOperationName();
                 var operationName = context.Request.GetOperationName();
-                var httpReq = context.ToRequest(operationName);
+                var httpReq = GetRequest(context, operationName);
                 var httpRes = httpReq.Response;
                 var httpRes = httpReq.Response;
                 var contentType = httpReq.ResponseContentType;
                 var contentType = httpReq.ResponseContentType;
 
 
@@ -409,6 +408,13 @@ namespace MediaBrowser.Server.Implementations.HttpServer
             }
             }
         }
         }
 
 
+        private static ListenerRequest GetRequest(HttpListenerContext httpContext, string operationName)
+        {
+            var req = new ListenerRequest(httpContext, operationName, RequestAttributes.None);
+            req.RequestAttributes = req.GetAttributes();
+            return req;
+        }
+
         /// <summary>
         /// <summary>
         /// Shut down the Web Service
         /// Shut down the Web Service
         /// </summary>
         /// </summary>
@@ -436,7 +442,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
 
 
             var operationName = context.Request.GetOperationName();
             var operationName = context.Request.GetOperationName();
 
 
-            var httpReq = context.ToRequest(operationName);
+            var httpReq = GetRequest(context, operationName);
             var httpRes = httpReq.Response;
             var httpRes = httpReq.Response;
             var handler = HttpHandlerFactory.GetHandler(httpReq);
             var handler = HttpHandlerFactory.GetHandler(httpReq);
 
 

+ 2 - 1
MediaBrowser.Server.Implementations/Localization/Server/server.json

@@ -620,5 +620,6 @@
 	"NotificationOptionPluginError": "Plugin failure",
 	"NotificationOptionPluginError": "Plugin failure",
 	"ButtonVolumeUp": "Volume up",
 	"ButtonVolumeUp": "Volume up",
 	"ButtonVolumeDown": "Volume down",
 	"ButtonVolumeDown": "Volume down",
-	"ButtonMute": "Mute"
+	"ButtonMute": "Mute",
+	"HeaderLatestMedia": "Latest Media"
 }
 }

+ 2 - 2
MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj

@@ -48,9 +48,9 @@
     <Reference Include="Alchemy">
     <Reference Include="Alchemy">
       <HintPath>..\packages\Alchemy.2.2.1\lib\net40\Alchemy.dll</HintPath>
       <HintPath>..\packages\Alchemy.2.2.1\lib\net40\Alchemy.dll</HintPath>
     </Reference>
     </Reference>
-    <Reference Include="Mono.Nat, Version=1.2.3.0, Culture=neutral, processorArchitecture=MSIL">
+    <Reference Include="Mono.Nat, Version=1.2.7.0, Culture=neutral, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\packages\Mono.Nat.1.2.3\lib\Net40\Mono.Nat.dll</HintPath>
+      <HintPath>..\packages\Mono.Nat.1.2.7.0\lib\net40\Mono.Nat.dll</HintPath>
     </Reference>
     </Reference>
     <Reference Include="ServiceStack.Api.Swagger">
     <Reference Include="ServiceStack.Api.Swagger">
       <HintPath>..\ThirdParty\ServiceStack\ServiceStack.Api.Swagger.dll</HintPath>
       <HintPath>..\ThirdParty\ServiceStack\ServiceStack.Api.Swagger.dll</HintPath>

+ 1 - 1
MediaBrowser.Server.Implementations/packages.config

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
 <packages>
   <package id="Alchemy" version="2.2.1" targetFramework="net45" />
   <package id="Alchemy" version="2.2.1" targetFramework="net45" />
-  <package id="Mono.Nat" version="1.2.3" targetFramework="net45" />
+  <package id="Mono.Nat" version="1.2.7.0" targetFramework="net45" />
   <package id="morelinq" version="1.0.16006" targetFramework="net45" />
   <package id="morelinq" version="1.0.16006" targetFramework="net45" />
   <package id="System.Data.SQLite.Core" version="1.0.91.3" targetFramework="net45" />
   <package id="System.Data.SQLite.Core" version="1.0.91.3" targetFramework="net45" />
 </packages>
 </packages>

+ 15 - 3
MediaBrowser.Server.Mono/Program.cs

@@ -41,10 +41,8 @@ namespace MediaBrowser.Server.Mono
 			var applicationPath = Assembly.GetEntryAssembly ().Location;
 			var applicationPath = Assembly.GetEntryAssembly ().Location;
 			#endif
 			#endif
 			
 			
-			var commandArgs = Environment.GetCommandLineArgs();
-			
 			// Allow this to be specified on the command line.
 			// Allow this to be specified on the command line.
-			var customProgramDataPath = commandArgs.ElementAtOrDefault(1);
+			var customProgramDataPath = ParseCommandLine();
 
 
 			var appPaths = CreateApplicationPaths(applicationPath, customProgramDataPath);
 			var appPaths = CreateApplicationPaths(applicationPath, customProgramDataPath);
 
 
@@ -75,6 +73,20 @@ namespace MediaBrowser.Server.Mono
 				_appHost.Dispose();
 				_appHost.Dispose();
 			}
 			}
 		}
 		}
+		
+		private static string ParseCommandLine()
+		{
+			var commandArgs = Environment.GetCommandLineArgs().ToList();
+			
+			var programDataPathIndex = commandArgs.IndexOf("-programdata");
+			
+			if (programDataPathIndex != -1)
+			{
+				return commandArgs.ElementAtOrDefault(programDataPathIndex + 1);
+			}
+			
+			return null;
+		}
 
 
 		private static ServerApplicationPaths CreateApplicationPaths(string applicationPath, string programDataPath)
 		private static ServerApplicationPaths CreateApplicationPaths(string applicationPath, string programDataPath)
 		{
 		{