From 863f123f3c8d26dc9fee050a9132857281caba84 Mon Sep 17 00:00:00 2001
From: Luke Pulverenti <luke.pulverenti@gmail.com>
Date: Sat, 5 Oct 2013 23:03:08 -0400
Subject: [PATCH] updated nuget + subtitle changes

---
 MediaBrowser.Api/GamesService.cs              | 39 ++++++++++++++++-
 MediaBrowser.Api/LibraryService.cs            | 42 +++++++++++++++++++
 .../Playback/BaseStreamingService.cs          |  8 ++--
 MediaBrowser.Api/UserLibrary/ItemsService.cs  | 24 ++++++++++-
 .../BaseApplicationHost.cs                    |  1 +
 .../MediaBrowser.Model.Portable.csproj        |  3 ++
 .../MediaBrowser.Model.net35.csproj           |  3 ++
 MediaBrowser.Model/ApiClient/IApiClient.cs    | 17 ++++++++
 MediaBrowser.Model/Dto/ItemIndex.cs           | 21 ++++++++++
 MediaBrowser.Model/MediaBrowser.Model.csproj  |  1 +
 MediaBrowser.Model/Querying/ItemQuery.cs      |  6 +++
 Nuget/MediaBrowser.Common.Internal.nuspec     |  4 +-
 Nuget/MediaBrowser.Common.nuspec              |  2 +-
 Nuget/MediaBrowser.Server.Core.nuspec         |  4 +-
 14 files changed, 164 insertions(+), 11 deletions(-)
 create mode 100644 MediaBrowser.Model/Dto/ItemIndex.cs

diff --git a/MediaBrowser.Api/GamesService.cs b/MediaBrowser.Api/GamesService.cs
index 68b3fc9c84..799b9d7567 100644
--- a/MediaBrowser.Api/GamesService.cs
+++ b/MediaBrowser.Api/GamesService.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Dto;
+using System.Globalization;
+using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Persistence;
@@ -35,6 +36,21 @@ namespace MediaBrowser.Api
         public Guid? UserId { get; set; }
     }
 
+    /// <summary>
+    /// Class GetGameSystemSummaries
+    /// </summary>
+    [Route("/Games/PlayerIndex", "GET")]
+    [Api(Description = "Gets an index of players (1-x) and the number of games listed under each")]
+    public class GetPlayerIndex : IReturn<List<ItemIndex>>
+    {
+        /// <summary>
+        /// Gets or sets the user id.
+        /// </summary>
+        /// <value>The user id.</value>
+        [ApiMember(Name = "UserId", Description = "Optional. Filter by user id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
+        public Guid? UserId { get; set; }
+    }
+
     /// <summary>
     /// Class GamesService
     /// </summary>
@@ -100,6 +116,27 @@ namespace MediaBrowser.Api
             return ToOptimizedResult(result);
         }
 
+        private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
+        
+        public object Get(GetPlayerIndex request)
+        {
+            var games = GetAllLibraryItems(request.UserId, _userManager, _libraryManager)
+                .OfType<Game>()
+                .ToList();
+
+            var lookup = games
+                .ToLookup(i => i.PlayersSupported ?? -1)
+                .OrderBy(i => i.Key)
+                .Select(i => new ItemIndex
+                {
+                    ItemCount = i.Count(),
+                    Name = i.Key == -1 ? string.Empty : i.Key.ToString(UsCulture)
+                })
+                .ToList();
+
+            return ToOptimizedResult(lookup);
+        }
+
         /// <summary>
         /// Gets the summary.
         /// </summary>
diff --git a/MediaBrowser.Api/LibraryService.cs b/MediaBrowser.Api/LibraryService.cs
index 0f15124a5f..16952dabdf 100644
--- a/MediaBrowser.Api/LibraryService.cs
+++ b/MediaBrowser.Api/LibraryService.cs
@@ -10,7 +10,9 @@ using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Querying;
 using ServiceStack.ServiceHost;
 using System;
+using System.Collections;
 using System.Collections.Generic;
+using System.Globalization;
 using System.IO;
 using System.Linq;
 using System.Threading;
@@ -175,6 +177,21 @@ namespace MediaBrowser.Api
         public string Id { get; set; }
     }
 
