showsApi = $showsApi; $this->personApi = $personApi; } public function process($item, $job) { $methodName = "get".ucfirst($job); if (!method_exists($this, $methodName)) { // @todo maybe raise an exception here return; } $this->$methodName($item); } private function getDetails($item) { $tmdbShow = $this->showsApi->getTvshow($item->tmdb_id); $tmdbShow['tmdb_id'] = $tmdbShow['id']; $show = Show::where('tmdb_id', $item->tmdb_id)->first(); if ($show) { return; } $tmdbShow['slug'] = Str::slug($tmdbShow['name'].'-'.$tmdbShow['tmdb_id']); $tmdbShow['first_air_date'] = $tmdbShow['first_air_date'] ? new \DateTime($tmdbShow['first_air_date']) : null; $tmdbShow['last_air_date'] = $tmdbShow['last_air_date'] ? new \DateTime($tmdbShow['last_air_date']) : null; $show = Show::create($tmdbShow); if (!empty($tmdbShow['seasons'])) { $this->processSeasons($show, $tmdbShow['seasons']); } $this->removeElementFromRemainingJobs($item->tmdb_id, ItemToFetchJobs::JOB_DETAILS); } private function getAlternativeTitles($item) { $tmdbAlternativeTitles = $this->showsApi->getAlternativeTitles($item->tmdb_id); if (empty($tmdbAlternativeTitles) ||empty($tmdbAlternativeTitles['results'])) { return; } $show = Show::where('tmdb_id', $item->tmdb_id)->first(); foreach ($tmdbAlternativeTitles['results'] as $tmdbAlternativeTitle) { $alternativeTitle = ShowAlternativeTitle::where('show_id', $show->id) ->where('iso', $tmdbAlternativeTitle['iso_3166_1']) ->first(); if (!$alternativeTitle) { ShowAlternativeTitle::create([ 'iso' => $tmdbAlternativeTitle['iso_3166_1'], 'title' => $tmdbAlternativeTitle['title'], 'show_id' => $show->id, 'type' => $tmdbAlternativeTitle['type'], ]); } } $this->removeElementFromRemainingJobs($item->tmdb_id, ItemToFetchJobs::JOB_ALTERNVATIVE_TITLES); } private function getCredits($item) { $tmdbCredits = $this->showsApi->getCredits($item->tmdb_id); if (empty($tmdbCredits)) { return; } $show = Show::where('tmdb_id', $item->tmdb_id)->first(); $this->processCast($show, $tmdbCredits['cast'] ?? []); $this->processCrew($show, $tmdbCredits['crew'] ?? []); $this->removeElementFromRemainingJobs($item->tmdb_id, ItemToFetchJobs::JOB_CREDITS); } private function processSeasons(Show $show, array $seasons) { foreach ($seasons as $season) { $showSeason = Season::where('tmdb_id', $season['id']) ->where('show_id', $show->id) ->first(); if (!$showSeason) { $showSeason = Season::create($season); $tmdbSeasonDetails = $this->showsApi->getSeasonDetails($show->tmdb_id, $season['season_number']); $this->processEpisodes($show, $showSeason, $tmdbSeasonDetails['episodes'] ?? []); } } } private function processEpisodes($show, $season, array $tmdbEpisodes) { if (empty($tmdbEpisodes)) { return; } foreach ($tmdbEpisodes as $tmdbEpisode) { $episode = Episode::where('show_id', $show->id) ->where('season_id', $season->id) ->where('tmdb_id', $tmdbEpisode['id']) ->first(); if (!$episode) { $tmdbEpisode['tmdb_id'] = $tmdbEpisode['id']; $tmdbEpisode['slug'] = Str::slug($tmdbEpisode['name']); $tmdbEpisode['tmdb_show_id'] = $tmdbEpisode['show_id']; $tmdbEpisode['show_id'] = $show->id; $tmdbEpisode['tmdb_id'] = $season->id; Episode::create($tmdbEpisode); } } } private function removeElementFromRemainingJobs(int $tmdbId, string $job) { $itemToFetchJobs = ItemToFetchJobs::where('tmdb_id', $tmdbId)->first(); $remainingJobs = $itemToFetchJobs->remaining_jobs; if (is_string($remainingJobs)) { $remainingJobs = json_decode($remainingJobs, true); } $remainingJobKey = array_search($job, $remainingJobs); unset($remainingJobs[$remainingJobKey]); if (empty($remainingJobs)) { $itemToFetchJobs->delete(); } $itemToFetchJobs->remaining_jobs = $remainingJobs; $itemToFetchJobs->save(); } private function processCast($show, array $credits) { if (empty($credits)) { return; } foreach ($credits as $castPerson) { $person = Person::where('tmdb_id', $castPerson['id'])->first(); if (!$person) { $personData = [ 'adult' => $castPerson['adult'], 'tmdb_id' => $castPerson['id'], 'gender' => $castPerson['gender'], 'name' => $castPerson['name'], 'slug' => Str::slug($castPerson['name']), 'popularity' => $castPerson['popularity'], 'profile_path' => $castPerson['profile_path'], ]; $tmdbPerson = $this->personApi->getPerson($castPerson['id']); if (!empty($tmdbPerson)) { $personData = array_merge($personData, [ 'biography' => $tmdbPerson['biography'], 'birtday' => $tmdbPerson['birthday'], 'deathday' => $tmdbPerson['deathday'], 'homepage' => $tmdbPerson['homepage'], 'imdb_id' => $tmdbPerson['imdb_id'], 'known_for_department' => $tmdbPerson['known_for_department'] ? json_encode($tmdbPerson['known_for_department']) : null, 'also_known_as' => $tmdbPerson['also_known_as'] ? json_encode($tmdbPerson['also_known_as']) : null, 'place_of_birth' => $tmdbPerson['place_of_birth'], ]); } $person = Person::create($personData); } if ($show->whereHas('castList', function ($query) use ($person) { $query->where('tmdb_id', '=', $person->tmdb_id); })->exists()) { return; } else { $show->castList()->attach($person, [ 'known_for_department' => $castPerson['known_for_department'], 'character' => $castPerson['character'], 'tmdb_cast_id' => $castPerson['cast_id'], 'order' => $castPerson['order'], ]); } } } private function processCrew($show, array $credits) { if (empty($credits)) { return; } foreach ($credits as $crewPerson) { $person = Person::where('tmdb_id', $crewPerson['id'])->first(); if (!$person) { $personData = [ 'adult' => $crewPerson['adult'], 'tmdb_id' => $crewPerson['id'], 'gender' => $crewPerson['gender'], 'name' => $crewPerson['name'], 'slug' => Str::slug($crewPerson['name']), 'popularity' => $crewPerson['popularity'], 'profile_path' => $crewPerson['profile_path'], ]; $tmdbPerson = $this->personApi->getPerson($crewPerson['id']); if (!empty($tmdbPerson)) { $personData = array_merge($personData, [ 'biography' => $tmdbPerson['biography'], 'birtday' => $tmdbPerson['birthday'], 'deathday' => $tmdbPerson['deathday'], 'homepage' => $tmdbPerson['homepage'], 'imdb_id' => $tmdbPerson['imdb_id'], 'known_for_department' => $tmdbPerson['known_for_department'] ? json_encode($tmdbPerson['known_for_department']) : null, 'also_known_as' => $tmdbPerson['also_known_as'] ? json_encode($tmdbPerson['also_known_as']) : null, 'place_of_birth' => $tmdbPerson['place_of_birth'], ]); } $person = Person::create($personData); } if ($show->whereHas('crewList', function ($query) use ($person) { $query->where('tmdb_id', '=', $person->tmdb_id); })->exists()) { return; } else { $show->crewList()->attach($person, [ 'known_for_department' => json_encode($crewPerson['known_for_department']), 'job' => $crewPerson['job'], 'department' => $crewPerson['department'], 'tmdb_cast_id' => $crewPerson['credit_id'], ]); } } } }