/** * @covers ::parse */ public function testParse() { $contents = file_get_contents(__DIR__ . '/../InputSamples/schedule-26052016.html'); $apiVersion = '2.1'; $schedule = ScheduleParser::parse($contents, $apiVersion); $this->assertInternalType('array', $schedule); $this->assertNotEmpty($schedule['monday']); $item = $schedule['monday'][0]; $this->assertNotNull($item->getId()); $this->assertInternalType('int', $item->getId()); $this->assertInternalType('string', $item->getTitle()); $this->assertContains('myanimelist.cdn-dena.com/images/anime', $item->getImageUrl()); $this->assertNotEmpty($item->getGenres()); $this->assertInternalType('float', $item->getMembersScore()); $this->assertInternalType('int', $item->getMembersCount()); $this->assertNotNull($item->getSynopsis()); $this->assertNotEmpty($item->getProducers()); }
public static function parse($contents) { $crawler = new Crawler(); $crawler->addHTMLContent($contents, 'UTF-8'); $classDay = 'seasonal-anime-list js-seasonal-anime-list js-seasonal-anime-list-key-'; $recordContainer = 'div[class="seasonal-anime js-seasonal-anime"]'; $result = array(); $result['monday'] = ScheduleParser::parseDay($crawler->filter('div[class="' . $classDay . 'monday clearfix"] ' . $recordContainer)); $result['tuesday'] = ScheduleParser::parseDay($crawler->filter('div[class="' . $classDay . 'tuesday clearfix"] ' . $recordContainer)); $result['wednesday'] = ScheduleParser::parseDay($crawler->filter('div[class="' . $classDay . 'wednesday clearfix"] ' . $recordContainer)); $result['thursday'] = ScheduleParser::parseDay($crawler->filter('div[class="' . $classDay . 'thursday clearfix"] ' . $recordContainer)); $result['friday'] = ScheduleParser::parseDay($crawler->filter('div[class="' . $classDay . 'friday clearfix"] ' . $recordContainer)); $result['saturday'] = ScheduleParser::parseDay($crawler->filter('div[class="' . $classDay . 'saturday clearfix"] ' . $recordContainer)); $result['sunday'] = ScheduleParser::parseDay($crawler->filter('div[class="' . $classDay . 'sunday clearfix"] ' . $recordContainer)); $result['other'] = ScheduleParser::parseDay($crawler->filter('div[class="' . $classDay . 'other clearfix"] ' . $recordContainer)); $result['unknown'] = ScheduleParser::parseDay($crawler->filter('div[class="' . $classDay . 'unknown clearfix"] ' . $recordContainer)); return $result; }
/** * Get the airing schedule. * * @param Request $request HTTP Request object * * @return View */ public function getScheduleAction(Request $request) { // http://myanimelist.net/anime/#{id}/_/episode $downloader = $this->get('atarashii_api.communicator'); $timeZone = $request->query->get('timezone'); try { $details = $downloader->fetch('/anime/season/schedule'); } catch (Exception\CurlException $e) { return $this->view(array('error' => 'network-error'), 500); } $result = ScheduleParser::parse($details, $timeZone); $response = new Response(); $response->setPublic(); $response->setMaxAge(43200); //one day $response->headers->addCacheControlDirective('must-revalidate', true); $response->setEtag('anime/season/schedule' . $timeZone); //Also, set "expires" header for caches that don't understand Cache-Control $date = new \DateTime(); $date->modify('+43200 seconds'); //one day $response->setExpires($date); $view = $this->view($result); $view->setResponse($response); $view->setStatusCode(200); return $view; }