function find_cinemas_brazil() { $start = microtime(true); $cinemas_br = Env::path('temp/brasil.json'); $cinemas_br = file_get_contents($cinemas_br); $cinemas_br = json_decode($cinemas_br); //loop em todos os estados e cidades do estado $new_cinemas = array(); $invalid_cinemas = array(); foreach ($cinemas_br as $value) { $estado = $value->nome; $uf = $value->codigo; $cidades = $value->cidades; $cinema_finder = new CinemaFinder('br', $uf, $cidades); $cinemas = $cinema_finder->get_all_cinemas(); $template = new CinemaTemplate(); foreach ($cinemas as $cinema) { $base_dir = "cinema/br/"; //passa o codigo do estado temporariamente para depois alterar e verificar se o cinema é realmente desse local $cinema->state_code = $uf; $template->create($base_dir, $cinema); } $new_cinemas = array_merge($new_cinemas, $template->get_new_cinemas()); $invalid_cinemas = array_merge($invalid_cinemas, $template->get_invalid_cinemas()); } $total = Helper::elapsed_time($start); Log::write("Tempo total procurando cinemas: {$total}"); Sendmail::to_admin(count($new_cinemas) . " cinemas novos", $new_cinemas); Sendmail::to_admin(count($invalid_cinemas) . " cinemas sem cidade", $invalid_cinemas); }
function update_showtimes() { $start = microtime(true); $path = Env::path() . 'cinema/br'; $cinemas = Helper::get_file_list($path); $updated = array(); $invalid = array(); $erros = array(); foreach ($cinemas as $value) { $classname = basename($value, '.php'); try { if (class_exists($classname)) { $cinema_class = new $classname(); $cinema = $cinema_class->update(); if (!empty($cinema)) { $updated[] = $cinema; if ($cinema->status == 'INVALID') { $invalid[] = $cinema; } } } } catch (Exception $e) { $erros[] = $classname . ' - ' . $e->getMessage(); } } if (count($updated) > 0) { callback_subscribers($updated); Sendmail::to_admin(count($updated) . " cinemas atualizados", $updated); } Sendmail::to_admin(count($invalid) . " cinemas invalidos", $invalid); Sendmail::to_admin(count($erros) . " erros atualizando cinemas", $erros); $total = Helper::elapsed_time($start); Log::write("Tempo total atualizando cinemas: {$total}"); }
function xtest_get_file_list() { $path = Env::path() . 'cinema/br'; $files = Helper::get_file_list($path); echo "<pre>"; print_r($files); echo "</pre>"; }
public function test_find() { // $cinema_finder = new CinemaFinder('br','SP', array('Bauru')); // $cinemas = $cinema_finder->get_all_cinemas(); $dir = Env::path("cinema/br/"); echo $dir; if (Helper::recursive_file_exists('cine_araujo_bauru.php', $dir)) { echo "existe"; } // echo "<pre>"; // print_r($cinemas); // echo "</pre>"; //1. gera cinemas por todo o brasil com fallback para o google // //pega o json das cidades e faz loop em todas as cidades //no resultado de cada find cria a estrutura de diretorios se NÃO existir //para cada cinema gerar um class que é o fallback para o google movies... //cada classe de cinema tem q se registrar no couchdb para rodar via loop sem precisar navegar na estrutura //sempre que um cinema for chamado, browser ou via polling cron atualizar seu status no couchdb. //se no update executar e não tiver cinema remover do couchdb // $dir = "/cinema/br/sc/florianopolis/"; // // $template = new CinemaTemplate(); // // $arr = array("nome" => "GNC Iguatémi", "id" => "123", "endereco" => "endereco", "url" => "http://www.google.com.br/movies?near=porto+alegre,+rs,+bra&tid=8731d7134e5b461a"); // // $template->create($dir, $arr); // echo $file; // // file_put_contents($file, "ssss"); // $fh = fopen($myFile, 'w') or die("can't open file"); // $stringData = "Subject\n"; // fwrite($fh, $stringData); // $stringData = "Message\n"; // fwrite($fh, $stringData); // fclose($fh); //$template_class = file_get_contents($url_template); // $cinema_finder = new CinemaFinder('br','RS', 'Florianópolis'); // echo $cinema_finder->find(); //2. rotina de polling - update de horarios //loop em todos os cinemas registrados no couchdb, so rodar a classe dinamica... //gerar e armazenar hash md5 do cinema e horarios para comparar e so fazer push para clientes com novidades. //no couch guardar id do cinema como array [pais, estado, cidade] ou ver como filtrar por estrutura... TALVEZ... //chamar callback do cliente registrado passando a lista de cinemas com horarios novos //controle de erros quando cinema não retornar horarios, pensar em outras.. //3. Diariamente rodar o CinemaFinder usando o arquivo json de cidades para encontrar novos cinemas //para cada lista de cinemas por cidade retornada comparar com a ja existente no couchdb verificando o tid com o cinema do google e fazendo //reflexao para so validar os que implementar o googlemoviesadapter. o resultado disso cria a estrutura de dir e template como cinema novo e //notifica por email //quando pegar o cinema para gravar armazenar como literal estatico, tid do cinema, nome, endereco, e gps do endereco }
public static function transliterate($string) { static $i18n_loaded = false; static $translations = array(); if (!$i18n_loaded) { $path = Env::path('helper/i18n-ascii.txt'); if (is_file($path)) { $translations = parse_ini_file($path); } $i18n_loaded = true; } return strtr($string, $translations); }
/** * Automatically resize and create images on the fly. * If the image already exists then it's path is just passed back. * * $options: * - string "path" The path that the images reside in (default: "images/img") * - string "basename" The filename, without extension, of the image, the extension will be automatically established and appended * - string "filename" The filename, including extension, of the image. Either this or "basename" must be set * - int "width" The maximum width that the image can be, if the image is wider it will be resized (maintaining the same aspect ratio) * - int "height" The maximum height that the image can be, if the image is taller it will be resized (maintaining the same aspect ratio) * * @param array $options An array of options (see above) * * @return string */ public static function img($options = null) { $options = Helper::getOptions($options, ["path" => "images/img", "basename" => null, "filename" => null, "width" => null, "height" => null]); $path = $options["path"]; if ($path[0] == "/") { $fullpath = $path; } else { $fullpath = Env::path($path, Env::PATH_DOCUMENT_ROOT); } $filename = $options["filename"]; if ($basename = $options["basename"]) { $original = $fullpath . "/original/" . $basename; if (file_exists($original)) { if ($ext = static::getExtension($original)) { $filename = $basename . "." . $ext; copy($original, $fullpath . "/original/" . $filename); } } } if (!$filename) { throw new \Exception("No image filename provided to use"); } $original = $fullpath . "/original/" . $filename; if (!file_exists($original)) { throw new \Exception("Original image file does not exist (" . $original . ")"); } $w = $options["width"]; $h = $options["height"]; if (!$w && !$h) { return $path . "/original/" . $filename; } if ($w && $h) { $dir = "max" . $w . "x" . $h; } elseif ($w) { $dir = "width" . $w; } elseif ($h) { $dir = "height" . $h; } $fullpath .= "/" . $dir; $newfile = $fullpath . "/" . $filename; $newpath = $path . "/" . $dir . "/" . $filename; if (file_exists($newfile)) { return $newpath; } if (!is_dir($fullpath)) { mkdir($fullpath, 0777, true); } static::resize(["fromPath" => $original, "toPath" => $newfile, "width" => $w, "height" => $h]); return $newpath; }
private function new_template($dir, Cinema $cinema) { $nome = $cinema->name; $class = Helper::clean_string($nome, -1, '_'); $file = $class . '.php'; $tid = $cinema->id; //se ja tem uma classe para o cinema descarta entao //pesquisa classe com mesmo nome recursivo a partir do diretorio do estado... if (!Helper::recursive_file_exists($file, $dir)) { $temp_uf = $cinema->state_code; $cinema = $this->geo_cinema($cinema); $endereco = $cinema->address; $telefone = $cinema->phone; $url = $cinema->url; $lat = $cinema->lat; $long = $cinema->long; $cidade = $cinema->city; $estado = $cinema->state; $uf = $cinema->state_code; //esse if deve evitar o compartamente do google de procurar cinemas proximos tipo colocar volta redonda dentro de sp if (empty($uf)) { //se caiu aqui é pq o geocode do endereco do cine falhou entao usa a uf temp pelo menos para colocar o cine no dir correto $uf = $temp_uf; $path = $dir . $uf . '/'; } else { //bug do google maps if (Helper::clean_string($uf) == 'sao-paulo') { $uf = 'SP'; } $path = $dir . $uf . '/' . Helper::clean_string($cinema->city); } $path = strtolower($path); $this->create_dir($path); $tpl = Env::path('helper/CinemaClass.tpl'); if (!is_file($tpl)) { Log::write("Não achou {$tpl}"); exit(1); } //a classe do cinema fica sempre em cinema/uf/cidade/file.php $file = $path . '/' . $file; $handle = fopen($file, 'w'); if ($handle == false) { Log::write("Erro criando {$file}"); exit(1); } $cinema_class = file_get_contents($tpl); $content = str_replace("%class", $class, $cinema_class); $content = str_replace("%nome", $nome, $content); $content = str_replace("%id", $tid, $content); $content = str_replace("%endereco", $endereco, $content); $content = str_replace("%telefone", $telefone, $content); $content = str_replace("%cidade", $cidade, $content); $content = str_replace("%estado", $estado, $content); $content = str_replace("%uf", $uf, $content); $content = str_replace("%lat", $lat, $content); $content = str_replace("%long", $long, $content); $content = str_replace("%url", $url, $content); fwrite($handle, $content); fclose($handle); //guarda todos os novos cinemas criados para depois notificar via email para o admin controlar... //se não achou a cidade do cinema via geolocation vai colocar em um lugar errado, entao tem q notificar... $cinema_path = str_replace(Env::path(), "", $file); if (empty($cidade)) { $this->invalid_cinemas[] = $cinema_path; } else { $this->new_cinemas[] = $cinema_path; } } }