diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs index c53076829..05446c646 100644 --- a/MediaBrowser.Api/ItemUpdateService.cs +++ b/MediaBrowser.Api/ItemUpdateService.cs @@ -345,6 +345,18 @@ namespace MediaBrowser.Api video.Video3DFormat = request.Video3DFormat; } + var hasMetascore = item as IHasMetascore; + if (hasMetascore != null) + { + hasMetascore.Metascore = request.Metascore; + } + + var hasAwards = item as IHasAwards; + if (hasAwards != null) + { + hasAwards.AwardSummary = request.AwardSummary; + } + var game = item as Game; if (game != null) diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 7ad15c9ee..9e2ce066f 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -287,9 +287,9 @@ namespace MediaBrowser.Api.Playback case EncodingQuality.HighSpeed: return 2; case EncodingQuality.HighQuality: - return isWebm ? Math.Min(3, Environment.ProcessorCount - 1) : 2; + return 2; case EncodingQuality.MaxQuality: - return isWebm ? Math.Max(2, Environment.ProcessorCount - 1) : 0; + return isWebm ? 2 : 0; default: throw new Exception("Unrecognized MediaEncodingQuality value."); } diff --git a/MediaBrowser.Controller/Entities/IHasAwards.cs b/MediaBrowser.Controller/Entities/IHasAwards.cs new file mode 100644 index 000000000..6661702fa --- /dev/null +++ b/MediaBrowser.Controller/Entities/IHasAwards.cs @@ -0,0 +1,15 @@ + +namespace MediaBrowser.Controller.Entities +{ + /// + /// Interface IHasAwards + /// + public interface IHasAwards + { + /// + /// Gets or sets the awards summary. + /// + /// The awards summary. + string AwardSummary { get; set; } + } +} diff --git a/MediaBrowser.Controller/Entities/IHasMetascore.cs b/MediaBrowser.Controller/Entities/IHasMetascore.cs new file mode 100644 index 000000000..a3445bbba --- /dev/null +++ b/MediaBrowser.Controller/Entities/IHasMetascore.cs @@ -0,0 +1,15 @@ + +namespace MediaBrowser.Controller.Entities +{ + /// + /// Interface IHasMetascore + /// + public interface IHasMetascore + { + /// + /// Gets or sets the metascore. + /// + /// The metascore. + float? Metascore { get; set; } + } +} diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs index ba11b0eef..2b252a6c2 100644 --- a/MediaBrowser.Controller/Entities/Movies/Movie.cs +++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs @@ -12,7 +12,7 @@ namespace MediaBrowser.Controller.Entities.Movies /// /// Class Movie /// - public class Movie : Video, IHasCriticRating, IHasSoundtracks, IHasBudget, IHasKeywords, IHasTrailers, IHasThemeMedia, IHasTaglines, IHasTags, IHasPreferredMetadataLanguage + public class Movie : Video, IHasCriticRating, IHasSoundtracks, IHasBudget, IHasKeywords, IHasTrailers, IHasThemeMedia, IHasTaglines, IHasTags, IHasPreferredMetadataLanguage, IHasAwards, IHasMetascore { public List SpecialFeatureIds { get; set; } @@ -20,7 +20,7 @@ namespace MediaBrowser.Controller.Entities.Movies public List ThemeSongIds { get; set; } public List ThemeVideoIds { get; set; } - + /// /// Gets or sets the preferred metadata country code. /// @@ -42,6 +42,10 @@ namespace MediaBrowser.Controller.Entities.Movies Keywords = new List(); } + public string AwardSummary { get; set; } + + public float? Metascore { get; set; } + public List LocalTrailerIds { get; set; } public List Keywords { get; set; } diff --git a/MediaBrowser.Controller/Entities/Trailer.cs b/MediaBrowser.Controller/Entities/Trailer.cs index 39869505c..f429a2677 100644 --- a/MediaBrowser.Controller/Entities/Trailer.cs +++ b/MediaBrowser.Controller/Entities/Trailer.cs @@ -9,7 +9,7 @@ namespace MediaBrowser.Controller.Entities /// /// Class Trailer /// - public class Trailer : Video, IHasCriticRating, IHasSoundtracks, IHasBudget, IHasTrailers, IHasKeywords, IHasTaglines, IHasTags, IHasPreferredMetadataLanguage + public class Trailer : Video, IHasCriticRating, IHasSoundtracks, IHasBudget, IHasTrailers, IHasKeywords, IHasTaglines, IHasTags, IHasPreferredMetadataLanguage, IHasMetascore { public List SoundtrackIds { get; set; } @@ -31,6 +31,8 @@ namespace MediaBrowser.Controller.Entities Keywords = new List(); } + public float? Metascore { get; set; } + public List LocalTrailerIds { get; set; } public List RemoteTrailers { get; set; } diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index af3857f17..ec6c88705 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -89,6 +89,7 @@ + @@ -103,6 +104,7 @@ + diff --git a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs index 72cb0d73e..416437d35 100644 --- a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs +++ b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs @@ -212,14 +212,41 @@ namespace MediaBrowser.Controller.Providers break; } + case "Metascore": + { + var text = reader.ReadElementContentAsString(); + var hasMetascore = item as IHasMetascore; + if (hasMetascore != null) + { + float value; + if (float.TryParse(text, NumberStyles.Any, _usCulture, out value)) + { + hasMetascore.Metascore = value; + } + } + + break; + } + + case "AwardSummary": + { + var text = reader.ReadElementContentAsString(); + var hasAwards = item as IHasAwards; + if (hasAwards != null) + { + if (!string.IsNullOrWhiteSpace(text)) + { + hasAwards.AwardSummary = text; + } + } + + break; + } + case "SortTitle": { var val = reader.ReadElementContentAsString(); - if (!string.IsNullOrWhiteSpace(val)) - { - item.ForcedSortName = val; - } break; } diff --git a/MediaBrowser.Model/Dto/BaseItemDto.cs b/MediaBrowser.Model/Dto/BaseItemDto.cs index cc20cc95f..a8c486d84 100644 --- a/MediaBrowser.Model/Dto/BaseItemDto.cs +++ b/MediaBrowser.Model/Dto/BaseItemDto.cs @@ -1,8 +1,8 @@ -using System.Diagnostics; -using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; using System.ComponentModel; +using System.Diagnostics; using System.Runtime.Serialization; namespace MediaBrowser.Model.Dto @@ -40,6 +40,10 @@ namespace MediaBrowser.Model.Dto public string PreferredMetadataLanguage { get; set; } public string PreferredMetadataCountryCode { get; set; } + + public string AwardSummary { get; set; } + + public float? Metascore { get; set; } /// /// Gets or sets the DVD season number. diff --git a/MediaBrowser.Model/Querying/ItemFields.cs b/MediaBrowser.Model/Querying/ItemFields.cs index 46123485e..6f73e73f7 100644 --- a/MediaBrowser.Model/Querying/ItemFields.cs +++ b/MediaBrowser.Model/Querying/ItemFields.cs @@ -6,6 +6,11 @@ namespace MediaBrowser.Model.Querying /// public enum ItemFields { + /// + /// The awards summary + /// + AwardSummary, + /// /// The budget /// diff --git a/MediaBrowser.Model/Querying/ItemSortBy.cs b/MediaBrowser.Model/Querying/ItemSortBy.cs index 57e09d724..09b8f0e18 100644 --- a/MediaBrowser.Model/Querying/ItemSortBy.cs +++ b/MediaBrowser.Model/Querying/ItemSortBy.cs @@ -85,5 +85,6 @@ namespace MediaBrowser.Model.Querying public const string SeriesSortName = "SeriesSortName"; public const string VideoBitRate = "VideoBitRate"; public const string AirTime = "AirTime"; + public const string Metascore = "Metascore"; } } diff --git a/MediaBrowser.Providers/Movies/OpenMovieDatabaseProvider.cs b/MediaBrowser.Providers/Movies/OpenMovieDatabaseProvider.cs index 306956c95..c440bf767 100644 --- a/MediaBrowser.Providers/Movies/OpenMovieDatabaseProvider.cs +++ b/MediaBrowser.Providers/Movies/OpenMovieDatabaseProvider.cs @@ -203,6 +203,24 @@ namespace MediaBrowser.Providers.Movies item.AddGenre(genre); } } + + var hasMetascore = item as IHasMetascore; + if (hasMetascore != null) + { + float metascore; + + if (!string.IsNullOrEmpty(result.Metascore) && float.TryParse(result.Metascore, NumberStyles.Any, UsCulture, out metascore) && metascore >= 0) + { + hasMetascore.Metascore = metascore; + } + } + + var hasAwards = item as IHasAwards; + if (hasAwards != null && !string.IsNullOrEmpty(result.Awards) && + !string.Equals(result.Awards, "n/a", StringComparison.OrdinalIgnoreCase)) + { + hasAwards.AwardSummary = WebUtility.HtmlDecode(result.Awards); + } } private bool ShouldFetchGenres(BaseItem item) diff --git a/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs b/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs index c251c139c..0a03f98f5 100644 --- a/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs +++ b/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs @@ -22,6 +22,7 @@ namespace MediaBrowser.Providers.Savers "Added", "AspectRatio", + "AwardSummary", "BirthDate", "Budget", "certification", @@ -44,11 +45,13 @@ namespace MediaBrowser.Providers.Savers "LockData", "LockedFields", "Format3D", + "Metascore", "MPAARating", "MusicbrainzId", "MusicBrainzReleaseGroupId", "Overview", "Persons", + "PlotKeywords", "PremiereDate", "ProductionYear", "Rating", @@ -290,6 +293,18 @@ namespace MediaBrowser.Providers.Savers { builder.Append("" + SecurityElement.Escape(hasDisplayOrder.DisplayOrder) + ""); } + + var hasMetascore = item as IHasMetascore; + if (hasMetascore != null && hasMetascore.Metascore.HasValue) + { + builder.Append("" + SecurityElement.Escape(hasMetascore.Metascore.Value.ToString(UsCulture)) + ""); + } + + var hasAwards = item as IHasAwards; + if (hasAwards != null && !string.IsNullOrEmpty(hasAwards.AwardSummary)) + { + builder.Append("" + SecurityElement.Escape(hasAwards.AwardSummary) + ""); + } var hasBudget = item as IHasBudget; if (hasBudget != null) diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index 9cf21c534..7fa299050 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -722,6 +722,21 @@ namespace MediaBrowser.Server.Implementations.Dto dto.AspectRatio = hasAspectRatio.AspectRatio; } + var hasMetascore = item as IHasMetascore; + if (hasMetascore != null) + { + dto.Metascore = hasMetascore.Metascore; + } + + if (fields.Contains(ItemFields.AwardSummary)) + { + var hasAwards = item as IHasAwards; + if (hasAwards != null) + { + dto.AwardSummary = hasAwards.AwardSummary; + } + } + dto.BackdropImageTags = GetBackdropImageTags(item); if (fields.Contains(ItemFields.ScreenshotImageTags)) diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index f1e0d6a8d..e530eca46 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -211,6 +211,7 @@ + diff --git a/MediaBrowser.Server.Implementations/Sorting/MetascoreComparer.cs b/MediaBrowser.Server.Implementations/Sorting/MetascoreComparer.cs new file mode 100644 index 000000000..bfd162661 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Sorting/MetascoreComparer.cs @@ -0,0 +1,41 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Sorting; +using MediaBrowser.Model.Querying; + +namespace MediaBrowser.Server.Implementations.Sorting +{ + public class MetascoreComparer : IBaseItemComparer + { + /// + /// Compares the specified x. + /// + /// The x. + /// The y. + /// System.Int32. + public int Compare(BaseItem x, BaseItem y) + { + return GetValue(x).CompareTo(GetValue(y)); + } + + private float GetValue(BaseItem x) + { + var hasMetascore = x as IHasMetascore; + + if (hasMetascore != null) + { + return hasMetascore.Metascore ?? 0; + } + + return 0; + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get { return ItemSortBy.Metascore; } + } + } +}