const XTREAM_USER_AGENT = 'VLC/3.0.20 (Linux; x86_64)'; let currentXtreamServerInfo = null; let xtreamData = { live: [], vod: [], series: [] }; let xtreamGroupSelectionResolver = null; function isXtreamUrl(url) { try { const parsedUrl = new URL(url); return parsedUrl.pathname.endsWith('/get.php') && parsedUrl.searchParams.has('username') && parsedUrl.searchParams.has('password'); } catch (e) { return false; } } function handleXtreamUrl(url) { try { const parsedUrl = new URL(url); const host = `${parsedUrl.protocol}//${parsedUrl.hostname}${parsedUrl.port ? ':' + parsedUrl.port : ''}`; const username = parsedUrl.searchParams.get('username'); const password = parsedUrl.searchParams.get('password'); let outputType = 'm3u_plus'; if (parsedUrl.searchParams.has('type')) { const typeParam = parsedUrl.searchParams.get('type'); if (typeParam === 'm3u_plus') outputType = 'm3u_plus'; } if (parsedUrl.searchParams.has('output')) { const outputParam = parsedUrl.searchParams.get('output'); if (outputParam === 'ts') outputType = 'ts'; else if (outputParam === 'hls' || outputParam === 'm3u8') outputType = 'hls'; } $('#xtreamHostInput').val(host); $('#xtreamUsernameInput').val(username); $('#xtreamPasswordInput').val(password); $('#xtreamOutputTypeSelect').val(outputType); $('#xtreamServerNameInput').val(''); $('#xtreamFetchEpgCheck').prop('checked', true); showXtreamConnectionModal(); if (typeof showNotification === 'function') showNotification("Datos de URL Xtream precargados en el modal.", "info"); } catch (e) { if (typeof showNotification === 'function') showNotification("URL Xtream inválida.", "error"); console.error("Error parsing Xtream URL:", e); } } async function showXtreamConnectionModal() { if (typeof dbPromise === 'undefined' || !dbPromise) { if (typeof showLoading === 'function') showLoading(true, 'Iniciando base de datos local...'); try { if (typeof openDB === 'function') await openDB(); } catch (error) { if (typeof showNotification === 'function') showNotification(`Error DB: ${error.message}`, 'error'); if (typeof showLoading === 'function') showLoading(false); return; } finally { if (typeof showLoading === 'function') showLoading(false); } } $('#xtreamConnectionModal').modal('show'); loadSavedXtreamServers(); } async function loadSavedXtreamServers() { if (typeof showLoading === 'function') showLoading(true, 'Cargando servidores Xtream guardados...'); try { const servers = typeof getAllXtreamServersFromDB === 'function' ? await getAllXtreamServersFromDB() : []; const $list = $('#savedXtreamServersList').empty(); if (!servers || servers.length === 0) { $list.append('