{"id":5213,"date":"2026-07-23T14:45:47","date_gmt":"2026-07-23T14:45:47","guid":{"rendered":"https:\/\/nophal.com\/?page_id=5213"},"modified":"2026-07-23T15:12:24","modified_gmt":"2026-07-23T15:12:24","slug":"apps","status":"publish","type":"page","link":"https:\/\/nophal.com\/en\/apps\/","title":{"rendered":"Apps"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"5213\" class=\"elementor elementor-5213\" data-elementor-settings=\"[]\">\n\t\t\t\t\t\t<div class=\"elementor-inner\">\n\t\t\t\t\t\t\t<div class=\"elementor-section-wrap\">\n\t\t\t\t\t\t\t<div class=\"elementor-section elementor-top-section elementor-element elementor-element-f632b78 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"f632b78\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t\t\t<div class=\"elementor-row\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-\" data-id=\"\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-column-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element- elementor-widget elementor-widget-text-editor\" data-id=\"\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-text-editor elementor-clearfix\">\n\t\t\t\t<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,600;0,9..144,700;1,9..144,500&#038;family=Inter:wght@400;500;600;700&#038;display=swap\" rel=\"stylesheet\">\n<style>\n  #streamfinder-app {\n    --bg: #12141c;\n    --surface: #1b1e2a;\n    --surface-raised: #232738;\n    --gold: #e8b23d;\n    --teal: #4fa3ae;\n    --cream: #f2efe9;\n    --muted: #8b8fa3;\n    --coral: #e1614f;\n    --line: rgba(242,239,233,0.10);\n    --radius: 14px;\n    font-size: 16px;\n  }\n\n  #streamfinder-app, #streamfinder-app * { box-sizing: border-box; }\n\n  #streamfinder-app {\n    margin: 0;\n    background:\n      radial-gradient(ellipse 1200px 600px at 50% -10%, rgba(232,178,61,0.08), transparent 60%),\n      var(--bg);\n    color: var(--cream);\n    font-family: 'Inter', sans-serif;\n    min-height: 100vh;\n    padding-bottom: 4rem;\n  }\n\n  #streamfinder-app .wrap {\n    max-width: 780px;\n    margin: 0 auto;\n    padding: 0 1.25rem;\n  }\n\n  \/* ---------- Marquee header ---------- *\/\n  #streamfinder-app header.marquee {\n    padding: 3rem 0 1.5rem;\n    text-align: center;\n    position: relative;\n  }\n\n  #streamfinder-app .marquee-bulbs {\n    display: flex;\n    justify-content: center;\n    gap: 10px;\n    margin-bottom: 0.85rem;\n  }\n  #streamfinder-app .marquee-bulbs span {\n    width: 6px; height: 6px;\n    border-radius: 50%;\n    background: var(--gold);\n    opacity: 0.35;\n    animation: sf-blink 2.4s infinite ease-in-out;\n  }\n  #streamfinder-app .marquee-bulbs span:nth-child(odd) { animation-delay: 0.6s; }\n  #streamfinder-app .marquee-bulbs span:nth-child(3n) { animation-delay: 1.2s; }\n  @keyframes sf-blink {\n    0%, 100% { opacity: 0.25; }\n    50% { opacity: 0.9; }\n  }\n  @media (prefers-reduced-motion: reduce) {\n    #streamfinder-app .marquee-bulbs span { animation: none; opacity: 0.6; }\n  }\n\n  #streamfinder-app h1.title {\n    font-family: 'Fraunces', serif;\n    font-weight: 700;\n    font-size: clamp(2.4rem, 7vw, 3.4rem);\n    letter-spacing: -0.01em;\n    margin: 0;\n    line-height: 1;\n  }\n  #streamfinder-app h1.title .accent { color: var(--gold); font-style: italic; font-weight: 500; }\n\n  #streamfinder-app .subtitle {\n    color: var(--muted);\n    font-size: 0.95rem;\n    margin-top: 0.6rem;\n    letter-spacing: 0.01em;\n  }\n\n  \/* ---------- Search ---------- *\/\n  #streamfinder-app .ticket {\n    margin-top: 2rem;\n    background: var(--surface);\n    border: 1px solid var(--line);\n    border-radius: var(--radius);\n    padding: 0.4rem 0.4rem 0.4rem 1.1rem;\n    display: flex;\n    align-items: center;\n    gap: 0.6rem;\n    position: relative;\n  }\n  #streamfinder-app .ticket::before, #streamfinder-app .ticket::after {\n    content: \"\";\n    position: absolute;\n    width: 20px; height: 20px;\n    background: var(--bg);\n    border-radius: 50%;\n    top: 50%;\n    transform: translateY(-50%);\n  }\n  #streamfinder-app .ticket::before { left: -10px; }\n  #streamfinder-app .ticket::after { right: -10px; }\n\n  #streamfinder-app .ticket input[type=\"text\"] {\n    flex: 1;\n    background: transparent;\n    border: none;\n    outline: none;\n    color: var(--cream);\n    font-family: 'Inter', sans-serif;\n    font-size: 1.05rem;\n    padding: 0.85rem 0;\n  }\n  #streamfinder-app .ticket input::placeholder { color: var(--muted); }\n\n  #streamfinder-app .ticket .go {\n    background: var(--gold);\n    color: #1a1608;\n    border: none;\n    border-radius: 10px;\n    padding: 0.7rem 1.1rem;\n    font-weight: 700;\n    font-size: 0.85rem;\n    letter-spacing: 0.03em;\n    text-transform: uppercase;\n    cursor: pointer;\n    flex-shrink: 0;\n  }\n  #streamfinder-app .ticket .go:active { transform: translateY(1px); }\n\n  #streamfinder-app .search-hint {\n    font-size: 0.8rem;\n    color: var(--muted);\n    margin-top: 0.6rem;\n    padding-left: 0.3rem;\n  }\n\n  \/* ---------- API key panel ---------- *\/\n  #streamfinder-app .key-panel {\n    background: var(--surface);\n    border: 1px solid var(--line);\n    border-radius: var(--radius);\n    padding: 1.4rem 1.4rem;\n    margin-top: 2rem;\n  }\n  #streamfinder-app .key-panel h2 {\n    font-family: 'Fraunces', serif;\n    font-size: 1.3rem;\n    margin: 0 0 0.4rem;\n  }\n  #streamfinder-app .key-panel p {\n    color: var(--muted);\n    font-size: 0.88rem;\n    line-height: 1.55;\n    margin: 0 0 1rem;\n  }\n  #streamfinder-app .key-panel a { color: var(--teal); }\n  #streamfinder-app .key-row {\n    display: flex;\n    gap: 0.6rem;\n  }\n  #streamfinder-app .key-row input {\n    flex: 1;\n    background: var(--surface-raised);\n    border: 1px solid var(--line);\n    border-radius: 10px;\n    padding: 0.7rem 0.9rem;\n    color: var(--cream);\n    font-family: 'Inter', monospace;\n    font-size: 0.85rem;\n  }\n  #streamfinder-app .key-row input:focus { outline: 1px solid var(--gold); }\n  #streamfinder-app .key-row button {\n    background: var(--gold);\n    border: none;\n    border-radius: 10px;\n    padding: 0.7rem 1.2rem;\n    font-weight: 700;\n    font-size: 0.85rem;\n    color: #1a1608;\n    cursor: pointer;\n  }\n\n  #streamfinder-app .key-status {\n    margin-top: 2rem;\n    text-align: center;\n  }\n  #streamfinder-app .key-status button {\n    background: none;\n    border: 1px solid var(--line);\n    color: var(--muted);\n    padding: 0.4rem 0.8rem;\n    border-radius: 20px;\n    font-size: 0.75rem;\n    cursor: pointer;\n    font-family: 'Inter', sans-serif;\n  }\n  #streamfinder-app .key-status button:hover { color: var(--cream); border-color: var(--muted); }\n\n  \/* ---------- Disambiguation results ---------- *\/\n  #streamfinder-app .results-label {\n    margin-top: 2.2rem;\n    font-size: 0.78rem;\n    text-transform: uppercase;\n    letter-spacing: 0.08em;\n    color: var(--muted);\n    padding-left: 0.2rem;\n  }\n  #streamfinder-app .results-label .q { color: var(--gold); font-style: normal; }\n\n  #streamfinder-app .result-grid {\n    margin-top: 0.9rem;\n    display: grid;\n    grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));\n    gap: 0.9rem;\n  }\n\n  #streamfinder-app .result-card {\n    background: var(--surface);\n    border: 1px solid var(--line);\n    border-radius: 12px;\n    overflow: hidden;\n    cursor: pointer;\n    text-align: left;\n    padding: 0;\n    transition: transform 0.15s ease, border-color 0.15s ease;\n  }\n  #streamfinder-app .result-card:hover { transform: translateY(-3px); border-color: var(--gold); }\n  #streamfinder-app .result-card .poster {\n    width: 100%;\n    aspect-ratio: 2\/3;\n    background: var(--surface-raised) center\/cover no-repeat;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    color: var(--muted);\n    font-size: 0.7rem;\n    text-align: center;\n    padding: 0.5rem;\n  }\n  #streamfinder-app .result-card .info { padding: 0.6rem 0.65rem 0.75rem; }\n  #streamfinder-app .result-card .name {\n    font-family: 'Fraunces', serif;\n    font-weight: 600;\n    font-size: 0.92rem;\n    line-height: 1.2;\n    margin: 0 0 0.25rem;\n  }\n  #streamfinder-app .result-card .meta {\n    font-size: 0.72rem;\n    color: var(--muted);\n    display: flex;\n    justify-content: space-between;\n  }\n  #streamfinder-app .result-card .meta .type-tag {\n    background: rgba(79,163,174,0.18);\n    color: var(--teal);\n    padding: 0.1rem 0.4rem;\n    border-radius: 5px;\n    font-weight: 600;\n    letter-spacing: 0.02em;\n  }\n\n  \/* ---------- Selected title ---------- *\/\n  #streamfinder-app .title-header {\n    margin-top: 2.4rem;\n    display: flex;\n    gap: 1.1rem;\n    align-items: flex-start;\n    border-bottom: 1px solid var(--line);\n    padding-bottom: 1.6rem;\n  }\n  #streamfinder-app .title-header .poster {\n    width: 92px;\n    flex-shrink: 0;\n    aspect-ratio: 2\/3;\n    border-radius: 8px;\n    background: var(--surface-raised) center\/cover no-repeat;\n  }\n  #streamfinder-app .title-header .txt { flex: 1; }\n  #streamfinder-app .title-header .back {\n    background: none;\n    border: none;\n    color: var(--muted);\n    font-size: 0.78rem;\n    cursor: pointer;\n    padding: 0;\n    margin-bottom: 0.5rem;\n    font-family: 'Inter', sans-serif;\n  }\n  #streamfinder-app .title-header .back:hover { color: var(--gold); }\n  #streamfinder-app .title-header h2 {\n    font-family: 'Fraunces', serif;\n    font-size: 1.7rem;\n    margin: 0 0 0.3rem;\n    line-height: 1.1;\n  }\n  #streamfinder-app .title-header .sub {\n    color: var(--muted);\n    font-size: 0.85rem;\n  }\n\n  \/* ---------- Platforms & stamps ---------- *\/\n  #streamfinder-app .platform-list {\n    margin-top: 1.8rem;\n    display: flex;\n    flex-direction: column;\n    gap: 1.4rem;\n  }\n  #streamfinder-app .platform-block {\n    background: var(--surface);\n    border: 1px solid var(--line);\n    border-radius: var(--radius);\n    padding: 1.1rem 1.2rem 1.3rem;\n  }\n  #streamfinder-app .platform-block .p-head {\n    display: flex;\n    align-items: center;\n    gap: 0.7rem;\n    margin-bottom: 0.9rem;\n  }\n  #streamfinder-app .platform-block .p-logo {\n    width: 34px; height: 34px;\n    border-radius: 8px;\n    background: var(--surface-raised) center\/cover no-repeat;\n    flex-shrink: 0;\n  }\n  #streamfinder-app .platform-block .p-name {\n    font-family: 'Fraunces', serif;\n    font-weight: 600;\n    font-size: 1.05rem;\n  }\n  #streamfinder-app .platform-block .p-count {\n    margin-left: auto;\n    font-size: 0.72rem;\n    color: var(--muted);\n  }\n\n  #streamfinder-app .stamp-row {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 0.6rem;\n  }\n  #streamfinder-app .stamp {\n    display: flex;\n    align-items: center;\n    gap: 0.35rem;\n    border: 1.5px dashed rgba(232,178,61,0.45);\n    border-radius: 40px;\n    padding: 0.32rem 0.65rem 0.32rem 0.5rem;\n    font-size: 0.76rem;\n    color: var(--cream);\n    background: rgba(232,178,61,0.05);\n    transform: rotate(var(--r, 0deg));\n  }\n  #streamfinder-app .stamp .flag { font-size: 0.95rem; }\n  #streamfinder-app .stamp:nth-child(3n+1) { --r: -1.5deg; }\n  #streamfinder-app .stamp:nth-child(3n+2) { --r: 1deg; }\n  #streamfinder-app .stamp:nth-child(3n) { --r: -0.5deg; }\n\n  \/* ---------- States ---------- *\/\n  #streamfinder-app .state-box {\n    margin-top: 2.5rem;\n    text-align: center;\n    padding: 2.4rem 1.5rem;\n    color: var(--muted);\n  }\n  #streamfinder-app .state-box .big-emoji { font-size: 2rem; margin-bottom: 0.7rem; }\n  #streamfinder-app .state-box .msg { font-size: 0.95rem; line-height: 1.5; }\n  #streamfinder-app .state-box .msg strong { color: var(--cream); }\n  #streamfinder-app .state-box.error { color: var(--coral); }\n\n  #streamfinder-app .spinner {\n    width: 22px; height: 22px;\n    border-radius: 50%;\n    border: 2.5px solid var(--line);\n    border-top-color: var(--gold);\n    margin: 0 auto 0.9rem;\n    animation: sf-spin 0.8s linear infinite;\n  }\n  @keyframes sf-spin { to { transform: rotate(360deg); } }\n\n  #streamfinder-app .suggest-note {\n    margin-top: 2.2rem;\n    font-size: 0.85rem;\n    color: var(--muted);\n    text-align: center;\n    font-style: italic;\n  }\n\n  #streamfinder-app footer.note {\n    text-align: center;\n    color: var(--muted);\n    font-size: 0.72rem;\n    margin-top: 3rem;\n    line-height: 1.6;\n  }\n<\/style>\n<div id=\"streamfinder-app\">\n<div class=\"wrap\">\n\n  <header class=\"marquee\">\n    <div class=\"marquee-bulbs\">\n      <span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span>\n    <\/div>\n    <h1 class=\"title\">Stream<span class=\"accent\">Finder<\/span><\/h1>\n    <p class=\"subtitle\">Busca un t\u00edtulo. Descubre en qu\u00e9 pa\u00edses est\u00e1 en streaming.<\/p>\n  <\/header>\n\n  <div id=\"searchArea\">\n    <div class=\"ticket\">\n      <input id=\"searchInput\" type=\"text\" placeholder=\"Ej. R\u00e1pido y Furioso, Breaking Bad...\" autocomplete=\"off\">\n      <button class=\"go\" id=\"searchBtn\">Buscar<\/button>\n    <\/div>\n    <div class=\"search-hint\">Solo se muestran plataformas por suscripci\u00f3n (no alquiler ni compra).<\/div>\n  <\/div>\n\n  <div id=\"resultsArea\"><\/div>\n\n<\/div>\n\n<script>\n(function(){\n  const TMDB_IMG_POSTER = 'https:\/\/image.tmdb.org\/t\/p\/w300';\n  const TMDB_IMG_LOGO = 'https:\/\/image.tmdb.org\/t\/p\/w92';\n\n  const apiKey = '0cdd6be5f6f785694408d50f3370cc3f';\n  let debounceTimer = null;\n\n  const searchArea = document.getElementById('searchArea');\n  const resultsArea = document.getElementById('resultsArea');\n  const searchInput = document.getElementById('searchInput');\n  const searchBtn = document.getElementById('searchBtn');\n\n  function countryFlag(code) {\n    if (!code || code.length !== 2) return '\ud83c\udff3\ufe0f';\n    const base = 127397;\n    return String.fromCodePoint(...[...code.toUpperCase()].map(c => c.charCodeAt(0) + base));\n  }\n\n  function countryName(code) {\n    try {\n      const dn = new Intl.DisplayNames(['es'], { type: 'region' });\n      return dn.of(code) || code;\n    } catch (e) {\n      return code;\n    }\n  }\n\n  function showLoading(msg) {\n    resultsArea.innerHTML = `\n      <div class=\"state-box\">\n        <div class=\"spinner\"><\/div>\n        <div class=\"msg\">${msg}<\/div>\n      <\/div>\n    `;\n  }\n\n  function showError(msg) {\n    resultsArea.innerHTML = `\n      <div class=\"state-box error\">\n        <div class=\"big-emoji\">\u26a0\ufe0f<\/div>\n        <div class=\"msg\">${msg}<\/div>\n      <\/div>\n    `;\n  }\n\n  async function tmdbFetch(path, params) {\n    const url = new URL('https:\/\/api.themoviedb.org\/3' + path);\n    url.searchParams.set('api_key', apiKey);\n    url.searchParams.set('language', 'es-MX');\n    Object.entries(params || {}).forEach(([k, v]) => url.searchParams.set(k, v));\n    const res = await fetch(url.toString());\n    if (res.status === 401) {\n      throw new Error('AUTH');\n    }\n    if (!res.ok) {\n      throw new Error('HTTP_' + res.status);\n    }\n    return res.json();\n  }\n\n  async function doSearch(query, isRetry) {\n    showLoading('Buscando \"' + query + '\"...');\n    try {\n      const data = await tmdbFetch('\/search\/multi', { query, include_adult: 'false' });\n      const items = (data.results || []).filter(r => r.media_type === 'movie' || r.media_type === 'tv');\n\n      if (items.length === 0 && !isRetry) {\n        \/\/ retry with a trimmed\/simplified query for a \"quisiste decir\" style suggestion\n        const simplified = query.split(' ').slice(0, Math.max(1, query.split(' ').length - 1)).join(' ');\n        if (simplified && simplified !== query) {\n          return doSearch(simplified, true);\n        }\n      }\n\n      if (items.length === 0) {\n        resultsArea.innerHTML = `\n          <div class=\"state-box\">\n            <div class=\"big-emoji\">\ud83d\udd0d<\/div>\n            <div class=\"msg\">No encontramos resultados para <strong>\"${query}\"<\/strong>.<br>Revisa la ortograf\u00eda o prueba con otro t\u00edtulo.<\/div>\n          <\/div>\n        `;\n        return;\n      }\n\n      renderResultGrid(items.slice(0, 12), query, isRetry);\n    } catch (err) {\n      handleFetchError(err);\n    }\n  }\n\n  function handleFetchError(err) {\n    if (err.message === 'AUTH') {\n      showError('Hubo un problema de autenticaci\u00f3n con TMDB. Intenta de nuevo m\u00e1s tarde.');\n    } else {\n      showError('Algo fall\u00f3 al conectar con TMDB. Revisa tu conexi\u00f3n e int\u00e9ntalo de nuevo.');\n    }\n  }\n\n  function renderResultGrid(items, query, wasRetry) {\n    const label = wasRetry\n      ? `\u00bfQuisiste decir algo como <span class=\"q\">\"${query}\"<\/span>?`\n      : `Resultados para <span class=\"q\">\"${query}\"<\/span>`;\n\n    const cards = items.map(item => {\n      const name = item.title || item.name || 'Sin t\u00edtulo';\n      const date = item.release_date || item.first_air_date || '';\n      const year = date ? date.slice(0, 4) : '\u2014';\n      const typeLabel = item.media_type === 'movie' ? 'Pel\u00edcula' : 'Serie';\n      const posterStyle = item.poster_path\n        ? `background-image:url('${TMDB_IMG_POSTER}${item.poster_path}')`\n        : '';\n      const posterFallback = item.poster_path ? '' : 'Sin p\u00f3ster';\n\n      return `\n        <button class=\"result-card\" data-id=\"${item.id}\" data-type=\"${item.media_type}\">\n          <div class=\"poster\" style=\"${posterStyle}\">${posterFallback}<\/div>\n          <div class=\"info\">\n            <p class=\"name\">${escapeHtml(name)}<\/p>\n            <div class=\"meta\">\n              <span>${year}<\/span>\n              <span class=\"type-tag\">${typeLabel}<\/span>\n            <\/div>\n          <\/div>\n        <\/button>\n      `;\n    }).join('');\n\n    resultsArea.innerHTML = `\n      <div class=\"results-label\">${label}<\/div>\n      <div class=\"result-grid\">${cards}<\/div>\n    `;\n\n    resultsArea.querySelectorAll('.result-card').forEach(card => {\n      card.addEventListener('click', () => {\n        loadTitle(card.dataset.id, card.dataset.type);\n      });\n    });\n  }\n\n  function escapeHtml(str) {\n    const d = document.createElement('div');\n    d.textContent = str;\n    return d.innerHTML;\n  }\n\n  async function loadTitle(id, mediaType) {\n    showLoading('Consultando plataformas...');\n    try {\n      const detailPath = mediaType === 'movie' ? `\/movie\/${id}` : `\/tv\/${id}`;\n      const providersPath = mediaType === 'movie' ? `\/movie\/${id}\/watch\/providers` : `\/tv\/${id}\/watch\/providers`;\n\n      const [detail, providers] = await Promise.all([\n        tmdbFetch(detailPath, {}),\n        tmdbFetch(providersPath, {})\n      ]);\n\n      renderTitleDetail(detail, providers, mediaType);\n    } catch (err) {\n      handleFetchError(err);\n    }\n  }\n\n  function renderTitleDetail(detail, providersData, mediaType) {\n    const name = detail.title || detail.name || 'Sin t\u00edtulo';\n    const date = detail.release_date || detail.first_air_date || '';\n    const year = date ? date.slice(0, 4) : '\u2014';\n    const typeLabel = mediaType === 'movie' ? 'Pel\u00edcula' : 'Serie';\n    const posterStyle = detail.poster_path\n      ? `background-image:url('${TMDB_IMG_POSTER}${detail.poster_path}')`\n      : '';\n\n    \/\/ group: providerId -> { name, logo, countries: [] }\n    const grouped = {};\n    const results = providersData.results || {};\n    Object.entries(results).forEach(([countryCode, entry]) => {\n      if (!entry.flatrate) return;\n      entry.flatrate.forEach(p => {\n        if (!grouped[p.provider_id]) {\n          grouped[p.provider_id] = { name: p.provider_name, logo: p.logo_path, countries: [] };\n        }\n        grouped[p.provider_id].countries.push(countryCode);\n      });\n    });\n\n    const providerBlocks = Object.values(grouped)\n      .sort((a, b) => b.countries.length - a.countries.length)\n      .map(p => {\n        const stamps = p.countries\n          .sort((a, b) => countryName(a).localeCompare(countryName(b), 'es'))\n          .map(cc => `\n            <span class=\"stamp\">\n              <span class=\"flag\">${countryFlag(cc)}<\/span>\n              ${escapeHtml(countryName(cc))}\n            <\/span>\n          `).join('');\n        const logoStyle = p.logo ? `background-image:url('${TMDB_IMG_LOGO}${p.logo}')` : '';\n        return `\n          <div class=\"platform-block\">\n            <div class=\"p-head\">\n              <div class=\"p-logo\" style=\"${logoStyle}\"><\/div>\n              <div class=\"p-name\">${escapeHtml(p.name)}<\/div>\n              <div class=\"p-count\">${p.countries.length} pa\u00eds${p.countries.length === 1 ? '' : 'es'}<\/div>\n            <\/div>\n            <div class=\"stamp-row\">${stamps}<\/div>\n          <\/div>\n        `;\n      }).join('');\n\n    const body = providerBlocks\n      ? `<div class=\"platform-list\">${providerBlocks}<\/div>`\n      : `\n        <div class=\"state-box\">\n          <div class=\"big-emoji\">\ud83c\udfac<\/div>\n          <div class=\"msg\">No disponible en streaming actualmente.<\/div>\n        <\/div>\n      `;\n\n    resultsArea.innerHTML = `\n      <div class=\"title-header\">\n        <div class=\"poster\" style=\"${posterStyle}\"><\/div>\n        <div class=\"txt\">\n          <button class=\"back\">\u2190 Nueva b\u00fasqueda<\/button>\n          <h2>${escapeHtml(name)}<\/h2>\n          <div class=\"sub\">${year} \u00b7 ${typeLabel}<\/div>\n        <\/div>\n      <\/div>\n      ${body}\n    `;\n\n    resultsArea.querySelector('.back').addEventListener('click', () => {\n      resultsArea.innerHTML = '';\n      searchInput.value = '';\n      searchInput.focus();\n    });\n  }\n\n  function triggerSearch() {\n    const q = searchInput.value.trim();\n    if (q.length < 2) return;\n    doSearch(q, false);\n  }\n\n  searchBtn.addEventListener('click', triggerSearch);\n  searchInput.addEventListener('keydown', e => {\n    if (e.key === 'Enter') triggerSearch();\n  });\n  searchInput.addEventListener('input', () => {\n    clearTimeout(debounceTimer);\n    const q = searchInput.value.trim();\n    if (q.length < 2) return;\n    debounceTimer = setTimeout(triggerSearch, 550);\n  });\n\n  searchInput.focus();\n})();\n<\/script>\n<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>StreamFinder Busca un t\u00edtulo. Descubre en qu\u00e9 pa\u00edses est\u00e1 en streaming. Buscar Solo se muestran plataformas por suscripci\u00f3n (no alquiler ni compra).<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-5213","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/nophal.com\/en\/wp-json\/wp\/v2\/pages\/5213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nophal.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/nophal.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/nophal.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nophal.com\/en\/wp-json\/wp\/v2\/comments?post=5213"}],"version-history":[{"count":4,"href":"https:\/\/nophal.com\/en\/wp-json\/wp\/v2\/pages\/5213\/revisions"}],"predecessor-version":[{"id":5218,"href":"https:\/\/nophal.com\/en\/wp-json\/wp\/v2\/pages\/5213\/revisions\/5218"}],"wp:attachment":[{"href":"https:\/\/nophal.com\/en\/wp-json\/wp\/v2\/media?parent=5213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}