/** * 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 found by a search for a movie title. * * @param string $near * @param string $name * @param string $lang * @param null $dateOffset * * @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 = []; $movie = null; if ($dataResponse) { $dayDate = Carbon::now(); $dayDate->setTime(0, 0, 0); $crawler = $dataResponse->getCrawler(); $parser = new ShowtimeParser($crawler); $movies = $parser->parseMovies(false); //TODO: Replace by handeles multiple movies in results! $movie = $movies[0]; if (count($movies) > 1) { throw new \Exception('more than one movie in search results are not supported yet!'); } else { //Dirty but didn't found better way... $midHref = $crawler->filter('#left_nav a')->first()->attr('href'); $movie->setMid(ParseHelper::getParamFromLink($midHref, 'mid')); } $days[] = $parser->getShowtimeDayByMovie($dayDate->copy()); for ($i = $dateOffset + 1; $i < 20; $i++) { $dataResponse = $this->getData($near, $name, null, 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; }