(function () {
'use strict';
var FLAG = 'lampa_p365x_plugin_started_v2';
if (window[FLAG]) return;
window[FLAG] = true;
var CFG = {
baseUrl: 'https://m.porno365x.space',
// Если прямой доступ блокируется CORS, укажи прокси URL:
// например: 'https://your-domain.tld/lampa/p365x?url='
proxyPrefix: '',
requestTimeoutMs: 15000
};
var STATE = {
items: [],
page: 1,
loading: false,
mounted: false
};
function qs(sel, root) { return (root || document).querySelector(sel); }
function ce(tag, cls, txt) {
var n = document.createElement(tag);
if (cls) n.className = cls;
if (typeof txt !== 'undefined' && txt !== null) n.textContent = txt;
return n;
}
function log(msg) {
try { console.log('[p365x] ' + msg); } catch (e) {}
}
function safeUrl(url) {
if (!CFG.proxyPrefix) return url;
return CFG.proxyPrefix + encodeURIComponent(url);
}
function requestText(url) {
return new Promise(function (resolve, reject) {
try {
var xhr = new XMLHttpRequest();
xhr.open('GET', safeUrl(url), true);
xhr.timeout = CFG.requestTimeoutMs;
xhr.onreadystatechange = function () {
if (xhr.readyState !== 4) return;
if (xhr.status >= 200 && xhr.status < 300) resolve(xhr.responseText || '');
else reject(new Error('HTTP ' + xhr.status));
};
xhr.ontimeout = function () { reject(new Error('TIMEOUT')); };
xhr.onerror = function () { reject(new Error('NETWORK')); };
xhr.send();
} catch (e) {
reject(e);
}
});
}
function extractCards(html) {
var out = [];
var re = /
([^<]+)<\/p>[\s\S]*?([^<]*)<\/span>/g;
var m;
while ((m = re.exec(html))) {
out.push({
id: m[1],
url: m[2].indexOf('http') === 0 ? m[2] : (CFG.baseUrl + m[2]),
poster: m[3],
title: (m[4] || '').trim(),
duration: (m[5] || '').trim()
});
}
return out;
}
function extractMp4(movieHtml) {
var all = [];
var re = /file\s*:\s*"([^"]+\.mp4[^"]*)"/g;
var m;
while ((m = re.exec(movieHtml))) all.push(m[1]);
if (!all.length) {
var v = movieHtml.match(/