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