@ -18,16 +18,19 @@ using MediaBrowser.Model.IO;
using MediaBrowser.Model.Providers ;
using MediaBrowser.Model.Serialization ;
using MediaBrowser.Providers.Movies ;
using MediaBrowser.Providers.Tmdb.Models.Search ;
using MediaBrowser.Providers.Tmdb.Models.TV ;
using MediaBrowser.Providers.Tmdb.Movies ;
using Microsoft.Extensions.Logging ;
namespace MediaBrowser.Providers.TV.TheMovieDb
namespace MediaBrowser.Providers.T mdb.TV
{
public class MovieD bSeriesProvider : IRemoteMetadataProvider < Series , SeriesInfo > , IHasOrder
public class Tmd bSeriesProvider : IRemoteMetadataProvider < Series , SeriesInfo > , IHasOrder
{
private const string GetTvInfo3 = MovieDbProvider. BaseMovieDb Url + @"3/tv/{0}?api_key={1}&append_to_response=credits,images,keywords,external_ids,videos,content_ratings" ;
private const string GetTvInfo3 = TmdbUtils. BaseTmdbApi Url + @"3/tv/{0}?api_key={1}&append_to_response=credits,images,keywords,external_ids,videos,content_ratings" ;
private readonly CultureInfo _usCulture = new CultureInfo ( "en-US" ) ;
internal static MovieD bSeriesProvider Current { get ; private set ; }
internal static Tmd bSeriesProvider Current { get ; private set ; }
private readonly IJsonSerializer _jsonSerializer ;
private readonly IFileSystem _fileSystem ;
@ -37,7 +40,7 @@ namespace MediaBrowser.Providers.TV.TheMovieDb
private readonly IHttpClient _httpClient ;
private readonly ILibraryManager _libraryManager ;
public MovieD bSeriesProvider( IJsonSerializer jsonSerializer , IFileSystem fileSystem , IServerConfigurationManager configurationManager , ILogger logger , ILocalizationManager localization , IHttpClient httpClient , ILibraryManager libraryManager )
public Tmd bSeriesProvider( IJsonSerializer jsonSerializer , IFileSystem fileSystem , IServerConfigurationManager configurationManager , ILogger logger , ILocalizationManager localization , IHttpClient httpClient , ILibraryManager libraryManager )
{
_jsonSerializer = jsonSerializer ;
_fileSystem = fileSystem ;
@ -49,7 +52,7 @@ namespace MediaBrowser.Providers.TV.TheMovieDb
Current = this ;
}
public string Name = > "TheMovieDb" ;
public string Name = > TmdbUtils . ProviderName ;
public async Task < IEnumerable < RemoteSearchResult > > GetSearchResults ( SeriesInfo searchInfo , CancellationToken cancellationToken )
{
@ -63,24 +66,24 @@ namespace MediaBrowser.Providers.TV.TheMovieDb
var dataFilePath = GetDataFilePath ( tmdbId , searchInfo . MetadataLanguage ) ;
var obj = _jsonSerializer . DeserializeFromFile < RootObjec t> ( dataFilePath ) ;
var obj = _jsonSerializer . DeserializeFromFile < SeriesResul t> ( dataFilePath ) ;
var tmdbSettings = await MovieDb Provider. Current . GetTmdbSettings ( cancellationToken ) . ConfigureAwait ( false ) ;
var tmdbSettings = await Tmdb MovieProvider. Current . GetTmdbSettings ( cancellationToken ) . ConfigureAwait ( false ) ;
var tmdbImageUrl = tmdbSettings . images . GetImageUrl ( "original" ) ;
var remoteResult = new RemoteSearchResult
{
Name = obj . n ame,
Name = obj . N ame,
SearchProviderName = Name ,
ImageUrl = string . IsNullOrWhiteSpace ( obj . poster_p ath) ? null : tmdbImageUrl + obj . poster_p ath
ImageUrl = string . IsNullOrWhiteSpace ( obj . Poster_P ath) ? null : tmdbImageUrl + obj . Poster_P ath
} ;
remoteResult . SetProviderId ( MetadataProviders . Tmdb , obj . i d. ToString ( _usCulture ) ) ;
remoteResult . SetProviderId ( MetadataProviders . Imdb , obj . external_ids. imdb_i d) ;
remoteResult . SetProviderId ( MetadataProviders . Tmdb , obj . I d. ToString ( _usCulture ) ) ;
remoteResult . SetProviderId ( MetadataProviders . Imdb , obj . External_Ids. Imdb_I d) ;
if ( obj . external_ids. tvdb_i d > 0 )
if ( obj . External_Ids. Tvdb_I d > 0 )
{
remoteResult . SetProviderId ( MetadataProviders . Tvdb , obj . external_ids. tvdb_i d. ToString ( _usCulture ) ) ;
remoteResult . SetProviderId ( MetadataProviders . Tvdb , obj . External_Ids. Tvdb_I d. ToString ( _usCulture ) ) ;
}
return new [ ] { remoteResult } ;
@ -110,7 +113,7 @@ namespace MediaBrowser.Providers.TV.TheMovieDb
}
}
return await new MovieD bSearch( _logger , _jsonSerializer , _libraryManager ) . GetSearchResults ( searchInfo , cancellationToken ) . ConfigureAwait ( false ) ;
return await new Tmd bSearch( _logger , _jsonSerializer , _libraryManager ) . GetSearchResults ( searchInfo , cancellationToken ) . ConfigureAwait ( false ) ;
}
public async Task < MetadataResult < Series > > GetMetadata ( SeriesInfo info , CancellationToken cancellationToken )
@ -153,7 +156,7 @@ namespace MediaBrowser.Providers.TV.TheMovieDb
if ( string . IsNullOrEmpty ( tmdbId ) )
{
result . QueriedById = false ;
var searchResults = await new MovieD bSearch( _logger , _jsonSerializer , _libraryManager ) . GetSearchResults ( info , cancellationToken ) . ConfigureAwait ( false ) ;
var searchResults = await new Tmd bSearch( _logger , _jsonSerializer , _libraryManager ) . GetSearchResults ( info , cancellationToken ) . ConfigureAwait ( false ) ;
var searchResult = searchResults . FirstOrDefault ( ) ;
@ -177,14 +180,14 @@ namespace MediaBrowser.Providers.TV.TheMovieDb
private async Task < MetadataResult < Series > > FetchMovieData ( string tmdbId , string language , string preferredCountryCode , CancellationToken cancellationToken )
{
RootObjec t seriesInfo = await FetchMainResult ( tmdbId , language , cancellationToken ) . ConfigureAwait ( false ) ;
SeriesResul t seriesInfo = await FetchMainResult ( tmdbId , language , cancellationToken ) . ConfigureAwait ( false ) ;
if ( seriesInfo = = null )
{
return null ;
}
tmdbId = seriesInfo . i d. ToString ( _usCulture ) ;
tmdbId = seriesInfo . I d. ToString ( _usCulture ) ;
string dataFilePath = GetDataFilePath ( tmdbId , language ) ;
Directory . CreateDirectory ( Path . GetDirectoryName ( dataFilePath ) ) ;
@ -196,102 +199,102 @@ namespace MediaBrowser.Providers.TV.TheMovieDb
result . Item = new Series ( ) ;
result . ResultLanguage = seriesInfo . ResultLanguage ;
var settings = await MovieDb Provider. Current . GetTmdbSettings ( cancellationToken ) . ConfigureAwait ( false ) ;
var settings = await Tmdb MovieProvider. Current . GetTmdbSettings ( cancellationToken ) . ConfigureAwait ( false ) ;
ProcessMainInfo ( result , seriesInfo , preferredCountryCode , settings ) ;
return result ;
}
private void ProcessMainInfo ( MetadataResult < Series > seriesResult , RootObjec t seriesInfo , string preferredCountryCode , TmdbSettingsResult settings )
private void ProcessMainInfo ( MetadataResult < Series > seriesResult , SeriesResul t seriesInfo , string preferredCountryCode , TmdbSettingsResult settings )
{
var series = seriesResult . Item ;
series . Name = seriesInfo . n ame;
series . SetProviderId ( MetadataProviders . Tmdb , seriesInfo . i d. ToString ( _usCulture ) ) ;
series . Name = seriesInfo . N ame;
series . SetProviderId ( MetadataProviders . Tmdb , seriesInfo . I d. ToString ( _usCulture ) ) ;
//series.VoteCount = seriesInfo.vote_count;
string voteAvg = seriesInfo . vote_a verage. ToString ( CultureInfo . InvariantCulture ) ;
string voteAvg = seriesInfo . Vote_A verage. ToString ( CultureInfo . InvariantCulture ) ;
if ( float . TryParse ( voteAvg , NumberStyles . AllowDecimalPoint , CultureInfo . InvariantCulture , out float rating ) )
{
series . CommunityRating = rating ;
}
series . Overview = seriesInfo . o verview;
series . Overview = seriesInfo . O verview;
if ( seriesInfo . n etworks ! = null )
if ( seriesInfo . N etworks ! = null )
{
series . Studios = seriesInfo . networks. Select ( i = > i . n ame) . ToArray ( ) ;
series . Studios = seriesInfo . Networks. Select ( i = > i . N ame) . ToArray ( ) ;
}
if ( seriesInfo . g enres ! = null )
if ( seriesInfo . G enres ! = null )
{
series . Genres = seriesInfo . genres. Select ( i = > i . n ame) . ToArray ( ) ;
series . Genres = seriesInfo . Genres. Select ( i = > i . N ame) . ToArray ( ) ;
}
//series.HomePageUrl = seriesInfo.homepage;
series . RunTimeTicks = seriesInfo . episode_run_t ime. Select ( i = > TimeSpan . FromMinutes ( i ) . Ticks ) . FirstOrDefault ( ) ;
series . RunTimeTicks = seriesInfo . Episode_Run_T ime. Select ( i = > TimeSpan . FromMinutes ( i ) . Ticks ) . FirstOrDefault ( ) ;
if ( string . Equals ( seriesInfo . s tatus, "Ended" , StringComparison . OrdinalIgnoreCase ) )
if ( string . Equals ( seriesInfo . S tatus, "Ended" , StringComparison . OrdinalIgnoreCase ) )
{
series . Status = SeriesStatus . Ended ;
series . EndDate = seriesInfo . last_air_d ate;
series . EndDate = seriesInfo . Last_Air_D ate;
}
else
{
series . Status = SeriesStatus . Continuing ;
}
series . PremiereDate = seriesInfo . first_air_d ate;
series . PremiereDate = seriesInfo . First_Air_D ate;
var ids = seriesInfo . external_i ds;
var ids = seriesInfo . External_I ds;
if ( ids ! = null )
{
if ( ! string . IsNullOrWhiteSpace ( ids . imdb_i d) )
if ( ! string . IsNullOrWhiteSpace ( ids . Imdb_I d) )
{
series . SetProviderId ( MetadataProviders . Imdb , ids . imdb_i d) ;
series . SetProviderId ( MetadataProviders . Imdb , ids . Imdb_I d) ;
}
if ( ids . tvrage_i d > 0 )
if ( ids . Tvrage_I d > 0 )
{
series . SetProviderId ( MetadataProviders . TvRage , ids . tvrage_i d. ToString ( _usCulture ) ) ;
series . SetProviderId ( MetadataProviders . TvRage , ids . Tvrage_I d. ToString ( _usCulture ) ) ;
}
if ( ids . tvdb_i d > 0 )
if ( ids . Tvdb_I d > 0 )
{
series . SetProviderId ( MetadataProviders . Tvdb , ids . tvdb_i d. ToString ( _usCulture ) ) ;
series . SetProviderId ( MetadataProviders . Tvdb , ids . Tvdb_I d. ToString ( _usCulture ) ) ;
}
}
var contentRatings = ( seriesInfo . content_r atings ? ? new ContentRatings ( ) ) . r esults ? ? new List < ContentRating > ( ) ;
var contentRatings = ( seriesInfo . Content_R atings ? ? new ContentRatings ( ) ) . R esults ? ? new List < ContentRating > ( ) ;
var ourRelease = contentRatings . FirstOrDefault ( c = > string . Equals ( c . i so_3166_1, preferredCountryCode , StringComparison . OrdinalIgnoreCase ) ) ;
var usRelease = contentRatings . FirstOrDefault ( c = > string . Equals ( c . i so_3166_1, "US" , StringComparison . OrdinalIgnoreCase ) ) ;
var ourRelease = contentRatings . FirstOrDefault ( c = > string . Equals ( c . I so_3166_1, preferredCountryCode , StringComparison . OrdinalIgnoreCase ) ) ;
var usRelease = contentRatings . FirstOrDefault ( c = > string . Equals ( c . I so_3166_1, "US" , StringComparison . OrdinalIgnoreCase ) ) ;
var minimumRelease = contentRatings . FirstOrDefault ( ) ;
if ( ourRelease ! = null )
{
series . OfficialRating = ourRelease . r ating;
series . OfficialRating = ourRelease . R ating;
}
else if ( usRelease ! = null )
{
series . OfficialRating = usRelease . r ating;
series . OfficialRating = usRelease . R ating;
}
else if ( minimumRelease ! = null )
{
series . OfficialRating = minimumRelease . r ating;
series . OfficialRating = minimumRelease . R ating;
}
if ( seriesInfo . videos ! = null & & seriesInfo . videos . r esults ! = null )
if ( seriesInfo . Videos ! = null & & seriesInfo . Videos . R esults ! = null )
{
foreach ( var video in seriesInfo . videos. r esults)
foreach ( var video in seriesInfo . Videos. R esults)
{
if ( ( video . t ype. Equals ( "trailer" , StringComparison . OrdinalIgnoreCase )
| | video . t ype. Equals ( "clip" , StringComparison . OrdinalIgnoreCase ) )
& & video . s ite. Equals ( "youtube" , StringComparison . OrdinalIgnoreCase ) )
if ( ( video . T ype. Equals ( "trailer" , StringComparison . OrdinalIgnoreCase )
| | video . T ype. Equals ( "clip" , StringComparison . OrdinalIgnoreCase ) )
& & video . S ite. Equals ( "youtube" , StringComparison . OrdinalIgnoreCase ) )
{
series . AddTrailerUrl ( $"http://www.youtube.com/watch?v={video. k ey}") ;
series . AddTrailerUrl ( $"http://www.youtube.com/watch?v={video. K ey}") ;
}
}
}
@ -299,26 +302,26 @@ namespace MediaBrowser.Providers.TV.TheMovieDb
seriesResult . ResetPeople ( ) ;
var tmdbImageUrl = settings . images . GetImageUrl ( "original" ) ;
if ( seriesInfo . credits ! = null & & seriesInfo . credits . c ast ! = null )
if ( seriesInfo . Credits ! = null & & seriesInfo . Credits . C ast ! = null )
{
foreach ( var actor in seriesInfo . credits. cast . OrderBy ( a = > a . o rder) )
foreach ( var actor in seriesInfo . Credits. Cast . OrderBy ( a = > a . O rder) )
{
var personInfo = new PersonInfo
{
Name = actor . n ame. Trim ( ) ,
Role = actor . c haracter,
Name = actor . N ame. Trim ( ) ,
Role = actor . C haracter,
Type = PersonType . Actor ,
SortOrder = actor . o rder
SortOrder = actor . O rder
} ;
if ( ! string . IsNullOrWhiteSpace ( actor . profile_p ath) )
if ( ! string . IsNullOrWhiteSpace ( actor . Profile_P ath) )
{
personInfo . ImageUrl = tmdbImageUrl + actor . profile_p ath;
personInfo . ImageUrl = tmdbImageUrl + actor . Profile_P ath;
}
if ( actor . i d > 0 )
if ( actor . I d > 0 )
{
personInfo . SetProviderId ( MetadataProviders . Tmdb , actor . i d. ToString ( CultureInfo . InvariantCulture ) ) ;
personInfo . SetProviderId ( MetadataProviders . Tmdb , actor . I d. ToString ( CultureInfo . InvariantCulture ) ) ;
}
seriesResult . AddPerson ( personInfo ) ;
@ -342,7 +345,7 @@ namespace MediaBrowser.Providers.TV.TheMovieDb
internal async Task DownloadSeriesInfo ( string id , string preferredMetadataLanguage , CancellationToken cancellationToken )
{
RootObjec t mainResult = await FetchMainResult ( id , preferredMetadataLanguage , cancellationToken ) . ConfigureAwait ( false ) ;
SeriesResul t mainResult = await FetchMainResult ( id , preferredMetadataLanguage , cancellationToken ) . ConfigureAwait ( false ) ;
if ( mainResult = = null )
{
@ -356,31 +359,31 @@ namespace MediaBrowser.Providers.TV.TheMovieDb
_jsonSerializer . SerializeToFile ( mainResult , dataFilePath ) ;
}
internal async Task < RootObjec t> FetchMainResult ( string id , string language , CancellationToken cancellationToken )
internal async Task < SeriesResul t> FetchMainResult ( string id , string language , CancellationToken cancellationToken )
{
var url = string . Format ( GetTvInfo3 , id , MovieDbProvider . ApiKey ) ;
var url = string . Format ( GetTvInfo3 , id , TmdbUtils . ApiKey ) ;
if ( ! string . IsNullOrEmpty ( language ) )
{
url + = "&language=" + MovieDb Provider. NormalizeLanguage ( language )
+ "&include_image_language=" + MovieDb Provider. GetImageLanguagesParam ( language ) ; // Get images in english and with no language
url + = "&language=" + Tmdb MovieProvider. NormalizeLanguage ( language )
+ "&include_image_language=" + Tmdb MovieProvider. GetImageLanguagesParam ( language ) ; // Get images in english and with no language
}
cancellationToken . ThrowIfCancellationRequested ( ) ;
RootObjec t mainResult ;
SeriesResul t mainResult ;
using ( var response = await MovieDb Provider. Current . GetMovieDbResponse ( new HttpRequestOptions
using ( var response = await Tmdb MovieProvider. Current . GetMovieDbResponse ( new HttpRequestOptions
{
Url = url ,
CancellationToken = cancellationToken ,
AcceptHeader = MovieDbProvider . AcceptHeader
AcceptHeader = TmdbUtils . AcceptHeader
} ) . ConfigureAwait ( false ) )
{
using ( var json = response . Content )
{
mainResult = await _jsonSerializer . DeserializeFromStreamAsync < RootObjec t> ( json ) . ConfigureAwait ( false ) ;
mainResult = await _jsonSerializer . DeserializeFromStreamAsync < SeriesResul t> ( json ) . ConfigureAwait ( false ) ;
if ( ! string . IsNullOrEmpty ( language ) )
{
@ -393,33 +396,33 @@ namespace MediaBrowser.Providers.TV.TheMovieDb
// If the language preference isn't english, then have the overview fallback to english if it's blank
if ( mainResult ! = null & &
string . IsNullOrEmpty ( mainResult . o verview) & &
string . IsNullOrEmpty ( mainResult . O verview) & &
! string . IsNullOrEmpty ( language ) & &
! string . Equals ( language , "en" , StringComparison . OrdinalIgnoreCase ) )
{
_logger . LogInformation ( "MovieDbSeriesProvider couldn't find meta for language {Language}. Trying English..." , language ) ;
url = string . Format ( GetTvInfo3 , id , MovieDbProvider . ApiKey ) + "&language=en" ;
url = string . Format ( GetTvInfo3 , id , TmdbUtils . ApiKey ) + "&language=en" ;
if ( ! string . IsNullOrEmpty ( language ) )
{
// Get images in english and with no language
url + = "&include_image_language=" + MovieDb Provider. GetImageLanguagesParam ( language ) ;
url + = "&include_image_language=" + Tmdb MovieProvider. GetImageLanguagesParam ( language ) ;
}
using ( var response = await MovieDb Provider. Current . GetMovieDbResponse ( new HttpRequestOptions
using ( var response = await Tmdb MovieProvider. Current . GetMovieDbResponse ( new HttpRequestOptions
{
Url = url ,
CancellationToken = cancellationToken ,
AcceptHeader = MovieDbProvider . AcceptHeader
AcceptHeader = TmdbUtils . AcceptHeader
} ) . ConfigureAwait ( false ) )
{
using ( var json = response . Content )
{
var englishResult = await _jsonSerializer . DeserializeFromStreamAsync < RootObjec t> ( json ) . ConfigureAwait ( false ) ;
var englishResult = await _jsonSerializer . DeserializeFromStreamAsync < SeriesResul t> ( json ) . ConfigureAwait ( false ) ;
mainResult . overview = englishResult . o verview;
mainResult . Overview = englishResult . O verview;
mainResult . ResultLanguage = "en" ;
}
}
@ -467,40 +470,40 @@ namespace MediaBrowser.Providers.TV.TheMovieDb
private async Task < RemoteSearchResult > FindByExternalId ( string id , string externalSource , CancellationToken cancellationToken )
{
var url = string . Format ( MovieDbProvider. BaseMovieDb Url + @"3/find/{0}?api_key={1}&external_source={2}" ,
var url = string . Format ( TmdbUtils. BaseTmdbApi Url + @"3/find/{0}?api_key={1}&external_source={2}" ,
id ,
MovieDbProvider . ApiKey ,
TmdbUtils . ApiKey ,
externalSource ) ;
using ( var response = await MovieDb Provider. Current . GetMovieDbResponse ( new HttpRequestOptions
using ( var response = await Tmdb MovieProvider. Current . GetMovieDbResponse ( new HttpRequestOptions
{
Url = url ,
CancellationToken = cancellationToken ,
AcceptHeader = MovieDbProvider . AcceptHeader
AcceptHeader = TmdbUtils . AcceptHeader
} ) . ConfigureAwait ( false ) )
{
using ( var json = response . Content )
{
var result = await _jsonSerializer . DeserializeFromStreamAsync < MovieDbSearch. ExternalIdLookupResult> ( json ) . ConfigureAwait ( false ) ;
var result = await _jsonSerializer . DeserializeFromStreamAsync < ExternalIdLookupResult> ( json ) . ConfigureAwait ( false ) ;
if ( result ! = null & & result . tv_r esults ! = null )
if ( result ! = null & & result . Tv_R esults ! = null )
{
var tv = result . tv_r esults. FirstOrDefault ( ) ;
var tv = result . Tv_R esults. FirstOrDefault ( ) ;
if ( tv ! = null )
{
var tmdbSettings = await MovieDb Provider. Current . GetTmdbSettings ( cancellationToken ) . ConfigureAwait ( false ) ;
var tmdbSettings = await Tmdb MovieProvider. Current . GetTmdbSettings ( cancellationToken ) . ConfigureAwait ( false ) ;
var tmdbImageUrl = tmdbSettings . images . GetImageUrl ( "original" ) ;
var remoteResult = new RemoteSearchResult
{
Name = tv . n ame,
Name = tv . N ame,
SearchProviderName = Name ,
ImageUrl = string . IsNullOrWhiteSpace ( tv . poster_p ath) ? null : tmdbImageUrl + tv . poster_p ath
ImageUrl = string . IsNullOrWhiteSpace ( tv . Poster_P ath) ? null : tmdbImageUrl + tv . Poster_P ath
} ;
remoteResult . SetProviderId ( MetadataProviders . Tmdb , tv . i d. ToString ( _usCulture ) ) ;
remoteResult . SetProviderId ( MetadataProviders . Tmdb , tv . I d. ToString ( _usCulture ) ) ;
return remoteResult ;
}
@ -511,163 +514,6 @@ namespace MediaBrowser.Providers.TV.TheMovieDb
return null ;
}
public class CreatedBy
{
public int id { get ; set ; }
public string name { get ; set ; }
public string profile_path { get ; set ; }
}
public class Genre
{
public int id { get ; set ; }
public string name { get ; set ; }
}
public class Network
{
public int id { get ; set ; }
public string name { get ; set ; }
}
public class Season
{
public string air_date { get ; set ; }
public int episode_count { get ; set ; }
public int id { get ; set ; }
public string poster_path { get ; set ; }
public int season_number { get ; set ; }
}
public class Cast
{
public string character { get ; set ; }
public string credit_id { get ; set ; }
public int id { get ; set ; }
public string name { get ; set ; }
public string profile_path { get ; set ; }
public int order { get ; set ; }
}
public class Crew
{
public string credit_id { get ; set ; }
public string department { get ; set ; }
public int id { get ; set ; }
public string name { get ; set ; }
public string job { get ; set ; }
public string profile_path { get ; set ; }
}
public class Credits
{
public List < Cast > cast { get ; set ; }
public List < Crew > crew { get ; set ; }
}
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 ; }
}
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 ; }
}
public class Images
{
public List < Backdrop > backdrops { get ; set ; }
public List < Poster > posters { get ; set ; }
}
public class Keywords
{
public List < object > results { get ; set ; }
}
public class ExternalIds
{
public string imdb_id { get ; set ; }
public string freebase_id { get ; set ; }
public string freebase_mid { get ; set ; }
public int tvdb_id { get ; set ; }
public int tvrage_id { get ; set ; }
}
public class Videos
{
public List < Video > results { get ; set ; }
}
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 ; }
}
public class ContentRating
{
public string iso_3166_1 { get ; set ; }
public string rating { get ; set ; }
}
public class ContentRatings
{
public List < ContentRating > results { get ; set ; }
}
public class RootObject
{
public string backdrop_path { get ; set ; }
public List < CreatedBy > created_by { get ; set ; }
public List < int > episode_run_time { get ; set ; }
public DateTime first_air_date { get ; set ; }
public List < Genre > genres { get ; set ; }
public string homepage { get ; set ; }
public int id { get ; set ; }
public bool in_production { get ; set ; }
public List < string > languages { get ; set ; }
public DateTime last_air_date { get ; set ; }
public string name { get ; set ; }
public List < Network > networks { get ; set ; }
public int number_of_episodes { get ; set ; }
public int number_of_seasons { get ; set ; }
public string original_name { get ; set ; }
public List < string > origin_country { get ; set ; }
public string overview { get ; set ; }
public string popularity { get ; set ; }
public string poster_path { get ; set ; }
public List < Season > seasons { get ; set ; }
public string status { get ; set ; }
public double vote_average { get ; set ; }
public int vote_count { get ; set ; }
public Credits credits { get ; set ; }
public Images images { get ; set ; }
public Keywords keywords { get ; set ; }
public ExternalIds external_ids { get ; set ; }
public Videos videos { get ; set ; }
public ContentRatings content_ratings { get ; set ; }
public string ResultLanguage { get ; set ; }
}
// After TheTVDB
public int Order = > 1 ;