async function e(){let e=await fetch(`./data/radio-stations.json`);if(!e.ok)throw Error(`Failed to load radio stations: ${e.status}`);let t=await e.json();return Array.isArray(t)?t:[]}var t=[{name:`Austria`,code:`AT`},{name:`Belgium`,code:`BE`},{name:`Bulgaria`,code:`BG`},{name:`Cyprus`,code:`CY`},{name:`Czechia`,code:`CZ`},{name:`Denmark`,code:`DK`},{name:`Estonia`,code:`EE`},{name:`Finland`,code:`FI`},{name:`France`,code:`FR`},{name:`Germany`,code:`DE`},{name:`Greece`,code:`GR`},{name:`Russia`,code:`RU`},{name:`Hungary`,code:`HU`},{name:`Ireland`,code:`IE`},{name:`Italy`,code:`IT`},{name:`Japan`,code:`JP`},{name:`Latvia`,code:`LV`},{name:`Lithuania`,code:`LT`},{name:`Luxembourg`,code:`LU`},{name:`Malta`,code:`MT`},{name:`Mexico`,code:`MX`},{name:`Netherlands`,code:`NL`},{name:`Poland`,code:`PL`},{name:`Brazil`,code:`BR`},{name:`Portugal`,code:`PT`},{name:`Romania`,code:`RO`},{name:`Croatia`,code:`HR`},{name:`Serbia`,code:`RS`},{name:`Montenegro`,code:`ME`},{name:`Bosnia & Herzegovina`,code:`BA`},{name:`Argentina`,code:`AR`},{name:`United Kingdom`,code:`GB`},{name:`Slovenia`,code:`SI`},{name:`Slovakia`,code:`SK`},{name:`Spain`,code:`ES`},{name:`USA`,code:`US`},{name:`Canada`,code:`CA`},{name:`Australia`,code:`AU`},{name:`China`,code:`CN`},{name:`Sweden`,code:`SE`},{name:`Switzerland`,code:`CH`},{name:`Turkey`,code:`TR`},{name:`Ukraine`,code:`UA`}];async function n(){let e=await fetch(`./stations.json`);if(!e.ok)throw Error(`Failed to load managed stations: ${e.status}`);let t=await e.json();return Array.isArray(t)?t:[]}var r=new Audio;r.preload=`none`;var i=`local`,a=null,o=null,s=!1,c=!1,l=null,u=[],d=0,f=!1,p=!1,m=.8,h=`all`,ee=``,g=`all`,_=`all`,v=0,te=1,y=`idle`,ne=``,b=``,x=!1,re=null,ie=null,ae=null,oe=12,se=[`shine-sweep`,`shine-glint`,`shine-flare`],ce=`./images/radio-placeholder.svg`,S=document.getElementById(`station-name`),C=document.getElementById(`station-subtitle`),le=document.getElementById(`now-playing`),ue=document.getElementById(`now-artist`),de=document.getElementById(`now-title`),w=document.getElementById(`status-text`),T=document.querySelector(`.status-dot`),E=document.getElementById(`engine-badge`);document.getElementById(`engine-label`);var fe=document.getElementById(`play-btn`),pe=document.getElementById(`icon-play`),me=document.getElementById(`icon-stop`),he=document.getElementById(`prev-btn`),ge=document.getElementById(`next-btn`),_e=document.getElementById(`volume-slider`),ve=document.getElementById(`volume-value`),ye=document.getElementById(`mute-btn`),be=document.getElementById(`icon-volume`),xe=document.getElementById(`icon-muted`),D=document.getElementById(`cast-overlay`),Se=document.getElementById(`close-overlay`),O=document.getElementById(`device-list`),k=document.getElementById(`artwork-coverflow-stage`),Ce=document.getElementById(`artwork-prev`),we=document.getElementById(`artwork-next`),A=document.querySelector(`.artwork-placeholder`),j=document.querySelector(`.station-logo-text`),M=document.getElementById(`station-logo-img`),N=document.getElementById(`station-library`),Te=document.querySelector(`.player-layout`),P=document.getElementById(`station-library-list`),F=document.getElementById(`station-library-summary`),Ee=document.getElementById(`station-search-input`),De=document.getElementById(`station-library-close`),Oe=document.getElementById(`station-category-list`),ke=document.querySelector(`[data-country-filter]`),Ae=document.getElementById(`station-country-filter-btn`),je=document.getElementById(`station-country-filter-menu`),Me=document.getElementById(`station-country-filter-text`),Ne=document.getElementById(`station-country-filter-flag`),Pe=document.getElementById(`station-library-pagination`),I=document.getElementById(`station-library-page-prev`),L=document.getElementById(`station-library-page-next`),R=document.getElementById(`station-library-page-info`),Fe=document.querySelectorAll(`[data-station-tab]`),Ie=document.getElementById(`install-prompt-banner`),Le=document.getElementById(`install-prompt-action`),Re=document.getElementById(`install-prompt-dismiss`),ze=new Map(t.map(e=>[e.name,e.code])),Be=new Map(t.map(e=>[e.code,e.name])),Ve=document.getElementById(`edit-stations-btn`),He=document.getElementById(`stations-list-btn`),Ue=document.getElementById(`install-app-btn`),z=document.getElementById(`cast-btn`),B=document.getElementById(`editor-overlay`),We=document.getElementById(`editor-close-btn`),V=document.getElementById(`editor-list`),Ge=document.getElementById(`add-station-form`),Ke=document.getElementById(`us_title`),qe=document.getElementById(`us_url`),Je=document.getElementById(`us_logo`),Ye=document.getElementById(`us_www`),Xe=document.getElementById(`us_id`),H=document.getElementById(`us_index`),Ze=document.getElementById(`cast-output-row`),U=document.getElementById(`cast-output-btn`),Qe=document.getElementById(`cast-output-text`);function $e(){try{return window.matchMedia(`(prefers-reduced-motion: reduce)`).matches}catch{return!1}}function et(){return window.matchMedia(`(max-width: 760px)`).matches}function tt(){return window.matchMedia(`(display-mode: standalone)`).matches||window.matchMedia(`(display-mode: fullscreen)`).matches||window.navigator.standalone===!0}async function nt(){if(et()&&tt()&&screen?.orientation?.lock)try{await screen.orientation.lock(`portrait`)}catch(e){console.debug(`Portrait orientation lock not available:`,e)}}function rt(){return window.matchMedia(`(max-width: 760px)`).matches}function it(){Ue?.classList.add(`hidden`),Ie?.classList.add(`hidden`)}function at(){l&&(rt()?Ie?.classList.remove(`hidden`):Ue?.classList.remove(`hidden`))}function ot(){re&&=(clearTimeout(re),null),ie&&=(clearTimeout(ie),null),A&&A.classList.remove(...se)}function st(){if(!A||$e())return;let e=()=>{if(re=null,ot(),!A||$e())return;let t=se[Math.floor(Math.random()*se.length)],n=1800+Math.floor(Math.random()*900);A.classList.add(t),ie=window.setTimeout(()=>{A.classList.remove(t),ie=null},n);let r=7e3+Math.floor(Math.random()*15e3);re=window.setTimeout(e,r)};ot(),e()}var ct=[{accent:`#4dd7c8`,accent2:`#ffb45c`,accent3:`#8fb3ff`,page:`#171b22`,panel:`#111821`},{accent:`#ff7aa8`,accent2:`#ffd166`,accent3:`#8fb3ff`,page:`#22151d`,panel:`#1b131a`},{accent:`#7ce38b`,accent2:`#53c7ff`,accent3:`#f0c86a`,page:`#132018`,panel:`#101a16`},{accent:`#b28cff`,accent2:`#6ee7d8`,accent3:`#ff9f6e`,page:`#19162a`,panel:`#141221`},{accent:`#ff9f43`,accent2:`#4dd7c8`,accent3:`#feca57`,page:`#241912`,panel:`#1c1510`},{accent:`#6ecbff`,accent2:`#b28cff`,accent3:`#ff7aa8`,page:`#111a25`,panel:`#101720`},{accent:`#f7d36b`,accent2:`#ff7a7a`,accent3:`#6ee7d8`,page:`#211b10`,panel:`#1a160e`},{accent:`#9cff6e`,accent2:`#ff8bd1`,accent3:`#78a7ff`,page:`#14200f`,panel:`#111a0e`},{accent:`#ff6f61`,accent2:`#ffd166`,accent3:`#80ed99`,page:`#241513`,panel:`#1c1110`},{accent:`#64dfdf`,accent2:`#c77dff`,accent3:`#f6bd60`,page:`#101f22`,panel:`#0e191c`},{accent:`#a3cef1`,accent2:`#f28482`,accent3:`#f6bd60`,page:`#121b24`,panel:`#101720`},{accent:`#d0f4de`,accent2:`#ff99c8`,accent3:`#a9def9`,page:`#10201a`,panel:`#0e1815`}];function W(e){return!e||typeof e!=`string`?``:e.startsWith(`http://`)?`https://`+e.slice(7):e}function lt(e){let t=0;for(let n=0;n>16&255}, ${n>>8&255}, ${n&255}`}function ut(e){let t=e?.raw?.theme||e?.theme||{},n=ct[lt(`${e?.id||``}:${e?.name||e?.title||``}`)%ct.length];return{accent:t.accent||t.primary||e?.raw?.color||n.accent,accent2:t.accent2||t.secondary||n.accent2,accent3:t.accent3||n.accent3,page:t.page||t.background||n.page,panel:t.panel||n.panel}}function dt(e){if(!e)return;let t=ut(e),n=document.documentElement;n.style.setProperty(`--accent`,t.accent),n.style.setProperty(`--accent-2`,t.accent2),n.style.setProperty(`--accent-3`,t.accent3),n.style.setProperty(`--page-bg`,t.page),n.style.setProperty(`--theme-panel`,t.panel),n.style.setProperty(`--accent-rgb`,G(t.accent)||`77, 215, 200`),n.style.setProperty(`--accent-2-rgb`,G(t.accent2)||`255, 180, 92`),n.style.setProperty(`--accent-3-rgb`,G(t.accent3)||`143, 179, 255`),n.style.setProperty(`--theme-page-rgb`,G(t.page)||`17, 19, 24`),n.style.setProperty(`--theme-panel-rgb`,G(t.panel)||`16, 20, 27`),n.style.setProperty(`--accent-glow`,`rgba(${G(t.accent)||`77, 215, 200`}, 0.34)`)}function ft(e){return e&&(e.streamUrl||e.url||e.streams?.audio||e.streams?.primary||e.liveAudio||e.liveStream||e.liveVideo)||``}function pt(e){return e&&(e.url||e.homepage||e.website||e.www||e.raw?.homepage||e.raw?.website||e.raw?.www)||``}function mt(e){return e?.streams?.video||e?.liveVideo||``}function ht(e){return e?.metadata?.lastSongs||e?.currentSong||e?.lastSongs||e?.raw?.metadata?.lastSongs||e?.raw?.currentSong||e?.raw?.lastSongs||``}function gt(e,t=!1){let n=e?.name||e?.title||e?.id||`Unknown`,r=ft(e),i=Number(e?.bitrate);return{id:e?.id||`${t?`user`:`station`}-${n.replace(/\s+/g,`-`)}`,name:n,url:r,logo:e?.logoUrl||e?.assets?.logo||e?.logo||``,poster:e?.assets?.poster||e?.poster||``,slogan:e?.slogan||e?.description||e?.defaultText||``,category:e?.category||e?.genre||``,country:e?.country||``,countryCode:e?.countryCode||``,language:e?.language||``,region:e?.region||``,tags:Array.isArray(e?.tags)?e.tags:[],codec:e?.codec||``,bitrate:Number.isFinite(i)&&i>0?i:null,homepage:e?.homepage||e?.website||e?.www||``,website:e?.website||e?.homepage||e?.www||``,metadata:e?.metadata||(e?.lastSongs?{lastSongs:e.lastSongs}:{}),streams:e?.streams||{audio:r,...mt(e)?{video:mt(e)}:{}},enabled:typeof e?.enabled==`boolean`?e.enabled:!0,source:e?.source||e?.raw?.source||``,sourceStationUuid:e?.sourceStationUuid||e?.raw?.sourceStationUuid||``,raw:e,_user:t}}function _t(e){if(!e||typeof e!=`string`)return``;let t=W(e)||e;try{if(new URL(t).hostname===`data.radio.si`)return``}catch{return t}return t}function vt(e){let t=[],n=new Set;for(let r of e){if(!r||typeof r!=`string`)continue;let e=r.trim();!e||n.has(e)||(n.add(e),t.push(e))}return t}function yt(e,t,n){let r=vt(t),i=0;if(!e||r.length===0){e&&(e.onload=null,e.onerror=null,e.src=``),n&&n();return}let a=()=>{if(i>=r.length){n&&n();return}e.src=r[i++]};e.onerror=a;try{e.referrerPolicy=`no-referrer`}catch{}a()}window.addEventListener(`error`,e=>{try{console.error(`Uncaught error`,e.error||e.message||e),w&&(w.textContent=`Error: `+(e.error?.message??e.message??`Unknown`))}catch{}}),window.addEventListener(`unhandledrejection`,e=>{try{console.error(`Unhandled rejection`,e.reason),w&&(w.textContent=`Error: `+(e.reason?.message??String(e.reason)))}catch{}}),r.addEventListener(`waiting`,()=>{f&&(w&&(w.textContent=`Buffering...`),T&&(T.style.backgroundColor=`var(--text-muted)`))}),r.addEventListener(`playing`,()=>{b=``,w&&(w.textContent=`Playing`),T&&(T.style.backgroundColor=`var(--success)`),f=!0,$()}),r.addEventListener(`stalled`,()=>{f&&(w&&(w.textContent=`Reconnecting...`),T&&(T.style.backgroundColor=`var(--text-muted)`))}),r.addEventListener(`error`,()=>{let e=r.error,t=e?bt(e.code):`Stream error`,n=u[d];b=n?`Unable to play ${K(n)}. ${t}.`:`Unable to play this station. ${t}.`,f=!1,$()}),r.addEventListener(`ended`,()=>{if(f){let e=r.src;setTimeout(()=>{r.src=e,r.load(),r.play().catch(()=>{})},2e3)}});function bt(e){switch(e){case 1:return`Playback aborted`;case 2:return`Network error`;case 3:return`Decode error`;case 4:return`Stream not supported`;default:return`Stream error`}}function xt(e){try{localStorage.setItem(`volume`,String(e))}catch{}}function St(){try{let e=localStorage.getItem(`volume`);if(!e)return null;let t=Number(e);return Number.isFinite(t)&&t>=0&&t<=100?t:null}catch{return null}}function Ct(){let e=St(),t=e===null?80:e;_e&&(_e.value=String(t)),ve&&(ve.textContent=`${t}%`),m=t/100,r.volume=m}function wt(e){try{e&&localStorage.setItem(`lastStationId`,e)}catch{}}function Tt(){try{return localStorage.getItem(`lastStationId`)}catch{return null}}function Et(e){try{e&&localStorage.setItem(`lastStationCountry`,e)}catch{}}function Dt(){try{return localStorage.getItem(`lastStationCountry`)}catch{return null}}function Ot(){_=Dt()||`all`}function kt(e){try{localStorage.setItem(`castBothMode`,e?`1`:`0`)}catch{}}function At(){try{c=localStorage.getItem(`castBothMode`)===`1`}catch{c=!1}}function jt(){if(!(!Ze||!U||!Qe)){if(i===`cast`)Ze.classList.remove(`hidden`);else{Ze.classList.add(`hidden`);return}c?(U.setAttribute(`aria-pressed`,`true`),Qe.textContent=`Cast + Local`,U.title=`Currently: Cast + This computer — click to cast only`):(U.setAttribute(`aria-pressed`,`false`),Qe.textContent=`Cast only`,U.title=`Currently: Cast only — click to also play on this computer`)}}function Mt(){c=!c,kt(c),jt(),!(i!==`cast`||!f)&&(c?Vn():(r.pause(),r.src=``))}function Nt(){try{let e=localStorage.getItem(`userStations`);return e?JSON.parse(e):[]}catch(e){return console.error(`Error reading user stations`,e),[]}}function Pt(e){try{localStorage.setItem(`userStations`,JSON.stringify(e||[]))}catch(e){console.error(`Error saving user stations`,e)}}function Ft(){try{let e=JSON.parse(localStorage.getItem(`favoriteStationIds`)||`[]`);return new Set(Array.isArray(e)?e.filter(Boolean):[])}catch{return new Set}}function It(e){try{localStorage.setItem(`favoriteStationIds`,JSON.stringify(Array.from(e)))}catch(e){console.debug(`Failed saving favourites`,e)}}function Lt(){try{let e=JSON.parse(localStorage.getItem(`stationUsageCounts`)||`{}`);return e&&typeof e==`object`?e:{}}catch{return{}}}function Rt(e){try{localStorage.setItem(`stationUsageCounts`,JSON.stringify(e||{}))}catch(e){console.debug(`Failed saving station usage`,e)}}function zt(e){if(!e?.id)return;let t=Lt();t[e.id]=Math.max(0,Number(t[e.id])||0)+1,Rt(t)}function K(e){return e?.name||e?.title||e?.id||`Station`}function Bt(){return window.matchMedia(`(max-width: 760px)`).matches}function Vt(e,t=!1){if(!S)return;if(S.replaceChildren(),!t){S.classList.remove(`station-title-marquee`);let t=document.createElement(`span`);t.className=`station-title-text`,t.textContent=e,S.appendChild(t);return}S.classList.add(`station-title-marquee`);let n=document.createElement(`span`);n.className=`station-title-track`;let r=document.createElement(`span`);r.className=`station-title-copy`,r.textContent=e;let i=document.createElement(`span`);i.className=`station-title-copy`,i.setAttribute(`aria-hidden`,`true`),i.textContent=e,n.append(r,i),S.appendChild(n)}function Ht(e){if(!S)return;let t=String(e||``).trim()||`Station`;ae&&=(cancelAnimationFrame(ae),null),Vt(t,!1),Bt()&&(ae=window.requestAnimationFrame(()=>{ae=null,!(!S||!Bt())&&S.scrollWidth>S.clientWidth+2&&Vt(t,!0)}))}function q(e){return e?.country||e?.countryCode||e?.region||``}function Ut(e){return Array.isArray(e?.tags)?e.tags.filter(Boolean):[]}function Wt(e){let t=[];return e?.codec&&t.push(String(e.codec).toUpperCase()),Number.isFinite(e?.bitrate)&&e.bitrate>0&&t.push(`${e.bitrate} kbps`),t.join(` • `)}function J(e){return[q(e),Wt(e)].filter(Boolean).join(` • `)}function Gt(e){return[K(e),q(e),Jt(e),Wt(e),Yt(e),...Ut(e)].join(` `).toLowerCase()}function Kt(e){return e?.logo||e?.poster||e?.raw?.assets?.logo||e?.raw?.logo||e?.raw?.assets?.poster||e?.raw?.poster||``}function qt(e){let t=Kt(e);return vt([W(t),t,ce])}function Jt(e){return e?.slogan||e?.raw?.slogan||e?.raw?.defaultText||``}function Yt(e){if(e?._user)return`Custom`;if(e?.category)return e.category;let t=e?.raw||{},n=t.category||t.genre||t.format||t.type;if(n)return String(n);let r=`${e?.id||``} ${e?.name||``} ${t.title||``} ${t.slogan||``} ${Ut(e).join(` `)}`.toLowerCase();return/news|talk|politic|speech|discussion/.test(r)?`Talk`:/jazz|blues|soul/.test(r)?`Jazz`:/classical|orchestra|symphony|opera/.test(r)?`Classical`:/electronic|dance|house|techno|trance|edm/.test(r)?`Electronic`:/ambient|chill|downtempo/.test(r)?`Ambient`:/rock|metal/.test(r)?`Rock`:/folk|veseljak|zvoki|narod|country/.test(r)?`Folk`:/aktual|pop|hit|dance|top/.test(r)?`Pop`:/80|90|70|retro|gold|old/.test(r)?`Retro`:/maribor|celje|kranj|triglav|velenje|korosk|koper|regional/.test(r)?`Regional`:`General`}function Xt(){return u.map((e,t)=>({station:e,index:t}))}function Zt(){let e=Xt().filter(({station:e})=>_===`all`||q(e)===_);return Array.from(new Set(e.map(({station:e})=>Yt(e)))).sort((e,t)=>e.localeCompare(t))}function Qt(){return Array.from(new Set(u.map(q).filter(Boolean))).sort((e,t)=>e.localeCompare(t))}function $t(e){let t=String(e||``).trim();if(!t)return``;if(t===`all`)return`All countries`;if(t===`SI`)return`Slovenia (managed)`;if(/^[A-Z]{2}$/i.test(t)){let e=Be.get(t.toUpperCase());if(e)return e}return t}function en(e){let t=String(e||``).trim();if(!t)return``;if(t===`all`)return`All countries`;if(t.toUpperCase()===`SI`)return`SLOVENIA (managed)`;if(/^[A-Z]{2}$/i.test(t)){let e=Be.get(t.toUpperCase());if(e)return e}return t}function tn(e){let t=String(e||``).trim();return!t||t===`all`?``:/^[A-Z]{2}$/i.test(t)?t.toUpperCase():ze.get(t)||``}function Y(){v=0}function nn(){v<=0||(--v,X())}function rn(){v>=te-1||(v+=1,X())}function an(e){let t=String(e||``).trim().toLowerCase();return/^[a-z]{2}$/.test(t)?`https://flagcdn.com/w20/${t}.png`:``}function on(e){if(!e||e===`all`)return`https://flagcdn.com/w20/eu.png`;let t=tn(e);return t?an(t):``}function sn(e){x=typeof e==`boolean`?e:!x,X()}function cn(){x&&(x=!1,X())}function ln(){if(!je||!Ae||!Me)return;let e=Qt();y===`ready`&&_!==`all`&&!e.includes(_)&&(_=`all`,Et(`all`),Y()),Ae.setAttribute(`aria-expanded`,x?`true`:`false`),Me.textContent=en(_),Ne&&(Ne.src=on(_)),ke?.classList.toggle(`open`,x),je.innerHTML=``,je.classList.toggle(`open`,x);let t=(e,t)=>{let n=document.createElement(`button`);n.type=`button`,n.className=`library-select-option`+(_===t?` active`:``),n.setAttribute(`role`,`option`),n.setAttribute(`aria-selected`,_===t?`true`:`false`);let r=document.createElement(`span`),i=on(t);if(r.className=`library-select-option-flag`,r.setAttribute(`aria-hidden`,`true`),i){let e=document.createElement(`img`);e.src=i,e.alt=``,e.setAttribute(`aria-hidden`,`true`),e.className=`library-select-option-flag-img`,e.loading=`lazy`,e.referrerPolicy=`no-referrer`,e.addEventListener(`error`,()=>{e.remove(),r.textContent=t===`all`?`🌐`:`🏳️`},{once:!0}),r.appendChild(e)}else r.textContent=t===`all`?`🌐`:`🏳️`;let a=document.createElement(`span`);a.className=`library-select-option-text`,a.textContent=e,n.appendChild(r),n.appendChild(a),n.addEventListener(`click`,()=>{_=t,g=`all`,Et(t),Y(),x=!1,X()}),je.appendChild(n)};t(`All countries`,`all`),e.slice().sort((e,t)=>{let n=e.toUpperCase()===`SI`?-1:0,r=t.toUpperCase()===`SI`?-1:0;return n===r?en(e).localeCompare(en(t)):n-r}).forEach(e=>t(en(e),e))}function un(){let e=Ft(),t=Lt(),n=ee.trim().toLowerCase(),r=Xt();return h===`favourites`?r=r.filter(({station:t})=>e.has(t.id)):h===`recent`&&(r=r.map(e=>({...e,count:Number(t[e.station.id])||0})).filter(e=>e.count>0).sort((e,t)=>t.count-e.count||e.index-t.index)),_!==`all`&&(r=r.filter(({station:e})=>q(e)===_)),h===`categories`&&g!==`all`&&(r=r.filter(({station:e})=>Yt(e)===g)),n&&(r=r.filter(({station:e})=>Gt(e).includes(n))),r}function dn(){let e=Ft(),t=Xt(),n=t.filter(({station:t})=>e.has(t.id));if(n.length>0)return n;let r=Lt();return t.map(e=>({...e,count:Number(r[e.station.id])||0})).sort((e,t)=>t.count===e.count?e.index-t.index:t.count-e.count).slice(0,10)}function fn(e){h=e||`all`,h!==`categories`&&(g=`all`),Y(),X()}function pn(e){if(!e?.id)return;let t=Ft();t.has(e.id)?t.delete(e.id):t.add(e.id),It(t),X(),Dn()}function mn(e,t,n){let r=document.createElement(`div`),i=K(e),a=document.createElement(`img`);return a.className=t,a.alt=`${i} logo`,a.referrerPolicy=`no-referrer`,yt(a,qt(e),()=>{r.innerHTML=``;let e=document.createElement(`div`);e.className=n,e.textContent=i.charAt(0).toUpperCase(),r.appendChild(e)}),r.appendChild(a),r.firstElementChild||r}function hn(){if(!Oe)return;Oe.innerHTML=``;let e=[`all`,...Zt()];g!==`all`&&!e.includes(g)&&(g=`all`),e.forEach(e=>{let t=document.createElement(`button`);t.className=`category-chip`+(g===e?` active`:``),t.type=`button`,t.textContent=e===`all`?`All categories`:e,t.addEventListener(`click`,()=>{g=e,Y(),X()}),Oe.appendChild(t)})}function X(){try{if(!P)return;if(P.innerHTML=``,P.scrollTop=0,N?.classList.toggle(`show-categories`,h===`categories`),Fe.forEach(e=>{let t=e.dataset.stationTab===h;e.classList.toggle(`active`,t),e.setAttribute(`aria-selected`,t?`true`:`false`)}),ln(),hn(),y===`loading`){F&&(F.textContent=`Loading stations...`),R&&(R.textContent=`Page 1 of 1`),I&&(I.disabled=!0),L&&(L.disabled=!0),Pe?.classList.add(`hidden`);let e=document.createElement(`li`);e.className=`library-empty`,e.textContent=`Loading the local radio catalog...`,P.appendChild(e);return}if(y===`error`){F&&(F.textContent=`Unable to load stations`),R&&(R.textContent=`Page 1 of 1`),I&&(I.disabled=!0),L&&(L.disabled=!0),Pe?.classList.add(`hidden`);let e=document.createElement(`li`);e.className=`library-empty`,e.textContent=ne||`The local station catalog could not be loaded.`,P.appendChild(e);return}if(!u.length){F&&(F.textContent=`No stations available`),R&&(R.textContent=`Page 1 of 1`),I&&(I.disabled=!0),L&&(L.disabled=!0),Pe?.classList.add(`hidden`);let e=document.createElement(`li`);e.className=`library-empty`,e.textContent=`The local station catalog is empty.`,P.appendChild(e);return}let e=Ft(),t=Lt(),n=un(),r=h===`favourites`?`favourite`:h===`recent`?`recent`:`available`;if(F){let e=_===`all`?``:` in ${$t(_)}`;F.textContent=`${n.length} ${r} station${n.length===1?``:`s`}${e}`}let i=Math.max(1,Math.ceil(n.length/oe));te=i,Pe?.classList.toggle(`hidden`,i<=1),v>=i&&(v=i-1);let a=v*oe,o=n.slice(a,a+oe);if(n.length===0){R&&(R.textContent=`Page 1 of 1`),I&&(I.disabled=!0),L&&(L.disabled=!0);let e=document.createElement(`li`);e.className=`library-empty`,e.textContent=h===`favourites`?`No favourites yet. Use the star button to build your quick list.`:`No stations match this filter.`,P.appendChild(e);return}R&&(R.textContent=`Page ${v+1} of ${i}`),I&&(I.disabled=v<=0,I.setAttribute(`aria-disabled`,v<=0?`true`:`false`)),L&&(L.disabled=v>=i-1,L.setAttribute(`aria-disabled`,v>=i-1?`true`:`false`)),o.forEach(({station:n,index:r,count:i})=>{let a=K(n),o=document.createElement(`li`),s=document.createElement(`div`);s.className=`library-station`+(r===d?` current`:``),s.setAttribute(`role`,`button`),s.setAttribute(`tabindex`,`0`),s.setAttribute(`aria-current`,r===d?`true`:`false`),s.title=a,s.appendChild(mn(n,`library-station-logo`,`library-station-fallback`));let c=document.createElement(`div`);c.className=`library-station-copy`;let l=document.createElement(`div`);l.className=`library-station-title`,l.textContent=a;let u=document.createElement(`div`);u.className=`library-station-meta`;let f=document.createElement(`span`);f.className=`library-station-country`,f.textContent=$t(q(n))||Yt(n);let p=document.createElement(`span`);p.className=`library-station-tech`,p.textContent=Wt(n)||Yt(n),u.appendChild(f),u.appendChild(p),c.appendChild(l),c.appendChild(u);let m=document.createElement(`div`);m.className=`library-station-tags`;let h=Ut(n).slice(0,3);h.forEach(e=>{let t=document.createElement(`span`);t.className=`library-tag`,t.textContent=e,m.appendChild(t)});let ee=Number(t[n.id]??i)||0;if(ee>0){let e=document.createElement(`span`);e.className=`library-tag muted`,e.textContent=`${ee} plays`,m.appendChild(e)}else if(h.length===0&&Jt(n)){let e=document.createElement(`span`);e.className=`library-tag muted`,e.textContent=Jt(n),m.appendChild(e)}m.childElementCount>0&&c.appendChild(m),s.appendChild(c);let g=document.createElement(`span`);g.className=`favorite-btn`+(e.has(n.id)?` active`:``),g.setAttribute(`role`,`button`),g.setAttribute(`aria-pressed`,e.has(n.id)?`true`:`false`),g.setAttribute(`tabindex`,`0`),g.setAttribute(`aria-label`,e.has(n.id)?`Remove ${a} from favourites`:`Add ${a} to favourites`),g.textContent=e.has(n.id)?`★`:`☆`,g.addEventListener(`click`,e=>{e.preventDefault(),e.stopPropagation(),pn(n)}),g.addEventListener(`keydown`,e=>{e.key!==`Enter`&&e.key!==` `||(e.preventDefault(),e.stopPropagation(),pn(n))}),s.appendChild(g),s.addEventListener(`click`,async()=>{await bn(r)}),s.addEventListener(`keydown`,async e=>{e.key!==`Enter`&&e.key!==` `||(e.preventDefault(),await bn(r))}),o.appendChild(s),P.appendChild(o)})}catch(e){console.debug(`renderStationLibrary failed`,e)}}function gn(){if(!N){Yn();return}X(),window.matchMedia(`(max-width: 1100px)`).matches?(Te?.classList.remove(`library-collapsed`),N.classList.add(`open`),document.body.classList.add(`library-open`)):Te?.classList.remove(`library-collapsed`),setTimeout(()=>Ee?.focus(),30)}function _n(){window.matchMedia(`(max-width: 1100px)`).matches?(N?.classList.remove(`open`),document.body.classList.remove(`library-open`)):Te?.classList.add(`library-collapsed`)}function vn(){if(!N){Yn();return}if(window.matchMedia(`(max-width: 1100px)`).matches){N.classList.contains(`open`)?_n():gn();return}Te?.classList.contains(`library-collapsed`)?gn():_n()}async function yn(e){let t=dn();if(!t.length)return;let n=t.findIndex(({index:e})=>e===d),r;r=n>=0?(n+e+t.length)%t.length:e>0?0:t.length-1,await An(t[r].index)}async function bn(e){let t=e!==d;await An(e),(!f||t)&&await Hn()}async function xn(){try{y=`loading`,ne=``,Y(),X(),Mn();let t=await e(),r=await n().catch(()=>[]),i=t.map(e=>gt(e)).filter(e=>e.enabled!==!1&&e.url&&e.url.length>0),a=r.map(e=>gt(e)).filter(e=>e.enabled!==!1&&e.url&&e.url.length>0),o=Nt().map(e=>gt(e,!0)).filter(e=>e.url&&e.url.length>0),s=[],c=new Set,l=new Set,f=e=>{!e?.id||!e?.url||c.has(e.id)||l.has(e.url)||(c.add(e.id),l.add(e.url),s.push(e))};if(a.forEach(f),i.forEach(f),o.forEach(f),u=s,y=u.length>0?`ready`:`empty`,console.debug(`loadStations: loaded`,u.length,`stations`),u.length>0){let e=Tt();if(e){let t=u.findIndex(t=>t.id===e);d=t>=0?t:0}else d=0;In(d),Dn(),X(),Nn()}else Dn(),X()}catch(e){console.error(`Failed to load stations`,e),u=[],y=`error`,ne=e?.message||`Error loading the local station catalog.`,Dn(),X(),w&&(w.textContent=`Unable to load stations`)}}var Z=null,Sn=0,Cn=0,wn=0,Tn=!1,En=!1;function Dn(){try{if(!k)return;k.innerHTML=``,dn().forEach(({station:e,index:t})=>{let n=document.createElement(`div`);n.className=`coverflow-item`,n.dataset.idx=String(t),n.setAttribute(`role`,`button`),n.setAttribute(`tabindex`,`0`);let r=(e?.name??`?`).trim();n.title=r,n.setAttribute(`aria-label`,`Select ${r}`);let i=Kt(e);if(i){let t=document.createElement(`img`);t.alt=`${e.name} logo`,yt(t,[W(i),i],()=>{n.innerHTML=``,n.classList.add(`fallback`),n.textContent=r}),n.appendChild(t)}else n.classList.add(`fallback`),n.textContent=r;n.addEventListener(`click`,async e=>{if(e.preventDefault(),e.stopPropagation(),Tn)return;let t=Number(n.dataset.idx);t===d?gn():await bn(t)}),n.addEventListener(`keydown`,async e=>{if(e.key!==`Enter`&&e.key!==` `)return;e.preventDefault();let t=Number(n.dataset.idx);t===d?gn():await bn(t)}),n.addEventListener(`dblclick`,()=>{Number(n.dataset.idx)===d&&gn()}),k.appendChild(n)}),On(),kn()}catch(e){console.debug(`renderCoverflow failed`,e)}}function On(){try{let e=document.getElementById(`artwork-coverflow`);if(!e)return;Ce&&(Ce.onpointerdown=e=>e.stopPropagation(),Ce.onclick=e=>{e.stopPropagation(),e.preventDefault(),yn(-1)}),we&&(we.onpointerdown=e=>e.stopPropagation(),we.onclick=e=>{e.stopPropagation(),e.preventDefault(),yn(1)}),e.onpointerdown=t=>{if(!(dn().length<=1)&&!t.target?.closest?.(`.coverflow-arrow`)){Z=t.pointerId,Sn=t.clientX,Cn=t.clientX,wn=0,Tn=!1;try{e.setPointerCapture(t.pointerId)}catch{}}},e.onpointermove=e=>{if(Z===null||e.pointerId!==Z)return;let t=e.clientX-Cn;Cn=e.clientX,Math.abs(e.clientX-Sn)>6&&(Tn=!0),wn+=t,wn>=36?(wn=0,yn(-1)):wn<=-36&&(wn=0,yn(1))},e.onpointerup=t=>{if(!(Z===null||t.pointerId!==Z)){Z=null,setTimeout(()=>{Tn=!1},0);try{e.releasePointerCapture(t.pointerId)}catch{}}},e.onpointercancel=()=>{Z=null,Tn=!1},e.onwheel=e=>{if(dn().length<=1||En)return;let t=Math.abs(e.deltaX)>Math.abs(e.deltaY)?e.deltaX:e.deltaY;Math.abs(t)<6||(e.preventDefault(),En=!0,yn(t>0?1:-1),setTimeout(()=>{En=!1},160))}}catch(e){console.debug(`wireCoverflowInteractions failed`,e)}}function kn(){try{if(!k)return;let e=k.querySelectorAll(`.coverflow-item`),t=e.length;if(t<=0)return;let n=Array.from(e).findIndex(e=>Number(e.dataset.idx)===d);n<0&&(n=0);let r=k.clientWidth||320,i=window.matchMedia(`(max-width: 760px)`).matches,a=window.matchMedia(`(max-width: 380px)`).matches,o=i?Math.min(78,Math.max(62,r/3.25)):Math.min(116,Math.max(94,r/3.1)),s=i?26:36,c=i?0:8,l=i?.08:.1,u=i||a?1:Math.max(1,Math.min(4,Math.floor((r-120)/(o*.95))));e.forEach((e,i)=>{let a=Number(e.dataset.idx),f=i-n,p=Math.floor(t/2);if(t>2&&f>p&&(f-=t),t>2&&f<-p&&(f+=t),e.dataset.offset=String(f),e.setAttribute(`aria-current`,a===d?`true`:`false`),Math.abs(f)>u){e.classList.toggle(`selected`,a===d),e.style.opacity=`0`,e.style.pointerEvents=`none`,e.style.transform=`translate(-50%, -50%) translateX(${r/2*Math.sign(f||1)}px) scale(0.72)`;return}let m=Math.abs(f),h=f===0?0:f>0?1:-1,ee=m===1;e.style.opacity=String(1-m*.2),e.style.zIndex=String(100-m),e.style.pointerEvents=`auto`,e.style.transform=`translate(-50%, -50%) translateX(${h*m*o}px) translateZ(${-m*s}px) rotateY(${h*-c*m}deg) scale(${ee?.88:1-m*l})`,a===d?e.classList.add(`selected`):e.classList.remove(`selected`)})}catch(e){console.debug(`updateCoverflowTransforms failed`,e)}}async function An(e){if(e<0||e>=u.length)return;let t=f;t&&await Un(),b=``,d=e,wt(u[d].id),zt(u[d]),In(d),Dn(),X(),kn(),t&&await Hn()}var jn=new Map;function Mn(){for(let e of jn.values()){try{e?.intervalId&&clearInterval(e.intervalId)}catch{}try{e?.timeoutId&&clearTimeout(e.timeoutId)}catch{}}jn.clear()}function Nn(){Mn();let e=u[d];if(!e)return;let t=_t(ht(e));if(!t||typeof t!=`string`||t.length===0)return;let n=()=>{Pn(e,d,t)};n();let r=setInterval(n,1e4);jn.set(e.id||d,{intervalId:r,timeoutId:null})}async function Pn(e,t,n){try{let r=null;try{r=await(await fetch(n,{cache:`no-store`})).text()}catch{return}if(!r)return;let i=null;try{let e=JSON.parse(r);i=typeof e==`string`?JSON.parse(e):e}catch{return}let a=null;if(i)if(i.currentSong?.artist||i.currentSong?.title)a={artist:i.currentSong.artist||``,title:i.currentSong.title||``};else if(Array.isArray(i.lastSongs)&&i.lastSongs.length>0){let e=i.lastSongs[0];(e?.artist||e?.title)&&(a={artist:e.artist||``,title:e.title||``})}else (i.artist||i.title)&&(a={artist:i.artist||``,title:i.title||``});if(a){e.currentSongInfo=a,t===d&&Fn();try{let r=e.id||t,a=i?.currentSong??null,o=a?.playTimeStartSec??a?.playTimeStart??null,s=a?.playTimeLengthSec??a?.playTimeLength??null;if(o&&s){let i=new Date,a=o.split(`:`).map(Number);if(a.length>=2){let o=new Date(i.getFullYear(),i.getMonth(),i.getDate(),a[0],a[1],a[2]||0,0),c=o.getTime()-i.getTime();c>12*36e5&&o.setDate(o.getDate()-1),c<-12*36e5&&o.setDate(o.getDate()+1);let l=s.split(`:`).map(Number),u=0;u=l.length===3?l[0]*3600+l[1]*60+l[2]:l.length===2?l[0]*60+l[1]:Number(l[0])||0;let f=o.getTime()+u*1e3-i.getTime();if(f>1e3){let i=jn.get(r);if(i?.intervalId)try{clearInterval(i.intervalId)}catch{}if(i?.timeoutId)try{clearTimeout(i.timeoutId)}catch{}let a=setTimeout(async()=>{try{await Pn(e,t,n)}catch{}finally{d===t&&Nn()}},f+250);jn.set(r,{intervalId:null,timeoutId:a})}}}}catch(e){console.debug(`Failed scheduling next-song fetch`,e)}}}catch(e){console.debug(`currentSong fetch failed for`,n,e.message||e)}}function Fn(){let e=u[d];e&&(le&&ue&&de&&(e.currentSongInfo?.artist&&e.currentSongInfo?.title?(ue.textContent=e.currentSongInfo.artist,de.textContent=e.currentSongInfo.title,le.classList.remove(`hidden`)):(ue.textContent=``,de.textContent=``,le.classList.add(`hidden`))),C&&(C.textContent=J(e)||`Live stream`))}function In(e){if(e<0||e>=u.length)return;let t=u[e];dt(t),Ht(t.name),C&&(C.textContent=J(t)||`Live stream`),le&&le.classList.add(`hidden`),ue&&(ue.textContent=``),de&&(de.textContent=``);try{j&&t.name&&(j.textContent=String(t.name).trim(),j.classList.add(`logo-name`)),M&&(M.classList.add(`hidden`),j&&j.classList.remove(`hidden`),yt(M,qt(t),()=>{M.classList.add(`hidden`),j&&j.classList.remove(`hidden`)}),M.onload=()=>{M.classList.remove(`hidden`),j&&j.classList.add(`hidden`)})}catch{}try{kn()}catch{}try{Nn()}catch{}}function Ln(){if(s){Q();return}try{s=!0,a=cast.framework.CastContext.getInstance(),a.setOptions({receiverApplicationId:chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,autoJoinPolicy:chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED});let e=new cast.framework.RemotePlayer;o=new cast.framework.RemotePlayerController(e),o.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,()=>{if(i!==`cast`)return;let t=Math.round(e.volumeLevel*100);_e&&(_e.value=String(t)),ve&&(ve.textContent=`${t}%`),m=e.volumeLevel}),a.addEventListener(cast.framework.CastContextEventType.SESSION_STATE_CHANGED,e=>{let t=cast.framework.SessionState;e.sessionState===t.SESSION_STARTED||e.sessionState===t.SESSION_RESUMED?(i=`cast`,Bn(),Q(),jt(),f&&(c||(r.pause(),r.src=``),zn())):(e.sessionState===t.SESSION_ENDED||e.sessionState===t.SESSION_START_FAILED)&&(i=`local`,Bn(),Q(),jt(),$())}),console.log(`Cast SDK initialised`),Q()}catch(e){s=!1,console.warn(`Cast init failed:`,e),Q()}}window.__onGCastApiAvailable=e=>{e?Ln():Q()},window.cast?.framework&&window.chrome?.cast&&Ln();function Q(){if(!z)return;let e=!!a;z.classList.toggle(`cast-ready`,e),z.classList.toggle(`cast-active`,i===`cast`),z.setAttribute(`aria-pressed`,i===`cast`?`true`:`false`),z.title=e?`Cast to device`:`Cast is not ready yet`}async function Rn(){if(!a){w&&(w.textContent=`Cast not available`),Q();return}try{await a.requestSession()}catch(e){console.debug(`Cast session request failed:`,e)}finally{Q()}}async function zn(){try{let e=a?.getCurrentSession();if(!e)return;let t=u[d];if(!t)return;let n=W(t.url)||t.url,r=n.includes(`.ogg`)?`audio/ogg`:`audio/mpeg`,i=new chrome.cast.media.MediaInfo(n,r);i.streamType=chrome.cast.media.StreamType.LIVE;let o=new chrome.cast.media.MusicTrackMediaMetadata;o.title=t.name,o.artist=t.currentSongInfo?.artist??``,o.songName=t.currentSongInfo?.title??``,t.logo&&(o.images=[new chrome.cast.Image(W(t.logo)||t.logo)]),i.metadata=o;let s=new chrome.cast.media.LoadRequest(i);if(await e.loadMedia(s),f=!0,w&&(w.textContent=`Casting...`),T&&(T.style.backgroundColor=`var(--success)`),C){let n=J(t);C.textContent=n?`Casting to ${e.getCastDevice().friendlyName} • ${n}`:`Casting to ${e.getCastDevice().friendlyName}`}$()}catch(e){console.error(`Cast play failed:`,e),w&&(w.textContent=`Cast error — playing locally`),i=`local`,Bn(),Vn()}}function Bn(){E&&(i===`cast`?(E.className=`engine-badge engine-cast`,E.title=`Google Cast playback`,E.innerHTML=`CAST`):(E.className=`engine-badge engine-html`,E.title=`HTML5 Audio playback`,E.innerHTML=`HTML5`))}async function Vn(){let e=u[d];if(e){b=``,w&&(w.textContent=`Buffering...`),T&&(T.style.backgroundColor=`var(--text-muted)`),r.src=W(e.url)||e.url,r.volume=p?0:m,r.load();try{await r.play(),f=!0,$()}catch(t){console.warn(`audio.play() failed:`,t.message),b=t?.name===`NotAllowedError`?`Playback was blocked until you interact with the page.`:`Unable to start ${K(e)}.`,f=!1,$()}}}async function Hn(){u[d]&&(i===`cast`?(c||(r.pause(),r.src=``),await zn(),c&&Vn()):await Vn())}async function Un(){if(b=``,i===`cast`)try{let e=(a?.getCurrentSession())?.getMediaSession();e&&e.stop(new chrome.cast.media.StopRequest,()=>{},()=>{})}catch(e){console.warn(`Cast stop error:`,e)}r.pause(),r.src=``,f=!1,$()}async function Wn(){f?await Un():await Hn()}async function Gn(){u.length!==0&&await An((d+1)%u.length)}async function Kn(){u.length!==0&&await An((d-1+u.length)%u.length)}function $(){let e=u[d];f?(pe&&pe.classList.add(`hidden`),me&&me.classList.remove(`hidden`),fe&&fe.classList.add(`playing`),w&&w.textContent===`Ready`&&(w.textContent=`Playing`),T&&(T.style.backgroundColor=`var(--success)`),C&&i!==`cast`&&e&&(C.textContent=J(e)||`Live stream`)):(pe&&pe.classList.remove(`hidden`),me&&me.classList.add(`hidden`),fe&&fe.classList.remove(`playing`),b?(w&&(w.textContent=b),T&&(T.style.backgroundColor=`var(--danger)`)):(w&&(w.textContent=y===`loading`?`Loading stations...`:`Ready`),T&&(T.style.backgroundColor=`var(--text-muted)`)),C&&e&&i!==`cast`&&(C.textContent=J(e)||`Live stream`)),Bn(),jt(),Q()}function qn(){let e=Number(_e.value);if(ve&&(ve.textContent=`${e}%`),m=e/100,p||(r.volume=m),i===`cast`)try{let e=a?.getCurrentSession();e&&e.setVolume(m,()=>{},()=>{})}catch{}xt(e)}function Jn(){p=!p,r.volume=p?0:m,be&&be.classList.toggle(`hidden`,p),xe&&xe.classList.toggle(`hidden`,!p)}async function Yn(){if(!D||!O)return;D.classList.remove(`hidden`),D.setAttribute(`aria-hidden`,`false`),O.classList.add(`stations-grid`),O.innerHTML=``;let e=document.getElementById(`deviceTitle`);if(e&&(e.textContent=`Stations`),!u||u.length===0){O.classList.remove(`stations-grid`),y===`loading`?O.innerHTML=`
  • Loading stations
    Reading the local radio catalog
  • `:y===`error`?O.innerHTML=`
  • Stations unavailable
    ${er(ne||`Unable to load local radio data.`)}
  • `:O.innerHTML=`
  • No stations found
    The local radio catalog is empty
  • `;return}for(let e=0;e{o.replaceChild(t,e)},e.src=W(r)||r||ce,o.appendChild(e)}else{let e=document.createElement(`img`);e.className=`station-card-logo`,e.alt=`${i} logo`,e.src=ce,o.appendChild(e)}let s=document.createElement(`div`);s.className=`station-card-body`;let c=document.createElement(`div`);c.className=`station-card-title`,c.textContent=i;let l=document.createElement(`div`);l.className=`station-card-sub`,l.textContent=a,s.appendChild(c),s.appendChild(l),n.appendChild(o),n.appendChild(s),n.onclick=async()=>{Xn(),await An(e);try{await Hn()}catch(e){console.error(`Failed to play station from grid`,e)}},O.appendChild(n)}}function Xn(){if(!D)return;D.classList.add(`hidden`),D.setAttribute(`aria-hidden`,`true`);let e=document.getElementById(`deviceTitle`);e&&(e.textContent=`Stations`),O&&O.classList.remove(`stations-grid`)}function Zn(){$n(),B&&(B.classList.remove(`hidden`),B.setAttribute(`aria-hidden`,`false`))}function Qn(){B&&(B.classList.add(`hidden`),B.setAttribute(`aria-hidden`,`true`)),Ge&&Ge.reset(),H&&(H.value=``)}function $n(){let e=Nt();if(V){if(V.innerHTML=``,!e||e.length===0){V.innerHTML=`
  • No user stations
    Add your stream using the form below
  • `;return}e.forEach((e,t)=>{let n=document.createElement(`li`);n.className=`device`;let r=e.title||e.name||e.id||`User Station`,i=e.url||e.streams?.audio||``;n.innerHTML=`
    ${er(r)}
    ${er(i)}
    `,V.appendChild(n)}),V.querySelectorAll(`.edit-btn`).forEach(e=>{e.addEventListener(`click`,()=>tr(Number(e.getAttribute(`data-idx`))))}),V.querySelectorAll(`.delete-btn`).forEach(e=>{e.addEventListener(`click`,()=>nr(Number(e.getAttribute(`data-idx`))))})}}function er(e){return String(e).replace(/&/g,`&`).replace(//g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}function tr(e){let t=Nt()[e];t&&(Ke&&(Ke.value=t.title||t.name||``),qe&&(qe.value=t.url||t.streams?.audio||t.liveAudio||``),Je&&(Je.value=t.logo||t.assets?.logo||``),Ye&&(Ye.value=t.website||t.www||``),Xe&&(Xe.value=t.id||``),H&&(H.value=String(e)))}function nr(e){let t=Nt();t.splice(e,1),Pt(t),xn(),$n()}Ge?.addEventListener(`submit`,e=>{e.preventDefault();let t=Nt(),n=qe?.value.trim()??``;try{new URL(n)}catch{w&&(w.textContent=`Invalid stream URL`);return}let r={id:Xe?.value||`user-${Date.now()}`,name:Ke?.value.trim()??``,category:`Custom`,country:``,language:``,website:Ye?.value.trim()??``,assets:{logo:Je?.value.trim()??``},streams:{audio:n},enabled:!0},i=H?.value===``?-1:Number(H?.value);i>=0&&i{e.target===D&&Xn()}),Ve?.addEventListener(`click`,Zn),He?.addEventListener(`click`,vn),Ue?.addEventListener(`click`,ar),z?.addEventListener(`click`,Rn),We?.addEventListener(`click`,Qn),De?.addEventListener(`click`,_n),Ae?.addEventListener(`click`,e=>{e.preventDefault(),e.stopPropagation(),sn()}),Ee?.addEventListener(`input`,()=>{ee=Ee.value||``,Y(),X()}),Fe.forEach(e=>{e.addEventListener(`click`,()=>fn(e.dataset.stationTab||`all`))}),A?.addEventListener(`click`,gn),U?.addEventListener(`click`,Mt),Le?.addEventListener(`click`,ar),Re?.addEventListener(`click`,it),window.addEventListener(`resize`,()=>{kn(),Ht(K(u[d]))}),document.addEventListener(`click`,e=>{x&&(ke?.contains(e.target)||cn())}),document.addEventListener(`keydown`,e=>{if(!(e.target instanceof HTMLInputElement||e.target instanceof HTMLTextAreaElement)){if(x&&e.code===`Escape`){e.preventDefault(),cn();return}e.code===`Space`?(e.preventDefault(),Wn()):e.code===`ArrowRight`?Gn():e.code===`ArrowLeft`?Kn():e.code===`KeyM`?Jn():e.code===`Escape`&&(_n(),Xn(),Qn())}})}async function ar(){if(l){l.prompt();try{await l.userChoice}catch{}l=null,it()}}function or(){if(!(`mediaSession`in navigator))return;let e=u[d];if(e)try{navigator.mediaSession.metadata=new MediaMetadata({title:e.name,artist:e.currentSongInfo?.artist??``,album:`Live Radio`,artwork:e.logo?[{src:W(e.logo),sizes:`512x512`}]:[]}),navigator.mediaSession.setActionHandler(`play`,()=>Hn()),navigator.mediaSession.setActionHandler(`pause`,()=>Un()),navigator.mediaSession.setActionHandler(`previoustrack`,()=>Kn()),navigator.mediaSession.setActionHandler(`nexttrack`,()=>Gn())}catch{}}var sr=!1;async function cr(){if(!sr){sr=!0;try{console.group(`RadioPlayer init`),console.log(`location:`,location.href),console.log(`userAgent:`,navigator.userAgent),console.groupEnd(),Ct(),At(),Ot(),await xn(),ir(),nt(),rr(),st(),$(),r.addEventListener(`playing`,or)}catch(e){console.error(`Error during init`,e),w&&(w.textContent=`Init error: `+(e?.message??String(e)))}}}`serviceWorker`in navigator,`serviceWorker`in navigator&&window.addEventListener(`load`,()=>{navigator.serviceWorker.register(`./sw.js`,{updateViaCache:`none`}).then(async e=>{try{await e.update()}catch(e){console.debug(`ServiceWorker update check failed:`,e)}console.log(`ServiceWorker registered:`,e.scope)}).catch(e=>console.debug(`ServiceWorker registration failed:`,e))}),`serviceWorker`in navigator&&navigator.serviceWorker.addEventListener(`controllerchange`,()=>{window.location.reload()}),window.addEventListener(`beforeinstallprompt`,e=>{e.preventDefault(),l=e,at()}),window.addEventListener(`appinstalled`,()=>{l=null,it()}),window.addEventListener(`orientationchange`,()=>{nt()});function lr(){return cr()}export{lr as initPlayer};