如何解决从 TMDB Api 中提取 Movie_ID
我已经安装了 MTDB,我已经使用 TMDB api 自动化了它,但我想尝试一些东西并进行实验。 使用 https://www.2embed.ru/embed/tmdb/movie?id=,您可以生成嵌入链接以流式传输几乎所有电影。 我想测试它以查看是否可以使用 MTDB,我尝试了多种方法通过其 getVideos 提取 TMDB 电影 ID,但它只提取密钥(youtube id)
这是用来拉起TMDB API的代码
const TMDB_IMAGE_BASE = 'https://image.tmdb.org/t/p/original';
CONST BACKDROP_BASE_URI = 'https://image.tmdb.org/t/p/w1280';
CONST PROFILE_BASE_URI = 'https://image.tmdb.org/t/p/w185';
CONST YOUTUBE_BASE_URI = 'https://youtube.com/embed/';
CONST SERIES_ENDED_STATUS = ['Ended','Canceled'];
/**
* @var Settings
*/
private $settings;
/**
* @param Settings $settings
*/
public function __construct(Settings $settings)
{
$this->settings = $settings;
}
/**
* @param array $tmdbMedia
* @return Collection
*/
public function execute($tmdbMedia)
{
return collect($tmdbMedia)->map(function($mediaItem) {
return $this->transformMediaItem($mediaItem);
});
}
public function transformMediaItem($mediaItem)
{
$type = $this->getType($mediaItem);
if ($type === Person::PERSON_TYPE) {
return $this->transformPerson($mediaItem);
} else if ($type === Episode::EPISODE_TYPE) {
return $this->transformEpisode($mediaItem);
} else if ($type === Season::SEASON_TYPE) {
return $this->transformSeason($mediaItem);
} else {
return $this->transformTitle($mediaItem,$type);
}
}
private function transformTitle($data,$type)
{
$releaseKey = $type === Title::MOVIE_TYPE ? 'release_date' : 'first_air_date';
$releaseDate = $this->getReleaseDate($releaseKey,$data);
$year = $this->getYear($releaseDate);
$name = $this->getTitle($data);
$transformed = [
'id' => $this->encodeId('tmdb',$type,$data['id']),'is_series' => $type === Title::SERIES_TYPE,'type' => Title::TITLE_TYPE,'poster' => $this->getPoster(Arr::get($data,'poster_path')),'release_date' => $releaseDate,'cast' => $this->getCast($data),'name' => $name,'description' => $data['overview'],'tmdb_Vote_count' => $data['Vote_count'] ?: null,'tmdb_Vote_average' => round($data['Vote_average'],1) ?: null,'year' => $year,'original_title' => $this->getoriginalName($data),'popularity' => Arr::get($data,'popularity'),'language' => Arr::get($data,'original_language'),'certification' => $this->getCertification($data,$type),'countries' => $this->getCountries($data),'tagline' => Arr::get($data,'tagline'),'budget' => Arr::get($data,'budget') ?: null,'revenue' => Arr::get($data,'revenue') ?: null,'runtime' => $this->getRuntime($data),'videos' => $this->getVideos($data,$year,$name),'images' => $this->transformImages($data),'backdrop' => $this->getBackdrop($data),'genres' => $this->getGenres($data),'imdb_id' => Arr::get($data,'external_ids.imdb_id') ?: null,'tmdb_id' => $data['id'],'keywords' => $this->getKeywords($data),'season_count' => Arr::get($data,'number_of_seasons',0),'episode_count' => Arr::get($data,'number_of_episodes','series_ended' => (bool) (array_search(Arr::get($data,'status'),self::SERIES_ENDED_STATUS) !== false),'adult' => Arr::get($data,'adult',false),];
if (Arr::get($data,'seasons')) {
$transformed['seasons'] = $this->getSeasons($data);
}
return $transformed;
}
/**
* Get US certification for title.
*
* @param array $data
* @param $type
* @return string|null
*/
private function getCertification($data,$type)
{
if ($type === Title::SERIES_TYPE) {
$firstKey = 'content_ratings.results';
$secondKey = 'rating';
} else {
$firstKey = 'release_dates.results';
$secondKey = 'release_dates.*.certification';
}
$rating = collect(Arr::get($data,$firstKey,[]))
->where('iso_3166_1','US')
->pluck($secondKey)
->flatten()
->filter()
->first();
return $rating ? str_replace('tv-','',strtolower($rating)) : null;
}
private function getCountries($data)
{
return array_map(function($country) {
return [
'name' => strtolower($country['iso_3166_1']),'display_name' => $country['name'],];
},Arr::get($data,'production_countries',[]));
}
private function transformSeason($data)
{
$releaseDate = $this->getReleaseDate('first_air_date',$data);
$type = Season::SEASON_TYPE;
return [
'id' => $this->encodeId('tmdb','type' => $type,'number' => Arr::get($data,'season_number'),'episodes' => array_map(function($episode) {
return $this->transformEpisode($episode);
},'episodes',[])),];
}
private function transformEpisode($data)
{
$releaseDate = $this->getReleaseDate('air_date',$data);
$type = Episode::EPISODE_TYPE;
return [
'id' => $this->encodeId('tmdb','still_path')),'name' => $this->getTitle($data),'tmdb_Vote_count' => $data['Vote_count'],'year' => $this->getYear($releaseDate),'episode_number' => Arr::get($data,'episode_number'),'season_number' => Arr::get($data,];
}
/**
* @param $path
* @return null|string
*/
private function getPoster($path)
{
return $path ? self::TMDB_IMAGE_BASE . $path : null;
}
private function getBackdrop($data)
{
$backdrop = Arr::get($data,'backdrop_path');
return $backdrop ? self::BACKDROP_BASE_URI . $backdrop : null;
}
/**
* @param array $data
* @return array
*/
private function getSeasons($data)
{
if ( ! Arr::has($data,'seasons')) return null;
// skip "specials" season with number of "0"
$seasons = array_filter(Arr::get($data,'seasons',[]),function($season) {
return $season['season_number'] !== 0;
});
return array_map(function($season) {
return [
'release_date' => $season['air_date'],'episode_count' => $season['episode_count'],'poster' => $season['poster_path'],'number' => $season['season_number'],$seasons);
}
/**
* @param array $data
* @return array
*/
private function getKeywords($data)
{
$keywords = array_merge(
Arr::get($data,'keywords.results','keywords.keywords',[])
);
return array_map(function($keyword) {
return ['name' => $keyword['name']];
},$keywords);
}
/**
* @param array $data
* @return integer
*/
private function getRuntime($data)
{
$runtime = Arr::get($data,'runtime','episode_run_time'));
return (is_array($runtime) && ! empty($runtime)) ? min($runtime) : $runtime;
}
private function transformPerson($tmdbPerson)
{
$syncCredits = $this->settings->get('content.automate_filmography');
$hasCredits = Arr::has($tmdbPerson,'combined_credits') && $syncCredits;
$hasKNownForCredits = Arr::has($tmdbPerson,'kNown_for') && $syncCredits;
$data = [
'id' => $this->encodeId('tmdb',Person::PERSON_TYPE,$tmdbPerson['id']),'name' => $tmdbPerson['name'],'tmdb_id' => $tmdbPerson['id'],'imdb_id' => Arr::get($tmdbPerson,'imdb_id'),'gender' => $this->transformGender(Arr::get($tmdbPerson,'gender')),'poster' => $this->getPoster($tmdbPerson['profile_path']),'type' => Person::PERSON_TYPE,'adult' => Arr::get($tmdbPerson,'fully_synced' => Arr::get($tmdbPerson,'fully_synced') ?: false,'relation_data' => [
'character' => Arr::get($tmdbPerson,'character') ?: null,'order' => Arr::get($tmdbPerson,'order','department' => strtolower(Arr::get($tmdbPerson,'department','cast')),'job' => strtolower(Arr::get($tmdbPerson,'job',]
];
// "kNown_for" credits will only be returned from "search" tmdb api call.
if ( ! $hasCredits && $hasKNownForCredits) {
$data['popular_credits'] = array_map(function($credit) {
return $this->transformMediaItem($credit);
},array_slice($tmdbPerson['kNown_for'],1));
}
if ($hasCredits) {
$credits = array_merge(
Arr::get($tmdbPerson,'combined_credits.cast'),Arr::get($tmdbPerson,'combined_credits.crew')
);
$credits = array_map(function($credit) {
// Todo: add "skipRelations" flag to transform config
$title = array_filter($this->transformMediaItem($credit),function($value) {
return ! is_array($value);
});
$title['relation_data'] = [
'department' => strtolower(Arr::get($credit,'job' => strtolower(Arr::get($credit,'character' => Arr::get($credit,'order' => Arr::get($credit,];
return $title;
},$credits);
$credits = array_filter($credits,function($credit) {
return !Arr::get($credit,'adult') || $this->settings->get('tmdb.includeAdult');
});
$data['credits'] = $credits;
}
$optionalProps = [
'biography' => 'description','birthday' => 'birth_date','deathday' => 'death_date','place_of_birth' => 'birth_place','kNown_for_department' => 'kNown_for','popularity' => 'popularity',];
// can't set these as "null" as some data might not be contained
// when getting people via movie/series filmography
foreach ($optionalProps as $tmdbKey => $localKey) {
if (Arr::has($tmdbPerson,$tmdbKey)) {
$data[$localKey] = $tmdbPerson[$tmdbKey];
}
}
return $data;
}
/**
* @param array $tmdbTitle
* @return array
*/
private function getCast($tmdbTitle)
{
// cast/crew from series,movies and episodes
$credits = array_merge(
Arr::get($tmdbTitle,'credits.cast',Arr::get($tmdbTitle,'credits.crew','crew','guest_stars',[])
);
// "created_by" is in separate property
if ($createdBy = Arr::get($tmdbTitle,'created_by')) {
$creators = array_map(function($person) {
$person['job'] = 'creator';
$person['department'] = 'creators';
return $person;
},$createdBy);
$credits = array_merge($credits,$creators);
}
return array_map(function($person) {
return $this->transformPerson($person);
},$credits);
}
/**
* @param int|null $gender
* @return null|string
*/
private function transformGender($gender)
{
if ($gender === 1) {
return 'female';
} else if ($gender === 2) {
return 'male';
} else {
return null;
}
}
/**
* @param array $tmdbTitle
* @param string $type
* @return array
*/
private function transformImages($tmdbTitle,$type = 'backdrop')
{
$images = Arr::get($tmdbTitle,'images.backdrops',[]);
return array_map(function($image) use($type) {
return [
'type' => $type,'source' => 'tmdb','url' => self::TMDB_IMAGE_BASE . $image['file_path']
];
},$images);
}
/**
* @param $tmdbTitle
* @return array
*/
private function getGenres($tmdbTitle)
{
return array_map(function($genre) {
return ['name' => $genre['name']];
},'genres',[]));
}
/**
* @param array $tmdbTitle
* @param string $titleName
* @param int $year
* @return array
*/
private function getVideos($tmdbTitle,$titleName)
{
$videos = Arr::get($tmdbTitle,'videos.results',[]);
$videos = array_slice($videos,10);
return array_map(function($video) use($titleName,$year) {
return [
'name' => trim($video['name']),'url' => self::YOUTUBE_BASE_URI . $video['key'],'type' => Video::VIDEO_TYPE_EMbed,'category' => strtolower(Arr::get($video,'type','trailer')),$videos);
}
/**
* @param array $data
* @return string
*/
private function getType($data)
{
$hasSeasonNumber = Arr::get($data,'season_number');
$hasEpisodeNumber = Arr::get($data,'episode_number');
if ($hasEpisodeNumber && $hasSeasonNumber) {
return Episode::EPISODE_TYPE;
} else if ($hasSeasonNumber) {
return Season::SEASON_TYPE;
} else if (Arr::get($data,'media_type') === 'person' || Arr::has($data,'birthday')) {
return Person::PERSON_TYPE;
} else if (Arr::has($data,'first_air_date')) {
return Title::SERIES_TYPE;
} else {
return Title::MOVIE_TYPE;
}
}
/**
* @param Carbon $releaseDate
* @return int|null
*/
private function getYear($releaseDate)
{
if ( ! $releaseDate) return null;
return $releaseDate->year;
}
private function getReleaseDate($key,$data)
{
if ( ! isset($data[$key])) return null;
return Carbon::parse($data[$key]);
}
/**
* @param array $tmdbTitle
* @return string|null
*/
private function getTitle($tmdbTitle)
{
if (isset($tmdbTitle['title'])) {
return $tmdbTitle['title'];
} else if (isset($tmdbTitle['name'])) {
return $tmdbTitle['name'];
} else {
return null;
}
}
/**
* @param array $tmdbTitle
* @return string|null
*/
private function getoriginalName($tmdbTitle)
{
if (isset($tmdbTitle['original_title'])) {
return $tmdbTitle['original_title'];
} else if (isset($tmdbTitle['original_name'])) {
return $tmdbTitle['original_name'];
} else {
return null;
}
}
}
如果你改变
CONST YOUTUBE_BASE_URI = 'https://youtube.com/embed/';
到
CONST YOUTUBE_BASE_URI = 'https://www.2embed.ru/embed/tmdb/movie?id=';
并编辑 getVideos 拉
private function getVideos($tmdbTitle,$videos);
}
允许检索 Movie_ID 的东西,从技术上讲它会起作用 但 getVideo 只能拉;
{ "id": xxx,(movie_id)
"results": [{
"id": "xxxxxxxxx854480003eb",(key id)
"iso_639_1": "en","iso_3166_1": "US","key": "XXXxxXXjlg",(youtube link id)
"name": "xxx","site": "YouTube","size": xxx,"type": "xxx"
}
]
}
这里的问题是,如果你输入的是第一个 ID 而不是 key,它只会拉起第二个 id(key id),所以链接变成了
https://www.2embed.ru/embed/tmdb/movie?id=xxxxxxxxx854480003eb
无论如何让它拉movie_id?
https://www.themoviedb.org/settings/api
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。