/**
  * @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;
 }