/**
  * @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;
 }
Esempio n. 5
0
 /**
  * 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;
 }
Esempio n. 6
0
 /**
  * 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;
 }