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; }
+ }
+ }
+}