FXMLbaseparser

Материал из Браузер Fork - Wiki
Перейти к: навигация, поиск

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();
?>