public function testParse() { $reviewContents = file_get_contents(__DIR__ . '/../InputSamples/anime-1887-reviews.html'); $reviews = ReviewParser::parse($reviewContents, 'anime'); $this->assertInternalType('array', $reviews); $review = $reviews[0]; $this->assertInstanceOf('Atarashii\\APIBundle\\Model\\Review', $review); $this->assertInstanceOf('\\DateTime', new \DateTime($review->getDate())); $this->assertInternalType('int', $review->getRating()); $this->assertGreaterThanOrEqual('1', $review->getRating()); $this->assertLessThanOrEqual('10', $review->getRating()); $this->assertInternalType('string', $review->getUsername()); $this->assertInternalType('int', $review->getHelpful()); $this->assertInternalType('int', $review->getEpisodes()); $this->assertNull($review->getChapters()); $reviewContents = file_get_contents(__DIR__ . '/../InputSamples/manga-11977-reviews.html'); $reviews = ReviewParser::parse($reviewContents, 'M'); $this->assertInternalType('array', $reviews); $review = $reviews[0]; $this->assertInstanceOf('Atarashii\\APIBundle\\Model\\Review', $review); $this->assertInstanceOf('\\DateTime', new \DateTime($review->getDate())); $this->assertInternalType('int', $review->getRating()); $this->assertGreaterThanOrEqual('1', $review->getRating()); $this->assertLessThanOrEqual('10', $review->getRating()); $this->assertInternalType('string', $review->getUsername()); $this->assertInternalType('int', $review->getHelpful()); $this->assertInternalType('int', $review->getChapters()); $this->assertNull($review->getEpisodes()); }
/** * Get the reviews of an anime or manga. * * If there isn't any page passed it will use the most helpfull voted reviews. * These are determined by the ratio (helpfull:all). * * @param int $id The ID of the anime or manga as assigned by MyAnimeList * @param Request $request HTTP Request object * @param string $requestType The anime or manga request string * * @return View */ public function getReviewsAction($id, $requestType, Request $request) { // http://myanimelist.net/anime/#{id}/ /reviews&p=#{page} // http://myanimelist.net/manga/#{id}/ /reviews&p=#{page} $downloader = $this->get('atarashii_api.communicator'); $page = (int) $request->query->get('page'); if ($page < 0) { $page = 0; } try { $details = $downloader->fetch('/' . $requestType . '/' . $id . '/_/reviews&p=' . $page); } catch (Exception\CurlException $e) { return $this->view(array('error' => 'network-error'), 500); } $response = new Response(); $response->setPublic(); $response->setMaxAge(10800); //Three hour $response->headers->addCacheControlDirective('must-revalidate', true); $response->setEtag($requestType . '/reviews/' . $id . '?page=' . $page); //Also, set "expires" header for caches that don't understand Cache-Control $date = new \DateTime(); $date->modify('+10800 seconds'); //Three hour $response->setExpires($date); if (strpos($details, 'No series found, check the series id and try again.') !== false) { $view = $this->view(array('error' => 'not-found')); $view->setResponse($response); $view->setStatusCode(404); return $view; } else { $reviews = ReviewParser::parse($details, $requestType); $view = $this->view($reviews); $view->setResponse($response); $view->setStatusCode(200); return $view; } }