/**
  * @param string $date date in yyyy-mm-dd form
  * @param string $time time in HH:MM form
  * @param int $offset in minutes
  * @return \DateTime
  */
 private function getDateTime($date, $time, $offset = 0)
 {
     $dateTime = new \DateTime("{$date} {$time}", $this->dateTimeZone);
     if ($offset) {
         $subtract = $offset < 0;
         $interval = new \DateInterval('PT' . abs($offset) . 'M');
         $dateTime = $subtract ? $dateTime->sub($interval) : $dateTime->add($interval);
     }
     \SystemLogger::info('Time: Generated', $date, $time, $dateTime->format('c'));
     return $dateTime;
 }
 protected function extractShowtimes($pageData)
 {
     $startTime = microtime(true);
     \SystemLogger::debug('Extraction of page started, total length = ', strlen($pageData));
     \SystemLogger::debug('Loading into QueryPath');
     $imdbPage = QueryPath::withHTML($pageData);
     \SystemLogger::debug('Query Path done loading...');
     \SystemLogger::debug(__CLASS__, "Extracting theatres...");
     //$cinemasList = $imdbPage->find("#cinemas-at-list .list_item.odd, #cinemas-at-list .list_item.even");
     $cinemasList = $imdbPage->find("#cinemas-at-list > .list_item");
     \SystemLogger::debug(__CLASS__, "Found: ", $cinemasList->count(), "cinemas");
     $theatreMovieShowtimes = array();
     if ($cinemasList) {
         for ($i = 0; $i < ShowtimeService::THEATRE_LIMIT && $i < $cinemasList->count(); $i++) {
             \SystemLogger::debug('Processing theatre at position: ', $i);
             /* @var $cinemaDiv DOMQuery */
             $cinemaDiv = new DOMQuery($cinemasList->get($i));
             $theatreData = array();
             $theatreTitle = $cinemaDiv->find('h3')->first();
             \SystemLogger::info("{$i}. Theatre: ", $theatreTitle->text());
             if (!$theatreTitle) {
                 \SystemLogger::debug(__CLASS__, "No theatre found");
                 continue;
             }
             $theatreData['name'] = trim($theatreTitle->text());
             $addressSpanTmp = $cinemaDiv->find('.address div');
             $addressSpan = $addressSpanTmp ? preg_replace('/\\s+/', ' ', $addressSpanTmp->text()) : "";
             $theatreData['address'] = trim(explode('|', $addressSpan)[0]);
             $movieDomList = $cinemaDiv->find('.list_item');
             \SystemLogger::info(__CLASS__, "Number of Movies = ", $movieDomList->count());
             if (!count($movieDomList)) {
                 \SystemLogger::debug(__CLASS__, "No movies found");
                 continue;
             }
             $theatreMovieShowtimes[] = array('theatre' => $theatreData, 'movies' => $this->extractMovies($movieDomList));
             \SystemLogger::debug('--Theatre extraction completed---');
         }
     }
     \SystemLogger::debug('Showtimes extraction completed in :', microtime(true) - $startTime);
     //var_dump($theatreMovieShowtimes);exit;
     return $theatreMovieShowtimes;
 }
 /**
  * @param Theatre $theatre
  * @return bool|mixed|\mysqli_result
  */
 public static function setTheatreLatLng(Theatre $theatre)
 {
     //51.4752267,-0.2396438
     \SystemLogger::info("Finding LongLat for: ", $theatre->name, $theatre->address);
     $geocode = LocationService::instance()->addressLookup($theatre->address, [], true);
     $saved = false;
     if ($geocode) {
         $geoLocation = $geocode->getGeocode();
         \SystemLogger::info("Found Geocode: ", strval($geoLocation));
         $saved = $theatre->update(['longitude' => $geoLocation->getLongitude(), 'latitude' => $geoLocation->getLatitude()], 'id');
     }
     return $saved;
 }
 public static function cleanPbis()
 {
     $staleDate = strtotime("-4 days");
     $files = glob(CACHE_DIR . "/*");
     $removed = 0;
     foreach ($files as $file) {
         \SystemLogger::info("Looking at: ", $file);
         if (filemtime($file) < $staleDate && unlink($file)) {
             \SystemLogger::info("\tRemoved file: ", $file);
             $removed++;
         }
     }
     return $removed;
 }
 private function extractTheatreMovieShowtimes($pageData, $limit, &$totalPages)
 {
     $startTime = microtime(true);
     \SystemLogger::debug("Begining extraction of data from file, size = ", strlen($pageData));
     if ($limit <= 0) {
         \SystemLogger::warn("Invalid limit was supplied: ", $limit);
         return array();
     }
     \SystemLogger::debug('Attempting to load into Query Path');
     /* @var $moviePage DOMQuery */
     $moviePage = \QueryPath::withHTML($pageData, null, array('convert_to_encoding' => "UTF-8", 'convert_from_encoding' => "UTF-8"));
     \SystemLogger::debug('Loaded into QueryPath');
     /* @var $theatersDom DOMQuery */
     $theatersDom = $moviePage->find("div.theater");
     //get total pages
     $paginationDom = $moviePage->find("#navbar td");
     $totalPages = $paginationDom->length ? $paginationDom->length - 2 : 1;
     \SystemLogger::debug("Found", $theatersDom->length, "theatres");
     $theatreCinemas = array();
     $foundTheatres = 0;
     \SystemLogger::debug('Loading data from Theatres DOM list');
     for ($i = 0; $i < $theatersDom->length && $foundTheatres < $limit; $i++) {
         $theatre = array();
         $theatreDom = new DOMQuery($theatersDom->get($i));
         $theatre['name'] = trim($theatreDom->find("h2.name")->first()->text());
         if (!$theatre['name']) {
             \SystemLogger::warn("Found no theatre at dom level: ", $i);
             continue;
         }
         \SystemLogger::debug("processing theatre: ", $theatre['name']);
         $addressText = $theatreDom->find(".info")->first()->text();
         //echo  $addressText, "<br>";
         $tmp = explode(" - ", trim($addressText));
         array_pop($tmp);
         $theatre['address'] = join(' ', $tmp);
         $theatreCinemas[] = array('theatre' => $theatre, 'movies' => $this->extractMovieShowtimes($theatreDom));
         $foundTheatres++;
     }
     \SystemLogger::info('Extraction done, completed in ', microtime(true) - $startTime, 'ms');
     return $theatreCinemas;
 }
 public function doPreload()
 {
     $version = $this->currentVersion;
     if ($this->geocode) {
         $status = $this->showtimeService->loadData($this->geocode, $this->currentDate, false, $this->dateOffset);
         \SystemLogger::info("PreloadStatus: ", $status);
     }
     $this->result['status'] = $status;
     $this->result['version'] = $version;
 }