From 24f7f848284562221e80c863ba2758815bc6965b Mon Sep 17 00:00:00 2001 From: dkanada Date: Sun, 31 May 2020 15:15:34 +0900 Subject: add plugin configurations for tvdb and omdb --- .../Omdb/Configuration/PluginConfiguration.cs | 9 ++ .../Plugins/Omdb/Configuration/config.html | 49 ++++++++ .../Plugins/Omdb/OmdbImageProvider.cs | 1 + .../Plugins/Omdb/OmdbItemProvider.cs | 2 + .../Plugins/Omdb/OmdbProvider.cs | 139 +++++++++++++-------- MediaBrowser.Providers/Plugins/Omdb/Plugin.cs | 35 ++++++ .../TheTvdb/Configuration/PluginConfiguration.cs | 8 ++ MediaBrowser.Providers/Plugins/TheTvdb/Plugin.cs | 24 ++++ .../Plugins/TheTvdb/TvdbClientManager.cs | 3 +- .../Plugins/TheTvdb/TvdbEpisodeProvider.cs | 4 +- .../Plugins/TheTvdb/TvdbPersonImageProvider.cs | 1 - .../Plugins/TheTvdb/TvdbSeasonImageProvider.cs | 4 +- .../Plugins/TheTvdb/TvdbSeriesImageProvider.cs | 3 +- .../Plugins/TheTvdb/TvdbSeriesProvider.cs | 10 +- 14 files changed, 230 insertions(+), 62 deletions(-) create mode 100644 MediaBrowser.Providers/Plugins/Omdb/Configuration/PluginConfiguration.cs create mode 100644 MediaBrowser.Providers/Plugins/Omdb/Configuration/config.html create mode 100644 MediaBrowser.Providers/Plugins/Omdb/Plugin.cs create mode 100644 MediaBrowser.Providers/Plugins/TheTvdb/Configuration/PluginConfiguration.cs create mode 100644 MediaBrowser.Providers/Plugins/TheTvdb/Plugin.cs diff --git a/MediaBrowser.Providers/Plugins/Omdb/Configuration/PluginConfiguration.cs b/MediaBrowser.Providers/Plugins/Omdb/Configuration/PluginConfiguration.cs new file mode 100644 index 000000000..a9eecdd9e --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Omdb/Configuration/PluginConfiguration.cs @@ -0,0 +1,9 @@ +using MediaBrowser.Model.Plugins; + +namespace MediaBrowser.Providers.Plugins.Omdb +{ + public class PluginConfiguration : BasePluginConfiguration + { + public bool CastAndCrew { get; set; } + } +} diff --git a/MediaBrowser.Providers/Plugins/Omdb/Configuration/config.html b/MediaBrowser.Providers/Plugins/Omdb/Configuration/config.html new file mode 100644 index 000000000..8b117ec8d --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Omdb/Configuration/config.html @@ -0,0 +1,49 @@ + + + + OMDb + + +
+
+
+
+ +
+
+ +
+
+
+
+ +
+ + diff --git a/MediaBrowser.Providers/Plugins/Omdb/OmdbImageProvider.cs b/MediaBrowser.Providers/Plugins/Omdb/OmdbImageProvider.cs index a450c2a6d..3cf4c3d50 100644 --- a/MediaBrowser.Providers/Plugins/Omdb/OmdbImageProvider.cs +++ b/MediaBrowser.Providers/Plugins/Omdb/OmdbImageProvider.cs @@ -92,6 +92,7 @@ namespace MediaBrowser.Providers.Plugins.Omdb { return item is Movie || item is Trailer || item is Episode; } + // After other internet providers, because they're better // But before fallback providers like screengrab public int Order => 90; diff --git a/MediaBrowser.Providers/Plugins/Omdb/OmdbItemProvider.cs b/MediaBrowser.Providers/Plugins/Omdb/OmdbItemProvider.cs index 64a75955a..35a840f00 100644 --- a/MediaBrowser.Providers/Plugins/Omdb/OmdbItemProvider.cs +++ b/MediaBrowser.Providers/Plugins/Omdb/OmdbItemProvider.cs @@ -103,6 +103,7 @@ namespace MediaBrowser.Providers.Plugins.Omdb { urlQuery += "&t=" + WebUtility.UrlEncode(name); } + urlQuery += "&type=" + type; } else @@ -117,6 +118,7 @@ namespace MediaBrowser.Providers.Plugins.Omdb { urlQuery += string.Format(CultureInfo.InvariantCulture, "&Episode={0}", searchInfo.IndexNumber); } + if (searchInfo.ParentIndexNumber.HasValue) { urlQuery += string.Format(CultureInfo.InvariantCulture, "&Season={0}", searchInfo.ParentIndexNumber); diff --git a/MediaBrowser.Providers/Plugins/Omdb/OmdbProvider.cs b/MediaBrowser.Providers/Plugins/Omdb/OmdbProvider.cs index fbdd293ed..dcc003dca 100644 --- a/MediaBrowser.Providers/Plugins/Omdb/OmdbProvider.cs +++ b/MediaBrowser.Providers/Plugins/Omdb/OmdbProvider.cs @@ -87,10 +87,10 @@ namespace MediaBrowser.Providers.Plugins.Omdb item.CommunityRating = imdbRating; } - //if (!string.IsNullOrEmpty(result.Website)) - //{ - // item.HomePageUrl = result.Website; - //} + if (!string.IsNullOrEmpty(result.Website)) + { + item.HomePageUrl = result.Website; + } if (!string.IsNullOrWhiteSpace(result.imdbID)) { @@ -121,7 +121,7 @@ namespace MediaBrowser.Providers.Plugins.Omdb if (!string.IsNullOrWhiteSpace(episodeImdbId)) { - foreach (var episode in (seasonResult.Episodes ?? new RootObject[] { })) + foreach (var episode in seasonResult.Episodes) { if (string.Equals(episodeImdbId, episode.imdbID, StringComparison.OrdinalIgnoreCase)) { @@ -134,7 +134,7 @@ namespace MediaBrowser.Providers.Plugins.Omdb // finally, search by numbers if (result == null) { - foreach (var episode in (seasonResult.Episodes ?? new RootObject[] { })) + foreach (var episode in seasonResult.Episodes) { if (episode.Episode == episodeNumber) { @@ -188,10 +188,10 @@ namespace MediaBrowser.Providers.Plugins.Omdb item.CommunityRating = imdbRating; } - //if (!string.IsNullOrEmpty(result.Website)) - //{ - // item.HomePageUrl = result.Website; - //} + if (!string.IsNullOrEmpty(result.Website)) + { + item.HomePageUrl = result.Website; + } if (!string.IsNullOrWhiteSpace(result.imdbID)) { @@ -263,6 +263,7 @@ namespace MediaBrowser.Providers.Plugins.Omdb { return url; } + return url + "&" + query; } @@ -386,7 +387,7 @@ namespace MediaBrowser.Providers.Plugins.Omdb var isConfiguredForEnglish = IsConfiguredForEnglish(item) || _configurationManager.Configuration.EnableNewOmdbSupport; - // Grab series genres because imdb data is better than tvdb. Leave movies alone + // Grab series genres because IMDb data is better than TVDB. Leave movies alone // But only do it if english is the preferred language because this data will not be localized if (isConfiguredForEnglish && !string.IsNullOrWhiteSpace(result.Genre)) { @@ -407,45 +408,50 @@ namespace MediaBrowser.Providers.Plugins.Omdb item.Overview = result.Plot; } - //if (!string.IsNullOrWhiteSpace(result.Director)) - //{ - // var person = new PersonInfo - // { - // Name = result.Director.Trim(), - // Type = PersonType.Director - // }; - - // itemResult.AddPerson(person); - //} - - //if (!string.IsNullOrWhiteSpace(result.Writer)) - //{ - // var person = new PersonInfo - // { - // Name = result.Director.Trim(), - // Type = PersonType.Writer - // }; - - // itemResult.AddPerson(person); - //} - - //if (!string.IsNullOrWhiteSpace(result.Actors)) - //{ - // var actorList = result.Actors.Split(','); - // foreach (var actor in actorList) - // { - // if (!string.IsNullOrWhiteSpace(actor)) - // { - // var person = new PersonInfo - // { - // Name = actor.Trim(), - // Type = PersonType.Actor - // }; - - // itemResult.AddPerson(person); - // } - // } - //} + if (!Plugin.Instance.Configuration.CastAndCrew) + { + return; + } + + if (!string.IsNullOrWhiteSpace(result.Director)) + { + var person = new PersonInfo + { + Name = result.Director.Trim(), + Type = PersonType.Director + }; + + itemResult.AddPerson(person); + } + + if (!string.IsNullOrWhiteSpace(result.Writer)) + { + var person = new PersonInfo + { + Name = result.Director.Trim(), + Type = PersonType.Writer + }; + + itemResult.AddPerson(person); + } + + if (!string.IsNullOrWhiteSpace(result.Actors)) + { + var actorList = result.Actors.Split(','); + foreach (var actor in actorList) + { + if (!string.IsNullOrWhiteSpace(actor)) + { + var person = new PersonInfo + { + Name = actor.Trim(), + Type = PersonType.Actor + }; + + itemResult.AddPerson(person); + } + } + } } private bool IsConfiguredForEnglish(BaseItem item) @@ -459,40 +465,70 @@ namespace MediaBrowser.Providers.Plugins.Omdb internal class SeasonRootObject { public string Title { get; set; } + public string seriesID { get; set; } + public int Season { get; set; } + public int? totalSeasons { get; set; } + public RootObject[] Episodes { get; set; } + public string Response { get; set; } } internal class RootObject { public string Title { get; set; } + public string Year { get; set; } + public string Rated { get; set; } + public string Released { get; set; } + public string Runtime { get; set; } + public string Genre { get; set; } + public string Director { get; set; } + public string Writer { get; set; } + public string Actors { get; set; } + public string Plot { get; set; } + public string Language { get; set; } + public string Country { get; set; } + public string Awards { get; set; } + public string Poster { get; set; } + public List Ratings { get; set; } + public string Metascore { get; set; } + public string imdbRating { get; set; } + public string imdbVotes { get; set; } + public string imdbID { get; set; } + public string Type { get; set; } + public string DVD { get; set; } + public string BoxOffice { get; set; } + public string Production { get; set; } + public string Website { get; set; } + public string Response { get; set; } + public int Episode { get; set; } public float? GetRottenTomatoScore() @@ -509,12 +545,15 @@ namespace MediaBrowser.Providers.Plugins.Omdb } } } + return null; } } + public class OmdbRating { public string Source { get; set; } + public string Value { get; set; } } } diff --git a/MediaBrowser.Providers/Plugins/Omdb/Plugin.cs b/MediaBrowser.Providers/Plugins/Omdb/Plugin.cs new file mode 100644 index 000000000..6ce2333e0 --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Omdb/Plugin.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using MediaBrowser.Common.Configuration; +using MediaBrowser.Common.Plugins; +using MediaBrowser.Model.Plugins; +using MediaBrowser.Model.Serialization; + +namespace MediaBrowser.Providers.Plugins.Omdb +{ + public class Plugin : BasePlugin, IHasWebPages + { + public static Plugin Instance { get; private set; } + + public override Guid Id => new Guid("a628c0da-fac5-4c7e-9d1a-7134223f14c8"); + + public override string Name => "OMDb"; + + public override string Description => "Get metadata for movies and other video content from OMDb."; + + public Plugin(IApplicationPaths applicationPaths, IXmlSerializer xmlSerializer) + : base(applicationPaths, xmlSerializer) + { + Instance = this; + } + + public IEnumerable GetPages() + { + yield return new PluginPageInfo + { + Name = Name, + EmbeddedResourcePath = GetType().Namespace + ".Configuration.config.html" + }; + } + } +} diff --git a/MediaBrowser.Providers/Plugins/TheTvdb/Configuration/PluginConfiguration.cs b/MediaBrowser.Providers/Plugins/TheTvdb/Configuration/PluginConfiguration.cs new file mode 100644 index 000000000..0a73634dc --- /dev/null +++ b/MediaBrowser.Providers/Plugins/TheTvdb/Configuration/PluginConfiguration.cs @@ -0,0 +1,8 @@ +using MediaBrowser.Model.Plugins; + +namespace MediaBrowser.Providers.Plugins.TheTvdb +{ + public class PluginConfiguration : BasePluginConfiguration + { + } +} diff --git a/MediaBrowser.Providers/Plugins/TheTvdb/Plugin.cs b/MediaBrowser.Providers/Plugins/TheTvdb/Plugin.cs new file mode 100644 index 000000000..2e6f548ca --- /dev/null +++ b/MediaBrowser.Providers/Plugins/TheTvdb/Plugin.cs @@ -0,0 +1,24 @@ +using System; +using MediaBrowser.Common.Configuration; +using MediaBrowser.Common.Plugins; +using MediaBrowser.Model.Serialization; + +namespace MediaBrowser.Providers.Plugins.TheTvdb +{ + public class Plugin : BasePlugin + { + public static Plugin Instance { get; private set; } + + public override Guid Id => new Guid("a677c0da-fac5-4cde-941a-7134223f14c8"); + + public override string Name => "TheTVDB"; + + public override string Description => "Get metadata for movies and other video content from TheTVDB."; + + public Plugin(IApplicationPaths applicationPaths, IXmlSerializer xmlSerializer) + : base(applicationPaths, xmlSerializer) + { + Instance = this; + } + } +} diff --git a/MediaBrowser.Providers/Plugins/TheTvdb/TvdbClientManager.cs b/MediaBrowser.Providers/Plugins/TheTvdb/TvdbClientManager.cs index b73834155..24d60deb9 100644 --- a/MediaBrowser.Providers/Plugins/TheTvdb/TvdbClientManager.cs +++ b/MediaBrowser.Providers/Plugins/TheTvdb/TvdbClientManager.cs @@ -120,6 +120,7 @@ namespace MediaBrowser.Providers.Plugins.TheTvdb var cacheKey = GenerateKey("series", zap2ItId, language); return TryGetValue(cacheKey, language, () => TvDbClient.Search.SearchSeriesByZap2ItIdAsync(zap2ItId, cancellationToken)); } + public Task> GetActorsAsync( int tvdbId, string language, @@ -190,7 +191,7 @@ namespace MediaBrowser.Providers.Plugins.TheTvdb episodeQuery.AbsoluteNumber = searchInfo.IndexNumber.Value; break; default: - //aired order + // aired order episodeQuery.AiredEpisode = searchInfo.IndexNumber.Value; episodeQuery.AiredSeason = searchInfo.ParentIndexNumber.Value; break; diff --git a/MediaBrowser.Providers/Plugins/TheTvdb/TvdbEpisodeProvider.cs b/MediaBrowser.Providers/Plugins/TheTvdb/TvdbEpisodeProvider.cs index 08c2a74d2..5a4827d2f 100644 --- a/MediaBrowser.Providers/Plugins/TheTvdb/TvdbEpisodeProvider.cs +++ b/MediaBrowser.Providers/Plugins/TheTvdb/TvdbEpisodeProvider.cs @@ -14,9 +14,8 @@ using TvDbSharper.Dto; namespace MediaBrowser.Providers.Plugins.TheTvdb { - /// - /// Class RemoteEpisodeProvider + /// Class RemoteEpisodeProvider. /// public class TvdbEpisodeProvider : IRemoteMetadataProvider, IHasOrder { @@ -139,7 +138,6 @@ namespace MediaBrowser.Providers.Plugins.TheTvdb Name = episode.EpisodeName, Overview = episode.Overview, CommunityRating = (float?)episode.SiteRating, - } }; result.ResetPeople(); diff --git a/MediaBrowser.Providers/Plugins/TheTvdb/TvdbPersonImageProvider.cs b/MediaBrowser.Providers/Plugins/TheTvdb/TvdbPersonImageProvider.cs index c1cdc90e9..77425f1d2 100644 --- a/MediaBrowser.Providers/Plugins/TheTvdb/TvdbPersonImageProvider.cs +++ b/MediaBrowser.Providers/Plugins/TheTvdb/TvdbPersonImageProvider.cs @@ -57,7 +57,6 @@ namespace MediaBrowser.Providers.Plugins.TheTvdb { EnableImages = false } - }).Cast() .Where(i => TvdbSeriesProvider.IsValidSeries(i.ProviderIds)) .ToList(); diff --git a/MediaBrowser.Providers/Plugins/TheTvdb/TvdbSeasonImageProvider.cs b/MediaBrowser.Providers/Plugins/TheTvdb/TvdbSeasonImageProvider.cs index a5d183df7..7abcd29ec 100644 --- a/MediaBrowser.Providers/Plugins/TheTvdb/TvdbSeasonImageProvider.cs +++ b/MediaBrowser.Providers/Plugins/TheTvdb/TvdbSeasonImageProvider.cs @@ -55,7 +55,7 @@ namespace MediaBrowser.Providers.Plugins.TheTvdb if (series == null || !season.IndexNumber.HasValue || !TvdbSeriesProvider.IsValidSeries(series.ProviderIds)) { - return new RemoteImageInfo[] { }; + return Array.Empty(); } var tvdbId = Convert.ToInt32(series.GetProviderId(MetadataProviders.Tvdb)); @@ -113,8 +113,8 @@ namespace MediaBrowser.Providers.Plugins.TheTvdb imageInfo.Type = TvdbUtils.GetImageTypeFromKeyType(image.KeyType); list.Add(imageInfo); } - var isLanguageEn = string.Equals(preferredLanguage, "en", StringComparison.OrdinalIgnoreCase); + var isLanguageEn = string.Equals(preferredLanguage, "en", StringComparison.OrdinalIgnoreCase); return list.OrderByDescending(i => { if (string.Equals(preferredLanguage, i.Language, StringComparison.OrdinalIgnoreCase)) diff --git a/MediaBrowser.Providers/Plugins/TheTvdb/TvdbSeriesImageProvider.cs b/MediaBrowser.Providers/Plugins/TheTvdb/TvdbSeriesImageProvider.cs index 1bad60756..f65707291 100644 --- a/MediaBrowser.Providers/Plugins/TheTvdb/TvdbSeriesImageProvider.cs +++ b/MediaBrowser.Providers/Plugins/TheTvdb/TvdbSeriesImageProvider.cs @@ -79,6 +79,7 @@ namespace MediaBrowser.Providers.Plugins.TheTvdb tvdbId); } } + return remoteImages; } @@ -110,8 +111,8 @@ namespace MediaBrowser.Providers.Plugins.TheTvdb imageInfo.Type = TvdbUtils.GetImageTypeFromKeyType(image.KeyType); list.Add(imageInfo); } - var isLanguageEn = string.Equals(preferredLanguage, "en", StringComparison.OrdinalIgnoreCase); + var isLanguageEn = string.Equals(preferredLanguage, "en", StringComparison.OrdinalIgnoreCase); return list.OrderByDescending(i => { if (string.Equals(preferredLanguage, i.Language, StringComparison.OrdinalIgnoreCase)) diff --git a/MediaBrowser.Providers/Plugins/TheTvdb/TvdbSeriesProvider.cs b/MediaBrowser.Providers/Plugins/TheTvdb/TvdbSeriesProvider.cs index f6cd249f5..d4fcad643 100644 --- a/MediaBrowser.Providers/Plugins/TheTvdb/TvdbSeriesProvider.cs +++ b/MediaBrowser.Providers/Plugins/TheTvdb/TvdbSeriesProvider.cs @@ -22,6 +22,7 @@ namespace MediaBrowser.Providers.Plugins.TheTvdb public class TvdbSeriesProvider : IRemoteMetadataProvider, IHasOrder { internal static TvdbSeriesProvider Current { get; private set; } + private readonly IHttpClient _httpClient; private readonly ILogger _logger; private readonly ILibraryManager _libraryManager; @@ -145,7 +146,6 @@ namespace MediaBrowser.Providers.Plugins.TheTvdb private async Task GetSeriesByRemoteId(string id, string idType, string language, CancellationToken cancellationToken) { - TvDbResponse result = null; try @@ -249,6 +249,7 @@ namespace MediaBrowser.Providers.Plugins.TheTvdb ImageUrl = TvdbUtils.BannerUrl + seriesSearchResult.Banner }; + try { var seriesSesult = @@ -274,11 +275,12 @@ namespace MediaBrowser.Providers.Plugins.TheTvdb } /// - /// The remove + /// The remove. /// const string remove = "\"'!`?"; + /// - /// The spacers + /// The spacers. /// const string spacers = "/,.:;\\(){}[]+-_=–*"; // (there are two types of dashes, short and long) @@ -315,8 +317,8 @@ namespace MediaBrowser.Providers.Plugins.TheTvdb sb.Append(c); } } - sb.Replace(", the", string.Empty).Replace("the ", " ").Replace(" the ", " "); + sb.Replace(", the", string.Empty).Replace("the ", " ").Replace(" the ", " "); return Regex.Replace(sb.ToString().Trim(), @"\s+", " "); } -- cgit v1.2.3 From d72bb8358e8d9aa20b2951bfea58fd51679fda96 Mon Sep 17 00:00:00 2001 From: dkanada Date: Sun, 31 May 2020 15:20:17 +0900 Subject: minor changes to server configuration file --- .../Configuration/ServerConfiguration.cs | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs index 1f5981f10..75bbeccfc 100644 --- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs +++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs @@ -240,11 +240,13 @@ namespace MediaBrowser.Model.Configuration public bool EnableNewOmdbSupport { get; set; } public string[] RemoteIPFilter { get; set; } + public bool IsRemoteIPFilterBlacklist { get; set; } public int ImageExtractionTimeoutMs { get; set; } public PathSubstitution[] PathSubstitutions { get; set; } + public bool EnableSimpleArtistDetection { get; set; } public string[] UninstalledPlugins { get; set; } @@ -313,24 +315,24 @@ namespace MediaBrowser.Model.Configuration new MetadataOptions { ItemType = "MusicVideo", - DisabledMetadataFetchers = new [] { "The Open Movie Database" }, - DisabledImageFetchers = new [] { "The Open Movie Database" } + DisabledMetadataFetchers = new[] { "The Open Movie Database" }, + DisabledImageFetchers = new[] { "The Open Movie Database" } }, new MetadataOptions { ItemType = "Series", - DisabledMetadataFetchers = new [] { "TheMovieDb" }, - DisabledImageFetchers = new [] { "TheMovieDb" } + DisabledMetadataFetchers = new[] { "TheMovieDb" }, + DisabledImageFetchers = new[] { "TheMovieDb" } }, new MetadataOptions { ItemType = "MusicAlbum", - DisabledMetadataFetchers = new [] { "TheAudioDB" } + DisabledMetadataFetchers = new[] { "TheAudioDB" } }, new MetadataOptions { ItemType = "MusicArtist", - DisabledMetadataFetchers = new [] { "TheAudioDB" } + DisabledMetadataFetchers = new[] { "TheAudioDB" } }, new MetadataOptions { @@ -339,13 +341,13 @@ namespace MediaBrowser.Model.Configuration new MetadataOptions { ItemType = "Season", - DisabledMetadataFetchers = new [] { "TheMovieDb" }, + DisabledMetadataFetchers = new[] { "TheMovieDb" }, }, new MetadataOptions { ItemType = "Episode", - DisabledMetadataFetchers = new [] { "The Open Movie Database", "TheMovieDb" }, - DisabledImageFetchers = new [] { "The Open Movie Database", "TheMovieDb" } + DisabledMetadataFetchers = new[] { "The Open Movie Database", "TheMovieDb" }, + DisabledImageFetchers = new[] { "The Open Movie Database", "TheMovieDb" } } }; } @@ -354,6 +356,7 @@ namespace MediaBrowser.Model.Configuration public class PathSubstitution { public string From { get; set; } + public string To { get; set; } } } -- cgit v1.2.3 From 685f8ad1f0ab74f73cfdb5608b8241d043f8fb25 Mon Sep 17 00:00:00 2001 From: dkanada Date: Sun, 31 May 2020 15:23:09 +0900 Subject: move tmdb to plugin folder --- .../Plugins/Tmdb/BoxSets/TmdbBoxSetExternalId.cs | 25 + .../Tmdb/BoxSets/TmdbBoxSetImageProvider.cs | 160 ++++++ .../Plugins/Tmdb/BoxSets/TmdbBoxSetProvider.cs | 287 +++++++++++ .../Tmdb/Models/Collections/CollectionImages.cs | 11 + .../Tmdb/Models/Collections/CollectionResult.cs | 15 + .../Plugins/Tmdb/Models/Collections/Part.cs | 11 + .../Plugins/Tmdb/Models/General/Backdrop.cs | 13 + .../Plugins/Tmdb/Models/General/Crew.cs | 12 + .../Plugins/Tmdb/Models/General/ExternalIds.cs | 11 + .../Plugins/Tmdb/Models/General/Genre.cs | 8 + .../Plugins/Tmdb/Models/General/Images.cs | 10 + .../Plugins/Tmdb/Models/General/Keyword.cs | 8 + .../Plugins/Tmdb/Models/General/Keywords.cs | 9 + .../Plugins/Tmdb/Models/General/Poster.cs | 13 + .../Plugins/Tmdb/Models/General/Profile.cs | 11 + .../Plugins/Tmdb/Models/General/Still.cs | 14 + .../Plugins/Tmdb/Models/General/StillImages.cs | 9 + .../Plugins/Tmdb/Models/General/Video.cs | 14 + .../Plugins/Tmdb/Models/General/Videos.cs | 9 + .../Tmdb/Models/Movies/BelongsToCollection.cs | 10 + .../Plugins/Tmdb/Models/Movies/Cast.cs | 12 + .../Plugins/Tmdb/Models/Movies/Casts.cs | 11 + .../Plugins/Tmdb/Models/Movies/Country.cs | 11 + .../Plugins/Tmdb/Models/Movies/MovieResult.cs | 49 ++ .../Tmdb/Models/Movies/ProductionCompany.cs | 8 + .../Tmdb/Models/Movies/ProductionCountry.cs | 8 + .../Plugins/Tmdb/Models/Movies/Releases.cs | 9 + .../Plugins/Tmdb/Models/Movies/SpokenLanguage.cs | 8 + .../Plugins/Tmdb/Models/Movies/Trailers.cs | 9 + .../Plugins/Tmdb/Models/Movies/Youtube.cs | 9 + .../Plugins/Tmdb/Models/People/PersonImages.cs | 10 + .../Plugins/Tmdb/Models/People/PersonResult.cs | 23 + .../Tmdb/Models/Search/ExternalIdLookupResult.cs | 9 + .../Plugins/Tmdb/Models/Search/MovieResult.cs | 65 +++ .../Tmdb/Models/Search/PersonSearchResult.cs | 29 ++ .../Plugins/Tmdb/Models/Search/TmdbSearchResult.cs | 31 ++ .../Plugins/Tmdb/Models/Search/TvResult.cs | 15 + .../Plugins/Tmdb/Models/TV/Cast.cs | 12 + .../Plugins/Tmdb/Models/TV/ContentRating.cs | 8 + .../Plugins/Tmdb/Models/TV/ContentRatings.cs | 9 + .../Plugins/Tmdb/Models/TV/CreatedBy.cs | 9 + .../Plugins/Tmdb/Models/TV/Credits.cs | 11 + .../Plugins/Tmdb/Models/TV/Episode.cs | 14 + .../Plugins/Tmdb/Models/TV/EpisodeCredits.cs | 12 + .../Plugins/Tmdb/Models/TV/EpisodeResult.cs | 23 + .../Plugins/Tmdb/Models/TV/GuestStar.cs | 12 + .../Plugins/Tmdb/Models/TV/Network.cs | 8 + .../Plugins/Tmdb/Models/TV/Season.cs | 11 + .../Plugins/Tmdb/Models/TV/SeasonImages.cs | 10 + .../Plugins/Tmdb/Models/TV/SeasonResult.cs | 21 + .../Plugins/Tmdb/Models/TV/SeriesResult.cs | 40 ++ .../Plugins/Tmdb/Movies/GenericTmdbMovieInfo.cs | 309 +++++++++++ .../Plugins/Tmdb/Movies/TmdbImageProvider.cs | 209 ++++++++ .../Plugins/Tmdb/Movies/TmdbMovieExternalId.cs | 32 ++ .../Plugins/Tmdb/Movies/TmdbMovieProvider.cs | 446 ++++++++++++++++ .../Plugins/Tmdb/Movies/TmdbSearch.cs | 265 ++++++++++ .../Plugins/Tmdb/Movies/TmdbSettings.cs | 22 + .../Plugins/Tmdb/Music/TmdbMusicVideoProvider.cs | 32 ++ .../Plugins/Tmdb/People/TmdbPersonExternalId.cs | 24 + .../Plugins/Tmdb/People/TmdbPersonImageProvider.cs | 134 +++++ .../Plugins/Tmdb/People/TmdbPersonProvider.cs | 276 ++++++++++ .../Plugins/Tmdb/TV/TmdbEpisodeImageProvider.cs | 131 +++++ .../Plugins/Tmdb/TV/TmdbEpisodeProvider.cs | 211 ++++++++ .../Plugins/Tmdb/TV/TmdbEpisodeProviderBase.cs | 147 ++++++ .../Plugins/Tmdb/TV/TmdbSeasonImageProvider.cs | 144 ++++++ .../Plugins/Tmdb/TV/TmdbSeasonProvider.cs | 229 +++++++++ .../Plugins/Tmdb/TV/TmdbSeriesExternalId.cs | 24 + .../Plugins/Tmdb/TV/TmdbSeriesImageProvider.cs | 186 +++++++ .../Plugins/Tmdb/TV/TmdbSeriesProvider.cs | 567 +++++++++++++++++++++ MediaBrowser.Providers/Plugins/Tmdb/TmdbUtils.cs | 64 +++ .../Plugins/Tmdb/Trailers/TmdbTrailerProvider.cs | 44 ++ .../Tmdb/BoxSets/TmdbBoxSetExternalId.cs | 25 - .../Tmdb/BoxSets/TmdbBoxSetImageProvider.cs | 160 ------ .../Tmdb/BoxSets/TmdbBoxSetProvider.cs | 287 ----------- .../Tmdb/Models/Collections/CollectionImages.cs | 11 - .../Tmdb/Models/Collections/CollectionResult.cs | 15 - .../Tmdb/Models/Collections/Part.cs | 11 - .../Tmdb/Models/General/Backdrop.cs | 13 - MediaBrowser.Providers/Tmdb/Models/General/Crew.cs | 12 - .../Tmdb/Models/General/ExternalIds.cs | 11 - .../Tmdb/Models/General/Genre.cs | 8 - .../Tmdb/Models/General/Images.cs | 10 - .../Tmdb/Models/General/Keyword.cs | 8 - .../Tmdb/Models/General/Keywords.cs | 9 - .../Tmdb/Models/General/Poster.cs | 13 - .../Tmdb/Models/General/Profile.cs | 11 - .../Tmdb/Models/General/Still.cs | 14 - .../Tmdb/Models/General/StillImages.cs | 9 - .../Tmdb/Models/General/Video.cs | 14 - .../Tmdb/Models/General/Videos.cs | 9 - .../Tmdb/Models/Movies/BelongsToCollection.cs | 10 - MediaBrowser.Providers/Tmdb/Models/Movies/Cast.cs | 12 - MediaBrowser.Providers/Tmdb/Models/Movies/Casts.cs | 11 - .../Tmdb/Models/Movies/Country.cs | 11 - .../Tmdb/Models/Movies/MovieResult.cs | 49 -- .../Tmdb/Models/Movies/ProductionCompany.cs | 8 - .../Tmdb/Models/Movies/ProductionCountry.cs | 8 - .../Tmdb/Models/Movies/Releases.cs | 9 - .../Tmdb/Models/Movies/SpokenLanguage.cs | 8 - .../Tmdb/Models/Movies/Trailers.cs | 9 - .../Tmdb/Models/Movies/Youtube.cs | 9 - .../Tmdb/Models/People/PersonImages.cs | 10 - .../Tmdb/Models/People/PersonResult.cs | 23 - .../Tmdb/Models/Search/ExternalIdLookupResult.cs | 9 - .../Tmdb/Models/Search/MovieResult.cs | 65 --- .../Tmdb/Models/Search/PersonSearchResult.cs | 29 -- .../Tmdb/Models/Search/TmdbSearchResult.cs | 31 -- .../Tmdb/Models/Search/TvResult.cs | 15 - MediaBrowser.Providers/Tmdb/Models/TV/Cast.cs | 12 - .../Tmdb/Models/TV/ContentRating.cs | 8 - .../Tmdb/Models/TV/ContentRatings.cs | 9 - MediaBrowser.Providers/Tmdb/Models/TV/CreatedBy.cs | 9 - MediaBrowser.Providers/Tmdb/Models/TV/Credits.cs | 11 - MediaBrowser.Providers/Tmdb/Models/TV/Episode.cs | 14 - .../Tmdb/Models/TV/EpisodeCredits.cs | 12 - .../Tmdb/Models/TV/EpisodeResult.cs | 23 - MediaBrowser.Providers/Tmdb/Models/TV/GuestStar.cs | 12 - MediaBrowser.Providers/Tmdb/Models/TV/Network.cs | 8 - MediaBrowser.Providers/Tmdb/Models/TV/Season.cs | 11 - .../Tmdb/Models/TV/SeasonImages.cs | 10 - .../Tmdb/Models/TV/SeasonResult.cs | 21 - .../Tmdb/Models/TV/SeriesResult.cs | 40 -- .../Tmdb/Movies/GenericTmdbMovieInfo.cs | 309 ----------- .../Tmdb/Movies/TmdbImageProvider.cs | 209 -------- .../Tmdb/Movies/TmdbMovieExternalId.cs | 32 -- .../Tmdb/Movies/TmdbMovieProvider.cs | 447 ---------------- MediaBrowser.Providers/Tmdb/Movies/TmdbSearch.cs | 265 ---------- MediaBrowser.Providers/Tmdb/Movies/TmdbSettings.cs | 22 - .../Tmdb/Music/TmdbMusicVideoProvider.cs | 32 -- .../Tmdb/People/TmdbPersonExternalId.cs | 24 - .../Tmdb/People/TmdbPersonImageProvider.cs | 134 ----- .../Tmdb/People/TmdbPersonProvider.cs | 276 ---------- .../Tmdb/TV/TmdbEpisodeImageProvider.cs | 131 ----- .../Tmdb/TV/TmdbEpisodeProvider.cs | 211 -------- .../Tmdb/TV/TmdbEpisodeProviderBase.cs | 147 ------ .../Tmdb/TV/TmdbSeasonImageProvider.cs | 144 ------ .../Tmdb/TV/TmdbSeasonProvider.cs | 229 --------- .../Tmdb/TV/TmdbSeriesExternalId.cs | 24 - .../Tmdb/TV/TmdbSeriesImageProvider.cs | 186 ------- .../Tmdb/TV/TmdbSeriesProvider.cs | 567 --------------------- MediaBrowser.Providers/Tmdb/TmdbUtils.cs | 64 --- .../Tmdb/Trailers/TmdbTrailerProvider.cs | 44 -- 142 files changed, 4672 insertions(+), 4673 deletions(-) create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/BoxSets/TmdbBoxSetExternalId.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/BoxSets/TmdbBoxSetImageProvider.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/BoxSets/TmdbBoxSetProvider.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/Collections/CollectionImages.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/Collections/CollectionResult.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/Collections/Part.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/General/Backdrop.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/General/Crew.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/General/ExternalIds.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/General/Genre.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/General/Images.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/General/Keyword.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/General/Keywords.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/General/Poster.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/General/Profile.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/General/Still.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/General/StillImages.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/General/Video.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/General/Videos.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/Movies/BelongsToCollection.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/Movies/Cast.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/Movies/Casts.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/Movies/Country.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/Movies/MovieResult.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/Movies/ProductionCompany.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/Movies/ProductionCountry.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/Movies/Releases.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/Movies/SpokenLanguage.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/Movies/Trailers.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/Movies/Youtube.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/People/PersonImages.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/People/PersonResult.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/Search/ExternalIdLookupResult.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/Search/MovieResult.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/Search/PersonSearchResult.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/Search/TmdbSearchResult.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/Search/TvResult.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/TV/Cast.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/TV/ContentRating.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/TV/ContentRatings.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/TV/CreatedBy.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/TV/Credits.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/TV/Episode.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/TV/EpisodeCredits.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/TV/EpisodeResult.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/TV/GuestStar.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/TV/Network.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/TV/Season.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/TV/SeasonImages.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/TV/SeasonResult.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Models/TV/SeriesResult.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Movies/GenericTmdbMovieInfo.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbImageProvider.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbMovieExternalId.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbMovieProvider.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbSearch.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbSettings.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Music/TmdbMusicVideoProvider.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/People/TmdbPersonExternalId.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/People/TmdbPersonImageProvider.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/People/TmdbPersonProvider.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbEpisodeImageProvider.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbEpisodeProvider.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbEpisodeProviderBase.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeasonImageProvider.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeasonProvider.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeriesExternalId.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeriesImageProvider.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeriesProvider.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/TmdbUtils.cs create mode 100644 MediaBrowser.Providers/Plugins/Tmdb/Trailers/TmdbTrailerProvider.cs delete mode 100644 MediaBrowser.Providers/Tmdb/BoxSets/TmdbBoxSetExternalId.cs delete mode 100644 MediaBrowser.Providers/Tmdb/BoxSets/TmdbBoxSetImageProvider.cs delete mode 100644 MediaBrowser.Providers/Tmdb/BoxSets/TmdbBoxSetProvider.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/Collections/CollectionImages.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/Collections/CollectionResult.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/Collections/Part.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/General/Backdrop.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/General/Crew.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/General/ExternalIds.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/General/Genre.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/General/Images.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/General/Keyword.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/General/Keywords.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/General/Poster.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/General/Profile.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/General/Still.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/General/StillImages.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/General/Video.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/General/Videos.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/Movies/BelongsToCollection.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/Movies/Cast.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/Movies/Casts.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/Movies/Country.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/Movies/MovieResult.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/Movies/ProductionCompany.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/Movies/ProductionCountry.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/Movies/Releases.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/Movies/SpokenLanguage.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/Movies/Trailers.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/Movies/Youtube.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/People/PersonImages.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/People/PersonResult.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/Search/ExternalIdLookupResult.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/Search/MovieResult.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/Search/PersonSearchResult.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/Search/TmdbSearchResult.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/Search/TvResult.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/TV/Cast.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/TV/ContentRating.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/TV/ContentRatings.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/TV/CreatedBy.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/TV/Credits.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/TV/Episode.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/TV/EpisodeCredits.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/TV/EpisodeResult.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/TV/GuestStar.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/TV/Network.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/TV/Season.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/TV/SeasonImages.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/TV/SeasonResult.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Models/TV/SeriesResult.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Movies/GenericTmdbMovieInfo.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Movies/TmdbImageProvider.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Movies/TmdbMovieExternalId.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Movies/TmdbMovieProvider.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Movies/TmdbSearch.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Movies/TmdbSettings.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Music/TmdbMusicVideoProvider.cs delete mode 100644 MediaBrowser.Providers/Tmdb/People/TmdbPersonExternalId.cs delete mode 100644 MediaBrowser.Providers/Tmdb/People/TmdbPersonImageProvider.cs delete mode 100644 MediaBrowser.Providers/Tmdb/People/TmdbPersonProvider.cs delete mode 100644 MediaBrowser.Providers/Tmdb/TV/TmdbEpisodeImageProvider.cs delete mode 100644 MediaBrowser.Providers/Tmdb/TV/TmdbEpisodeProvider.cs delete mode 100644 MediaBrowser.Providers/Tmdb/TV/TmdbEpisodeProviderBase.cs delete mode 100644 MediaBrowser.Providers/Tmdb/TV/TmdbSeasonImageProvider.cs delete mode 100644 MediaBrowser.Providers/Tmdb/TV/TmdbSeasonProvider.cs delete mode 100644 MediaBrowser.Providers/Tmdb/TV/TmdbSeriesExternalId.cs delete mode 100644 MediaBrowser.Providers/Tmdb/TV/TmdbSeriesImageProvider.cs delete mode 100644 MediaBrowser.Providers/Tmdb/TV/TmdbSeriesProvider.cs delete mode 100644 MediaBrowser.Providers/Tmdb/TmdbUtils.cs delete mode 100644 MediaBrowser.Providers/Tmdb/Trailers/TmdbTrailerProvider.cs diff --git a/MediaBrowser.Providers/Plugins/Tmdb/BoxSets/TmdbBoxSetExternalId.cs b/MediaBrowser.Providers/Plugins/Tmdb/BoxSets/TmdbBoxSetExternalId.cs new file mode 100644 index 000000000..a260406da --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Tmdb/BoxSets/TmdbBoxSetExternalId.cs @@ -0,0 +1,25 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; + +namespace MediaBrowser.Providers.Plugins.Tmdb.BoxSets +{ + public class TmdbBoxSetExternalId : IExternalId + { + /// + public string Name => TmdbUtils.ProviderName; + + /// + public string Key => MetadataProviders.TmdbCollection.ToString(); + + /// + public string UrlFormatString => TmdbUtils.BaseTmdbUrl + "collection/{0}"; + + /// + public bool Supports(IHasProviderIds item) + { + return item is Movie || item is MusicVideo || item is Trailer; + } + } +} diff --git a/MediaBrowser.Providers/Plugins/Tmdb/BoxSets/TmdbBoxSetImageProvider.cs b/MediaBrowser.Providers/Plugins/Tmdb/BoxSets/TmdbBoxSetImageProvider.cs new file mode 100644 index 000000000..0918b3eb6 --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Tmdb/BoxSets/TmdbBoxSetImageProvider.cs @@ -0,0 +1,160 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using MediaBrowser.Common.Net; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Providers; +using MediaBrowser.Providers.Plugins.Tmdb.Models.Collections; +using MediaBrowser.Providers.Plugins.Tmdb.Models.General; +using MediaBrowser.Providers.Plugins.Tmdb.Movies; + +namespace MediaBrowser.Providers.Plugins.Tmdb.BoxSets +{ + public class TmdbBoxSetImageProvider : IRemoteImageProvider, IHasOrder + { + private readonly IHttpClient _httpClient; + + public TmdbBoxSetImageProvider(IHttpClient httpClient) + { + _httpClient = httpClient; + } + + public string Name => ProviderName; + + public static string ProviderName => TmdbUtils.ProviderName; + + public bool Supports(BaseItem item) + { + return item is BoxSet; + } + + public IEnumerable GetSupportedImages(BaseItem item) + { + return new List + { + ImageType.Primary, + ImageType.Backdrop + }; + } + + public async Task> GetImages(BaseItem item, CancellationToken cancellationToken) + { + var tmdbId = item.GetProviderId(MetadataProviders.Tmdb); + + if (!string.IsNullOrEmpty(tmdbId)) + { + var language = item.GetPreferredMetadataLanguage(); + + var mainResult = await TmdbBoxSetProvider.Current.GetMovieDbResult(tmdbId, null, cancellationToken).ConfigureAwait(false); + + if (mainResult != null) + { + var tmdbSettings = await TmdbMovieProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false); + + var tmdbImageUrl = tmdbSettings.images.GetImageUrl("original"); + + return GetImages(mainResult, language, tmdbImageUrl); + } + } + + return new List(); + } + + private IEnumerable GetImages(CollectionResult obj, string language, string baseUrl) + { + var list = new List(); + + var images = obj.Images ?? new CollectionImages(); + + list.AddRange(GetPosters(images).Select(i => new RemoteImageInfo + { + Url = baseUrl + i.File_Path, + CommunityRating = i.Vote_Average, + VoteCount = i.Vote_Count, + Width = i.Width, + Height = i.Height, + Language = TmdbMovieProvider.AdjustImageLanguage(i.Iso_639_1, language), + ProviderName = Name, + Type = ImageType.Primary, + RatingType = RatingType.Score + })); + + list.AddRange(GetBackdrops(images).Select(i => new RemoteImageInfo + { + Url = baseUrl + i.File_Path, + CommunityRating = i.Vote_Average, + VoteCount = i.Vote_Count, + Width = i.Width, + Height = i.Height, + ProviderName = Name, + Type = ImageType.Backdrop, + RatingType = RatingType.Score + })); + + var isLanguageEn = string.Equals(language, "en", StringComparison.OrdinalIgnoreCase); + + return list.OrderByDescending(i => + { + if (string.Equals(language, i.Language, StringComparison.OrdinalIgnoreCase)) + { + return 3; + } + if (!isLanguageEn) + { + if (string.Equals("en", i.Language, StringComparison.OrdinalIgnoreCase)) + { + return 2; + } + } + if (string.IsNullOrEmpty(i.Language)) + { + return isLanguageEn ? 3 : 2; + } + return 0; + }) + .ThenByDescending(i => i.CommunityRating ?? 0) + .ThenByDescending(i => i.VoteCount ?? 0); + } + + /// + /// Gets the posters. + /// + /// The images. + /// IEnumerable{MovieDbProvider.Poster}. + private IEnumerable GetPosters(CollectionImages images) + { + return images.Posters ?? new List(); + } + + /// + /// Gets the backdrops. + /// + /// The images. + /// IEnumerable{MovieDbProvider.Backdrop}. + private IEnumerable GetBackdrops(CollectionImages images) + { + var eligibleBackdrops = images.Backdrops == null ? new List() : + images.Backdrops; + + return eligibleBackdrops.OrderByDescending(i => i.Vote_Average) + .ThenByDescending(i => i.Vote_Count); + } + + public int Order => 0; + + public Task GetImageResponse(string url, CancellationToken cancellationToken) + { + return _httpClient.GetResponse(new HttpRequestOptions + { + CancellationToken = cancellationToken, + Url = url + }); + } + } +} diff --git a/MediaBrowser.Providers/Plugins/Tmdb/BoxSets/TmdbBoxSetProvider.cs b/MediaBrowser.Providers/Plugins/Tmdb/BoxSets/TmdbBoxSetProvider.cs new file mode 100644 index 000000000..75d91a11d --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Tmdb/BoxSets/TmdbBoxSetProvider.cs @@ -0,0 +1,287 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using MediaBrowser.Common.Configuration; +using MediaBrowser.Common.Net; +using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Globalization; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Providers; +using MediaBrowser.Model.Serialization; +using MediaBrowser.Providers.Plugins.Tmdb.Models.Collections; +using MediaBrowser.Providers.Plugins.Tmdb.Models.General; +using MediaBrowser.Providers.Plugins.Tmdb.Movies; +using Microsoft.Extensions.Logging; + +namespace MediaBrowser.Providers.Plugins.Tmdb.BoxSets +{ + public class TmdbBoxSetProvider : IRemoteMetadataProvider + { + private const string GetCollectionInfo3 = TmdbUtils.BaseTmdbApiUrl + @"3/collection/{0}?api_key={1}&append_to_response=images"; + + internal static TmdbBoxSetProvider Current; + + private readonly ILogger _logger; + private readonly IJsonSerializer _json; + private readonly IServerConfigurationManager _config; + private readonly IFileSystem _fileSystem; + private readonly ILocalizationManager _localization; + private readonly IHttpClient _httpClient; + private readonly ILibraryManager _libraryManager; + + public TmdbBoxSetProvider( + ILogger logger, + IJsonSerializer json, + IServerConfigurationManager config, + IFileSystem fileSystem, + ILocalizationManager localization, + IHttpClient httpClient, + ILibraryManager libraryManager) + { + _logger = logger; + _json = json; + _config = config; + _fileSystem = fileSystem; + _localization = localization; + _httpClient = httpClient; + _libraryManager = libraryManager; + Current = this; + } + + private readonly CultureInfo _usCulture = new CultureInfo("en-US"); + + public async Task> GetSearchResults(BoxSetInfo searchInfo, CancellationToken cancellationToken) + { + var tmdbId = searchInfo.GetProviderId(MetadataProviders.Tmdb); + + if (!string.IsNullOrEmpty(tmdbId)) + { + await EnsureInfo(tmdbId, searchInfo.MetadataLanguage, cancellationToken).ConfigureAwait(false); + + var dataFilePath = GetDataFilePath(_config.ApplicationPaths, tmdbId, searchInfo.MetadataLanguage); + var info = _json.DeserializeFromFile(dataFilePath); + + var images = (info.Images ?? new CollectionImages()).Posters ?? new List(); + + var tmdbSettings = await TmdbMovieProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false); + + var tmdbImageUrl = tmdbSettings.images.GetImageUrl("original"); + + var result = new RemoteSearchResult + { + Name = info.Name, + + SearchProviderName = Name, + + ImageUrl = images.Count == 0 ? null : (tmdbImageUrl + images[0].File_Path) + }; + + result.SetProviderId(MetadataProviders.Tmdb, info.Id.ToString(_usCulture)); + + return new[] { result }; + } + + return await new TmdbSearch(_logger, _json, _libraryManager).GetSearchResults(searchInfo, cancellationToken).ConfigureAwait(false); + } + + public async Task> GetMetadata(BoxSetInfo id, CancellationToken cancellationToken) + { + var tmdbId = id.GetProviderId(MetadataProviders.Tmdb); + + // We don't already have an Id, need to fetch it + if (string.IsNullOrEmpty(tmdbId)) + { + var searchResults = await new TmdbSearch(_logger, _json, _libraryManager).GetSearchResults(id, cancellationToken).ConfigureAwait(false); + + var searchResult = searchResults.FirstOrDefault(); + + if (searchResult != null) + { + tmdbId = searchResult.GetProviderId(MetadataProviders.Tmdb); + } + } + + var result = new MetadataResult(); + + if (!string.IsNullOrEmpty(tmdbId)) + { + var mainResult = await GetMovieDbResult(tmdbId, id.MetadataLanguage, cancellationToken).ConfigureAwait(false); + + if (mainResult != null) + { + result.HasMetadata = true; + result.Item = GetItem(mainResult); + } + } + + return result; + } + + internal async Task GetMovieDbResult(string tmdbId, string language, CancellationToken cancellationToken) + { + if (string.IsNullOrEmpty(tmdbId)) + { + throw new ArgumentNullException(nameof(tmdbId)); + } + + await EnsureInfo(tmdbId, language, cancellationToken).ConfigureAwait(false); + + var dataFilePath = GetDataFilePath(_config.ApplicationPaths, tmdbId, language); + + if (!string.IsNullOrEmpty(dataFilePath)) + { + return _json.DeserializeFromFile(dataFilePath); + } + + return null; + } + + private BoxSet GetItem(CollectionResult obj) + { + var item = new BoxSet + { + Name = obj.Name, + Overview = obj.Overview + }; + + item.SetProviderId(MetadataProviders.Tmdb, obj.Id.ToString(_usCulture)); + + return item; + } + + private async Task DownloadInfo(string tmdbId, string preferredMetadataLanguage, CancellationToken cancellationToken) + { + var mainResult = await FetchMainResult(tmdbId, preferredMetadataLanguage, cancellationToken).ConfigureAwait(false); + + if (mainResult == null) return; + + var dataFilePath = GetDataFilePath(_config.ApplicationPaths, tmdbId, preferredMetadataLanguage); + + Directory.CreateDirectory(Path.GetDirectoryName(dataFilePath)); + + _json.SerializeToFile(mainResult, dataFilePath); + } + + private async Task FetchMainResult(string id, string language, CancellationToken cancellationToken) + { + var url = string.Format(GetCollectionInfo3, id, TmdbUtils.ApiKey); + + if (!string.IsNullOrEmpty(language)) + { + url += string.Format("&language={0}", TmdbMovieProvider.NormalizeLanguage(language)); + + // Get images in english and with no language + url += "&include_image_language=" + TmdbMovieProvider.GetImageLanguagesParam(language); + } + + cancellationToken.ThrowIfCancellationRequested(); + + CollectionResult mainResult; + + using (var response = await TmdbMovieProvider.Current.GetMovieDbResponse(new HttpRequestOptions + { + Url = url, + CancellationToken = cancellationToken, + AcceptHeader = TmdbUtils.AcceptHeader + + }).ConfigureAwait(false)) + { + using (var json = response.Content) + { + mainResult = await _json.DeserializeFromStreamAsync(json).ConfigureAwait(false); + } + } + + cancellationToken.ThrowIfCancellationRequested(); + + if (mainResult != null && string.IsNullOrEmpty(mainResult.Name)) + { + if (!string.IsNullOrEmpty(language) && !string.Equals(language, "en", StringComparison.OrdinalIgnoreCase)) + { + url = string.Format(GetCollectionInfo3, id, TmdbUtils.ApiKey) + "&language=en"; + + if (!string.IsNullOrEmpty(language)) + { + // Get images in english and with no language + url += "&include_image_language=" + TmdbMovieProvider.GetImageLanguagesParam(language); + } + + using (var response = await TmdbMovieProvider.Current.GetMovieDbResponse(new HttpRequestOptions + { + Url = url, + CancellationToken = cancellationToken, + AcceptHeader = TmdbUtils.AcceptHeader + + }).ConfigureAwait(false)) + { + using (var json = response.Content) + { + mainResult = await _json.DeserializeFromStreamAsync(json).ConfigureAwait(false); + } + } + } + } + return mainResult; + } + + internal Task EnsureInfo(string tmdbId, string preferredMetadataLanguage, CancellationToken cancellationToken) + { + var path = GetDataFilePath(_config.ApplicationPaths, tmdbId, preferredMetadataLanguage); + + var fileInfo = _fileSystem.GetFileSystemInfo(path); + + if (fileInfo.Exists) + { + // If it's recent or automatic updates are enabled, don't re-download + if ((DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(fileInfo)).TotalDays <= 2) + { + return Task.CompletedTask; + } + } + + return DownloadInfo(tmdbId, preferredMetadataLanguage, cancellationToken); + } + + public string Name => TmdbUtils.ProviderName; + + private static string GetDataFilePath(IApplicationPaths appPaths, string tmdbId, string preferredLanguage) + { + var path = GetDataPath(appPaths, tmdbId); + + var filename = string.Format("all-{0}.json", preferredLanguage ?? string.Empty); + + return Path.Combine(path, filename); + } + + private static string GetDataPath(IApplicationPaths appPaths, string tmdbId) + { + var dataPath = GetCollectionsDataPath(appPaths); + + return Path.Combine(dataPath, tmdbId); + } + + private static string GetCollectionsDataPath(IApplicationPaths appPaths) + { + var dataPath = Path.Combine(appPaths.CachePath, "tmdb-collections"); + + return dataPath; + } + + public Task GetImageResponse(string url, CancellationToken cancellationToken) + { + return _httpClient.GetResponse(new HttpRequestOptions + { + CancellationToken = cancellationToken, + Url = url + }); + } + } +} diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Models/Collections/CollectionImages.cs b/MediaBrowser.Providers/Plugins/Tmdb/Models/Collections/CollectionImages.cs new file mode 100644 index 000000000..2410ca16b --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Tmdb/Models/Collections/CollectionImages.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using MediaBrowser.Providers.Plugins.Tmdb.Models.General; + +namespace MediaBrowser.Providers.Plugins.Tmdb.Models.Collections +{ + public class CollectionImages + { + public List Backdrops { get; set; } + public List Posters { get; set; } + } +} diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Models/Collections/CollectionResult.cs b/MediaBrowser.Providers/Plugins/Tmdb/Models/Collections/CollectionResult.cs new file mode 100644 index 000000000..3437552df --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Tmdb/Models/Collections/CollectionResult.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; + +namespace MediaBrowser.Providers.Plugins.Tmdb.Models.Collections +{ + public class CollectionResult + { + public int Id { get; set; } + public string Name { get; set; } + public string Overview { get; set; } + public string Poster_Path { get; set; } + public string Backdrop_Path { get; set; } + public List Parts { get; set; } + public CollectionImages Images { get; set; } + } +} diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Models/Collections/Part.cs b/MediaBrowser.Providers/Plugins/Tmdb/Models/Collections/Part.cs new file mode 100644 index 000000000..462fdab53 --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Tmdb/Models/Collections/Part.cs @@ -0,0 +1,11 @@ +namespace MediaBrowser.Providers.Plugins.Tmdb.Models.Collections +{ + public class Part + { + public string Title { get; set; } + public int Id { get; set; } + public string Release_Date { get; set; } + public string Poster_Path { get; set; } + public string Backdrop_Path { get; set; } + } +} diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Backdrop.cs b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Backdrop.cs new file mode 100644 index 000000000..35e3e2112 --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Backdrop.cs @@ -0,0 +1,13 @@ +namespace MediaBrowser.Providers.Plugins.Tmdb.Models.General +{ + public class Backdrop + { + public double Aspect_Ratio { get; set; } + public string File_Path { get; set; } + public int Height { get; set; } + public string Iso_639_1 { get; set; } + public double Vote_Average { get; set; } + public int Vote_Count { get; set; } + public int Width { get; set; } + } +} diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Crew.cs b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Crew.cs new file mode 100644 index 000000000..6a5e74ddb --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Crew.cs @@ -0,0 +1,12 @@ +namespace MediaBrowser.Providers.Plugins.Tmdb.Models.General +{ + public class Crew + { + public int Id { get; set; } + public string Credit_Id { get; set; } + public string Name { get; set; } + public string Department { get; set; } + public string Job { get; set; } + public string Profile_Path { get; set; } + } +} diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Models/General/ExternalIds.cs b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/ExternalIds.cs new file mode 100644 index 000000000..a083f6e9c --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/ExternalIds.cs @@ -0,0 +1,11 @@ +namespace MediaBrowser.Providers.Plugins.Tmdb.Models.General +{ + public class ExternalIds + { + public string Imdb_Id { get; set; } + public object Freebase_Id { get; set; } + public string Freebase_Mid { get; set; } + public int Tvdb_Id { get; set; } + public int Tvrage_Id { get; set; } + } +} diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Genre.cs b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Genre.cs new file mode 100644 index 000000000..7f1a394c3 --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Genre.cs @@ -0,0 +1,8 @@ +namespace MediaBrowser.Providers.Plugins.Tmdb.Models.General +{ + public class Genre + { + public int Id { get; set; } + public string Name { get; set; } + } +} diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Images.cs b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Images.cs new file mode 100644 index 000000000..166f9b740 --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Images.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace MediaBrowser.Providers.Plugins.Tmdb.Models.General +{ + public class Images + { + public List Backdrops { get; set; } + public List Posters { get; set; } + } +} diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Keyword.cs b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Keyword.cs new file mode 100644 index 000000000..72f417be5 --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Keyword.cs @@ -0,0 +1,8 @@ +namespace MediaBrowser.Providers.Plugins.Tmdb.Models.General +{ + public class Keyword + { + public int Id { get; set; } + public string Name { get; set; } + } +} diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Keywords.cs b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Keywords.cs new file mode 100644 index 000000000..ec2d7a035 --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Keywords.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace MediaBrowser.Providers.Plugins.Tmdb.Models.General +{ + public class Keywords + { + public List Results { get; set; } + } +} diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Poster.cs b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Poster.cs new file mode 100644 index 000000000..0cf04a6ce --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Poster.cs @@ -0,0 +1,13 @@ +namespace MediaBrowser.Providers.Plugins.Tmdb.Models.General +{ + public class Poster + { + public double Aspect_Ratio { get; set; } + public string File_Path { get; set; } + public int Height { get; set; } + public string Iso_639_1 { get; set; } + public double Vote_Average { get; set; } + public int Vote_Count { get; set; } + public int Width { get; set; } + } +} diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Profile.cs b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Profile.cs new file mode 100644 index 000000000..b45cfc30f --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Profile.cs @@ -0,0 +1,11 @@ +namespace MediaBrowser.Providers.Plugins.Tmdb.Models.General +{ + public class Profile + { + public string File_Path { get; set; } + public int Width { get; set; } + public int Height { get; set; } + public object Iso_639_1 { get; set; } + public double Aspect_Ratio { get; set; } + } +} diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Still.cs b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Still.cs new file mode 100644 index 000000000..9fc82cfee --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Still.cs @@ -0,0 +1,14 @@ +namespace MediaBrowser.Providers.Plugins.Tmdb.Models.General +{ + public class Still + { + public double Aspect_Ratio { get; set; } + public string File_Path { get; set; } + public int Height { get; set; } + public string Id { get; set; } + public string Iso_639_1 { get; set; } + public double Vote_Average { get; set; } + public int Vote_Count { get; set; } + public int Width { get; set; } + } +} diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Models/General/StillImages.cs b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/StillImages.cs new file mode 100644 index 000000000..23af4b697 --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/StillImages.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace MediaBrowser.Providers.Plugins.Tmdb.Models.General +{ + public class StillImages + { + public List Stills { get; set; } + } +} diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Video.cs b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Video.cs new file mode 100644 index 000000000..19bfd62f6 --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Video.cs @@ -0,0 +1,14 @@ +namespace MediaBrowser.Providers.Plugins.Tmdb.Models.General +{ + public class Video + { + public string Id { get; set; } + public string Iso_639_1 { get; set; } + public string Iso_3166_1 { get; set; } + public string Key { get; set; } + public string Name { get; set; } + public string Site { get; set; } + public string Size { get; set; } + public string Type { get; set; } + } +} diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Videos.cs b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Videos.cs new file mode 100644 index 000000000..26e839de7 --- /dev/null +++ b/MediaBrowser.Providers/Plugins/Tmdb/Models/General/Videos.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace MediaBrowser.Providers.Plugins.Tmdb.Models.General +{ + public class Videos + { + public List