+    [Route("/Items/YearIndex", "GET")]
+    [Api(Description = "Gets a year index based on an item query.")]
+    public class GetYearIndex : IReturn<List<ItemIndex>>
+    {
+        /// <summary>
+        /// Gets or sets the user id.
+        /// </summary>
+        /// <value>The user id.</value>
+        [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; }
+
+        [ApiMember(Name = "IncludeItemTypes", Description = "Optional. If specified, results will be filtered based on item type. This allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
+        public string IncludeItemTypes { get; set; }
+    }
+
     /// <summary>
     /// Class LibraryService
     /// </summary>
@@ -564,5 +581,30 @@ namespace MediaBrowser.Api
                 OwnerId = _dtoService.GetDtoId(item)
             };
         }
+
+        private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
+        
+        public object Get(GetYearIndex request)
+        {
+            IEnumerable<BaseItem> items = GetAllLibraryItems(request.UserId, _userManager, _libraryManager);
+
+            if (!string.IsNullOrEmpty(request.IncludeItemTypes))
+            {
+                var vals = request.IncludeItemTypes.Split(',');
+                items = items.Where(f => vals.Contains(f.GetType().Name, StringComparer.OrdinalIgnoreCase));
+            }
+            
+            var lookup = items
+                .ToLookup(i => i.ProductionYear ?? -1)
+                .OrderBy(i => i.Key)
+                .Select(i => new ItemIndex
+                {
+                    ItemCount = i.Count(),
+                    Name = i.Key == -1 ? string.Empty : i.Key.ToString(UsCulture)
+                })
+                .ToList();
+
+            return ToOptimizedResult(lookup);
+        }
     }
 }
diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs
index 6491b2527c..93b26e3877 100644
--- a/MediaBrowser.Api/Playback/BaseStreamingService.cs
+++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs
@@ -286,8 +286,8 @@ namespace MediaBrowser.Api.Playback
             if (request.Height.HasValue)
             {
                 return isH264Output ?
-                    string.Format(" -vf \"scale={0}:trunc(oh/a/2)*2{1}\"", request.Height.Value, assSubtitleParam) :
-                    string.Format(" -vf \"scale=-1{1}:{0}\"", request.Height.Value, assSubtitleParam);
+                    string.Format(" -vf \"scale=trunc(oh*a*2)/2:{0}{1}\"", request.Height.Value, assSubtitleParam) :
+                    string.Format(" -vf \"scale=-1:{0}{1}\"", request.Height.Value, assSubtitleParam);
             }
 
             // If a max width was requested
@@ -302,8 +302,8 @@ namespace MediaBrowser.Api.Playback
             if (request.MaxHeight.HasValue && (!request.MaxWidth.HasValue || state.VideoStream == null))
             {
                 return isH264Output ?
-                    string.Format(" -vf \"scale=min(ih\\,{0}):trunc(oh/a/2)*2{1}\"", request.MaxHeight.Value, assSubtitleParam) :
-                    string.Format(" -vf \"scale=min(ih\\,{0}):-1{1}\"", request.MaxHeight.Value, assSubtitleParam);
+                    string.Format(" -vf \"scale=trunc(oh*a*2)/2:min(ih\\,{0}){1}\"", request.MaxHeight.Value, assSubtitleParam) :
+                    string.Format(" -vf \"scale=-1:min(ih\\,{0}){1}\"", request.MaxHeight.Value, assSubtitleParam);
             }
 
             if (state.VideoStream == null)
diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs
index f4976bba30..6a89926584 100644
--- a/MediaBrowser.Api/UserLibrary/ItemsService.cs
+++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs
@@ -167,7 +167,10 @@ namespace MediaBrowser.Api.UserLibrary
 
         [ApiMember(Name = "MinPlayers", Description = "Optional filter by minimum number of game players.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
         public int? MinPlayers { get; set; }
-        
+
+        [ApiMember(Name = "MaxPlayers", Description = "Optional filter by maximum number of game players.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
+        public int? MaxPlayers { get; set; }
+
         [ApiMember(Name = "ParentIndexNumber", Description = "Optional filter by parent index number.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
         public int? ParentIndexNumber { get; set; }
 
@@ -692,6 +695,25 @@ namespace MediaBrowser.Api.UserLibrary
                 });
             }
 
+            if (request.MaxPlayers.HasValue)
+            {
+                var filterValue = request.MaxPlayers.Value;
+
+                items = items.Where(i =>
+                {
+                    var game = i as Game;
+
+                    if (game != null)
+                    {
+                        var players = game.PlayersSupported ?? 1;
+
+                        return players <= filterValue;
+                    }
+
+                    return false;
+                });
+            }
+
             if (request.HasSpecialFeature.HasValue)
             {
                 var filterValue = request.HasSpecialFeature.Value;
diff --git a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs
index 5631104c4e..9c77b8627e 100644
--- a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs
+++ b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs
@@ -214,6 +214,7 @@ namespace MediaBrowser.Common.Implementations
         {
             try
             {
+                // Increase the max http request limit
                 ServicePointManager.DefaultConnectionLimit = Math.Min(48, ServicePointManager.DefaultConnectionLimit);
             }
             catch (Exception ex)
diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
index 907433a809..926c680b8d 100644
--- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
+++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
@@ -113,6 +113,9 @@
     <Compile Include="..\MediaBrowser.Model\Dto\ItemCounts.cs">
       <Link>Dto\ItemCounts.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Dto\ItemIndex.cs">
+      <Link>Dto\ItemIndex.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Dto\StreamOptions.cs">
       <Link>Dto\StreamOptions.cs</Link>
     </Compile>
diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
index 076778d33b..8d7ad5721f 100644
--- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
+++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
@@ -97,6 +97,9 @@
     <Compile Include="..\MediaBrowser.Model\Dto\ItemCounts.cs">
       <Link>Dto\ItemCounts.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Dto\ItemIndex.cs">
+      <Link>Dto\ItemIndex.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Dto\StreamOptions.cs">
       <Link>Dto\StreamOptions.cs</Link>
     </Compile>
diff --git a/MediaBrowser.Model/ApiClient/IApiClient.cs b/MediaBrowser.Model/ApiClient/IApiClient.cs
index a428236308..bb395cd6a4 100644
--- a/MediaBrowser.Model/ApiClient/IApiClient.cs
+++ b/MediaBrowser.Model/ApiClient/IApiClient.cs
@@ -58,6 +58,23 @@ namespace MediaBrowser.Model.ApiClient
         Task<T> GetAsync<T>(string url, CancellationToken cancellationToken)
             where T : class;
 
+        /// <summary>
+        /// Gets the index of the game players.
+        /// </summary>
+        /// <param name="userId">The user id.</param>
+        /// <param name="cancellationToken">The cancellation token.</param>
+        /// <returns>Task{List{ItemIndex}}.</returns>
+        Task<List<ItemIndex>> GetGamePlayerIndex(string userId, CancellationToken cancellationToken);
+
+        /// <summary>
+        /// Gets the index of the year.
+        /// </summary>
+        /// <param name="userId">The user id.</param>
+        /// <param name="includeItemTypes">The include item types.</param>
+        /// <param name="cancellationToken">The cancellation token.</param>
+        /// <returns>Task{List{ItemIndex}}.</returns>
+        Task<List<ItemIndex>> GetYearIndex(string userId, string[] includeItemTypes, CancellationToken cancellationToken);
+        
         /// <summary>
         /// Gets the critic reviews.
         /// </summary>
diff --git a/MediaBrowser.Model/Dto/ItemIndex.cs b/MediaBrowser.Model/Dto/ItemIndex.cs
new file mode 100644
index 0000000000..96cef622b2
--- /dev/null
+++ b/MediaBrowser.Model/Dto/ItemIndex.cs
@@ -0,0 +1,21 @@
+
+namespace MediaBrowser.Model.Dto
+{
+    /// <summary>
+    /// Class ItemIndex
+    /// </summary>
+    public class ItemIndex
+    {
+        /// <summary>
+        /// Gets or sets the name.
+        /// </summary>
+        /// <value>The name.</value>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// Gets or sets the item count.
+        /// </summary>
+        /// <value>The item count.</value>
+        public int ItemCount { get; set; }
+    }
+}
diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj
index ccb6221112..adb05149a7 100644
--- a/MediaBrowser.Model/MediaBrowser.Model.csproj
+++ b/MediaBrowser.Model/MediaBrowser.Model.csproj
@@ -56,6 +56,7 @@
     <Compile Include="Dto\ImageInfo.cs" />
     <Compile Include="Dto\ItemByNameCounts.cs" />
     <Compile Include="Dto\ItemCounts.cs" />
+    <Compile Include="Dto\ItemIndex.cs" />
     <Compile Include="Dto\StudioDto.cs" />
     <Compile Include="Entities\CollectionType.cs" />
     <Compile Include="Entities\ItemReview.cs" />
diff --git a/MediaBrowser.Model/Querying/ItemQuery.cs b/MediaBrowser.Model/Querying/ItemQuery.cs
index 20eac55e81..db0cc4928f 100644
--- a/MediaBrowser.Model/Querying/ItemQuery.cs
+++ b/MediaBrowser.Model/Querying/ItemQuery.cs
@@ -212,6 +212,12 @@ namespace MediaBrowser.Model.Querying
         /// <value>The min players.</value>
         public int? MinPlayers { get; set; }
 
+        /// <summary>
+        /// Gets or sets the max players.
+        /// </summary>
+        /// <value>The max players.</value>
+        public int? MaxPlayers { get; set; }
+        
         /// <summary>
         /// Gets or sets the name starts with or greater.
         /// </summary>
diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec
index 7cad1c7cfa..92c8f2c054 100644
--- a/Nuget/MediaBrowser.Common.Internal.nuspec
+++ b/Nuget/MediaBrowser.Common.Internal.nuspec
@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Common.Internal</id>
-        <version>3.0.220</version>
+        <version>3.0.221</version>
         <title>MediaBrowser.Common.Internal</title>
         <authors>Luke</authors>
         <owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
         <description>Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.</description>
         <copyright>Copyright © Media Browser 2013</copyright>
         <dependencies>
-            <dependency id="MediaBrowser.Common" version="3.0.220" />
+            <dependency id="MediaBrowser.Common" version="3.0.221" />
             <dependency id="NLog" version="2.0.1.2" />
             <dependency id="ServiceStack.Text" version="3.9.58" />
             <dependency id="SimpleInjector" version="2.3.2" />
diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec
index ffb5153f47..3baf5d96fc 100644
--- a/Nuget/MediaBrowser.Common.nuspec
+++ b/Nuget/MediaBrowser.Common.nuspec
@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Common</id>
-        <version>3.0.220</version>
+        <version>3.0.221</version>
         <title>MediaBrowser.Common</title>
         <authors>Media Browser Team</authors>
         <owners>ebr,Luke,scottisafool</owners>
diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec
index a81bb7ebf6..147850f29e 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.220</version>
+        <version>3.0.221</version>
         <title>Media Browser.Server.Core</title>
         <authors>Media Browser Team</authors>
         <owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
         <description>Contains core components required to build plugins for Media Browser Server.</description>
         <copyright>Copyright © Media Browser 2013</copyright>
         <dependencies>
-            <dependency id="MediaBrowser.Common" version="3.0.220" />
+            <dependency id="MediaBrowser.Common" version="3.0.221" />
         </dependencies>
     </metadata>
     <files>