/** * Creates new episodes * * @param InputInterface $input * @param OutputInterface $output */ private function syncEpisodes(InputInterface $input, OutputInterface $output) { //Each episode has an unique ID in TVMaze, this may be a good hint for us //First, let's fetch all series with keys as external IDS, we'll loop through them $currentSeries = Serie::all()->keyBy('external_id')->toArray(); //FirstOrNew is overkill, "eager load Series + contains($episode_id)" cannot check by external_id column, so pre-fetching is best approach $currentEpisodes = Episode::all()->lists('title', 'external_id')->toArray(); foreach ($currentSeries as $external_id => $serie) { $output->writeln('Now syncing: ' . $serie['title']); $request = new Request('GET', 'http://api.tvmaze.com/shows/' . $external_id . '/episodes?specials=1'); $response = $this->client->send($request); if ($response->getStatusCode() != 200) { $output->writeln('An error has been occurred while fetching series with external_id ' . $external_id); $output->writeln('Error code: ' . $response->getStatusCode()); $output->writeln(self::separator); continue; } $episodes = json_decode($response->getBody()->getContents(), true); //Loop through all episodes: foreach ($episodes as $data) { if (!isset($currentEpisodes[$data['id']])) { $episode = new Episode(); $episode->external_id = $data['id']; $episode->serie_id_external = $external_id; $episode->serie_id_internal = $currentSeries[$external_id]['id']; $episode->season_id = $data['season']; //Episode ID can be null or an integer, it MOST POSSIBLY IS special if (is_null($data['number'])) { $episode->episode_id = 0; $episode->is_special = 1; } else { $episode->episode_id = $data['number']; $episode->is_special = 0; } $episode->title = $data['name']; $episode->description = $data['summary']; $episode->url = $data['url']; if (isset($data['image']['original'])) { $episode->image = $data['image']['original']; } $episode->airdate = $data['airdate'] . ' ' . $data['airtime']; $episode->save(); } } $output->writeln($serie['title'] . ' synced successfully!'); $output->writeln(self::separator); } }