diff --git a/lib/Tmdb/Api/Movies.php b/lib/Tmdb/Api/Movies.php index e3b13450..b7b139d5 100644 --- a/lib/Tmdb/Api/Movies.php +++ b/lib/Tmdb/Api/Movies.php @@ -296,6 +296,19 @@ public function getVideos($movie_id, array $parameters = [], array $headers = [] return $this->get('movie/' . $movie_id . '/videos', $parameters, $headers); } + /** + * Get the watch providers (by region) for a specific movie id. + * + * @param $movie_id + * @param array $parameters + * @param array $headers + * @return mixed + */ + public function getWatchProviders($movie_id, array $parameters = [], array $headers = []) + { + return $this->get('movie/' . $movie_id . '/watch/providers', $parameters, $headers); + } + /** * Get the external ids that we have stored for a movie. * diff --git a/lib/Tmdb/Api/Tv.php b/lib/Tmdb/Api/Tv.php index 7cda9080..d86a317b 100644 --- a/lib/Tmdb/Api/Tv.php +++ b/lib/Tmdb/Api/Tv.php @@ -169,6 +169,19 @@ public function getVideos($tvshow_id, array $parameters = [], array $headers = [ return $this->get('tv/' . $tvshow_id . '/videos', $parameters, $headers); } + /** + * Get the watch providers (by region) for a specific movie id. + * + * @param $movie_id + * @param array $parameters + * @param array $headers + * @return mixed + */ + public function getWatchProviders($tvshow_id, array $parameters = [], array $headers = []) + { + return $this->get('tv/' . $tvshow_id . '/watch/providers', $parameters, $headers); + } + /** * Get the changes for a specific TV show id. * diff --git a/lib/Tmdb/Factory/MovieFactory.php b/lib/Tmdb/Factory/MovieFactory.php index b5d6920e..e937ea5f 100644 --- a/lib/Tmdb/Factory/MovieFactory.php +++ b/lib/Tmdb/Factory/MovieFactory.php @@ -28,6 +28,7 @@ use Tmdb\Model\Common\Translation; use Tmdb\Model\Company; use Tmdb\Model\Movie; +use Tmdb\Model\Watch; /** * Class MovieFactory @@ -206,6 +207,33 @@ public function create(array $data = []): ?AbstractModel $movie->setReleaseDates($release_dates); } + if (array_key_exists('watch/providers', $data) && array_key_exists('results', $data['watch/providers'])) { + $watchProviders = new GenericCollection(); + foreach ($data['watch/providers']['results'] as $iso31661 => $countryWatchData) { + $countryWatchData['iso_3166_1'] = $iso31661; + + foreach (['flatrate', 'rent', 'buy'] as $providerType) { + $typeProviders = new GenericCollection(); + foreach ($countryWatchData[$providerType] ?? [] as $providerData) { + if (isset($providerData['provider_id'])) { + $providerData['id'] = $providerData['provider_id']; + } + if (isset($providerData['provider_name'])) { + $providerData['name'] = $providerData['provider_name']; + } + + $providerData['iso_3166_1'] = $iso31661; + $providerData['type'] = $providerType; + $typeProviders->add(null, $this->hydrate(new Watch\Provider(), $providerData)); + } + $countryWatchData[$providerType] = $typeProviders; + } + + $watchProviders->add($iso31661, $this->hydrate(new Watch\Providers(), $countryWatchData)); + } + $movie->setWatchProviders($watchProviders); + } + if (array_key_exists('videos', $data)) { $movie->setVideos($this->getVideoFactory()->createCollection($data['videos'])); } diff --git a/lib/Tmdb/Factory/TvFactory.php b/lib/Tmdb/Factory/TvFactory.php index 86b9d1b1..911ef4b5 100644 --- a/lib/Tmdb/Factory/TvFactory.php +++ b/lib/Tmdb/Factory/TvFactory.php @@ -29,6 +29,7 @@ use Tmdb\Model\Person\CastMember; use Tmdb\Model\Person\CrewMember; use Tmdb\Model\Tv; +use Tmdb\Model\Watch; /** * Class TvFactory @@ -244,6 +245,33 @@ public function create(array $data = []): ?AbstractModel $tvShow->setNetworks($this->getNetworkFactory()->createCollection($data['networks'])); } + if (array_key_exists('watch/providers', $data) && array_key_exists('results', $data['watch/providers'])) { + $watchProviders = new GenericCollection(); + foreach ($data['watch/providers']['results'] as $iso31661 => $countryWatchData) { + $countryWatchData['iso_3166_1'] = $iso31661; + + foreach (['flatrate', 'rent', 'buy'] as $providerType) { + $typeProviders = new GenericCollection(); + foreach ($countryWatchData[$providerType] ?? [] as $providerData) { + if (isset($providerData['provider_id'])) { + $providerData['id'] = $providerData['provider_id']; + } + if (isset($providerData['provider_name'])) { + $providerData['name'] = $providerData['provider_name']; + } + + $providerData['iso_3166_1'] = $iso31661; + $providerData['type'] = $providerType; + $typeProviders->add(null, $this->hydrate(new Watch\Provider(), $providerData)); + } + $countryWatchData[$providerType] = $typeProviders; + } + + $watchProviders->add($iso31661, $this->hydrate(new Watch\Providers(), $countryWatchData)); + } + $tvShow->setWatchProviders($watchProviders); + } + if (array_key_exists('videos', $data) && $data['videos'] !== null) { $tvShow->setVideos($this->getVideoFactory()->createCollection($data['videos'])); } diff --git a/lib/Tmdb/Model/Movie.php b/lib/Tmdb/Model/Movie.php index 8f4b33d2..207042e9 100644 --- a/lib/Tmdb/Model/Movie.php +++ b/lib/Tmdb/Model/Movie.php @@ -230,6 +230,10 @@ class Movie extends AbstractModel * @var int */ private $voteCount; + /** + * @var GenericCollection + */ + private $watchProviders; /** * Constructor @@ -255,6 +259,7 @@ public function __construct() $this->recommendations = new GenericCollection(); $this->translations = new GenericCollection(); $this->videos = new Videos(); + $this->watchProviders = new GenericCollection(); } /** @@ -1032,4 +1037,23 @@ public function setVideos($videos) return $this; } + + /** + * @return GenericCollection + */ + public function getWatchProviders(): GenericCollection + { + return $this->watchProviders; + } + + /** + * @param GenericCollection $watchProviders + * @return $this + */ + public function setWatchProviders($watchProviders) + { + $this->watchProviders = $watchProviders; + + return $this; + } } diff --git a/lib/Tmdb/Model/Movie/QueryParameter/AppendToResponse.php b/lib/Tmdb/Model/Movie/QueryParameter/AppendToResponse.php index 44178a09..2b775dbc 100644 --- a/lib/Tmdb/Model/Movie/QueryParameter/AppendToResponse.php +++ b/lib/Tmdb/Model/Movie/QueryParameter/AppendToResponse.php @@ -40,4 +40,5 @@ final class AppendToResponse extends BaseAppendToResponse public const LISTS = 'lists'; public const CHANGES = 'changes'; public const VIDEOS = 'videos'; + public const WATCH_PROVIDERS = 'watch/providers'; } diff --git a/lib/Tmdb/Model/Query/Discover/DiscoverMoviesQuery.php b/lib/Tmdb/Model/Query/Discover/DiscoverMoviesQuery.php index 10b6e899..5b166fed 100644 --- a/lib/Tmdb/Model/Query/Discover/DiscoverMoviesQuery.php +++ b/lib/Tmdb/Model/Query/Discover/DiscoverMoviesQuery.php @@ -120,6 +120,49 @@ public function language($language) return $this; } + /** + * An ISO 3166-1 code. Combine this filter with with_watch_providers in order to filter your results by a specific watch provider in a specific region. + * + * @param string $watchRegion + * @return $this + */ + public function watchRegion($watchRegion) + { + $this->set('watch_region', $watchRegion); + + return $this; + } + + /** + * Only include movies with the specified watch providers. Combine with watch_region. + * + * @param array|string $watchProviders + * @param int $mode + * @return $this + */ + public function withWatchProviders($watchProviders, $mode = self::MODE_OR) + { + $this->set('with_watch_providers', $this->with($watchProviders, $mode)); + + return $this; + } + + /** + * Only include movies with the specified monetization types. Combine with watch_region. + * + * Allowed Values: flatrate, free, ads, rent, buy + * + * @param array|string $watchProviders + * @param int $mode + * @return $this + */ + public function withWatchMonetizationTypes($watchProviders, $mode = self::MODE_OR) + { + $this->set('with_watch_monetization_types', $this->with($watchProviders, $mode)); + + return $this; + } + /** * Minimum value is 1, expected value is an integer. * diff --git a/lib/Tmdb/Model/Query/Discover/DiscoverTvQuery.php b/lib/Tmdb/Model/Query/Discover/DiscoverTvQuery.php index ac80da88..da338971 100644 --- a/lib/Tmdb/Model/Query/Discover/DiscoverTvQuery.php +++ b/lib/Tmdb/Model/Query/Discover/DiscoverTvQuery.php @@ -15,6 +15,7 @@ namespace Tmdb\Model\Query\Discover; use DateTime; +use Tmdb\Model\AbstractModel; use Tmdb\Model\Collection\QueryParametersCollection; /** @@ -23,6 +24,12 @@ */ class DiscoverTvQuery extends QueryParametersCollection { + /** Transform args to an AND query */ + public const MODE_AND = 0; + + /** Transform args to an OR query */ + public const MODE_OR = 1; + /** * Minimum value is 1, expected value is an integer. * @@ -49,6 +56,49 @@ public function language($language) return $this; } + /** + * An ISO 3166-1 code. Combine this filter with with_watch_providers in order to filter your results by a specific watch provider in a specific region. + * + * @param string $watchRegion + * @return $this + */ + public function watchRegion($watchRegion) + { + $this->set('watch_region', $watchRegion); + + return $this; + } + + /** + * Only include movies with the specified watch providers. Combine with watch_region. + * + * @param array|string $watchProviders + * @param int $mode + * @return $this + */ + public function withWatchProviders($watchProviders, $mode = self::MODE_OR) + { + $this->set('with_watch_providers', $this->with($watchProviders, $mode)); + + return $this; + } + + /** + * Only include movies with the specified monetization types. Combine with watch_region. + * + * Allowed Values: flatrate, free, ads, rent, buy + * + * @param array|string $watchProviders + * @param int $mode + * @return $this + */ + public function withWatchMonetizationTypes($watchProviders, $mode = self::MODE_OR) + { + $this->set('with_watch_monetization_types', $this->with($watchProviders, $mode)); + + return $this; + } + /** * Available options are vote_average.desc, vote_average.asc, first_air_date.desc, * first_air_date.asc, popularity.desc, popularity.asc @@ -109,6 +159,44 @@ public function voteAverageGte($average) return $this; } + /** + * Format the with compatible parameters. + * + * @param array|string $with + * @param int $mode + * + * @return null|string + */ + protected function with($with = null, $mode = self::MODE_OR): ?string + { + if ($with instanceof GenericCollection) { + $with = $with->toArray(); + } + + if (is_array($with)) { + return $this->andWith((array)$with, $mode); + } + + return $with; + } + + /** + * Creates an and query to combine an AND or an OR expression. + * + * @param array $with + * @param int $mode + * @return string + */ + protected function andWith(array $with, $mode) + { + return ( + implode( + $mode === self::MODE_OR ? '|' : ',', + array_map([$this, 'normalize'], $with) + ) + ); + } + /** * Creates an OR query for genres * @@ -227,4 +315,19 @@ public function withNetworksAnd(array $networks = []) implode(',', $networks) ); } + + /** + * Extract object id's if an collection was passed on. + * + * @param $mixed + * @return mixed + */ + protected function normalize($mixed) + { + if (is_object($mixed) && $mixed instanceof AbstractModel) { + return $mixed->getId(); + } + + return $mixed; + } } diff --git a/lib/Tmdb/Model/Tv.php b/lib/Tmdb/Model/Tv.php index 33c55538..f5562c72 100644 --- a/lib/Tmdb/Model/Tv.php +++ b/lib/Tmdb/Model/Tv.php @@ -234,6 +234,10 @@ class Tv extends AbstractModel * @var int */ private $voteCount; + /** + * @var GenericCollection + */ + private $watchProviders; /** * Constructor @@ -258,6 +262,7 @@ public function __construct() $this->contentRatings = new GenericCollection(); $this->alternativeTitles = new GenericCollection(); $this->languages = new GenericCollection(); + $this->watchProviders = new GenericCollection(); } /** @@ -1045,4 +1050,23 @@ public function setType($type) return $this; } + + /** + * @return GenericCollection + */ + public function getWatchProviders(): GenericCollection + { + return $this->watchProviders; + } + + /** + * @param GenericCollection $watchProviders + * @return $this + */ + public function setWatchProviders($watchProviders) + { + $this->watchProviders = $watchProviders; + + return $this; + } } diff --git a/lib/Tmdb/Model/Tv/QueryParameter/AppendToResponse.php b/lib/Tmdb/Model/Tv/QueryParameter/AppendToResponse.php index a67a1062..ca0bffeb 100644 --- a/lib/Tmdb/Model/Tv/QueryParameter/AppendToResponse.php +++ b/lib/Tmdb/Model/Tv/QueryParameter/AppendToResponse.php @@ -33,4 +33,5 @@ class AppendToResponse extends BaseAppendToResponse public const RECOMMENDATIONS = 'recommendations'; public const CONTENT_RATINGS = 'content_ratings'; public const ALTERNATIVE_TITLES = 'alternative_titles'; + public const WATCH_PROVIDERS = 'watch/providers'; } diff --git a/lib/Tmdb/Model/Watch/Provider.php b/lib/Tmdb/Model/Watch/Provider.php new file mode 100644 index 00000000..36c85793 --- /dev/null +++ b/lib/Tmdb/Model/Watch/Provider.php @@ -0,0 +1,154 @@ + + * @copyright (c) 2021, Neil Daniels + * @version 4.0.0 + */ + +namespace Tmdb\Model\Watch; + +use Tmdb\Model\AbstractModel; +use Tmdb\Model\Filter\CountryFilter; + +/** + * Class Watch Provider + * @package Tmdb\Model\Watch + */ +class Provider extends AbstractModel implements CountryFilter +{ + public static $properties = [ + 'iso_3166_1', + 'id', + 'name', + 'logo_path', + 'display_priority', + 'type' + ]; + private $iso31661; + private $id; + private $name; + private $logoPath; + private $displayPriority; + private $type; + + /** + * @return string|null + */ + public function getIso31661(): ?string + { + return $this->iso31661; + } + + /** + * @param string $iso31661|null + * @return $this + */ + public function setIso31661(?string $iso31661): self + { + $this->iso31661 = $iso31661; + + return $this; + } + + /** + * @return int|null + */ + public function getId(): ?int + { + return $this->id; + } + + /** + * @param int|null $id + * @return $this + */ + public function setId(?int $id): self + { + $this->id = $id; + + return $this; + } + + /** + * @return string|null + */ + public function getName(): ?string + { + return $this->name; + } + + /** + * @param string|null $name + * @return $this + */ + public function setName(?string $name): self + { + $this->name = $name; + + return $this; + } + + /** + * @return string|null + */ + public function getLogoPath(): ?string + { + return $this->logoPath; + } + + /** + * @param string|null $logoPath + * @return $this + */ + public function setLogoPath(?string $logoPath): self + { + $this->logoPath = $logoPath; + + return $this; + } + + /** + * @return int|null + */ + public function getDisplayPriority(): ?int + { + return $this->displayPriority; + } + + /** + * @param int|null $displayPriority + * @return $this + */ + public function setDisplayPriority(?int $displayPriority): self + { + $this->displayPriority = $displayPriority; + + return $this; + } + + /** + * @return string|null + */ + public function getType(): ?string + { + return $this->type; + } + + /** + * @param string|null $type + * @return $this + */ + public function setType(?string $type): self + { + $this->type = $type; + + return $this; + } +} diff --git a/lib/Tmdb/Model/Watch/Providers.php b/lib/Tmdb/Model/Watch/Providers.php new file mode 100644 index 00000000..3dec27ff --- /dev/null +++ b/lib/Tmdb/Model/Watch/Providers.php @@ -0,0 +1,146 @@ + + * @copyright (c) 2021, Neil Daniels + * @version 4.0.0 + */ + +namespace Tmdb\Model\Watch; + +use Tmdb\Model\AbstractModel; +use Tmdb\Model\Common\GenericCollection; +use Tmdb\Model\Filter\CountryFilter; + +/** + * Class Watch Providers + * @package Tmdb\Model\Watch + */ +class Providers extends AbstractModel implements CountryFilter +{ + public static $properties = [ + 'iso_3166_1', + 'link', + 'flatrate', + 'rent', + 'buy' + ]; + private $iso31661; + private $link; + private $flatrate; + private $rent; + private $buy; + + /** + * Constructor + * + * Set all default collections + */ + public function __construct() + { + $this->flatrate = new GenericCollection(); + $this->rent = new GenericCollection(); + $this->buy = new GenericCollection(); + } + + /** + * @return string|null + */ + public function getLink(): ?string + { + return $this->link; + } + + /** + * @param string|null $link + * @return $this + */ + public function setLink(?string $link): self + { + $this->link = $link; + + return $this; + } + + /** + * @return string|null + */ + public function getIso31661(): ?string + { + return $this->iso31661; + } + + /** + * @param string $iso31661 + * @return $this + */ + public function setIso31661(?string $iso31661): self + { + $this->iso31661 = $iso31661; + + return $this; + } + + /** + * @return GenericCollection + */ + public function getFlatrate(): GenericCollection + { + return $this->flatrate; + } + + /** + * @param GenericCollection $flatrate + * @return $this + */ + public function setFlatrate(GenericCollection $flatrate): self + { + $this->flatrate = $flatrate; + + return $this; + } + + /** + * @return GenericCollection + */ + public function getRent(): GenericCollection + { + return $this->rent; + } + + /** + * @param GenericCollection $rent + * @return $this + */ + public function setRent(GenericCollection $rent): self + { + $this->rent = $rent; + + return $this; + } + + /** + * @return GenericCollection + */ + public function getBuy(): GenericCollection + { + return $this->buy; + } + + /** + * @param GenericCollection $buy + * @return $this + */ + public function setBuy(GenericCollection $buy): self + { + $this->buy = $buy; + + return $this; + } +} diff --git a/lib/Tmdb/Repository/MovieRepository.php b/lib/Tmdb/Repository/MovieRepository.php index 7a5b70ff..5185e0db 100644 --- a/lib/Tmdb/Repository/MovieRepository.php +++ b/lib/Tmdb/Repository/MovieRepository.php @@ -82,6 +82,7 @@ public function load($id, array $parameters = [], array $headers = []) AppendToResponse::RECOMMENDATIONS, AppendToResponse::TRANSLATIONS, AppendToResponse::VIDEOS, + AppendToResponse::WATCH_PROVIDERS, ]) ]); } @@ -454,6 +455,22 @@ public function getVideos($id, array $parameters = [], array $headers = []) return $movie->getVideos(); } + /** + * Get the watch providers (by region) for a specific movie id. + * + * @param $id + * @param $parameters + * @param $headers + * @return GenericCollection + */ + public function getWatchProviders($id, array $parameters = [], array $headers = []) + { + $data = $this->getApi()->getWatchProviders($id, $this->parseQueryParameters($parameters), $headers); + $movie = $this->getFactory()->create(['watch/providers' => $data]); + + return $movie->getWatchProviders(); + } + /** * Get the external ids that we have stored for a movie. * diff --git a/lib/Tmdb/Repository/TvRepository.php b/lib/Tmdb/Repository/TvRepository.php index 0a2392b4..9380154f 100644 --- a/lib/Tmdb/Repository/TvRepository.php +++ b/lib/Tmdb/Repository/TvRepository.php @@ -61,6 +61,7 @@ public function load($id, array $parameters = [], array $headers = []) AppendToResponse::CONTENT_RATINGS, AppendToResponse::ALTERNATIVE_TITLES, AppendToResponse::VIDEOS, + AppendToResponse::WATCH_PROVIDERS, ]) ]); } @@ -226,6 +227,22 @@ public function getVideos($id, array $parameters = [], array $headers = []) return $tv->getVideos(); } + /** + * Get the watch providers (by region) for a TV series. + * + * @param $id + * @param $parameters + * @param $headers + * @return GenericCollection + */ + public function getWatchProviders($id, array $parameters = [], array $headers = []) + { + $data = $this->getApi()->getWatchProviders($id, $this->parseQueryParameters($parameters), $headers); + $tv = $this->getFactory()->create(['watch/providers' => $data]); + + return $tv->getWatchProviders(); + } + /** * Get the alternative titles for a specific show ID. * diff --git a/test/Tmdb/Tests/Api/MoviesTest.php b/test/Tmdb/Tests/Api/MoviesTest.php index 5d648f0e..b133cc6e 100644 --- a/test/Tmdb/Tests/Api/MoviesTest.php +++ b/test/Tmdb/Tests/Api/MoviesTest.php @@ -254,6 +254,17 @@ public function shouldGetVideos() $this->assertLastRequestIsWithPathAndMethod('/3/movie/' . self::MOVIE_ID . '/videos'); } + /** + * @test + */ + public function shouldGetWatchProviders() + { + $api = $this->getApiWithMockedHttpAdapter(); + + $api->getWatchProviders(self::MOVIE_ID); + $this->assertLastRequestIsWithPathAndMethod('/3/movie/' . self::MOVIE_ID . '/watch/providers'); + } + protected function getApiClass() { return 'Tmdb\Api\Movies'; diff --git a/test/Tmdb/Tests/Api/TvTest.php b/test/Tmdb/Tests/Api/TvTest.php index bf9a78fc..386b1f65 100644 --- a/test/Tmdb/Tests/Api/TvTest.php +++ b/test/Tmdb/Tests/Api/TvTest.php @@ -221,6 +221,17 @@ public function shouldGetContentRatings() $this->assertLastRequestIsWithPathAndMethod('/3/tv/' . self::TV_ID . '/content_ratings'); } + /** + * @test + */ + public function shouldGetWatchProviders() + { + $api = $this->getApiWithMockedHttpAdapter(); + + $api->getWatchProviders(self::TV_ID); + $this->assertLastRequestIsWithPathAndMethod('/3/tv/' . self::TV_ID . '/watch/providers'); + } + protected function getApiClass() { return 'Tmdb\Api\Tv'; diff --git a/test/Tmdb/Tests/Factory/MovieFactoryTest.php b/test/Tmdb/Tests/Factory/MovieFactoryTest.php index cb712cc7..6551b9ec 100644 --- a/test/Tmdb/Tests/Factory/MovieFactoryTest.php +++ b/test/Tmdb/Tests/Factory/MovieFactoryTest.php @@ -111,6 +111,9 @@ public function shouldBeFunctional() $this->assertInstanceOf('Tmdb\Model\Common\GenericCollection', $this->movie->getSimilar()); $this->assertInstanceOf('Tmdb\Model\Common\GenericCollection', $this->movie->getRecommendations()); $this->assertInstanceOf('Tmdb\Model\Collection\Videos', $this->movie->getVideos()); + $this->assertInstanceOf('Tmdb\Model\Common\GenericCollection', $this->movie->getWatchProviders()); + $this->assertInstanceOf('Tmdb\Model\Watch\Providers', $this->movie->getWatchProviders()->get('US')); + $this->assertInstanceOf('Tmdb\Model\Common\GenericCollection', $this->movie->getWatchProviders()->get('US')->getFlatrate()); /** @var Release[] $releases */ $releases = $this->movie->getReleases()->getAll(); @@ -125,6 +128,33 @@ public function shouldBeFunctional() $this->assertInstanceOf(\DateTime::class, $release_date->getReleaseDate()); $this->assertTrue(is_int($release_date->getType())); } + + $watchProviders = $this->movie->getWatchProviders(); + $this->assertEquals(38, count($watchProviders)); + foreach ($watchProviders as $countryCode => $countryWatchProviders) { + $this->assertEquals($countryCode, $countryWatchProviders->getIso31661()); + $this->assertNotEmpty($countryWatchProviders->getLink()); + $this->assertInstanceOf('Tmdb\Model\Common\GenericCollection', $countryWatchProviders->getFlatrate()); + $this->assertInstanceOf('Tmdb\Model\Common\GenericCollection', $countryWatchProviders->getRent()); + $this->assertInstanceOf('Tmdb\Model\Common\GenericCollection', $countryWatchProviders->getBuy()); + + $watchProvidersByType = [ + 'flatrate' => $countryWatchProviders->getFlatrate(), + 'rent' => $countryWatchProviders->getRent(), + 'buy' => $countryWatchProviders->getBuy(), + ]; + + foreach ($watchProvidersByType as $type => $typeWatchProviders) { + foreach ($typeWatchProviders as $watchProvider) { + $this->assertEquals($countryCode, $watchProvider->getIso31661()); + $this->assertTrue(is_int($watchProvider->getId())); + $this->assertNotEmpty($watchProvider->getName()); + $this->assertNotEmpty($watchProvider->getLogoPath()); + $this->assertTrue(is_int($watchProvider->getDisplayPriority())); + $this->assertEquals($type, $watchProvider->getType()); + } + } + } } /** diff --git a/test/Tmdb/Tests/Factory/TvFactoryTest.php b/test/Tmdb/Tests/Factory/TvFactoryTest.php index e01ea6aa..8a3dd0e8 100644 --- a/test/Tmdb/Tests/Factory/TvFactoryTest.php +++ b/test/Tmdb/Tests/Factory/TvFactoryTest.php @@ -128,6 +128,37 @@ public function shouldBeFunctional() $this->assertEquals('US', $usContentRating->getIso31661()); $this->assertEquals('TV-MA', $usContentRating->getRating()); + + $this->assertInstanceOf('Tmdb\Model\Common\GenericCollection', $this->tv->getWatchProviders()); + $this->assertInstanceOf('Tmdb\Model\Watch\Providers', $this->tv->getWatchProviders()->get('US')); + $this->assertInstanceOf('Tmdb\Model\Common\GenericCollection', $this->tv->getWatchProviders()->get('US')->getFlatrate()); + + $watchProviders = $this->tv->getWatchProviders(); + $this->assertEquals(46, count($watchProviders)); + foreach ($watchProviders as $countryCode => $countryWatchProviders) { + $this->assertEquals($countryCode, $countryWatchProviders->getIso31661()); + $this->assertNotEmpty($countryWatchProviders->getLink()); + $this->assertInstanceOf('Tmdb\Model\Common\GenericCollection', $countryWatchProviders->getFlatrate()); + $this->assertInstanceOf('Tmdb\Model\Common\GenericCollection', $countryWatchProviders->getRent()); + $this->assertInstanceOf('Tmdb\Model\Common\GenericCollection', $countryWatchProviders->getBuy()); + + $watchProvidersByType = [ + 'flatrate' => $countryWatchProviders->getFlatrate(), + 'rent' => $countryWatchProviders->getRent(), + 'buy' => $countryWatchProviders->getBuy(), + ]; + + foreach ($watchProvidersByType as $type => $typeWatchProviders) { + foreach ($typeWatchProviders as $watchProvider) { + $this->assertEquals($countryCode, $watchProvider->getIso31661()); + $this->assertTrue(is_int($watchProvider->getId())); + $this->assertNotEmpty($watchProvider->getName()); + $this->assertNotEmpty($watchProvider->getLogoPath()); + $this->assertTrue(is_int($watchProvider->getDisplayPriority())); + $this->assertEquals($type, $watchProvider->getType()); + } + } + } } /** diff --git a/test/Tmdb/Tests/Model/Query/Discover/DiscoverMoviesQueryTest.php b/test/Tmdb/Tests/Model/Query/Discover/DiscoverMoviesQueryTest.php index b60c71cc..c30df8ff 100644 --- a/test/Tmdb/Tests/Model/Query/Discover/DiscoverMoviesQueryTest.php +++ b/test/Tmdb/Tests/Model/Query/Discover/DiscoverMoviesQueryTest.php @@ -44,9 +44,12 @@ public function shouldCreateValidQuery() ->releaseDateLte($now) ->certificationCountry('NL') ->certificationLte(1) - ->withCompanies([1]); + ->withCompanies([1]) + ->watchRegion('US') + ->withWatchProviders([8]) + ->withWatchMonetizationTypes(['flatrate']); - $this->assertEquals(14, count($query)); + $this->assertEquals(17, count($query)); } /** diff --git a/test/Tmdb/Tests/Model/Query/Discover/DiscoverTvQueryTest.php b/test/Tmdb/Tests/Model/Query/Discover/DiscoverTvQueryTest.php index 0a979b10..6f042d6f 100644 --- a/test/Tmdb/Tests/Model/Query/Discover/DiscoverTvQueryTest.php +++ b/test/Tmdb/Tests/Model/Query/Discover/DiscoverTvQueryTest.php @@ -41,8 +41,11 @@ public function shouldCreateValidQuery() ->firstAirDateGte($now) ->firstAirDateLte($now) ->withNetworks([1, 2]) - ->withNetworksAnd([1, 2, 3]); + ->withNetworksAnd([1, 2, 3]) + ->watchRegion('US') + ->withWatchProviders([8]) + ->withWatchMonetizationTypes(['flatrate']); - $this->assertEquals(10, count($query)); + $this->assertEquals(13, count($query)); } } diff --git a/test/Tmdb/Tests/Model/Watch/ProviderTest.php b/test/Tmdb/Tests/Model/Watch/ProviderTest.php new file mode 100644 index 00000000..1a2b3219 --- /dev/null +++ b/test/Tmdb/Tests/Model/Watch/ProviderTest.php @@ -0,0 +1,51 @@ + + * @copyright (c) 2021, Neil Daniels + * @version 4.0.0 + */ + +namespace Tmdb\Tests\Model\Watch; + +use Tmdb\Common\ObjectHydrator; +use Tmdb\Model\Watch\Provider; +use Tmdb\Tests\Model\TestCase; + +class ProviderTest extends TestCase +{ + /** + * @test + */ + public function shouldBeFunctional() + { + $data = [ + 'iso_3166_1' => 'US', + 'id' => 337, + 'name' => 'Disney Plus', + 'logo_path' => '/dgPueyEdOwpQ10fjuhL2WYFQwQs.jpg', + 'display_priority' => 1, + 'type' => 'flatrate', + ]; + + $hydrator = new ObjectHydrator(); + + /** + * @var Release $object + */ + $object = $hydrator->hydrate(new Provider(), $data); + + $this->assertEquals('US', $object->getIso31661()); + $this->assertEquals(337, $object->getId()); + $this->assertEquals('Disney Plus', $object->getName()); + $this->assertEquals('/dgPueyEdOwpQ10fjuhL2WYFQwQs.jpg', $object->getLogoPath()); + $this->assertEquals(1, $object->getDisplayPriority()); + $this->assertEquals('flatrate', $object->getType()); + } +} diff --git a/test/Tmdb/Tests/Model/Watch/ProvidersTest.php b/test/Tmdb/Tests/Model/Watch/ProvidersTest.php new file mode 100644 index 00000000..3b307dbd --- /dev/null +++ b/test/Tmdb/Tests/Model/Watch/ProvidersTest.php @@ -0,0 +1,54 @@ + + * @copyright (c) 2021, Neil Daniels + * @version 4.0.0 + */ + +namespace Tmdb\Tests\Model\Watch; + +use Tmdb\Common\ObjectHydrator; +use Tmdb\Model\Watch\Providers; +use Tmdb\Model\Common\GenericCollection; +use Tmdb\Tests\Model\TestCase; + +class ProvidersTest extends TestCase +{ + /** + * @test + */ + public function shouldBeFunctional() + { + $flatrateCollection = new GenericCollection(); + $rentCollection = new GenericCollection(); + $buyCollection = new GenericCollection(); + + $data = [ + 'iso_3166_1' => 'US', + 'link' => 'https://www.themoviedb.org/movie/12092-alice-in-wonderland/watch?locale=US', + 'flatrate' => $flatrateCollection, + 'rent' => $rentCollection, + 'buy' => $buyCollection, + ]; + + $hydrator = new ObjectHydrator(); + + /** + * @var Release $object + */ + $object = $hydrator->hydrate(new Providers(), $data); + + $this->assertEquals('US', $object->getIso31661()); + $this->assertEquals('https://www.themoviedb.org/movie/12092-alice-in-wonderland/watch?locale=US', $object->getLink()); + $this->assertEquals($flatrateCollection, $object->getFlatrate()); + $this->assertEquals($rentCollection, $object->getRent()); + $this->assertEquals($buyCollection, $object->getBuy()); + } +} diff --git a/test/Tmdb/Tests/Repository/MovieRepositoryTest.php b/test/Tmdb/Tests/Repository/MovieRepositoryTest.php index baade95a..0784f127 100644 --- a/test/Tmdb/Tests/Repository/MovieRepositoryTest.php +++ b/test/Tmdb/Tests/Repository/MovieRepositoryTest.php @@ -30,7 +30,7 @@ public function shouldLoadMovie() $repository->load(self::MOVIE_ID); $this->assertLastRequestIsWithPathAndMethod('/3/movie/' . self::MOVIE_ID); $this->assertRequestHasQueryParameters([ - 'append_to_response' => 'alternative_titles,external_ids,changes,credits,images,keywords,lists,release_dates,reviews,similar,recommendations,translations,videos' + 'append_to_response' => 'alternative_titles,external_ids,changes,credits,images,keywords,lists,release_dates,reviews,similar,recommendations,translations,videos,watch/providers' ]); } @@ -257,6 +257,17 @@ public function shouldGetVideos() $this->assertLastRequestIsWithPathAndMethod('/3/movie/' . self::MOVIE_ID . '/videos'); } + /** + * @test + */ + public function shouldGetWatchProviders() + { + $repository = $this->getRepositoryWithMockedHttpAdapter(); + + $repository->getWatchProviders(self::MOVIE_ID); + $this->assertLastRequestIsWithPathAndMethod('/3/movie/' . self::MOVIE_ID . '/watch/providers'); + } + /** * @test */ diff --git a/test/Tmdb/Tests/Repository/TvRepositoryTest.php b/test/Tmdb/Tests/Repository/TvRepositoryTest.php index fad6fbbf..e5357029 100644 --- a/test/Tmdb/Tests/Repository/TvRepositoryTest.php +++ b/test/Tmdb/Tests/Repository/TvRepositoryTest.php @@ -28,7 +28,7 @@ public function shouldLoadTv() $repository->load(self::TV_ID); $this->assertLastRequestIsWithPathAndMethod('/3/tv/' . self::TV_ID); $this->assertRequestHasQueryParameters( - ['append_to_response' => 'credits,external_ids,images,translations,similar,recommendations,keywords,changes,content_ratings,alternative_titles,videos'] + ['append_to_response' => 'credits,external_ids,images,translations,similar,recommendations,keywords,changes,content_ratings,alternative_titles,videos,watch/providers'] ); } @@ -175,6 +175,17 @@ public function shouldGetVideos() $this->assertLastRequestIsWithPathAndMethod('/3/tv/' . self::TV_ID . '/videos'); } + /** + * @test + */ + public function shouldGetWatchProviders() + { + $repository = $this->getRepositoryWithMockedHttpAdapter(); + + $repository->getWatchProviders(self::TV_ID); + $this->assertLastRequestIsWithPathAndMethod('/3/tv/' . self::TV_ID . '/watch/providers'); + } + /** * @test */ diff --git a/test/Tmdb/Tests/Resources/movie/all.json b/test/Tmdb/Tests/Resources/movie/all.json index 2e08be77..6d411199 100644 --- a/test/Tmdb/Tests/Resources/movie/all.json +++ b/test/Tmdb/Tests/Resources/movie/all.json @@ -2230,5 +2230,1807 @@ "english_name":"Korean" } ] + }, + "watch/providers": { + "results": { + "AR": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=AR", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + }, + { + "display_priority": 8, + "logo_path": "/rgbalNWbAuhWklHH5JAnF53Wjey.jpg", + "provider_id": 339, + "provider_name": "Movistar Play" + } + ] + }, + "AT": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=AT", + "rent": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 8, + "logo_path": "/pZgeSWpfvD59x6sY6stT5c6uc2h.jpg", + "provider_id": 130, + "provider_name": "Sky Store" + }, + { + "display_priority": 11, + "logo_path": "/vjKeS7Y9fNyqNtvp2ROCc71iu1u.jpg", + "provider_id": 40, + "provider_name": "Chili" + }, + { + "display_priority": 11, + "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg", + "provider_id": 10, + "provider_name": "Amazon Video" + }, + { + "display_priority": 15, + "logo_path": "/mosNtwHNCqCmjk7n5odKgYYf2GI.jpg", + "provider_id": 20, + "provider_name": "maxdome Store" + }, + { + "display_priority": 16, + "logo_path": "/kd2fTHmmkCuZ4lCucf8xH48sl89.jpg", + "provider_id": 133, + "provider_name": "Videobuster" + }, + { + "display_priority": 18, + "logo_path": "/wuViyDkbFp4r7VqI0efPW5hFfQj.jpg", + "provider_id": 35, + "provider_name": "Rakuten TV" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ], + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 8, + "logo_path": "/pZgeSWpfvD59x6sY6stT5c6uc2h.jpg", + "provider_id": 130, + "provider_name": "Sky Store" + }, + { + "display_priority": 11, + "logo_path": "/vjKeS7Y9fNyqNtvp2ROCc71iu1u.jpg", + "provider_id": 40, + "provider_name": "Chili" + }, + { + "display_priority": 11, + "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg", + "provider_id": 10, + "provider_name": "Amazon Video" + }, + { + "display_priority": 15, + "logo_path": "/mosNtwHNCqCmjk7n5odKgYYf2GI.jpg", + "provider_id": 20, + "provider_name": "maxdome Store" + }, + { + "display_priority": 16, + "logo_path": "/kd2fTHmmkCuZ4lCucf8xH48sl89.jpg", + "provider_id": 133, + "provider_name": "Videobuster" + }, + { + "display_priority": 18, + "logo_path": "/wuViyDkbFp4r7VqI0efPW5hFfQj.jpg", + "provider_id": 35, + "provider_name": "Rakuten TV" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ] + }, + "AU": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=AU", + "rent": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 11, + "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg", + "provider_id": 10, + "provider_name": "Amazon Video" + }, + { + "display_priority": 13, + "logo_path": "/vDCcryHD32b0yMeSCgBhuYavsmx.jpg", + "provider_id": 192, + "provider_name": "YouTube" + }, + { + "display_priority": 35, + "logo_path": "/43Ykyf69e9Ca3jmTtefhINkw6PN.jpg", + "provider_id": 436, + "provider_name": "Fetch TV" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ], + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + }, + { + "display_priority": 3, + "logo_path": "/5XaVJgyS5FZcQSjLNaQj7Z8yY5r.jpg", + "provider_id": 385, + "provider_name": "BINGE" + }, + { + "display_priority": 6, + "logo_path": "/mgUoFq0rh4hko98wFGYpb7WKw5w.jpg", + "provider_id": 134, + "provider_name": "Foxtel Now" + }, + { + "display_priority": 7, + "logo_path": "/yyJuFDErO2IF65m8wgowkEzT7aS.jpg", + "provider_id": 21, + "provider_name": "Stan" + } + ], + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 11, + "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg", + "provider_id": 10, + "provider_name": "Amazon Video" + }, + { + "display_priority": 13, + "logo_path": "/vDCcryHD32b0yMeSCgBhuYavsmx.jpg", + "provider_id": 192, + "provider_name": "YouTube" + }, + { + "display_priority": 35, + "logo_path": "/43Ykyf69e9Ca3jmTtefhINkw6PN.jpg", + "provider_id": 436, + "provider_name": "Fetch TV" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ] + }, + "BE": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=BE", + "flatrate": [ + { + "display_priority": 12, + "logo_path": "/g3rPUj7XIHYvC2LHSG439Q7iJET.jpg", + "provider_id": 313, + "provider_name": "Yelo Play" + } + ], + "rent": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + } + ], + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + } + ] + }, + "BR": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=BR", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + }, + { + "display_priority": 10, + "logo_path": "/3JXBhduFj3Q3YSqTSNmOdgzNf1I.jpg", + "provider_id": 307, + "provider_name": "Globo Play" + }, + { + "display_priority": 31, + "logo_path": "/EXiiGtayyTEilp8BE1z8so64UB.jpg", + "provider_id": 512, + "provider_name": "TNTGo" + } + ] + }, + "CA": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=CA", + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 13, + "logo_path": "/xEWgUq2tJyggisxbJ3fNOV9Inj2.jpg", + "provider_id": 140, + "provider_name": "Cineplex" + }, + { + "display_priority": 13, + "logo_path": "/vDCcryHD32b0yMeSCgBhuYavsmx.jpg", + "provider_id": 192, + "provider_name": "YouTube" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ], + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ], + "rent": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 13, + "logo_path": "/vDCcryHD32b0yMeSCgBhuYavsmx.jpg", + "provider_id": 192, + "provider_name": "YouTube" + }, + { + "display_priority": 13, + "logo_path": "/xEWgUq2tJyggisxbJ3fNOV9Inj2.jpg", + "provider_id": 140, + "provider_name": "Cineplex" + } + ] + }, + "CH": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=CH", + "rent": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 8, + "logo_path": "/pZgeSWpfvD59x6sY6stT5c6uc2h.jpg", + "provider_id": 130, + "provider_name": "Sky Store" + }, + { + "display_priority": 8, + "logo_path": "/567LmXMmafb8e2jGOmpHDZNl2r8.jpg", + "provider_id": 164, + "provider_name": "Hollystar" + }, + { + "display_priority": 16, + "logo_path": "/kd2fTHmmkCuZ4lCucf8xH48sl89.jpg", + "provider_id": 133, + "provider_name": "Videobuster" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ], + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 8, + "logo_path": "/pZgeSWpfvD59x6sY6stT5c6uc2h.jpg", + "provider_id": 130, + "provider_name": "Sky Store" + }, + { + "display_priority": 8, + "logo_path": "/567LmXMmafb8e2jGOmpHDZNl2r8.jpg", + "provider_id": 164, + "provider_name": "Hollystar" + }, + { + "display_priority": 16, + "logo_path": "/kd2fTHmmkCuZ4lCucf8xH48sl89.jpg", + "provider_id": 133, + "provider_name": "Videobuster" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ] + }, + "CL": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=CL", + "rent": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + } + ], + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + }, + { + "display_priority": 8, + "logo_path": "/rgbalNWbAuhWklHH5JAnF53Wjey.jpg", + "provider_id": 339, + "provider_name": "Movistar Play" + } + ], + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + } + ] + }, + "CO": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=CO", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + }, + { + "display_priority": 8, + "logo_path": "/rgbalNWbAuhWklHH5JAnF53Wjey.jpg", + "provider_id": 339, + "provider_name": "Movistar Play" + } + ] + }, + "DE": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=DE", + "rent": [ + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 8, + "logo_path": "/pZgeSWpfvD59x6sY6stT5c6uc2h.jpg", + "provider_id": 130, + "provider_name": "Sky Store" + }, + { + "display_priority": 11, + "logo_path": "/vjKeS7Y9fNyqNtvp2ROCc71iu1u.jpg", + "provider_id": 40, + "provider_name": "Chili" + }, + { + "display_priority": 11, + "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg", + "provider_id": 10, + "provider_name": "Amazon Video" + }, + { + "display_priority": 13, + "logo_path": "/vDCcryHD32b0yMeSCgBhuYavsmx.jpg", + "provider_id": 192, + "provider_name": "YouTube" + }, + { + "display_priority": 15, + "logo_path": "/mosNtwHNCqCmjk7n5odKgYYf2GI.jpg", + "provider_id": 20, + "provider_name": "maxdome Store" + }, + { + "display_priority": 16, + "logo_path": "/kd2fTHmmkCuZ4lCucf8xH48sl89.jpg", + "provider_id": 133, + "provider_name": "Videobuster" + }, + { + "display_priority": 18, + "logo_path": "/wuViyDkbFp4r7VqI0efPW5hFfQj.jpg", + "provider_id": 35, + "provider_name": "Rakuten TV" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ], + "flatrate": [ + { + "display_priority": 16, + "logo_path": "/zznIwoeBvIUHJUfCaXzzmvJz2WH.jpg", + "provider_id": 194, + "provider_name": "Starz Play Amazon Channel" + }, + { + "display_priority": 18, + "logo_path": "/wuViyDkbFp4r7VqI0efPW5hFfQj.jpg", + "provider_id": 35, + "provider_name": "Rakuten TV" + }, + { + "display_priority": 34, + "logo_path": "/pDcaPupcS7YxKce2sQePrq8k1gK.jpg", + "provider_id": 43, + "provider_name": "Starz" + } + ], + "buy": [ + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 8, + "logo_path": "/pZgeSWpfvD59x6sY6stT5c6uc2h.jpg", + "provider_id": 130, + "provider_name": "Sky Store" + }, + { + "display_priority": 11, + "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg", + "provider_id": 10, + "provider_name": "Amazon Video" + }, + { + "display_priority": 11, + "logo_path": "/vjKeS7Y9fNyqNtvp2ROCc71iu1u.jpg", + "provider_id": 40, + "provider_name": "Chili" + }, + { + "display_priority": 13, + "logo_path": "/vDCcryHD32b0yMeSCgBhuYavsmx.jpg", + "provider_id": 192, + "provider_name": "YouTube" + }, + { + "display_priority": 15, + "logo_path": "/mosNtwHNCqCmjk7n5odKgYYf2GI.jpg", + "provider_id": 20, + "provider_name": "maxdome Store" + }, + { + "display_priority": 16, + "logo_path": "/kd2fTHmmkCuZ4lCucf8xH48sl89.jpg", + "provider_id": 133, + "provider_name": "Videobuster" + }, + { + "display_priority": 18, + "logo_path": "/wuViyDkbFp4r7VqI0efPW5hFfQj.jpg", + "provider_id": 35, + "provider_name": "Rakuten TV" + }, + { + "display_priority": 28, + "logo_path": "/6QfNLK9toSu2bvsWN7A0sEsTz3j.jpg", + "provider_id": 178, + "provider_name": "EntertainTV" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ] + }, + "DK": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=DK", + "buy": [ + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 19, + "logo_path": "/oEntjkQyz84qo1C4FZK9jW1qznl.jpg", + "provider_id": 423, + "provider_name": "Blockbuster" + }, + { + "display_priority": 20, + "logo_path": "/yEbC1a22QZul3KGjeZ1OZjcN4u6.jpg", + "provider_id": 426, + "provider_name": "SF Anytime" + } + ], + "flatrate": [ + { + "display_priority": 6, + "logo_path": "/okuStqHQL2ImgtNxNM40La91u3A.jpg", + "provider_id": 76, + "provider_name": "Viaplay" + } + ], + "rent": [ + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 19, + "logo_path": "/oEntjkQyz84qo1C4FZK9jW1qznl.jpg", + "provider_id": 423, + "provider_name": "Blockbuster" + } + ] + }, + "EC": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=EC", + "rent": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + } + ], + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + } + ], + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + }, + { + "display_priority": 8, + "logo_path": "/rgbalNWbAuhWklHH5JAnF53Wjey.jpg", + "provider_id": 339, + "provider_name": "Movistar Play" + } + ] + }, + "EE": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=EE", + "flatrate": [ + { + "display_priority": 9, + "logo_path": "/gX0ivBWeCv3JcbOko3UoVYDITjL.jpg", + "provider_id": 373, + "provider_name": "Go3" + } + ] + }, + "ES": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=ES", + "rent": [ + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 18, + "logo_path": "/wuViyDkbFp4r7VqI0efPW5hFfQj.jpg", + "provider_id": 35, + "provider_name": "Rakuten TV" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ], + "buy": [ + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 18, + "logo_path": "/wuViyDkbFp4r7VqI0efPW5hFfQj.jpg", + "provider_id": 35, + "provider_name": "Rakuten TV" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ] + }, + "FI": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=FI", + "flatrate": [ + { + "display_priority": 6, + "logo_path": "/okuStqHQL2ImgtNxNM40La91u3A.jpg", + "provider_id": 76, + "provider_name": "Viaplay" + }, + { + "display_priority": 7, + "logo_path": "/weGwCc0WcQa8d1TjXRMY7zwG6Tv.jpg", + "provider_id": 338, + "provider_name": "Ruutu" + } + ], + "buy": [ + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 19, + "logo_path": "/oEntjkQyz84qo1C4FZK9jW1qznl.jpg", + "provider_id": 423, + "provider_name": "Blockbuster" + }, + { + "display_priority": 20, + "logo_path": "/yEbC1a22QZul3KGjeZ1OZjcN4u6.jpg", + "provider_id": 426, + "provider_name": "SF Anytime" + } + ], + "free": [ + { + "display_priority": 7, + "logo_path": "/weGwCc0WcQa8d1TjXRMY7zwG6Tv.jpg", + "provider_id": 338, + "provider_name": "Ruutu" + } + ], + "rent": [ + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 19, + "logo_path": "/oEntjkQyz84qo1C4FZK9jW1qznl.jpg", + "provider_id": 423, + "provider_name": "Blockbuster" + }, + { + "display_priority": 36, + "logo_path": "/4DrvzomVasfWYZ1FN2YwFzANcNx.jpg", + "provider_id": 553, + "provider_name": "Telia Play" + } + ] + }, + "FR": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=FR", + "flatrate": [ + { + "display_priority": 1, + "logo_path": "/68MNrwlkpF7WnmNPXLah69CR5cb.jpg", + "provider_id": 119, + "provider_name": "Amazon Prime Video" + } + ], + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 11, + "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg", + "provider_id": 10, + "provider_name": "Amazon Video" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ], + "rent": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 11, + "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg", + "provider_id": 10, + "provider_name": "Amazon Video" + }, + { + "display_priority": 13, + "logo_path": "/vDCcryHD32b0yMeSCgBhuYavsmx.jpg", + "provider_id": 192, + "provider_name": "YouTube" + }, + { + "display_priority": 26, + "logo_path": "/sCFSnOFDWIj0lfgwoaYEs8dKllR.jpg", + "provider_id": 324, + "provider_name": "Cinemas a la Demande" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ] + }, + "GB": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=GB", + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 8, + "logo_path": "/pZgeSWpfvD59x6sY6stT5c6uc2h.jpg", + "provider_id": 130, + "provider_name": "Sky Store" + }, + { + "display_priority": 11, + "logo_path": "/vjKeS7Y9fNyqNtvp2ROCc71iu1u.jpg", + "provider_id": 40, + "provider_name": "Chili" + }, + { + "display_priority": 11, + "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg", + "provider_id": 10, + "provider_name": "Amazon Video" + }, + { + "display_priority": 13, + "logo_path": "/vDCcryHD32b0yMeSCgBhuYavsmx.jpg", + "provider_id": 192, + "provider_name": "YouTube" + }, + { + "display_priority": 18, + "logo_path": "/wuViyDkbFp4r7VqI0efPW5hFfQj.jpg", + "provider_id": 35, + "provider_name": "Rakuten TV" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ], + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + }, + { + "display_priority": 1, + "logo_path": "/68MNrwlkpF7WnmNPXLah69CR5cb.jpg", + "provider_id": 9, + "provider_name": "Amazon Prime Video" + }, + { + "display_priority": 62, + "logo_path": "/2OTvHZ5EjTd55bC0LF8KzQlkzgJ.jpg", + "provider_id": 594, + "provider_name": "Virgin TV Go" + } + ], + "rent": [ + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 11, + "logo_path": "/vjKeS7Y9fNyqNtvp2ROCc71iu1u.jpg", + "provider_id": 40, + "provider_name": "Chili" + }, + { + "display_priority": 11, + "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg", + "provider_id": 10, + "provider_name": "Amazon Video" + }, + { + "display_priority": 13, + "logo_path": "/vDCcryHD32b0yMeSCgBhuYavsmx.jpg", + "provider_id": 192, + "provider_name": "YouTube" + }, + { + "display_priority": 18, + "logo_path": "/wuViyDkbFp4r7VqI0efPW5hFfQj.jpg", + "provider_id": 35, + "provider_name": "Rakuten TV" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ] + }, + "ID": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=ID", + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + } + ], + "rent": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + } + ] + }, + "IE": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=IE", + "rent": [ + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 18, + "logo_path": "/wuViyDkbFp4r7VqI0efPW5hFfQj.jpg", + "provider_id": 35, + "provider_name": "Rakuten TV" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ], + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 8, + "logo_path": "/pZgeSWpfvD59x6sY6stT5c6uc2h.jpg", + "provider_id": 130, + "provider_name": "Sky Store" + }, + { + "display_priority": 18, + "logo_path": "/wuViyDkbFp4r7VqI0efPW5hFfQj.jpg", + "provider_id": 35, + "provider_name": "Rakuten TV" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ], + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + }, + { + "display_priority": 1, + "logo_path": "/68MNrwlkpF7WnmNPXLah69CR5cb.jpg", + "provider_id": 119, + "provider_name": "Amazon Prime Video" + } + ] + }, + "IN": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=IN", + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + } + ], + "rent": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + } + ], + "flatrate": [ + { + "display_priority": 42, + "logo_path": "/xLGlqG6WHuO1wfxp8vhRvJv7IBo.jpg", + "provider_id": 561, + "provider_name": "Lionsgate Play" + }, + { + "display_priority": 47, + "logo_path": "/sfXXtlU4C66jxFuDn7R3lfMPgUT.jpg", + "provider_id": 614, + "provider_name": "VI movies and tv" + } + ] + }, + "IT": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=IT", + "flatrate": [ + { + "display_priority": 1, + "logo_path": "/68MNrwlkpF7WnmNPXLah69CR5cb.jpg", + "provider_id": 119, + "provider_name": "Amazon Prime Video" + } + ], + "rent": [ + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 11, + "logo_path": "/vjKeS7Y9fNyqNtvp2ROCc71iu1u.jpg", + "provider_id": 40, + "provider_name": "Chili" + }, + { + "display_priority": 18, + "logo_path": "/wuViyDkbFp4r7VqI0efPW5hFfQj.jpg", + "provider_id": 35, + "provider_name": "Rakuten TV" + } + ], + "buy": [ + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 11, + "logo_path": "/vjKeS7Y9fNyqNtvp2ROCc71iu1u.jpg", + "provider_id": 40, + "provider_name": "Chili" + }, + { + "display_priority": 18, + "logo_path": "/wuViyDkbFp4r7VqI0efPW5hFfQj.jpg", + "provider_id": 35, + "provider_name": "Rakuten TV" + } + ] + }, + "JP": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=JP", + "rent": [ + { + "display_priority": 2, + "logo_path": "/1MXP8yzNAuVHQAT0sqBIFI9Fc2M.jpg", + "provider_id": 85, + "provider_name": "dTV" + } + ] + }, + "LT": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=LT", + "rent": [ + { + "display_priority": 36, + "logo_path": "/4DrvzomVasfWYZ1FN2YwFzANcNx.jpg", + "provider_id": 553, + "provider_name": "Telia Play" + } + ], + "flatrate": [ + { + "display_priority": 9, + "logo_path": "/gX0ivBWeCv3JcbOko3UoVYDITjL.jpg", + "provider_id": 373, + "provider_name": "Go3" + }, + { + "display_priority": 36, + "logo_path": "/4DrvzomVasfWYZ1FN2YwFzANcNx.jpg", + "provider_id": 553, + "provider_name": "Telia Play" + } + ] + }, + "LV": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=LV", + "flatrate": [ + { + "display_priority": 9, + "logo_path": "/gX0ivBWeCv3JcbOko3UoVYDITjL.jpg", + "provider_id": 373, + "provider_name": "Go3" + } + ] + }, + "MX": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=MX", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "NL": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=NL", + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 6, + "logo_path": "/j7qnV5qyzWDB0uOdhe5PzQh71Th.jpg", + "provider_id": 71, + "provider_name": "Pathé Thuis" + }, + { + "display_priority": 11, + "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg", + "provider_id": 10, + "provider_name": "Amazon Video" + } + ], + "rent": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 6, + "logo_path": "/j7qnV5qyzWDB0uOdhe5PzQh71Th.jpg", + "provider_id": 71, + "provider_name": "Pathé Thuis" + }, + { + "display_priority": 11, + "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg", + "provider_id": 10, + "provider_name": "Amazon Video" + } + ], + "flatrate": [ + { + "display_priority": 34, + "logo_path": "/9sOKDL0W3HeUFAY8kCJGz9kadhC.jpg", + "provider_id": 563, + "provider_name": "KPN" + } + ] + }, + "NO": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=NO", + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 19, + "logo_path": "/oEntjkQyz84qo1C4FZK9jW1qznl.jpg", + "provider_id": 423, + "provider_name": "Blockbuster" + }, + { + "display_priority": 20, + "logo_path": "/yEbC1a22QZul3KGjeZ1OZjcN4u6.jpg", + "provider_id": 426, + "provider_name": "SF Anytime" + } + ], + "flatrate": [ + { + "display_priority": 6, + "logo_path": "/okuStqHQL2ImgtNxNM40La91u3A.jpg", + "provider_id": 76, + "provider_name": "Viaplay" + }, + { + "display_priority": 22, + "logo_path": "/vQcXxLDrybWOMK68kzZJ78TmcF2.jpg", + "provider_id": 431, + "provider_name": "SumoTV" + }, + { + "display_priority": 34, + "logo_path": "/2SZVMASyXPKC7sEBHgmTjCMySNG.jpg", + "provider_id": 578, + "provider_name": "Strim" + } + ], + "rent": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 19, + "logo_path": "/oEntjkQyz84qo1C4FZK9jW1qznl.jpg", + "provider_id": 423, + "provider_name": "Blockbuster" + } + ] + }, + "NZ": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=NZ", + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ], + "rent": [ + { + "display_priority": 2, + "logo_path": "/wRfIw4x22z9Zag6DZ8qLYwzpjOA.jpg", + "provider_id": 273, + "provider_name": "Neon TV" + }, + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ], + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "PE": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=PE", + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + } + ], + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + }, + { + "display_priority": 8, + "logo_path": "/rgbalNWbAuhWklHH5JAnF53Wjey.jpg", + "provider_id": 339, + "provider_name": "Movistar Play" + } + ], + "rent": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + } + ] + }, + "PL": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=PL", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "PT": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=PT", + "rent": [ + { + "display_priority": 3, + "logo_path": "/l9OqSYtqktdEFQ9Bk194DzTSGDN.jpg", + "provider_id": 242, + "provider_name": "Meo" + } + ] + }, + "RO": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=RO", + "flatrate": [ + { + "display_priority": 1, + "logo_path": "/49zBTsyFqE0u2hO8NxlyVmjFZDH.jpg", + "provider_id": 250, + "provider_name": "Horizon" + } + ] + }, + "RU": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=RU", + "rent": [ + { + "display_priority": 2, + "logo_path": "/2DpMZHxP9jzu3v70bph1UD3LLv3.jpg", + "provider_id": 113, + "provider_name": "Ivi" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + } + ], + "ads": [ + { + "display_priority": 2, + "logo_path": "/2DpMZHxP9jzu3v70bph1UD3LLv3.jpg", + "provider_id": 113, + "provider_name": "Ivi" + }, + { + "display_priority": 22, + "logo_path": "/10AwaHOKZ8iYWIUo9vPgouDtJKl.jpg", + "provider_id": 557, + "provider_name": "More TV" + } + ], + "buy": [ + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 30, + "logo_path": "/hH99ng4jQdmt6qFzoie8SyoUiR8.jpg", + "provider_id": 117, + "provider_name": "Kinopoisk" + } + ], + "flatrate": [ + { + "display_priority": 2, + "logo_path": "/2DpMZHxP9jzu3v70bph1UD3LLv3.jpg", + "provider_id": 113, + "provider_name": "Ivi" + }, + { + "display_priority": 27, + "logo_path": "/1KGLqrMX8rpPfoym9e3xtT9SJni.jpg", + "provider_id": 570, + "provider_name": "Premier" + }, + { + "display_priority": 30, + "logo_path": "/hH99ng4jQdmt6qFzoie8SyoUiR8.jpg", + "provider_id": 117, + "provider_name": "Kinopoisk" + } + ] + }, + "SE": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=SE", + "flatrate": [ + { + "display_priority": 6, + "logo_path": "/okuStqHQL2ImgtNxNM40La91u3A.jpg", + "provider_id": 76, + "provider_name": "Viaplay" + } + ], + "rent": [ + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 19, + "logo_path": "/oEntjkQyz84qo1C4FZK9jW1qznl.jpg", + "provider_id": 423, + "provider_name": "Blockbuster" + } + ], + "buy": [ + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 19, + "logo_path": "/oEntjkQyz84qo1C4FZK9jW1qznl.jpg", + "provider_id": 423, + "provider_name": "Blockbuster" + }, + { + "display_priority": 20, + "logo_path": "/yEbC1a22QZul3KGjeZ1OZjcN4u6.jpg", + "provider_id": 426, + "provider_name": "SF Anytime" + } + ] + }, + "SG": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=SG", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "TR": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=TR", + "rent": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + } + ], + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + } + ] + }, + "US": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=US", + "rent": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 11, + "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg", + "provider_id": 10, + "provider_name": "Amazon Video" + }, + { + "display_priority": 13, + "logo_path": "/vDCcryHD32b0yMeSCgBhuYavsmx.jpg", + "provider_id": 192, + "provider_name": "YouTube" + }, + { + "display_priority": 32, + "logo_path": "/hBdCQamqj7J2VPZNbqf0wiLBous.jpg", + "provider_id": 7, + "provider_name": "Vudu" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + }, + { + "display_priority": 45, + "logo_path": "/nSr2IQSwc5C2QrttIWen8s06ofe.jpg", + "provider_id": 279, + "provider_name": "Redbox" + }, + { + "display_priority": 49, + "logo_path": "/qZdEeINwQotbr1Rq15dL5G2BaAh.jpg", + "provider_id": 358, + "provider_name": "DIRECTV" + }, + { + "display_priority": 130, + "logo_path": "/p1e92kLeYHalxC9GClqNJ75lBDG.jpg", + "provider_id": 352, + "provider_name": "AMC on Demand" + }, + { + "display_priority": 164, + "logo_path": "/xiUQmGI2bi8Rn6C5u2bArB4YHMp.jpg", + "provider_id": 486, + "provider_name": "Spectrum On Demand" + } + ], + "flatrate": [ + { + "display_priority": 5, + "logo_path": "/2wPRZit7b8u79GsqTdygmGL6kBW.jpg", + "provider_id": 257, + "provider_name": "fuboTV" + }, + { + "display_priority": 22, + "logo_path": "/9DrynzGqT6DNLoc4BB3rlcxFRn.jpg", + "provider_id": 528, + "provider_name": "AMC Plus" + } + ], + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 11, + "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg", + "provider_id": 10, + "provider_name": "Amazon Video" + }, + { + "display_priority": 13, + "logo_path": "/vDCcryHD32b0yMeSCgBhuYavsmx.jpg", + "provider_id": 192, + "provider_name": "YouTube" + }, + { + "display_priority": 32, + "logo_path": "/hBdCQamqj7J2VPZNbqf0wiLBous.jpg", + "provider_id": 7, + "provider_name": "Vudu" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + }, + { + "display_priority": 45, + "logo_path": "/nSr2IQSwc5C2QrttIWen8s06ofe.jpg", + "provider_id": 279, + "provider_name": "Redbox" + }, + { + "display_priority": 49, + "logo_path": "/qZdEeINwQotbr1Rq15dL5G2BaAh.jpg", + "provider_id": 358, + "provider_name": "DIRECTV" + }, + { + "display_priority": 130, + "logo_path": "/p1e92kLeYHalxC9GClqNJ75lBDG.jpg", + "provider_id": 352, + "provider_name": "AMC on Demand" + } + ] + }, + "VE": { + "link": "https://www.themoviedb.org/movie/87421-riddick/watch?locale=VE", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + } + } } -} \ No newline at end of file +} diff --git a/test/Tmdb/Tests/Resources/tv/all.json b/test/Tmdb/Tests/Resources/tv/all.json index 5619be39..0a659cf7 100644 --- a/test/Tmdb/Tests/Resources/tv/all.json +++ b/test/Tmdb/Tests/Resources/tv/all.json @@ -1148,6 +1148,859 @@ "english_name":"Romanian" } ] + }, + "watch/providers": { + "results": { + "AR": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=AR", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "AT": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=AT", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ], + "buy": [ + { + "display_priority": 11, + "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg", + "provider_id": 10, + "provider_name": "Amazon Video" + }, + { + "display_priority": 11, + "logo_path": "/vjKeS7Y9fNyqNtvp2ROCc71iu1u.jpg", + "provider_id": 40, + "provider_name": "Chili" + }, + { + "display_priority": 15, + "logo_path": "/mosNtwHNCqCmjk7n5odKgYYf2GI.jpg", + "provider_id": 20, + "provider_name": "maxdome Store" + } + ] + }, + "AU": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=AU", + "flatrate": [ + { + "display_priority": 7, + "logo_path": "/yyJuFDErO2IF65m8wgowkEzT7aS.jpg", + "provider_id": 21, + "provider_name": "Stan" + } + ], + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 11, + "logo_path": "/8hO3WmuKaTnrDN15t9rnlBqUGAo.jpg", + "provider_id": 24, + "provider_name": "Quickflix Store" + }, + { + "display_priority": 35, + "logo_path": "/43Ykyf69e9Ca3jmTtefhINkw6PN.jpg", + "provider_id": 436, + "provider_name": "Fetch TV" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ] + }, + "BE": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=BE", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "BG": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=BG", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "BR": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=BR", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "CA": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=CA", + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + } + ], + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "CH": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=CH", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "CL": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=CL", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "CO": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=CO", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "CZ": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=CZ", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "DE": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=DE", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ], + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 11, + "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg", + "provider_id": 10, + "provider_name": "Amazon Video" + }, + { + "display_priority": 11, + "logo_path": "/vjKeS7Y9fNyqNtvp2ROCc71iu1u.jpg", + "provider_id": 40, + "provider_name": "Chili" + }, + { + "display_priority": 15, + "logo_path": "/mosNtwHNCqCmjk7n5odKgYYf2GI.jpg", + "provider_id": 20, + "provider_name": "maxdome Store" + }, + { + "display_priority": 18, + "logo_path": "/wuViyDkbFp4r7VqI0efPW5hFfQj.jpg", + "provider_id": 35, + "provider_name": "Rakuten TV" + }, + { + "display_priority": 28, + "logo_path": "/6QfNLK9toSu2bvsWN7A0sEsTz3j.jpg", + "provider_id": 178, + "provider_name": "EntertainTV" + } + ] + }, + "DK": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=DK", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ], + "buy": [ + { + "display_priority": 19, + "logo_path": "/oEntjkQyz84qo1C4FZK9jW1qznl.jpg", + "provider_id": 423, + "provider_name": "Blockbuster" + } + ] + }, + "EC": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=EC", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "EE": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=EE", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "ES": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=ES", + "buy": [ + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ], + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "FI": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=FI", + "buy": [ + { + "display_priority": 19, + "logo_path": "/oEntjkQyz84qo1C4FZK9jW1qznl.jpg", + "provider_id": 423, + "provider_name": "Blockbuster" + } + ], + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "FR": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=FR", + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 11, + "logo_path": "/bqgpWEtokIEOF5nsliXca2BQMEn.jpg", + "provider_id": 61, + "provider_name": "Orange VOD" + }, + { + "display_priority": 18, + "logo_path": "/wuViyDkbFp4r7VqI0efPW5hFfQj.jpg", + "provider_id": 35, + "provider_name": "Rakuten TV" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ], + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "GB": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=GB", + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 8, + "logo_path": "/pZgeSWpfvD59x6sY6stT5c6uc2h.jpg", + "provider_id": 130, + "provider_name": "Sky Store" + }, + { + "display_priority": 11, + "logo_path": "/vjKeS7Y9fNyqNtvp2ROCc71iu1u.jpg", + "provider_id": 40, + "provider_name": "Chili" + }, + { + "display_priority": 11, + "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg", + "provider_id": 10, + "provider_name": "Amazon Video" + }, + { + "display_priority": 18, + "logo_path": "/wuViyDkbFp4r7VqI0efPW5hFfQj.jpg", + "provider_id": 35, + "provider_name": "Rakuten TV" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + } + ], + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "GR": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=GR", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "HU": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=HU", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "ID": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=ID", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "IE": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=IE", + "buy": [ + { + "display_priority": 8, + "logo_path": "/pZgeSWpfvD59x6sY6stT5c6uc2h.jpg", + "provider_id": 130, + "provider_name": "Sky Store" + } + ], + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "IN": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=IN", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "IT": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=IT", + "buy": [ + { + "display_priority": 11, + "logo_path": "/vjKeS7Y9fNyqNtvp2ROCc71iu1u.jpg", + "provider_id": 40, + "provider_name": "Chili" + }, + { + "display_priority": 18, + "logo_path": "/wuViyDkbFp4r7VqI0efPW5hFfQj.jpg", + "provider_id": 35, + "provider_name": "Rakuten TV" + } + ], + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "JP": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=JP", + "rent": [ + { + "display_priority": 11, + "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg", + "provider_id": 10, + "provider_name": "Amazon Video" + } + ], + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ], + "buy": [ + { + "display_priority": 11, + "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg", + "provider_id": 10, + "provider_name": "Amazon Video" + } + ] + }, + "KR": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=KR", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "LT": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=LT", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "LV": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=LV", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "MX": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=MX", + "buy": [ + { + "display_priority": 9, + "logo_path": "/mzu37NQphDvqN2BHKM0Rwq9Es3r.jpg", + "provider_id": 167, + "provider_name": "Claro video" + } + ], + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "NL": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=NL", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "NO": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=NO", + "buy": [ + { + "display_priority": 19, + "logo_path": "/oEntjkQyz84qo1C4FZK9jW1qznl.jpg", + "provider_id": 423, + "provider_name": "Blockbuster" + } + ], + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "NZ": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=NZ", + "flatrate": [ + { + "display_priority": 2, + "logo_path": "/wRfIw4x22z9Zag6DZ8qLYwzpjOA.jpg", + "provider_id": 273, + "provider_name": "Neon TV" + } + ], + "buy": [ + { + "display_priority": 11, + "logo_path": "/8hO3WmuKaTnrDN15t9rnlBqUGAo.jpg", + "provider_id": 24, + "provider_name": "Quickflix Store" + } + ] + }, + "PE": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=PE", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "PH": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=PH", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "PL": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=PL", + "buy": [ + { + "display_priority": 11, + "logo_path": "/vjKeS7Y9fNyqNtvp2ROCc71iu1u.jpg", + "provider_id": 40, + "provider_name": "Chili" + } + ], + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "PT": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=PT", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "RO": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=RO", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "RU": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=RU", + "buy": [ + { + "display_priority": 3, + "logo_path": "/As8vTHasikgyhZPkSOI9QzAst4L.jpg", + "provider_id": 115, + "provider_name": "Okko" + }, + { + "display_priority": 16, + "logo_path": "/4AWMLvjQUQNmU3CkpLp7FSSIyZX.jpg", + "provider_id": 501, + "provider_name": "Wink" + }, + { + "display_priority": 30, + "logo_path": "/hH99ng4jQdmt6qFzoie8SyoUiR8.jpg", + "provider_id": 117, + "provider_name": "Kinopoisk" + } + ] + }, + "SE": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=SE", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ], + "buy": [ + { + "display_priority": 19, + "logo_path": "/oEntjkQyz84qo1C4FZK9jW1qznl.jpg", + "provider_id": 423, + "provider_name": "Blockbuster" + } + ] + }, + "SG": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=SG", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "TH": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=TH", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "TR": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=TR", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "US": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=US", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + }, + { + "display_priority": 49, + "logo_path": "/qZdEeINwQotbr1Rq15dL5G2BaAh.jpg", + "provider_id": 358, + "provider_name": "DIRECTV" + } + ], + "buy": [ + { + "display_priority": 2, + "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg", + "provider_id": 2, + "provider_name": "Apple iTunes" + }, + { + "display_priority": 3, + "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg", + "provider_id": 3, + "provider_name": "Google Play Movies" + }, + { + "display_priority": 11, + "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg", + "provider_id": 10, + "provider_name": "Amazon Video" + }, + { + "display_priority": 32, + "logo_path": "/hBdCQamqj7J2VPZNbqf0wiLBous.jpg", + "provider_id": 7, + "provider_name": "Vudu" + }, + { + "display_priority": 43, + "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg", + "provider_id": 68, + "provider_name": "Microsoft Store" + }, + { + "display_priority": 45, + "logo_path": "/nSr2IQSwc5C2QrttIWen8s06ofe.jpg", + "provider_id": 279, + "provider_name": "Redbox" + } + ] + }, + "VE": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=VE", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + }, + "ZA": { + "link": "https://www.themoviedb.org/tv/1396-breaking-bad/watch?locale=ZA", + "flatrate": [ + { + "display_priority": 0, + "logo_path": "/9A1JSVmSxsyaBK4SUFsYVqbAYfW.jpg", + "provider_id": 8, + "provider_name": "Netflix" + } + ] + } + } } - }