FXMLbaseparser
Содержание
PHP класс упрощающий верстку кода для Fork browser
Смотреть fxmlbaseparser.php с тестовым использованием кода сторонней страницы для парсинга
<?php // Можно сохранить в отдельном файле fxmlbaseparser.php и использовать во всех проектах через include "fxmlbaseparser.php"; header('Access-Control-Allow-Origin: *'); header("Access-Control-Allow-Methods: POST, GET, OPTIONS"); header("Access-Control-Allow-Headers: Accept, Content-Type"); if($_SERVER['REQUEST_METHOD']=='OPTIONS') exit; class fxmlBaseParser{ public $actual_page; public $_PL = []; public function getScheme(){ $scheme = $_SERVER['REQUEST_SCHEME'] ?? 'http'; if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) { $scheme = $_SERVER['HTTP_X_FORWARDED_PROTO']; } elseif (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') { $scheme = 'https'; } return $scheme; } public function __construct(){ $requesturl = $this->getScheme()."://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; $this->actual_page = preg_replace("/([\?&](w_lang|box_client|get_callback)=.*)/", "", $requesturl); $this->BASE=$this->getScheme()."://$_SERVER[HTTP_HOST]"; } public function sU($u,$d=""){ if (!$u) return $d; if (!$d) return $u; // Разделяем URL и данные POST-запроса $ur = explode("#POST", $u); $dr = explode("#POST", $d); // Если URL начинается с 'curl', возвращаем его if (strpos($u, "curl") === 0) return $u; // Добавляем "?" или "&" для параметров $ur[0] .= (strpos($ur[0], "?") === false) ? "?" : "&"; $ur[0] .= $dr[0]; // Обрабатываем данные POST-запроса if (!empty($ur[1]) || !empty($dr[1])) { $ur[0] .= "#POST" . ($ur[1] ?? '') . (($ur[1] && $dr[1]) ? "&" : "") . ($dr[1] ?? ''); } return $ur[0]; } public function getParse($url,$crs="android|direct|rf",$id=0){ $xdata="s$id"; if(isset($_POST[$xdata])|| ($_SERVER["REQUEST_METHOD"]=="POST"&&isset($_GET["get_url"]))){ return $_POST[$xdata]; } else{ $post=$this->sU($this->actual_page,"get_url=".urlencode($url)."#POST$xdata=%s"); $prs=["parse"=>"$url","cors"=>$crs,"fastremote"=>false,"async"=>["post"=>$post]]; print json_encode($prs); exit; } } public function add($ch) { if ($ch === null) return; // Установка флага с переносом строки if (isset($ch["br"])) $this->withbr = true; // Объединение значений с addbefore и noaddbr, если они установлены if ($this->addbefore !== null) { $ch["before"] = $this->addbefore . $ch["before"]; $this->addbefore = null; } if ($this->noaddbr !== null) { $ch["noaddbr"] = $this->noaddbr; $this->noaddbr = null; } // Замена ключей foreach (["url" => "playlist_url", "stream" => "stream_url", "icon" => "logo_30x30"] as $old => $new) { if (isset($ch[$old])) { $ch[$new] = $ch[$old]; unset($ch[$old]); } } // Установка логотипа по умолчанию if (!isset($ch["logo_30x30"])) $ch["logo_30x30"] = "none"; // Добавление BASE к относительным путям $this->addBaseToPaths($ch, ["url", "playlist_url", "stream", "stream_url", "parser", "presearch"], $this->BASE); // Обработка меню и подменю if (isset($ch["menu"])) $this->addBaseToPaths($ch["menu"], ["playlist_url"], $this->BASE); if (isset($ch["submenu"])) $this->addBaseToPaths($ch["submenu"], ["logo_30x30" => $this->BASEICON, "playlist_url", "stream_url", "parser"], $this->BASE); // Обработка подтверждений if (isset($ch["confirm"])) $this->addBaseToPaths($ch["confirm"], [], $this->BASE); // Добавление иконок $this->addBaseToPaths($ch, ["logo_30x30"], $this->BASEICON); // Добавляем канал в список $this->_PL["channels"][] = $ch; } private function addBaseToPaths(&$array, $fields, $base) { foreach ($fields as $field => $customBase) { $baseToUse = is_string($field) ? $customBase : $base; $key = is_string($field) ? $field : $customBase; if (isset($array[$key]) && strpos($array[$key], "/") === 0) { $array[$key] = $baseToUse . $array[$key]; } } } public function render() { // Добавляем BASE к относительным путям иконки $this->addBaseToPaths($this->_PL, ["icon"], $this->BASE); // Добавляем BASE к относительным путям в меню if (is_array($this->_PL["menu"])) { foreach ($this->_PL["menu"] as $kk => $vv) { $this->addBaseToPaths($this->_PL["menu"][$kk], ["url", "playlist_url", "stream", "stream_url", "parser"], $this->BASE); } } // Добавление сообщения об FXML и вывод JSON $this->_PL = array_merge(["fxml" => "This page contains FXML code from PHP generator fxmlBaseParser class! Open it in the Fork browser or any other browser that supports FXML code."], $this->_PL); echo json_encode($this->_PL); return $this; } } $FXML=new fxmlBaseParser(); // Удалите этот блок, если не нужен тест. Он добавляет кнопку "Test" в плейлист и выводит результат парсинга в виде HTML-кода при нажатии на кнопку. if(@$_GET["mode"]=="test"){ $link="https://api.ninsel.ws/embed/movie/1212"; $html= $FXML->getParse($link,"android|direct|rf"); $FXML->add(["title"=>"Result parse","description"=>htmlspecialchars($html)]); } else $FXML->add(["title"=>"Test","playlist_url"=>$FXML->actual_page."?mode=test","description"=>$FXML->actual_page]); $FXML->render(); ?>
Еще примеры использования fxmlbaseparser.php
Вывод списка категорий
<?php // Подключаем библиотеку fxmlbaseparser.php include 'fxmlbaseparser.php'; // Используем экземпляр класса fxmlBaseParser // Можно задать свою базовую директорию если она неправильно определилась (без / в конце) $FXML->BASE="http://site.com/parsers" $FXML->add(["title"=>"Category 1","playlist_url"=>"/?category=1"]; $FXML->add(["title"=>"Category 2","playlist_url"=>"/?category=2"]; $FXML->render();
Добавление меню
Пример кода для добавления меню
<?php // Подключаем библиотеку fxmlbaseparser.php include 'fxmlbaseparser.php'; // Создаем экземпляр класса FXMLBaseParser $FXML = new FXMLBaseParser(); // Добавляем категории $FXML->add(["title" => "Category 1", "playlist_url" => "/?category=1"]); $FXML->add(["title" => "Category 2", "playlist_url" => "/?category=2"]); // Добавляем меню $FXML->_PL["menu"][]=["title" => "Home", "playlist_url" => "/"]; $FXML->_PL["menu"][]=["title" => "About", "playlist_url" => "/?mode=about"]; // Генерируем и выводим FXML код $FXML->render(); ?>