/** * @param bool $includeShowtimes * * @return array|null */ public function parseMovies($includeShowtimes = true) { $movies = []; $movieDivs = $this->crawler->filter('#movie_results .movie'); $count = $movieDivs->count(); if ($count == 0) { return null; } $movies = $movieDivs->each(function (Crawler $movieDiv, $i) use($includeShowtimes) { $resultItemParser = new ResultItemParser($movieDiv); $movie = $resultItemParser->parseResultMovieItem(); if ($movie == null) { return; } $movieInfoLinks = $movieDiv->filter('.info a'); if (count($movieInfoLinks) > 0) { $imdbLink = $movieInfoLinks->last(); if ($imdbLink != null) { $movie->setImdbLink(ParseHelper::getParamFromLink($imdbLink->attr('href'), 'q')); } } if ($includeShowtimes) { $movie->setShowtimeInfo($this->parseShowtimeInfo($movieDiv)); } return $movie; }); return $movies; }
/** * @param Crawler $resultItemDiv * @param $paramName * @param $className * * @return ResultItem|null */ private function parseResultItem(Crawler $resultItemDiv, $paramName, $className) { $resultItemA = $resultItemDiv->filter('h2 a, .name a')->first(); $url = $resultItemA->attr('href'); if (!$url) { return null; } $resultItem = new ResultItem(); $resultItem->setId(ParseHelper::getParamFromLink($url, $paramName)); $resultItem->setName($resultItemA->text()); $resultItem->setInfo(strip_tags($resultItemDiv->filter($className)->first()->text())); return $resultItem; }
/** * Parses the content as Result Item (Generic). * * @param Crawler $resultItemDiv * @param string $paramName * @param string $className * @param string $fallbackUrl * * @return ResultItem|null */ private function parseResultItem(Crawler $resultItemDiv, $paramName, $className, $fallbackUrl = null) { $filter = 'h2[itemprop=name] a, h2[itemprop=name], .name a'; $resultItemA = $resultItemDiv->filter($filter)->first(); if ($resultItemA->count() > 0) { if ($resultItemA->nodeName() == "a") { $url = $resultItemA->attr('href'); } elseif ($resultItemA->nodeName() == "h2" && $fallbackUrl != null) { $url = $fallbackUrl; } } else { throw new \Exception("Can't detect title of item!"); } if (!$url) { return null; } $resultItem = new ResultItem(); $resultItem->setId(ParseHelper::getParamFromLink($url, $paramName)); $resultItem->setName($resultItemA->text()); $resultItem->setInfo(strip_tags($resultItemDiv->filter($className)->first()->text())); return $resultItem; }
/** * Parses the Movies from the result div. * * @param bool $includeShowtimes * * @return array|null */ public function parseMovies($includeShowtimes = true) { $movieDivs = $this->crawler->filter('#movie_results .movie'); $count = $movieDivs->count(); if ($count == 0) { return null; } if ($count = 1) { $justOneMovieFound = true; } $movies = $movieDivs->each(function (Crawler $movieDiv, $i) use($includeShowtimes, $justOneMovieFound) { $resultItemParser = new ResultItemParser($movieDiv); if ($justOneMovieFound) { //extract url with mid from $firstLeftNavLink = $this->getFirstLeftNavLink(); $fallbackUrl = $firstLeftNavLink->attr('href'); $movie = $resultItemParser->parseResultMovieItem($fallbackUrl); } else { $movie = $resultItemParser->parseResultMovieItem(); } if ($movie == null) { return null; } $movieInfoLinks = $movieDiv->filter('.info a'); if (count($movieInfoLinks) > 0) { $imdbLink = $movieInfoLinks->last(); if ($imdbLink != null) { $movie->setImdbLink(ParseHelper::getParamFromLink($imdbLink->attr('href'), 'q')); } } if ($includeShowtimes) { $movie->setShowtimeInfo($this->parseShowtimeInfo($movieDiv)); } return $movie; }); return $movies; }
/** * Returns Showtimes found by a search for a movie title. * * @param $movieTitle Title of the searched Movie * @param string $nearLocation Search Movies or Theaters near this location. Format CH-3000 Bern. * @param string $lang Language for the search Results. (i.e. en, de, fr). * @param null $dateOffset Offset of Days from Today (null|0 = Today) Showtimes searched. * * @throws \Exception * * @return mixed|null */ public function queryShowtimesByMovieNear($movieTitle, $nearLocation, $lang = 'en', $dateOffset = null) { // http://google.com/movies?near=Thun&hl=de&q=jurassic+world $dataResponse = $this->getData($nearLocation, $movieTitle, null, null, $lang); $days = []; /** @var Movie $movie */ $movie = null; if ($dataResponse) { $dayDate = Carbon::now(); $dayDate->setTime(0, 0, 0); $crawler = $dataResponse->getCrawler(); $parser = new ShowtimeParser($crawler); $movies = $parser->parseMovies(false); if ($movies == null) { return null; } //TODO: handle multiple movies found on one page $movie = $movies[0]; if ($movie->getMid() == null) { //Dirty but didn't found better way... $link = $parser->getFirstLeftNavLink(); $movie->setMid(ParseHelper::getParamFromLink($link->attr('href'), 'mid')); } $days[] = $parser->getShowtimeDayByMovie($dayDate->copy()); for ($i = $dateOffset + 1; $i < 20; $i++) { $dataResponse = $this->getData($nearLocation, null, $movie->getMid(), null, $lang, $i); $parser = new ShowtimeParser($dataResponse->getCrawler()); $result = $parser->getShowtimeDayByMovie($dayDate->addDay(1)->copy()); if ($result == null) { break; } else { $days[] = $result; } } } $movie->setTheaterShowtimeDays($days); return $movie; }
/** * Returns Showtimes near a location. * * @param string $near * @param string $lang * @param null $dateOffset * * @throws \Exception * * @return mixed */ public function getMoviesNear($near, $lang = 'en', $dateOffset = null, $includeShowtimes = true) { //http://google.com/movies?near=New%20York&hl=en&sort=1 //http://google.com/movies?near=New%20York&hl=en&sort=1&start=10 $dataResponse = $this->getData($near, null, null, null, $lang, null, null, 1); $movies = []; if ($dataResponse) { $crawler = $dataResponse->getCrawler(); $parser = new ShowtimeParser($crawler); $movies = $parser->parseMovies($includeShowtimes); $navBarPageLinks = $crawler->filter('#navbar a'); $furtherPages = $navBarPageLinks->each(function (Crawler $node, $i) { return $temp = ParseHelper::getParamFromLink($node->attr('href'), 'start'); }); $furtherPages = array_unique($furtherPages); foreach ($furtherPages as $page) { $dataResponse = $this->getData($near, null, null, null, $lang, null, $page, 1); if ($dataResponse) { $parser = new ShowtimeParser($dataResponse->getCrawler()); $pageMovies = $parser->parseMovies($includeShowtimes); $movies = array_merge($movies, $pageMovies); } } } return $movies; }