showsApi = $showsApi; } 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']); } // @todo remove jobs from db } private function getAlternativeTitles() { } 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); } } } }