nixamp 0.58.1 → 0.59.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/ai-label.d.ts +6 -0
  2. package/dist/ai-label.js +1 -0
  3. package/dist/follow-page.js +1 -1
  4. package/dist/label-routes.js +3 -1
  5. package/dist/music-hub.d.ts +97 -0
  6. package/dist/music-hub.js +215 -0
  7. package/dist/music-store.d.ts +2 -0
  8. package/dist/music-store.js +4 -2
  9. package/dist/server.d.ts +9 -0
  10. package/dist/server.js +109 -6
  11. package/dist/store-routes.js +5 -4
  12. package/package.json +1 -1
  13. package/src/ai-label.ts +3 -0
  14. package/src/follow-page.ts +1 -1
  15. package/src/label-routes.ts +3 -1
  16. package/src/music-hub.ts +210 -0
  17. package/src/music-store.ts +6 -2
  18. package/src/server.ts +95 -6
  19. package/src/store-routes.ts +5 -4
  20. package/web/dist/assets/{ar-CBn9fObz.js → ar-BUzfqyls.js} +1 -1
  21. package/web/dist/assets/chunk-Q2XQMA4B-BaoaSqsD.js +1 -0
  22. package/web/dist/assets/{cs-BvEScz92.js → cs-Cg4JJr06.js} +1 -1
  23. package/web/dist/assets/{da-uKElVtgi.js → da-Dw-Resfu.js} +1 -1
  24. package/web/dist/assets/{de-DXEoI1GG.js → de-CZ5dYZwQ.js} +1 -1
  25. package/web/dist/assets/{es-Q-QEZFh2.js → es-D-dOpAe8.js} +1 -1
  26. package/web/dist/assets/{fi-ClJkdfXs.js → fi-k22PyB0Z.js} +1 -1
  27. package/web/dist/assets/{fr-DWmNoP1h.js → fr-DYab0grY.js} +1 -1
  28. package/web/dist/assets/{hi-DGQOrveg.js → hi-BvC83nQm.js} +1 -1
  29. package/web/dist/assets/{hls-OR5FY6YP-CxI-FwpW.js → hls-OR5FY6YP-B-70I17r.js} +1 -1
  30. package/web/dist/assets/{hu-DGcKM8DB.js → hu-vUE9gd3q.js} +1 -1
  31. package/web/dist/assets/{id-D18Cz5RW.js → id-CZk93O-W.js} +1 -1
  32. package/web/dist/assets/{it-WQxuRjlI.js → it-RH7JO2dG.js} +1 -1
  33. package/web/dist/assets/{main-cry6C8KD.js → main-DtTNC2wE.js} +2 -2
  34. package/web/dist/assets/modulepreload-polyfill-P2Xu9kJm.js +1 -0
  35. package/web/dist/assets/{mpegts-7CN75AI2-D-6xFZI-.js → mpegts-7CN75AI2-D-bdbDNw.js} +1 -1
  36. package/web/dist/assets/{mpegts-D2ZKeEby.js → mpegts-C_-pZIIG.js} +1 -1
  37. package/web/dist/assets/music-CmI2KJ1Y.js +1 -0
  38. package/web/dist/assets/music-jouma3VD.css +1 -0
  39. package/web/dist/assets/{nl-BvOA9QBr.js → nl-CuG3UJ3J.js} +1 -1
  40. package/web/dist/assets/radio-DmVc3wpH.js +1 -0
  41. package/web/dist/assets/{ru-Cx4tgP1k.js → ru-B2Iki93q.js} +1 -1
  42. package/web/dist/assets/{station-BzLUgyQ0.js → station-DtY1LOm5.js} +1 -1
  43. package/web/dist/assets/{sv-f0zj1AdU.js → sv-ChF-PxpS.js} +1 -1
  44. package/web/dist/assets/{uk-DpGYtFFI.js → uk-kLEkvaMX.js} +1 -1
  45. package/web/dist/assets/{vi-Cxf7VqJQ.js → vi-CjnMlYos.js} +1 -1
  46. package/web/dist/assets/vod-BzQvQVLd.js +1 -0
  47. package/web/dist/assets/watch-B9LW8D1C.js +1 -0
  48. package/web/dist/assets/{zh-DyuYbygO.js → zh-Uq6eryT3.js} +1 -1
  49. package/web/dist/index.html +4 -3
  50. package/web/dist/music.html +43 -0
  51. package/web/dist/radio.html +3 -2
  52. package/web/dist/station.html +3 -2
  53. package/web/dist/sw.js +30 -27
  54. package/web/dist/vod.html +3 -2
  55. package/web/dist/watch.html +3 -2
  56. package/web/dist/assets/chunk-Q2XQMA4B-PTuZPMen.js +0 -1
  57. package/web/dist/assets/radio-DV3h4YZS.js +0 -1
  58. package/web/dist/assets/vod-Bbg_gWbl.js +0 -1
  59. package/web/dist/assets/watch-Bygo4bPY.js +0 -1
package/web/dist/sw.js CHANGED
@@ -1,44 +1,47 @@
1
1
  /* nixamp service worker — generated, do not edit */
2
- const CACHE = "nixamp-1792568214892";
2
+ const CACHE = "nixamp-1792568755211";
3
3
  const PRECACHE = [
4
4
  "/",
5
5
  "/.well-known/openaccess.json",
6
6
  "/.well-known/openwebring.json",
7
7
  "/apple-touch-icon.png",
8
- "/assets/ar-CBn9fObz.js",
8
+ "/assets/ar-BUzfqyls.js",
9
9
  "/assets/background.worker-Hz7oaQ8X.js",
10
+ "/assets/chunk-Q2XQMA4B-BaoaSqsD.js",
10
11
  "/assets/chunk-Q2XQMA4B-DdHrVlSJ.css",
11
- "/assets/chunk-Q2XQMA4B-PTuZPMen.js",
12
- "/assets/cs-BvEScz92.js",
13
- "/assets/da-uKElVtgi.js",
14
- "/assets/de-DXEoI1GG.js",
15
- "/assets/es-Q-QEZFh2.js",
16
- "/assets/fi-ClJkdfXs.js",
17
- "/assets/fr-DWmNoP1h.js",
18
- "/assets/hi-DGQOrveg.js",
19
- "/assets/hls-OR5FY6YP-CxI-FwpW.js",
12
+ "/assets/cs-Cg4JJr06.js",
13
+ "/assets/da-Dw-Resfu.js",
14
+ "/assets/de-CZ5dYZwQ.js",
15
+ "/assets/es-D-dOpAe8.js",
16
+ "/assets/fi-k22PyB0Z.js",
17
+ "/assets/fr-DYab0grY.js",
18
+ "/assets/hi-BvC83nQm.js",
19
+ "/assets/hls-OR5FY6YP-B-70I17r.js",
20
20
  "/assets/hls-n74Cnh8A.js",
21
- "/assets/hu-DGcKM8DB.js",
22
- "/assets/id-D18Cz5RW.js",
23
- "/assets/it-WQxuRjlI.js",
24
- "/assets/main-cry6C8KD.js",
25
- "/assets/mpegts-7CN75AI2-D-6xFZI-.js",
26
- "/assets/mpegts-D2ZKeEby.js",
21
+ "/assets/hu-vUE9gd3q.js",
22
+ "/assets/id-CZk93O-W.js",
23
+ "/assets/it-RH7JO2dG.js",
24
+ "/assets/main-DtTNC2wE.js",
25
+ "/assets/modulepreload-polyfill-P2Xu9kJm.js",
26
+ "/assets/mpegts-7CN75AI2-D-bdbDNw.js",
27
+ "/assets/mpegts-C_-pZIIG.js",
28
+ "/assets/music-CmI2KJ1Y.js",
29
+ "/assets/music-jouma3VD.css",
27
30
  "/assets/native-C7JTKWJH-BUyIoj0P.js",
28
- "/assets/nl-BvOA9QBr.js",
31
+ "/assets/nl-CuG3UJ3J.js",
29
32
  "/assets/radio-Cmg6GPN2.css",
30
- "/assets/radio-DV3h4YZS.js",
33
+ "/assets/radio-DmVc3wpH.js",
31
34
  "/assets/remote-DJqvFdE6.js",
32
- "/assets/ru-Cx4tgP1k.js",
35
+ "/assets/ru-B2Iki93q.js",
33
36
  "/assets/station-6b_smJHe.css",
34
- "/assets/station-BzLUgyQ0.js",
35
37
  "/assets/station-CphmRiag.js",
36
- "/assets/sv-f0zj1AdU.js",
37
- "/assets/uk-DpGYtFFI.js",
38
- "/assets/vi-Cxf7VqJQ.js",
39
- "/assets/vod-Bbg_gWbl.js",
40
- "/assets/watch-Bygo4bPY.js",
41
- "/assets/zh-DyuYbygO.js",
38
+ "/assets/station-DtY1LOm5.js",
39
+ "/assets/sv-ChF-PxpS.js",
40
+ "/assets/uk-kLEkvaMX.js",
41
+ "/assets/vi-CjnMlYos.js",
42
+ "/assets/vod-BzQvQVLd.js",
43
+ "/assets/watch-B9LW8D1C.js",
44
+ "/assets/zh-Uq6eryT3.js",
42
45
  "/favicon.png",
43
46
  "/hero.png",
44
47
  "/icons/icon-192-maskable.png",
package/web/dist/vod.html CHANGED
@@ -6,8 +6,9 @@
6
6
  <title>On demand · nixamp</title>
7
7
  <meta name="theme-color" content="#080c09" />
8
8
  <link rel="icon" href="/favicon.png" type="image/png" sizes="64x64" />
9
- <script type="module" crossorigin src="/assets/vod-Bbg_gWbl.js"></script>
10
- <link rel="modulepreload" crossorigin href="/assets/chunk-Q2XQMA4B-PTuZPMen.js">
9
+ <script type="module" crossorigin src="/assets/vod-BzQvQVLd.js"></script>
10
+ <link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-P2Xu9kJm.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/chunk-Q2XQMA4B-BaoaSqsD.js">
11
12
  <link rel="stylesheet" crossorigin href="/assets/chunk-Q2XQMA4B-DdHrVlSJ.css">
12
13
  <link rel="stylesheet" crossorigin href="/assets/station-6b_smJHe.css">
13
14
  </head>
@@ -7,8 +7,9 @@
7
7
  <meta name="robots" content="noindex" />
8
8
  <meta name="theme-color" content="#080c09" />
9
9
  <link rel="icon" href="/favicon.png" type="image/png" sizes="64x64" />
10
- <script type="module" crossorigin src="/assets/watch-Bygo4bPY.js"></script>
11
- <link rel="modulepreload" crossorigin href="/assets/chunk-Q2XQMA4B-PTuZPMen.js">
10
+ <script type="module" crossorigin src="/assets/watch-B9LW8D1C.js"></script>
11
+ <link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-P2Xu9kJm.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/chunk-Q2XQMA4B-BaoaSqsD.js">
12
13
  <link rel="stylesheet" crossorigin href="/assets/chunk-Q2XQMA4B-DdHrVlSJ.css">
13
14
  <link rel="stylesheet" crossorigin href="/assets/station-6b_smJHe.css">
14
15
  </head>
@@ -1 +0,0 @@
1
- (function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e=`modulepreload`,t=function(e){return`/`+e},n={},r=function(r,i,a){let o=Promise.resolve();if(i&&i.length>0){let r=document.getElementsByTagName(`link`),s=document.querySelector(`meta[property=csp-nonce]`),c=s?.nonce||s?.getAttribute(`nonce`);function l(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function u(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}o=l(i.map(i=>{if(i=t(i,a),i=u(i),i in n)return;n[i]=!0;let o=i.endsWith(`.css`);for(let e=r.length-1;e>=0;e--){let t=r[e];if(t.href===i&&(!o||t.rel===`stylesheet`))return}let s=document.createElement(`link`);if(s.rel=o?`stylesheet`:e,o||(s.as=`script`),s.crossOrigin=``,s.href=i,c&&s.setAttribute(`nonce`,c),document.head.appendChild(s),o)return new Promise((e,t)=>{s.addEventListener(`load`,e),s.addEventListener(`error`,()=>t(Error(`Unable to preload CSS for ${i}`)))})}))}function s(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return o.then(e=>{for(let t of e||[])t.status===`rejected`&&s(t.reason);return r().catch(s)})};function i(e,t){if(!e||e.length===0||!Number.isFinite(t)||t<=0)return[];let n=new Set,r=e.filter(e=>!!e&&typeof e.title==`string`).map(e=>({start:Math.floor(e.start),title:e.title.trim()})).filter(e=>Number.isFinite(e.start)&&e.start>=0).filter(e=>e.start<t).filter(e=>e.title!==``).sort((e,t)=>e.start-t.start).filter(e=>!n.has(e.start)&&(n.add(e.start),!0));return r.map((e,n)=>({...e,end:r[n+1]?.start??t,position:e.start/t}))}function a(e,t){if(!Number.isFinite(t))return null;let n=null;for(let r of e)if(r.start<=t)n=r;else break;return n}var o=`profullstack.player.prefs`,s=`profullstack.player.positions`,c=60,l={volume:1,muted:!1,rate:1};function u(e){if(e!==void 0)return e;try{return typeof window>`u`?null:window.localStorage}catch{return null}}function d(e,t){if(!e)return null;try{let n=e.getItem(t);return n===null?null:JSON.parse(n)}catch{return null}}function f(e,t,n){if(e)try{e.setItem(t,JSON.stringify(n))}catch{}}function p(e,t,n,r){return typeof e==`number`&&Number.isFinite(e)?Math.min(n,Math.max(t,e)):r}function m(e){let t=d(u(e),o);return t?{volume:p(t.volume,0,1,l.volume),muted:typeof t.muted==`boolean`?t.muted:l.muted,rate:p(t.rate,.25,4,l.rate)}:{...l}}function h(e,t){f(u(t),o,e)}function g(e){let t=d(e,s);if(!t||typeof t!=`object`)return{};let n={};for(let[e,r]of Object.entries(t)){if(!r||typeof r!=`object`)continue;let t=r;typeof t.t==`number`&&Number.isFinite(t.t)&&(n[e]={t:t.t,d:typeof t.d==`number`&&Number.isFinite(t.d)?t.d:0,at:typeof t.at==`number`&&Number.isFinite(t.at)?t.at:0})}return n}function ee(e,t){return g(u(t))[e]??null}function _(e,t,n,r=Date.now){let i=u(n);if(!i)return;let a=g(i);a[e]={t:t.t,d:t.d,at:r()};let o=Object.entries(a).sort(([,e],[,t])=>t.at-e.at).slice(0,c);f(i,s,Object.fromEntries(o))}function v(e,t){let n=u(t);if(!n)return;let r=g(n);if(!(e in r))return;let i=Object.entries(r).filter(([t])=>t!==e);f(n,s,Object.fromEntries(i))}var y=15,b=20;function x(e,t){return!e||!Number.isFinite(t)||t<=0||Number.isFinite(e.d)&&e.d>0&&Math.abs(e.d-t)>1?!1:e.t>=y&&e.t<=t-b}function S(e){if(!Number.isFinite(e)||e<0)return`--:--`;let t=Math.floor(e),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60,a=e=>String(e).padStart(2,`0`);return n>0?`${String(n)}:${a(r)}:${a(i)}`:`${String(r)}:${a(i)}`}function C(e){if(typeof e!=`string`)return null;let t=e.trim().toLowerCase();if(t===``)return null;if(t.includes(`:`)){let e=t.split(`:`);if(e.length>3)return null;let n=0;for(let t of e){if(!/^\d+$/.test(t))return null;n=n*60+Number(t)}return n}if(/^\d+s?$/.test(t))return Number(t.replace(`s`,``));let n=/^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/.exec(t);if(!n||n[1]===void 0&&n[2]===void 0&&n[3]===void 0)return null;let r=Number(n[1]??0),i=Number(n[2]??0),a=Number(n[3]??0);return r*3600+i*60+a}function w(e){return!Number.isFinite(e)||e<=0?`0`:String(Math.floor(e))}var T=[[/\bAFT[A-Z0-9]+\b/i,`firetv`],[/\bKF[A-Z]+\b/,`silk`],[/\bSilk\b/i,`silk`],[/\bAndroid TV\b/i,`androidtv`],[/\bGoogleTV\b/i,`googletv`],[/\bTizen\b/i,`tizen`],[/\bWeb0S\b/i,`webos`],[/\bRoku\b/i,`roku`],[/AppleTV/i,`appletv`],[/\bCrKey\b/i,`chromecast`],[/\bSMART-TV\b/i,`smarttv`],[/\bSmartTV\b/i,`smarttv`]];function E(e){if(!e)return null;for(let[t,n]of T)if(t.test(e))return n;return null}function D(e){return E(e)!==null}function te(e){return e?{hideAfterMs:6e3,seekStep:10,alwaysShowFocus:!0}:{hideAfterMs:2800,seekStep:5,alwaysShowFocus:!1}}var O=[[/\.m3u8$/i,`hls`],[/\.(ts|mts|m2ts|mpegts)$/i,`mpegts`],[/\.(mp3|m4a|aac|oga|ogg|opus|wav|flac)$/i,`audio`],[/\.(mp4|m4v|webm|mov|ogv)$/i,`mp4`]],ne=[[/mpegurl/i,`hls`],[/mp2t|mpeg-?ts/i,`mpegts`],[/^audio\//i,`audio`],[/^video\//i,`mp4`]];function k(e){if(e.kind)return e.kind;if(e.mimeType){for(let[t,n]of ne)if(t.test(e.mimeType))return n}let t=A(e.src);for(let[e,n]of O)if(e.test(t))return n;return`unknown`}function A(e){try{return new URL(e,`https://placeholder.invalid`).pathname}catch{return e.split(/[?#]/)[0]??e}}function re(e=globalThis,t=null){let n=e.MediaSource!==void 0,r=!1;try{let e=t??(typeof document>`u`?null:document.createElement(`video`));r=e?e.canPlayType(`application/vnd.apple.mpegurl`)!==``||e.canPlayType(`application/x-mpegURL`)!==``:!1}catch{r=!1}return{mediaSource:n,nativeHls:r}}function ie(e,t){let n=k(e);switch(n){case`hls`:return t.mediaSource?{engine:`hls`,kind:n}:t.nativeHls?{engine:`native`,kind:n}:{engine:`native`,kind:n,unplayable:`This browser cannot play HLS streams.`};case`mpegts`:return t.mediaSource?{engine:`mpegts`,kind:n}:{engine:`mpegts`,kind:n,unplayable:`This browser cannot play transport streams.`};default:return{engine:`native`,kind:n}}}function ae(e){return e===`audio`}async function oe(e,t){let n=t.capabilities??re(),i=ie({src:t.src,...t.kind?{kind:t.kind}:{},...t.mimeType?{mimeType:t.mimeType}:{}},n),a=()=>void 0,o={media:e,src:t.src,isTv:t.isTv??!1,live:t.live??i.kind===`mpegts`,onError:t.onError??a,onNotice:t.onNotice??a,...t.headers?{headers:t.headers}:{},...t.onReady?{onReady:t.onReady}:{}};if(i.unplayable)return t.onError?.(i.unplayable),{destroy:a,engine:i.engine,kind:i.kind,levels:()=>[],unplayable:i.unplayable};let s,c=t.engines?.[i.engine];if(c)s=await c(o);else if(i.engine===`hls`){let{createHlsEngine:e}=await r(async()=>{let{createHlsEngine:e}=await import(`./hls-OR5FY6YP-CxI-FwpW.js`);return{createHlsEngine:e}},[]);s=await e(o)}else if(i.engine===`mpegts`){let{createMpegtsEngine:e}=await r(async()=>{let{createMpegtsEngine:e}=await import(`./mpegts-7CN75AI2-D-6xFZI-.js`);return{createMpegtsEngine:e}},[]);s=await e(o,{withCredentials:t.withCredentials??!1,unplayableAdvice:t.unplayableAdvice??``})}else{let{createNativeEngine:e}=await r(async()=>{let{createNativeEngine:e}=await import(`./native-C7JTKWJH-BUyIoj0P.js`);return{createNativeEngine:e}},[]);s=await e(o)}return{destroy:()=>{s.destroy()},engine:i.engine,kind:i.kind,levels:s.levels,...s.setLevel?{setLevel:s.setLevel}:{},...s.currentLevel?{currentLevel:s.currentLevel}:{}}}var j=300,se=120,ce=.4;function M(e,t,n,r){return n<=0||e===t?(r(t),Promise.resolve()):new Promise(i=>{let a=Date.now(),o=n*1e3,s=()=>{let n=Math.min(1,(Date.now()-a)/o);r(e+(t-e)*n),n<1?setTimeout(s,16):i()};s()})}var N=e=>Math.min(1,Math.max(0,e));function P(e){return e.volume>0?e.volume:1}function F(e){return e&&e.tagName===`VIDEO`?e:null}function I(e){return e?typeof document<`u`&&document.pictureInPictureElement===e||e.webkitPresentationMode===`picture-in-picture`:!1}async function L(e){let t=e,n=e.requestPictureInPicture;if(typeof n==`function`){await n.call(e);return}if(typeof t.webkitSetPresentationMode==`function`){t.webkitSetPresentationMode(`picture-in-picture`);return}throw Error(`picture-in-picture is not available here`)}var le=/\.(mp3|m4a|aac|ogg|oga|opus|wav|flac)(\?|#|$)/i;function ue(e){let t=typeof e==`string`?{url:e}:e;return{url:t.url,kind:t.kind??(le.test(t.url)?`audio`:`video`)}}function de(e,t,n,r=()=>Date.now()){let i=Math.max(5,n.everySeconds??j)*1e3,a=Math.max(5,n.maxSeconds??se)*1e3,o=Math.max(0,n.fadeSeconds??ce),s=n.revealStage!==!1;function c(){if(!s||typeof window>`u`)return;let t=e.getBoundingClientRect();if(Math.min(t.bottom,window.innerHeight)-Math.max(t.top,0)>=t.height*.6)return;let n=!window.matchMedia?.(`(prefers-reduced-motion: reduce)`).matches;e.scrollIntoView({block:`center`,behavior:n?`smooth`:`auto`})}async function l(e){if(e)try{await L(e)}catch(e){n.onError?.(e)}}let u=0,d=null,f=0,p=!1,m=!1,h=!n.preroll,g=document.createElement(`div`);g.className=`pux-ad`,g.hidden=!0,Object.assign(g.style,{position:`absolute`,inset:`0`,zIndex:`3`,display:`grid`,placeItems:`center`,background:`#000`});let ee=getComputedStyle(e).position;(!ee||ee===`static`)&&(e.style.position=`relative`);let _=document.createElement(`video`);_.className=`pux-ad__video`,_.playsInline=!0,_.preload=`auto`,Object.assign(_.style,{width:`100%`,height:`100%`,objectFit:`contain`,background:`#000`});let v=document.createElement(`audio`);v.className=`pux-ad__audio`,v.preload=`auto`;let y=_;for(let e of[_,v])e.muted=t.muted,e.volume=P(t);let b=document.createElement(`span`);b.className=`pux-ad__badge`,b.textContent=`Ad`,Object.assign(b.style,{position:`absolute`,top:`0.75rem`,left:`0.75rem`,padding:`0.15rem 0.5rem`,borderRadius:`0.25rem`,background:`rgb(0 0 0 / 0.65)`,color:`#fff`,font:`600 0.75rem/1.4 system-ui, sans-serif`,letterSpacing:`0.04em`,textTransform:`uppercase`});let x=document.createElement(`button`);x.type=`button`,x.className=`pux-ad__skip`,x.hidden=!0,Object.assign(x.style,{position:`absolute`,right:`1rem`,bottom:`1rem`,padding:`0.5rem 0.9rem`,border:`1px solid rgb(255 255 255 / 0.4)`,borderRadius:`0.3rem`,background:`rgb(0 0 0 / 0.6)`,color:`#fff`,font:`500 0.85rem/1 system-ui, sans-serif`,cursor:`pointer`}),g.append(_,v,b,x),e.append(g);function S(){if(m||p)return;let e=r();if(t.paused){d=null;return}d!==null&&(u+=e-d),d=e,u>=i&&C()}async function C(){if(p||m)return;p=!0,u=0,d=null;let r=null;try{r=await n.next()}catch(e){n.onError?.(e)}if(!r||m){p=!1;return}let i=ue(r),s=i.url;y=i.kind===`audio`?v:_;let h=f++,ee=!t.paused,b=i.kind!==`audio`&&I(t),S=P(t);await M(S,0,o,e=>{t.volume=N(e)}),t.pause(),y.src=s,y.currentTime=0,y.muted=t.muted,y.volume=0,g.style.opacity=`0`,c(),g.hidden=!1,g.classList.toggle(`pux-ad--audio`,i.kind===`audio`);let C=i.kind===`audio`;g.style.background=C?`rgb(0 0 0 / 0.35)`:`#000`,_.style.display=C?`none`:``,e.classList.add(`pux-player--ad`),n.onBreakStart?.({url:s,index:h});let w=!1,T=e=>{p&&(w=e,M(1,0,o,e=>{g.style.opacity=String(e),y.volume=N(S*e)}).then(async()=>{b&&I(y)&&await l(F(t)),E(),n.onBreakEnd?.({url:s,index:h,skipped:w}),!m&&(t.volume=0,ee&&t.play().catch(()=>{}),M(0,S,o,e=>{t.volume=N(e)}))}))};function E(){clearTimeout(ne),clearInterval(A),y.removeEventListener(`ended`,D),y.removeEventListener(`error`,te),x.removeEventListener(`click`,O),y.pause(),y.removeAttribute(`src`),y.load(),g.hidden=!0,g.classList.remove(`pux-ad--audio`),x.hidden=!0,e.classList.remove(`pux-player--ad`),p=!1}let D=()=>T(!1),te=()=>{n.onError?.(Error(`advert failed to play: ${s}`)),T(!1)},O=()=>T(!0);y.addEventListener(`ended`,D),y.addEventListener(`error`,te),x.addEventListener(`click`,O);let ne=setTimeout(()=>T(!1),a),k=n.skipAfter,A=0;if(typeof k==`number`&&k>=0){let e=k;x.hidden=!1;let t=()=>{let t=Math.ceil(e-y.currentTime);t>0?(x.disabled=!0,x.textContent=`Skip in ${t}`):(x.disabled=!1,x.textContent=`Skip ad`)};t(),A=setInterval(t,250)}try{await y.play(),b&&await l(y),await M(0,1,o,e=>{g.style.opacity=String(e),y.volume=N(S*e)})}catch(e){n.onError?.(e),t.volume=N(S),T(!1)}}let w=()=>S(),T=()=>{d=r(),h||(h=!0,C())},E=()=>{S(),d=null},D=()=>{for(let e of[_,v])e.muted=t.muted,e.volume=P(t)};return t.addEventListener(`timeupdate`,w),t.addEventListener(`play`,T),t.addEventListener(`pause`,E),t.addEventListener(`volumechange`,D),{play(){return C()},destroy(){m=!0,I(y)&&l(F(t)),t.removeEventListener(`timeupdate`,w),t.removeEventListener(`play`,T),t.removeEventListener(`pause`,E),t.removeEventListener(`volumechange`,D),_.pause(),v.pause(),g.remove()},get playing(){return p}}}var fe=[1,1.25,1.5,1.75,2,.75],pe=5e3,R=10,z={play:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M8 5v14l11-7z"/></svg>`,pause:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 5h4v14H6zM14 5h4v14h-4z"/></svg>`,replay:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5V1L7 6l5 5V7a6 6 0 1 1-6 6H4a8 8 0 1 0 8-8z"/></svg>`,back10:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5V1L7 6l5 5V7a6 6 0 1 1-6 6H4a8 8 0 1 0 8-8z"/><text x="12" y="17" font-size="8" text-anchor="middle" fill="currentColor">10</text></svg>`,fwd10:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5V1l5 5-5 5V7a6 6 0 1 0 6 6h2a8 8 0 1 1-8-8z"/><text x="12" y="17" font-size="8" text-anchor="middle" fill="currentColor">10</text></svg>`,volume:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M3 9v6h4l5 5V4L7 9H3zm13.5 3a4.5 4.5 0 0 0-2.5-4v8a4.5 4.5 0 0 0 2.5-4z"/></svg>`,muted:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M3 9v6h4l5 5V4L7 9H3z"/><path d="M15 9l6 6m0-6l-6 6" stroke="currentColor" stroke-width="2" fill="none"/></svg>`,pip:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M3 5h18v14H3z" fill="none" stroke="currentColor" stroke-width="2"/><path d="M12 12h7v5h-7z"/></svg>`,link:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M8 16a4 4 0 0 1 0-5.7l2-2a4 4 0 0 1 5.7 5.7l-1 1-1.4-1.4 1-1a2 2 0 0 0-2.9-2.9l-2 2A2 2 0 0 0 9.4 14.6L8 16z"/><path d="M16 8a4 4 0 0 1 0 5.7l-2 2A4 4 0 0 1 8.3 10l1-1 1.4 1.4-1 1a2 2 0 0 0 2.9 2.9l2-2A2 2 0 0 0 14.6 9.4L16 8z"/></svg>`,enterFullscreen:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 9V4h5v2H6v3H4zm11-5h5v5h-2V6h-3V4zM4 15h2v3h3v2H4v-5zm14 0h2v5h-5v-2h3v-3z"/></svg>`,exitFullscreen:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M9 4v3H6v2H4V4h5zm6 0h5v5h-2V7h-3V4zM4 15h2v3h3v2H4v-5zm14 3v-3h2v5h-5v-2h3z"/></svg>`};function B(e,t,n={}){let r=document.createElement(e);r.className=t;for(let[e,t]of Object.entries(n))r.setAttribute(e,t);return r}function V(e,t,n,r){let i=B(`button`,e,{type:`button`,"aria-label":t,title:t,"data-control":r});return i.innerHTML=n,i}function me(e){let t=e.error,n=t?.message??``;if(/URL safety check/i.test(n))return`This was blocked before it could load. That is a configuration problem on our side, not on yours — please report it.`;switch(t?.code){case 1:return`Playback was stopped before it started.`;case 2:return`The connection dropped while loading. Check your network and try again.`;case 3:return`This could not be decoded by your browser.`;case 4:return`This is missing, or in a format your browser cannot play.`;default:return`This could not be played.`}}function he(e,t){let{src:n,mediaId:r,startAt:o=null,shareUrl:s=null,storage:c,now:u=Date.now,userAgent:d=typeof navigator>`u`?``:navigator.userAgent}=t,f=D(d),p=te(f),g=t.capabilities??re(),y=ie({src:n,...t.kind?{kind:t.kind}:{},...t.mimeType?{mimeType:t.mimeType}:{}},g),b=t.audio??(typeof HTMLAudioElement<`u`&&t.media instanceof HTMLAudioElement||ae(y.kind)),C=t.live??y.kind===`mpegts`,w=t.media??document.createElement(b?`audio`:`video`);t.media||e.append(w),!b&&t.poster&&w instanceof HTMLVideoElement&&(w.poster=t.poster),w instanceof HTMLVideoElement&&(w.playsInline=!0),w.controls=!1,e.classList.add(`pux-player`),f&&e.classList.add(`pux-player--tv`),b&&e.classList.add(`pux-player--audio`),e.hasAttribute(`tabindex`)||e.setAttribute(`tabindex`,`0`);let T=V(`pux-player__overlay`,`Play`,z.play,`overlay`),E=B(`div`,`pux-player__spinner`,{"aria-hidden":`true`}),O=B(`div`,`pux-player__notice`,{role:`status`,"aria-live":`polite`});O.hidden=!0;let ne=B(`span`,`pux-player__notice-text`),k=B(`button`,`pux-player__notice-action`,{type:`button`});k.hidden=!0,O.append(ne,k);let A=B(`div`,`pux-player__bar`),j=B(`div`,`pux-player__scrub`,{role:`slider`,tabindex:`0`,"aria-label":`Seek`,"aria-valuemin":`0`,"aria-valuenow":`0`}),se=B(`div`,`pux-player__track`),ce=B(`div`,`pux-player__buffered`),M=B(`div`,`pux-player__played`),N=B(`div`,`pux-player__marks`,{"aria-hidden":`true`}),P=B(`div`,`pux-player__handle`,{"aria-hidden":`true`}),F=B(`div`,`pux-player__tooltip`,{"aria-hidden":`true`});se.append(ce,M,N,P),j.append(se,F);let I=B(`div`,`pux-player__row`),L=V(`pux-player__btn`,`Play`,z.play,`play`),le=V(`pux-player__btn`,`Back ${String(R)} seconds`,z.back10,`back`),ue=V(`pux-player__btn`,`Forward ${String(R)} seconds`,z.fwd10,`forward`),he=B(`div`,`pux-player__volume`),H=V(`pux-player__btn`,`Mute`,z.volume,`mute`),U=B(`input`,`pux-player__volume-input`,{type:`range`,min:`0`,max:`1`,step:`0.05`,"aria-label":`Volume`,"data-control":`volume`});he.append(H,U);let ge=B(`div`,`pux-player__live`,{"data-control":`live`});ge.textContent=`LIVE`;let _e=B(`div`,`pux-player__time`),ve=B(`div`,`pux-player__chapter`),ye=B(`div`,`pux-player__spacer`),W=B(`button`,`pux-player__btn pux-player__btn--text`,{type:`button`,"aria-label":`Playback speed`,title:`Playback speed`,"data-control":`rate`}),G=B(`button`,`pux-player__btn pux-player__btn--text`,{type:`button`,"aria-label":`Quality`,title:`Quality`,"data-control":`quality`});G.hidden=!0;let be=V(`pux-player__btn`,`Copy link at this time`,z.link,`share`),K=V(`pux-player__btn`,`Picture in picture`,z.pip,`pip`),q=V(`pux-player__btn`,`Fullscreen`,z.enterFullscreen,`fullscreen`);I.append(L,le,ue,he,ge,_e,ve,ye,W,G,be,K,q),A.append(j,I),e.append(T,E,O,A),f&&(U.hidden=!0,K.hidden=!0),b&&(q.hidden=!0,K.hidden=!0,T.hidden=!0),s||(be.hidden=!0),(typeof document>`u`||!document.pictureInPictureEnabled)&&(K.hidden=!0);let xe=[],Se=t.chapters??[],Ce=[],we=null,Te=null,Ee=0,De=!1,Oe=!1,J=null,ke=[];function Y(e,t,n,r){e.addEventListener(t,n,r),Ce.push(()=>e.removeEventListener(t,n,r))}function X(e,t){ne.textContent=e,O.hidden=!1,Te&&clearTimeout(Te),t?(k.hidden=!1,k.textContent=t.label,k.onclick=()=>{t.run(),Ae()}):(k.hidden=!0,k.onclick=null),Te=setTimeout(Ae,t?9e3:4e3)}function Ae(){O.hidden=!0,k.onclick=null}function je(){e.classList.toggle(`pux-player--live`,C),j.hidden=C,le.hidden=C,ue.hidden=C,W.hidden=C,be.hidden=C||!s,ge.hidden=!C,_e.hidden=C,ve.hidden=C}function Me(){N.replaceChildren();for(let e of xe){let t=B(`button`,`pux-player__mark`,{type:`button`,"aria-label":`${e.title}, ${S(e.start)}`,title:e.title});t.style.left=`${String(e.position*100)}%`,t.addEventListener(`click`,t=>{t.stopPropagation(),w.currentTime=e.start}),N.append(t)}}function Ne(){xe=C?[]:i(Se,w.duration),Me(),Z()}function Z(){if(C)return;let e=w.duration,t=w.currentTime,n=Number.isFinite(e)&&e>0,r=n?Math.min(1,Math.max(0,t/e)):0;if(M.style.width=`${String(r*100)}%`,P.style.left=`${String(r*100)}%`,w.buffered.length>0&&n){let n=0;for(let e=0;e<w.buffered.length;e+=1)if(w.buffered.start(e)<=t&&w.buffered.end(e)>=t){n=w.buffered.end(e);break}ce.style.width=`${String(Math.min(1,n/e)*100)}%`}_e.textContent=`${S(t)} / ${S(e)}`,j.setAttribute(`aria-valuenow`,String(Math.floor(t))),n&&j.setAttribute(`aria-valuemax`,String(Math.floor(e))),j.setAttribute(`aria-valuetext`,n?`${S(t)} of ${S(e)}`:S(t));let i=a(xe,t);ve.textContent=i?i.title:``}function Pe(){let t=!w.paused&&!w.ended,n=w.ended,r=n?z.replay:t?z.pause:z.play,i=n?`Play again`:t?`Pause`:`Play`;L.innerHTML=r,L.setAttribute(`aria-label`,i),L.title=i,T.innerHTML=r,T.setAttribute(`aria-label`,i),e.classList.toggle(`pux-player--playing`,t),e.classList.toggle(`pux-player--ended`,n),t||Q(!1)}function Fe(){let e=w.muted||w.volume===0;H.innerHTML=e?z.muted:z.volume,H.setAttribute(`aria-label`,e?`Unmute`:`Mute`),H.setAttribute(`aria-pressed`,e?`true`:`false`),U.value=String(e?0:w.volume)}function Ie(){W.textContent=`${String(w.playbackRate)}\xD7`,W.setAttribute(`aria-label`,`Playback speed, ${String(w.playbackRate)} times`)}function Le(){if(G.hidden=ke.length<2||!J?.setLevel,G.hidden)return;let e=J?.currentLevel?.()??-1,t=ke.find(t=>t.index===e);G.textContent=e===-1?`Auto`:t?.label??`Auto`}function Q(t=!0){e.classList.add(`pux-player--controls`),we&&clearTimeout(we),t&&(we=setTimeout(()=>{w.paused||e.classList.remove(`pux-player--controls`)},p.hideAfterMs))}function Re(){Ye?.playing||(w.paused||w.ended?w.play().catch(()=>void 0):w.pause())}function $(e){if(C)return;let t=Number.isFinite(w.duration)?w.duration:1/0;w.currentTime=Math.min(t,Math.max(0,w.currentTime+e)),Z(),Q()}function ze(e){C||!Number.isFinite(w.duration)||w.duration<=0||(w.currentTime=Math.min(1,Math.max(0,e))*w.duration,Z())}function Be(e){let t=se.getBoundingClientRect();return t.width===0?0:(e-t.left)/t.width}function Ve(e){let t=fe[(fe.indexOf(w.playbackRate)+e+fe.length)%fe.length]??1;w.playbackRate=t}function He(){if(!J?.setLevel)return;let e=[-1,...ke.map(e=>e.index)],t=J.currentLevel?.()??-1,n=e[(e.indexOf(t)+1)%e.length]??-1;J.setLevel(n),Le(),Q()}async function Ue(){try{if(document.fullscreenElement){await document.exitFullscreen();return}await e.requestFullscreen()}catch{w.webkitEnterFullscreen?.()}}async function We(){try{document.pictureInPictureElement?await document.exitPictureInPicture():w instanceof HTMLVideoElement&&await w.requestPictureInPicture()}catch{X(`Picture in picture is not available here.`)}}async function Ge(){if(!s)return;let e=Math.floor(w.currentTime),t=s(e);try{await navigator.clipboard.writeText(t),X(`Link copied, starting at ${S(e)}.`)}catch{X(t)}}Y(w,`loadedmetadata`,()=>{if(Ne(),Z(),C)return;let e=typeof o==`number`&&o>0?o:null;if(e!==null&&Number.isFinite(w.duration)&&e<w.duration){w.currentTime=e;return}if(!r)return;let t=ee(r,c);x(t,w.duration)&&t&&(w.currentTime=t.t,X(`Resumed at ${S(t.t)}.`,{label:`Start over`,run:()=>{w.currentTime=0,v(r,c)}}))});function Ke(){!C&&r&&Number.isFinite(w.duration)&&w.duration>0&&!w.ended&&_(r,{t:w.currentTime,d:w.duration},c,u)}Y(w,`timeupdate`,()=>{De||Z(),!(u()-Ee<pe)&&(Ee=u(),Ke())}),Y(w,`progress`,Z),Y(w,`seeked`,Z),Y(w,`seeking`,Z),Y(w,`durationchange`,Ne),Y(w,`play`,Pe),Y(w,`pause`,()=>{Pe(),Ke()}),Y(w,`ended`,()=>{Pe(),r&&v(r,c)}),Y(w,`volumechange`,()=>{Fe(),h({volume:w.volume,muted:w.muted,rate:w.playbackRate},c)}),Y(w,`ratechange`,()=>{Ie(),h({volume:w.volume,muted:w.muted,rate:w.playbackRate},c)}),Y(w,`waiting`,()=>e.classList.add(`pux-player--buffering`)),Y(w,`playing`,()=>e.classList.remove(`pux-player--buffering`)),Y(w,`canplay`,()=>e.classList.remove(`pux-player--buffering`)),Y(w,`error`,()=>{e.classList.remove(`pux-player--buffering`),e.classList.add(`pux-player--failed`),X(me(w))}),Y(T,`click`,Re),Y(L,`click`,Re),Y(le,`click`,()=>{$(-R)}),Y(ue,`click`,()=>{$(R)}),Y(H,`click`,()=>{w.muted=!w.muted}),Y(U,`input`,()=>{w.volume=Number(U.value),w.muted=Number(U.value)===0}),Y(W,`click`,()=>{Ve(1)}),Y(G,`click`,He),Y(be,`click`,()=>void Ge()),Y(K,`click`,()=>void We()),Y(q,`click`,()=>void Ue()),Y(document,`fullscreenchange`,()=>{let t=document.fullscreenElement===e;e.classList.toggle(`pux-player--fullscreen`,t),q.innerHTML=t?z.exitFullscreen:z.enterFullscreen,q.setAttribute(`aria-label`,t?`Exit fullscreen`:`Fullscreen`)}),Y(j,`pointerdown`,e=>{let t=e;De=!0,j.setPointerCapture(t.pointerId),ze(Be(t.clientX))}),Y(j,`pointermove`,e=>{let t=Be(e.clientX);Number.isFinite(w.duration)&&w.duration>0&&(F.textContent=S(Math.max(0,Math.min(1,t))*w.duration),F.style.left=`${String(Math.max(0,Math.min(1,t))*100)}%`),De&&ze(t)});let qe=e=>{if(!De)return;De=!1;let t=e;j.hasPointerCapture(t.pointerId)&&j.releasePointerCapture(t.pointerId)};Y(j,`pointerup`,qe),Y(j,`pointercancel`,qe),Y(e,`pointermove`,()=>{Q()}),Y(e,`pointerleave`,()=>{w.paused||e.classList.remove(`pux-player--controls`)}),Y(e,`focusin`,()=>{Q()}),Y(e,`keydown`,e=>{let t=e.key,n=e.target,r=n?I.contains(n):!1;if(!(r&&[`ArrowLeft`,`ArrowRight`,`ArrowUp`,`ArrowDown`].includes(t)))switch(t){case` `:case`k`:case`Enter`:if(t===`Enter`&&n?.closest(`button`))return;e.preventDefault(),Re();break;case`ArrowLeft`:e.preventDefault(),$(-p.seekStep);break;case`ArrowRight`:e.preventDefault(),$(p.seekStep);break;case`j`:$(-R);break;case`l`:$(R);break;case`ArrowUp`:e.preventDefault(),w.volume=Math.min(1,w.volume+.1),w.muted=!1,Q();break;case`ArrowDown`:e.preventDefault(),w.volume=Math.max(0,w.volume-.1),Q();break;case`m`:w.muted=!w.muted,Q();break;case`f`:q.hidden||Ue();break;case`p`:K.hidden||We();break;case`Home`:e.preventDefault(),C||(w.currentTime=0);break;case`End`:e.preventDefault(),!C&&Number.isFinite(w.duration)&&(w.currentTime=w.duration);break;case`<`:case`,`:C||(Ve(-1),Q());break;case`>`:case`.`:C||(Ve(1),Q());break;default:/^[0-9]$/.test(t)&&!r&&!C&&(e.preventDefault(),ze(Number(t)/10))}}),Y(window,`pagehide`,Ke);let Je=m(c);w.volume=Je.volume,w.muted=t.autoplay?!0:Je.muted,w.playbackRate=Je.rate===0?l.rate:Je.rate,je(),Pe(),Fe(),Ie(),Z(),Ne(),Q(!1),y.unplayable&&(e.classList.add(`pux-player--failed`),X(y.unplayable));let Ye=t.ads?de(e,w,t.ads,u):null,Xe=Ze();async function Ze(){if(!y.unplayable)try{let r=await oe(w,{src:n,...t.kind?{kind:t.kind}:{},...t.mimeType?{mimeType:t.mimeType}:{},live:C,isTv:f,capabilities:g,withCredentials:t.withCredentials??!1,...t.headers?{headers:t.headers}:{},unplayableAdvice:t.unplayableAdvice??``,...t.engines?{engines:t.engines}:{},onError:t=>{e.classList.add(`pux-player--failed`),X(t)},onNotice:e=>{e===null?Ae():X(e)},onReady:e=>{Oe||(e.live!==C&&(C=e.live,je(),Ne()),ke=e.levels,Le())}});if(J=r,Oe){r.destroy(),J=null;return}Le(),t.autoplay&&w.play().catch(()=>void 0)}catch{e.classList.add(`pux-player--failed`),X(`The player could not be loaded. Please reload the page.`)}}return{media:w,destroy(){if(!Oe){Oe=!0,Ke(),Ye?.destroy(),we&&clearTimeout(we),Te&&clearTimeout(Te);for(let e of Ce)e();Xe.then(()=>{J?.destroy(),J=null}),T.remove(),E.remove(),O.remove(),A.remove(),t.media||w.remove(),e.classList.remove(`pux-player`,`pux-player--tv`,`pux-player--audio`,`pux-player--live`,`pux-player--controls`,`pux-player--playing`,`pux-player--ended`,`pux-player--buffering`,`pux-player--failed`,`pux-player--fullscreen`)}},setChapters(e){Se=e,Ne()}}}export{S as a,r as c,k as i,oe as n,w as o,he as r,C as s,de as t};
@@ -1 +0,0 @@
1
- import{n as e}from"./chunk-Q2XQMA4B-PTuZPMen.js";import{l as t}from"./remote-DJqvFdE6.js";var n=e=>document.querySelector(e);function r(e,t={},...n){let r=document.createElement(e);for(let[e,n]of Object.entries(t))n!==!1&&(e===`class`?r.className=String(n):r.setAttribute(e,n===!0?``:n));for(let e of n)e!=null&&e!==!1&&r.append(typeof e==`string`?document.createTextNode(e):e);return r}function i(e){n(`#sr-status`).textContent=e}var a;function o(e,t=`error`){let i=n(`#notice`);if(clearTimeout(a),i.classList.toggle(`ok`,t===`ok`),i.setAttribute(`role`,t===`ok`?`status`:`alert`),i.replaceChildren(),e!==``){let t=r(`button`,{type:`button`,class:`ghost notice-close`,"aria-label":`Dismiss`},`×`);t.addEventListener(`click`,()=>o(``)),i.append(r(`span`,{},e),t)}i.hidden=e===``,t===`ok`&&e&&(a=setTimeout(()=>o(``),6e3))}var s=class extends Error{status;code;constructor(e,t,n){super(n),this.status=e,this.code=t}},c={id:`here`,name:location.host,base:``,session:``,key:``},l=0;function u(e,t=!1){if(!c.base)return e;let n=new URL(c.base+e);return c.session?t&&n.searchParams.set(`session`,c.session):c.key&&n.searchParams.set(`k`,c.key),n.href}async function d(e,t,n){let r=c.base!==``,i=await fetch(u(t),{method:e,credentials:r?`omit`:`same-origin`,headers:{...n===void 0?{}:{"content-type":`application/json`},...r&&c.session?{authorization:`Bearer ${c.session}`}:{}},...n===void 0?{}:{body:JSON.stringify(n)}}),a=await i.json().catch(()=>({}));if(!i.ok)throw new s(i.status,String(a.code??i.status),String(a.error??`HTTP ${i.status}`));return a}async function f(e,t,n){if(!n?.disabled){n&&(n.disabled=!0);try{await t()}catch(t){o(`${e} failed: ${t instanceof Error?t.message:String(t)}`)}finally{n&&(n.disabled=!1)}}}function p(e){return e?`${Math.floor(e/60)}:${String(Math.floor(e%60)).padStart(2,`0`)}`:``}var m={live:`Live`,starting:`Starting`,recovering:`Coming back`,offline:`Offline`,stopped:`Off the air`},h=[],g=null;async function _(){let e=l,t=await d(`GET`,`/api/v1/stations?limit=200`);e===l&&(h=t.stations,w())}var ee=`https://backtoschool.help`,v=!1,y=new Map;function b(e){try{let t=new URL(e);return`${t.origin}${t.pathname.replace(/\/+$/,``)}?t=${t.searchParams.get(`t`)??``}`}catch{return e}}async function x(){if(!v)return;let e=await fetch(`/api/v1/events?mine=true&kind=class&status=live&limit=100`,{credentials:`same-origin`});if(!e.ok)return;let t=await e.json().catch(()=>({}));y=new Map((t.events??[]).filter(e=>e.broadcastUrl).map(e=>[b(e.broadcastUrl),e]))}async function S(e,t){let n=await fetch(e,{method:`POST`,credentials:`same-origin`,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),r=await n.json().catch(()=>({}));if(!n.ok)throw Error(String(r.error??`HTTP ${n.status}`));return r}async function C(e){e.desired!==`running`&&await d(`POST`,`/api/v1/stations/${e.id}/start`,{})}async function te(e,t){if(t&&!e.rights){T(e,{visibility:`public`,listed:!0});return}await d(`POST`,`/api/v1/stations/${e.id}/access`,t?{visibility:`public`,listed:!0}:{visibility:e.visibility,listed:!1}),t&&await C(e),i(t?`${e.name} is on live.streaming`:`${e.name} is off live.streaming`),await _()}async function ne(e,t){let n=y.get(b(e.links.page));if(!t){n&&await S(`/api/v1/events/${encodeURIComponent(n.id)}/end`,{version:n.version}),i(`${e.name} is off backtoschool.help`),await x(),w();return}let r=e;e.visibility===`private`&&(r=(await d(`POST`,`/api/v1/stations/${e.id}/access`,{visibility:`unlisted`})).station),await C(r);let a=(await S(`/api/v1/events`,{kind:`class`,title:r.name,broadcastUrl:r.links.page,visibility:`public`})).event;await S(`/api/v1/events/${encodeURIComponent(a.id)}/start`,{version:a.version}),i(`${r.name} is live on backtoschool.help`),await x(),await _()}async function re(e){let t=y.get(b(e.links.page));t&&await S(`/api/v1/events/${encodeURIComponent(t.id)}/end`,{version:t.version}).catch(()=>void 0)}function ie(e){let t=r(`div`,{class:`targets`}),n=r(`input`,{type:`checkbox`});n.checked=e.visibility===`public`&&e.listed,n.addEventListener(`change`,()=>{n.disabled=!0,f(`live.streaming`,()=>te(e,n.checked)).finally(()=>{n.disabled=!1,_().catch(()=>void 0)})}),t.append(r(`label`,{title:`Public and listed in the live.streaming guide`},n,`On live.streaming`)),n.checked&&t.append(r(`a`,{href:`https://live.streaming/`,target:`_blank`,rel:`noopener`},`open`));let i=y.get(b(e.links.page)),a=r(`input`,{type:`checkbox`,disabled:!v});return a.checked=i!==void 0,a.addEventListener(`change`,()=>{a.disabled=!0,f(`backtoschool.help`,()=>ne(e,a.checked)).finally(()=>{a.disabled=!v,w()})}),t.append(r(`label`,{title:v?`A live class on backtoschool.help that plays this station`:`Open nixamp.com/radio signed in to put stations on backtoschool.help`},a,`On backtoschool.help`)),i&&t.append(r(`a`,{href:`${ee}/live/${encodeURIComponent(i.slug)}`,target:`_blank`,rel:`noopener`},`open`)),t}function w(){let e=n(`#station-list`);if(e.replaceChildren(),h.length===0){e.append(r(`p`,{class:`hint`},`No stations yet. Make one below from a folder or a playlist.`));return}for(let t of h){let n=t.desired===`running`,a=t.visibility!==`private`,o=r(`button`,{type:`button`,class:`ghost`,disabled:!a,title:a?`Copy the listening link`:`Private: make it unlisted or public to share`},`Copy link`);o.addEventListener(`click`,()=>void f(`Copy`,async()=>{await navigator.clipboard.writeText(t.links.page),i(`Link to ${t.name} copied`),o.textContent=`Copied`,setTimeout(()=>{o.textContent=`Copy link`},1500)}));let s=r(`button`,{type:`button`},n?`Stop`:`Start`);s.addEventListener(`click`,()=>void f(n?`Stop`:`Start`,async()=>{await d(`POST`,`/api/v1/stations/${t.id}/${n?`stop`:`start`}`,{}),i(`${t.name} ${n?`stopped`:`started`}`),await _()}));let c=r(`button`,{type:`button`,class:`ghost`,disabled:t.state!==`live`},`Skip`);c.addEventListener(`click`,()=>void f(`Skip`,async()=>{await d(`POST`,`/api/v1/stations/${t.id}/skip`,{}),i(`Skipped`)}));let l=r(`button`,{type:`button`,class:`ghost`},`Who can listen…`);l.addEventListener(`click`,()=>T(t));let u=r(`button`,{type:`button`,class:`ghost danger`},`Delete`);u.addEventListener(`click`,()=>void f(`Delete`,async()=>{confirm(`Delete the station "${t.name}"? Its files are not touched.`)&&(await d(`DELETE`,`/api/v1/stations/${t.id}`),i(`${t.name} deleted`),await _())}));let p=t.excluded.length?r(`button`,{type:`button`,class:`ghost`},`Retry ${t.excluded.length} left out`):null;p?.addEventListener(`click`,()=>void f(`Retry`,async()=>{await d(`POST`,`/api/v1/stations/${t.id}/retry`,{}),await _()})),e.append(r(`article`,{class:`station`,id:`station-${t.id}`,"aria-label":t.name},r(`div`,{class:`station-head`},r(`span`,{class:`state state-${t.state}`},m[t.state]??t.state),r(`h3`,{},t.name),r(`span`,{class:`muted`},`${t.visibility}${t.listed?`, listed`:``}`)),r(`p`,{class:`muted`},`${t.items.length} files · ${t.shuffle?`shuffle`:`in order`} · ${t.repeat?`repeating`:`once`} · ${t.bitrate} kbps · ${t.listeners} listening`),t.error&&t.state!==`live`?r(`p`,{class:`warn`},t.error):null,...(t.alerts??[]).map(e=>r(`p`,{class:`warn`,role:`status`},`⚠ ${e}`)),t.metrics?r(`p`,{class:`muted`},`This month: ${(t.metrics.month.bytes/1024**2).toFixed(1)} MB delivered · ${Math.round(t.metrics.month.listenerSeconds/3600*10)/10} listener-hours · peak ${t.metrics.month.peakListeners}`):null,ie(t),a?r(`p`,{class:`link`},r(`a`,{href:t.links.page,target:`_blank`,rel:`noopener`},`Open the listening page`)):null,r(`div`,{class:`actions`},s,c,o,l,p,u)))}}function T(e,t){g=e;let r=n(`#publish-form`);r.elements.namedItem(`visibility`).value=t?.visibility??e.visibility,r.elements.namedItem(`listed`).checked=t?.listed??(e.visibility!==`public`||e.listed),r.elements.namedItem(`basis`).value=e.rights?.basis??``,r.elements.namedItem(`note`).value=e.rights?.note??``,E(),n(`#publish-dialog`).showModal()}function E(){let e=n(`#publish-form`),t=e.elements.namedItem(`visibility`).value===`public`;n(`#public-only`).hidden=!t,e.elements.namedItem(`basis`).required=t}async function ae(){if(!g)return;let e=n(`#publish-form`),t=e.elements.namedItem(`visibility`).value,r=e.elements.namedItem(`basis`).value,i=e.elements.namedItem(`note`).value,a=await d(`POST`,`/api/v1/stations/${g.id}/access`,{visibility:t,listed:t===`public`&&e.elements.namedItem(`listed`).checked,...r?{rights:{basis:r,note:i}}:{}});t===`private`?await re(g):t===`public`&&e.elements.namedItem(`listed`).checked&&await C(g);let s=t===`private`?`${g.name} is private`:t===`unlisted`?`${g.name} is unlisted: anyone with the link can listen`:`${g.name} is public${e.elements.namedItem(`listed`).checked?` and on the air on live.streaming`:``}`;o(a.dropped?`${s}; ${a.dropped} listeners disconnected`:s,`ok`),await x(),await _(),D(g.id)}function D(e){let t=document.getElementById(`station-${e}`);t&&(t.scrollIntoView({block:`center`}),t.classList.add(`just-changed`),setTimeout(()=>t.classList.remove(`just-changed`),2500))}var O=[],k=new Set,A=[],j=!0;async function M(){let e=l,t=await d(`GET`,`/api/v1/library`);if(e!==l)return;let a=Object.entries(t.counts).filter(([e,t])=>t>0&&e!==`ready`).map(([e,t])=>`${t} ${e}`),o=t.sources.some(e=>e.lastScan?.status===`running`);n(`#library-summary`).textContent=`${t.counts.ready??0} ready to play${a.length?` (${a.join(`, `)})`:``}${o?` · reading new files…`:``}`;let s=n(`#sources`);s.replaceChildren();for(let e of t.sources){let t=r(`button`,{type:`button`,class:`ghost`},`Scan again`);t.addEventListener(`click`,()=>void f(`Scan`,async()=>{await d(`POST`,`/api/v1/library/sources/${String(e.id)}/scan`,{}),i(`Scanning`),setTimeout(()=>void M(),1500)}));let n=e.lastScan;s.append(r(`p`,{class:`source`},r(`code`,{},String(e.root??e.id)),` ${e.enabled?``:`(off) `}`,n?r(`span`,{class:`muted`},`last scan ${String(n.status)}: ${String(n.found)} found, ${String(n.probed)} read`):r(`span`,{class:`muted`},`never scanned`),` `,t))}}var N=0;async function P(e){let t=++N,n=await d(`GET`,`/api/v1/library/items?${new URLSearchParams({q:e,limit:`100`,sort:e?`artist`:`recent`})}`);t===N&&(O=n.items,k.clear(),F(n.total))}function F(e){let t=n(`#results`);if(t.replaceChildren(),O.length===0){t.append(r(`p`,{class:`hint`},`Nothing matches.`)),I();return}let i=r(`table`,{class:`items`},r(`caption`,{class:`sr-only`},`Library items`),r(`thead`,{},r(`tr`,{},r(`th`,{scope:`col`},r(`span`,{class:`sr-only`},`Select`)),r(`th`,{scope:`col`},`Title`),r(`th`,{scope:`col`},`Artist`),r(`th`,{scope:`col`},`Album`),r(`th`,{scope:`col`},`Time`),r(`th`,{scope:`col`},r(`span`,{class:`sr-only`},`Play`))))),a=r(`tbody`);for(let e of O){let t=r(`input`,{type:`checkbox`,"aria-label":`Select ${e.title}`});t.addEventListener(`change`,()=>{t.checked?k.add(e.id):k.delete(e.id),I()});let n=r(`button`,{type:`button`,class:`ghost`,"aria-label":`Play ${e.title}`},`▶`);n.addEventListener(`click`,()=>void W([e.id],0)),a.append(r(`tr`,{},r(`td`,{},t),r(`td`,{title:e.rel},e.title),r(`td`,{},e.artist),r(`td`,{},e.album),r(`td`,{class:`muted`},p(e.duration)),r(`td`,{},n)))}i.append(a),t.append(i),e>O.length&&t.append(r(`p`,{class:`muted`},`Showing ${O.length} of ${e}. Narrow the search to see the rest.`)),I()}function I(){n(`#selection`).hidden=k.size===0,n(`#selection-count`).textContent=`${k.size} selected`,n(`#add-to`).replaceChildren(...A.map(e=>r(`option`,{value:e.id},e.name))),n(`#add-selection`).toggleAttribute(`disabled`,A.length===0),n(`#new-playlist`).disabled=!j}async function L(e){let t=await d(`GET`,`/api/v1/library/browse/${e}?limit=500`),i=n(`#groups`);i.replaceChildren(),i.hidden=!1;for(let n of t.groups){let t=r(`button`,{type:`button`,class:`group`},`${n.name}${n.artist?` — ${n.artist}`:``} (${n.count})`);t.addEventListener(`click`,()=>void f(`Browse`,async()=>{let t={[e===`artists`?`artist`:e===`albums`?`album`:e===`genres`?`genre`:`folder`]:n.name},r=++N,i=await d(`GET`,`/api/v1/library/items?${new URLSearchParams({...t,limit:`500`,sort:`album`})}`);r===N&&(O=i.items,k.clear(),F(i.total))})),i.append(t)}}async function R(){try{A=(await d(`GET`,`/api/v1/library/playlists`)).playlists,j=!0}catch(e){if(e instanceof s&&e.code===`sign_in_required`)j=!1,A=[];else throw e}let e=n(`#playlists`);e.replaceChildren(),j?A.length===0&&e.append(r(`p`,{class:`hint`},`No playlists yet. Select some items above and choose New playlist.`)):e.append(r(`p`,{class:`hint`},`Sign in to nixamp.com (or open this server with its control link) to keep playlists and pick up where you left off on another device.`));for(let t of A){let n=r(`button`,{type:`button`,class:`ghost`},`Open`);n.addEventListener(`click`,()=>void f(`Open playlist`,()=>z(t.id)));let i=r(`button`,{type:`button`},`Play`);i.addEventListener(`click`,()=>void f(`Play`,async()=>{let e=(await d(`GET`,`/api/v1/library/playlists/${t.id}`)).playlist;await W((e.items??[]).filter(e=>e.state===`ready`).map(e=>e.id),0)}));let a=r(`button`,{type:`button`,class:`ghost`},`Publish as a station`);a.addEventListener(`click`,()=>void f(`Publish as a station`,async()=>{let e=await d(`POST`,`/api/v1/stations`,{name:t.name,playlist:t.id,idempotencyKey:`playlist:${t.id}`});await _(),D(e.station.id),o(e.created?`Station ${t.name} made. Choose who can listen to put it on the air.`:`${t.name} already has a station. Choose who can listen.`,`ok`),T(h.find(t=>t.id===e.station.id)??e.station,{visibility:`public`,listed:!0})},a));let s=r(`button`,{type:`button`,class:`ghost danger`},`Delete`);s.addEventListener(`click`,()=>void f(`Delete playlist`,async()=>{confirm(`Delete the playlist "${t.name}"?`)&&(await d(`DELETE`,`/api/v1/library/playlists/${t.id}`),await R())})),e.append(r(`div`,{class:`playlist`,id:`playlist-${t.id}`},r(`strong`,{},t.name),r(`span`,{class:`muted`},` ${t.count} items `),r(`span`,{class:`actions`},i,n,a,s)))}I(),ce()}async function z(e){let t=(await d(`GET`,`/api/v1/library/playlists/${e}`)).playlist,i=n(`#playlist-${e}`);i.querySelector(`ol`)?.remove();let a=t.items??[],o=r(`ol`,{class:`playlist-items`});a.forEach((n,i)=>{let s=n=>async()=>{let r=a.map(e=>e.id),[o]=r.splice(i,1);r.splice(Math.max(0,Math.min(r.length,i+n)),0,o),await d(`PATCH`,`/api/v1/library/playlists/${e}`,{items:r,revision:t.revision}),await z(e)},c=r(`button`,{type:`button`,class:`ghost`,disabled:i===0,"aria-label":`Move ${n.title??`item`} up`},`↑`);c.addEventListener(`click`,()=>void f(`Move`,s(-1)));let l=r(`button`,{type:`button`,class:`ghost`,disabled:i===a.length-1,"aria-label":`Move ${n.title??`item`} down`},`↓`);l.addEventListener(`click`,()=>void f(`Move`,s(1)));let u=r(`button`,{type:`button`,class:`ghost`,"aria-label":`Remove ${n.title??`item`}`},`✕`);u.addEventListener(`click`,()=>void f(`Remove`,async()=>{await d(`PATCH`,`/api/v1/library/playlists/${e}`,{items:a.filter((e,t)=>t!==i).map(e=>e.id),revision:t.revision}),await z(e),await R()})),o.append(r(`li`,{},`${n.title??n.id}${n.artist?` — ${n.artist}`:``}`,n.state===`ready`?null:r(`span`,{class:`warn`},` (${n.state})`),` `,c,l,u))}),i.append(o)}var B=[],V=0,H=0,U=/Mobi|Android|iPhone/i.test(navigator.userAgent)?`phone`:`computer`;async function W(e,t,n=0){e.length!==0&&(B=e,V=t,j&&await d(`PUT`,`/api/v1/library/queue`,{items:e,device:U}).catch(()=>void 0),await q(n))}var G=null;function K(){G?.destroy(),G=null}async function q(t=0){let r=B[V];if(!r)return;let i=n(`#audio`);K(),G=await e(i,{src:u(`/api/v1/library/items/${r}/stream`,!0),kind:`audio`}),t>0&&(i.currentTime=t);let a=O.find(e=>e.id===r)??await d(`GET`,`/api/v1/library/items/${r}`).then(e=>e.item).catch(()=>null);n(`#now`).textContent=a?`${a.title}${a.artist?` — ${a.artist}`:``}`:``,await i.play().catch(()=>void 0),j&&await d(`PATCH`,`/api/v1/library/queue`,{at:V,position:t,device:U}).catch(()=>void 0)}function oe(){let e=n(`#audio`);e.addEventListener(`ended`,()=>{V+1<B.length&&(V+=1,q())}),e.addEventListener(`timeupdate`,()=>{!j||Date.now()-H<1e4||(H=Date.now(),d(`PATCH`,`/api/v1/library/queue`,{at:V,position:e.currentTime,device:U}).catch(()=>void 0))})}async function se(){if(!j)return;let e=(await d(`GET`,`/api/v1/library/queue`).catch(()=>null))?.queue,t=e?.items[e.at];if(!e||!t||e.items.length===0)return;let i=n(`#resume`),a=r(`button`,{type:`button`},`Resume`);a.addEventListener(`click`,()=>void f(`Resume`,async()=>{B=e.items.map(e=>e.id),V=e.at,await q(e.position),i.hidden=!0})),i.replaceChildren(r(`span`,{},`Where you left off${e.device?` on your ${e.device}`:``}: ${t.title??``} at ${p(e.position)||`the start`}. `),a),i.hidden=!1}async function ce(){let e=n(`#station-from`),t=await d(`GET`,`/api/v1/library/browse/folders?limit=500`).catch(()=>({groups:[]}));e.replaceChildren(r(`option`,{value:`folder:`},`The whole library`),...A.length?[r(`optgroup`,{label:`Playlists`},...A.map(e=>r(`option`,{value:`playlist:${e.id}`},`${e.name} (${e.count})`)))]:[],r(`optgroup`,{label:`Folders`},...t.groups.map(e=>r(`option`,{value:`folder:${e.name}`},`${e.name} (${e.count})`))))}async function le(e){let t=new FormData(e),[r,i]=String(t.get(`from`)??`folder:`).split(/:(.*)/s),a=await d(`POST`,`/api/v1/stations`,{name:String(t.get(`name`)??``),...r===`playlist`?{playlist:i}:{folder:i??``},shuffle:t.get(`shuffle`)===`on`,repeat:t.get(`repeat`)===`on`,bitrate:Number(t.get(`bitrate`)??128)});e.reset(),n(`#new-station`).open=!1,await _(),D(a.station.id),o(`Station ${a.station.name} made; it is private and stopped. Use "Who can listen" to put it on the air.`,`ok`)}var J={ai:`AI Radio`,radio:`Radio`,tv:`TV`,shared:`Shared by listeners`,rooms:`Live rooms`,vod:`On demand`};async function Y(){let e=Q()?``:`https://nixamp.com`,t=((await(await fetch(`${e}/api/v1/stations/guide`)).json()).stations??[]).filter(e=>/^https:\/\//.test(e.page)),i=n(`#on-air-list`);if(t.length===0){i.replaceChildren(r(`p`,{class:`hint`},`Nothing is on the air right now.`));return}let a=[...new Set(t.map(e=>e.group??(e.kind===`video`?`tv`:`radio`)))].sort((e,t)=>Object.keys(J).indexOf(e)-Object.keys(J).indexOf(t));i.replaceChildren(...a.map(e=>r(`div`,{class:`on-air-group`},r(`h3`,{class:`radio-subtitle`},J[e]??e),r(`ul`,{class:`on-air-cards`},...t.filter(t=>(t.group??(t.kind===`video`?`tv`:`radio`))===e).map(e=>r(`li`,{class:`on-air-card`},r(`a`,{href:e.page,target:`_blank`,rel:`noopener`},r(`span`,{class:`state ${e.state===`live`?`state-live`:`state-stopped`}`},e.state===`live`?`Live`:`Off`),r(`strong`,{},e.name),r(`span`,{class:`muted`},e.nowPlaying?[e.nowPlaying.title,e.nowPlaying.artist].filter(Boolean).join(` · `):``))))))))}async function ue(e){let t=(await(await fetch(`${e.server}/api/v1/label`)).json()).genres.flatMap(e=>e.artists).find(t=>t.key===e.artist);return t?t.albums.filter(t=>e.kind===`artist`||t.key===e.album).flatMap(n=>n.songs.filter(t=>e.kind!==`song`||t.n===e.n).map(r=>({title:`${r.title} · ${t.name} · ${n.title}`,src:`${e.server}/api/v1/label/${t.key}/${n.key}/${r.n}.mp3?grant=${encodeURIComponent(e.grant??``)}`}))):[]}var X=[],de=0;function fe(e){let t=X[e];if(!t)return;de=e;let r=n(`#music-audio`);n(`#music-player`).hidden=!1,n(`#music-now`).textContent=`${e+1}/${X.length} · ${t.title}`,r.src=t.src,r.play().catch(()=>void 0),i(`Playing ${t.title}`)}async function pe(){if(!Q()){n(`#music-summary`).replaceChildren(`Your purchases are on `,r(`a`,{href:`https://nixamp.com/radio#music`,target:`_blank`,rel:`noopener`},`nixamp.com/radio`),`.`);return}let e=await fetch(`/api/v1/store/purchases`,{credentials:`same-origin`});if(e.status===401){n(`#music-summary`).textContent=`Sign in to nixamp.com with the email you bought with, and your music is here.`;return}let t=await e.json(),i=t.purchases??[];n(`#music-summary`).textContent=i.length?`${i.length} purchase${i.length===1?``:`s`} for ${t.email??`you`}. Play here or download the zip again.`:`Nothing bought yet. Every AI label song is 10¢, an album $1, an artist's whole catalogue $2: look for Download on a station's now playing.`,n(`#music-list`).replaceChildren(...i.map(e=>{let t=r(`button`,{type:`button`},`Play`);return t.addEventListener(`click`,()=>void f(`Play`,async()=>{if(X=await ue(e),X.length===0)throw Error(`its server has no songs for it right now`);fe(0)},t)),r(`article`,{class:`station`,"aria-label":e.title},r(`div`,{class:`station-head`},r(`span`,{class:`state state-live`},e.kind===`artist`?`Artist`:e.kind===`album`?`Album`:`Song`),r(`h3`,{},e.title),r(`span`,{class:`muted`},`${e.artistName} · ${new Date(e.paidAt).toLocaleDateString()}`)),r(`div`,{class:`actions`},t,e.zip?r(`a`,{href:e.zip,class:`ghost`,download:!0},`Download zip`):null,e.link?r(`a`,{href:e.link,target:`_blank`,rel:`noopener`},`Receipt`):null))}))}function me(){n(`#music-audio`).addEventListener(`ended`,()=>fe(de+1)),pe().catch(()=>void 0)}var he=``;async function Z(){let e=l,t;try{t=await d(`GET`,`/api/v1/stations/label`)}catch(t){if(e!==l)return;n(`#label-artists`).replaceChildren(),n(`#label-summary`).textContent=t instanceof s&&t.status===404?`This server has no AI label yet: it needs nixamp 0.49 or later (nixamp update on that machine).`:`The label could not be read: ${t instanceof Error?t.message:String(t)}`;return}if(e!==l)return;let{settings:a}=t,o=a.monthlySeconds===0?`no cap`:`${Math.round(t.secondsThisMonth/60)} of ${Math.round(a.monthlySeconds/60)} min this month`,u=`${c.base}/label`;n(`#label-summary`).replaceChildren(`${a.holder} · ${t.composer??`no composer`} · ${o} · an album every ${a.everyDays} days`,t.busy?` · recording ${t.busy}`:``,t.waiting?` · waiting: ${t.waiting}`:``,` · `,r(`a`,{href:u,target:`_blank`,rel:`noopener`},`Public catalogue`));let p=n(`#label-preset`),m=p.value;if(p.replaceChildren(r(`option`,{value:``},`Choose…`),...t.roster.filter(e=>!e.signed).map(e=>r(`option`,{value:e.key},`${e.name} (${e.genre})`))),p.value=t.roster.some(e=>e.key===m&&!e.signed)?m:``,he!==c.id){he=c.id;let e=n(`#label-config`);for(let t of[`holder`,`monthlySeconds`,`everyDays`,`songsPerAlbum`,`songSeconds`])e.elements.namedItem(t).value=String(a[t])}let h=n(`#label-artists`);if(h.replaceChildren(),a.pausedReason){let e=r(`button`,{type:`button`},`Resume`);e.addEventListener(`click`,()=>void f(`Resume`,async()=>{await d(`POST`,`/api/v1/stations/label`,{resume:!0}),await Z()},e)),h.append(r(`p`,{class:`warn`,role:`status`},`Paused: ${a.pausedReason} `,e))}if(t.artists.length===0){let e=r(`button`,{type:`button`},`Sign the whole roster`);e.addEventListener(`click`,()=>void f(`Sign`,async()=>{await d(`POST`,`/api/v1/stations/label/artists`,{roster:!0}),i(`Roster signed`),await Z()},e)),h.append(r(`p`,{class:`hint`},`Nobody signed yet. `,e));return}for(let e of t.artists){let t=e.nextAlbumAt===-1?`off`:e.nextAlbumAt===0?`due now`:`next album ${new Date(e.nextAlbumAt).toLocaleDateString()}`,n=e.albums.some(e=>!e.doneAt),a=r(`button`,{type:`button`,disabled:n,title:n?`An album is still being recorded`:`Plan and record the next album now`},`New album now`);a.addEventListener(`click`,()=>void f(`New album`,async()=>{await d(`POST`,`/api/v1/stations/label/artists/${e.key}/album`,{}),i(`${e.name}: album planned`),await Z()},a));let o=r(`button`,{type:`button`,class:`ghost`},e.enabled?`Pause`:`Resume`);o.addEventListener(`click`,()=>void f(e.enabled?`Pause`:`Resume`,async()=>{await d(`PATCH`,`/api/v1/stations/label/artists/${e.key}`,{enabled:!e.enabled}),await Z()},o));let s=r(`button`,{type:`button`,class:`ghost danger`},`Drop`);s.addEventListener(`click`,()=>void f(`Drop`,async()=>{confirm(`Drop ${e.name} from the label? Their albums stay on the air; nothing new is recorded.`)&&(await d(`DELETE`,`/api/v1/stations/label/artists/${e.key}`),await Z())},s)),h.append(r(`article`,{class:`station`,"aria-label":e.name},r(`div`,{class:`station-head`},r(`span`,{class:`state ${e.enabled?`state-live`:`state-stopped`}`},e.genre),r(`h3`,{},e.name),r(`span`,{class:`muted`},t)),e.albums.length?r(`ul`,{class:`playlist-items`},...e.albums.map(e=>r(`li`,{},`${e.year} · ${e.title} · ${e.composed}/${e.songs} songs${e.doneAt?``:` (recording)`}`))):r(`p`,{class:`muted`},`No albums yet.`),e.lastError?r(`p`,{class:`warn`},e.lastError):null,r(`div`,{class:`actions`},a,o,s)))}}function ge(){n(`#label-sign`).addEventListener(`submit`,e=>{e.preventDefault();let t=e.currentTarget,n=e=>t.elements.namedItem(e).value.trim(),r=n(`preset`)?{preset:n(`preset`)}:{name:n(`name`),genre:n(`genre`),sound:n(`sound`),...n(`voice`)?{voice:n(`voice`)}:{}};f(`Sign`,async()=>{let e=await d(`POST`,`/api/v1/stations/label/artists`,r);t.reset(),o(`${e.artist.name} signed. Their first albums are being written now.`,`ok`),await Z()},t.querySelector(`button[type=submit]`)??void 0)}),n(`#label-config`).addEventListener(`submit`,e=>{e.preventDefault();let t=e.currentTarget,n=e=>t.elements.namedItem(e).value.trim();f(`Save label settings`,async()=>{await d(`POST`,`/api/v1/stations/label`,{holder:n(`holder`),monthlySeconds:Number(n(`monthlySeconds`)),everyDays:Number(n(`everyDays`)),songsPerAlbum:Number(n(`songsPerAlbum`)),songSeconds:Number(n(`songSeconds`))}),o(`Label settings saved.`,`ok`),await Z()},t.querySelector(`button[type=submit]`)??void 0)}),setInterval(()=>void Z().catch(()=>void 0),15e3)}async function _e(){oe(),ge(),me(),Y().catch(()=>void 0),setInterval(()=>void Y().catch(()=>void 0),3e4),n(`#search-form`).addEventListener(`submit`,e=>{e.preventDefault();let t=e.currentTarget,r=t.elements.namedItem(`browse`).value,i=t.elements.namedItem(`q`).value.trim();n(`#groups`).hidden=!0,f(`Search`,()=>r&&!i?L(r):P(i))}),n(`#search-form select`).addEventListener(`change`,e=>{let t=e.currentTarget.value;t&&f(`Browse`,()=>L(t))}),n(`#play-selection`).addEventListener(`click`,()=>void f(`Play`,()=>W(O.filter(e=>k.has(e.id)).map(e=>e.id),0))),n(`#new-playlist`).addEventListener(`click`,()=>void f(`New playlist`,async()=>{let e=prompt(`Name the playlist`);e&&(await d(`POST`,`/api/v1/library/playlists`,{name:e,items:O.filter(e=>k.has(e.id)).map(e=>e.id)}),i(`Playlist ${e} made`),await R())})),n(`#add-selection`).addEventListener(`click`,()=>void f(`Add to playlist`,async()=>{let e=n(`#add-to`).value;await d(`POST`,`/api/v1/library/playlists/${e}/items`,{items:O.filter(e=>k.has(e.id)).map(e=>e.id)}),i(`Added`),await R()})),n(`#station-form`).addEventListener(`submit`,e=>{e.preventDefault();let t=e.currentTarget;f(`Make station`,()=>le(t),t.querySelector(`button[type=submit]`)??void 0)}),n(`#source-form`).addEventListener(`submit`,e=>{e.preventDefault();let t=e.currentTarget,n=t.elements.namedItem(`root`).value.trim();f(`Add source`,async()=>{await d(`POST`,`/api/v1/library/sources`,{root:n}),t.reset(),i(`Added; reading its files`),setTimeout(()=>void M(),1500)})}),n(`#publish-form`).addEventListener(`change`,E),n(`#publish-dialog`).addEventListener(`close`,()=>{n(`#publish-dialog`).returnValue===`save`&&f(`Who can listen`,ae)});let e=await be(),t=n(`#server`);t.replaceChildren(...e.map(e=>r(`option`,{value:e.id},e.name))),e.length===0&&t.append(r(`option`,{value:``},`No servers`));let a=(()=>{try{return localStorage.getItem(ye)??``}catch{return``}})(),o=e.find(e=>e.id===a)??e[0];if(t.addEventListener(`change`,()=>{let n=e.find(e=>e.id===t.value);n&&$(n)}),setInterval(()=>void _().catch(()=>void 0),5e3),setInterval(()=>void M().catch(()=>void 0),15e3),setInterval(()=>void x().then(w).catch(()=>void 0),15e3),!o){let e=Q()?`Sign in to nixamp.com to manage your own stations, library and label here. A server shows up once it has run signed in to your account (nixamp login on that machine).`:`This page manages the server it is on.`;for(let e of[`#stations`,`#label`,`#library`,`#music`])n(e).hidden=!0;for(let e of document.querySelectorAll(`.radio-nav [data-tab], .server-pick`))e.hidden=!0;n(`#on-air`).before(r(`p`,{class:`hint`,id:`signed-out`},e)),Q()&&ve().then(e=>{e&&n(`#signed-out`).after(e)});return}t.value=o.id,await $(o),location.hash===`#stations`&&document.querySelector(`#stations`)?.scrollIntoView()}async function ve(){let e=[];try{let t=await fetch(`/api/v1/auth/providers`);t.ok&&(e=(await t.json()).providers??[])}catch{return null}let t=encodeURIComponent(location.pathname+location.hash);return r(`p`,{class:`actions sign-in`,id:`sign-in`},r(`a`,{class:`button`,href:`/?signin=1&redirect=${t}`},`Sign in with nixamp`),...e.map(e=>r(`a`,{class:`button ghost`,href:`/api/v1/${encodeURIComponent(e.id)}/oauth/start?redirect=${t}`},`Sign in with ${e.name}`)))}var ye=`nixamp.radio.server`;function Q(){return/^(www\.)?nixamp\.com$/i.test(location.hostname)}async function be(){let e=Q()?[]:[{id:`here`,name:`This server (${location.host})`,base:``,session:``,key:``}],n=``;try{let e=await fetch(`/api/v1/auth/token`,{credentials:`same-origin`}),t=await e.json().catch(()=>({}));n=e.ok&&typeof t.token==`string`?t.token:``}catch{n=``}if(!n)return e;try{v=(await fetch(`/api/v1/events?mine=true&kind=class&status=live&limit=1`,{credentials:`same-origin`})).ok}catch{v=!1}try{let r=await(await fetch(`/api/v1/servers`,{credentials:`same-origin`})).json().catch(()=>({}));for(let i of r.servers??[]){let{base:r,key:a}=t(i.url);/^https?:\/\//.test(r)&&r.replace(/\/+$/,``)!==location.origin&&(location.protocol===`https:`&&r.startsWith(`http://`)||e.find(e=>e.base===r.replace(/\/+$/,``))||e.push({id:i.id,name:i.name||new URL(r).host,base:r.replace(/\/+$/,``),session:n,key:i.key||a}))}}catch{}return e}async function $(e){l+=1,N+=1,c=e;try{localStorage.setItem(ye,e.id)}catch{}h=[],O=[],k.clear(),B=[];let t=n(`#audio`);t.pause(),K(),t.removeAttribute(`src`),n(`#now`).textContent=``,n(`#resume`).hidden=!0,n(`#groups`).hidden=!0,w(),o(``);try{await x().catch(()=>void 0),await xe(e)}catch(t){t instanceof s&&(t.status===401||t.status===403)?o(e.base?`${e.name} did not accept your nixamp.com sign-in. Is it running signed in as you? (on that machine: nixamp login, then nixamp daemon restart)`:`This page manages the server it is on. Open it from your server's admin link (nixamp admin prints it), or sign in as its owner.`):t instanceof s&&t.status===404?o(`${e.name} has no library or stations: it needs nixamp 0.32 or later (nixamp update on that machine).`):t instanceof TypeError?o(`Could not reach ${e.name} at ${e.base||location.origin}. Is it on?`):o(t instanceof Error?t.message:String(t));return}await Z(),await se()}async function xe(e){let t=l;try{await Promise.all([M(),_(),R(),P(``)])}catch(n){if(!(n instanceof s&&(n.status===401||n.status===403)&&e.session&&e.key)||t!==l)throw n;c={...e,session:``},await Promise.all([M(),_(),R(),P(``)])}}_e();
@@ -1 +0,0 @@
1
- import{a as e,o as t,r as n,s as r}from"./chunk-Q2XQMA4B-PTuZPMen.js";/* empty css */var i=e=>document.querySelector(e),a=e=>{i(`#announce`).textContent=e},o=/^\/vod\/([A-Za-z0-9_-]{1,32})\/?$/.exec(location.pathname)?.[1]??``;function s(e,t){let n=i(`#state`);n.className=`station-chip `+e,n.textContent=t}async function c(){i(`#one`).hidden=!1;let c=await fetch(`/api/v1/guide/vods/${o}`,{cache:`no-store`}).catch(()=>null),l=c?.ok?(await c.json()).vod:null;if(!l){i(`#name`).textContent=`That video is not here`,i(`#note`).textContent=`It may have been taken off. See everything that is.`,i(`#note`).hidden=!1,s(`unavailable`,`Unavailable`),i(`.vod-share`).hidden=!0;return}document.title=`${l.name} · on demand`,i(`#name`).textContent=l.name,i(`#by`).textContent=l.artist,i(`#length`).textContent=l.duration>0?e(l.duration):``,l.note&&(i(`#note`).textContent=l.note,i(`#note`).hidden=!1);let u=i(`#link`);u.value=l.page,i(`#copy`).addEventListener(`click`,()=>{navigator.clipboard?.writeText(u.value).then(()=>a(`Link copied`),()=>{u.select(),a(`Select and copy the link`)}),i(`#copy`).textContent=`Copied`,setTimeout(()=>{i(`#copy`).textContent=`Copy link`},1500)}),typeof navigator.share==`function`&&(i(`#share`).hidden=!1,i(`#share`).addEventListener(`click`,()=>{navigator.share({title:l.name,url:u.value}).catch(()=>void 0)})),i(`#raw`).href=l.play,i(`#nixamp`).href=`https://nixamp.com/?play=${encodeURIComponent(l.play)}`,s(`vod`,l.kind===`video`?`On demand · video`:`On demand · audio`),n(i(`#stage`),{src:l.play,kind:l.kind===`video`?`mp4`:`audio`,audio:l.kind===`audio`,live:!1,mediaId:`nixamp-vod:${l.id}`,startAt:r(new URLSearchParams(location.search).get(`t`)),shareUrl:e=>`${l.page}?t=${t(e)}`,unplayableAdvice:`Open in another player (VLC can) with the link below.`}).media.addEventListener(`error`,()=>s(`unavailable`,l.available?`Could not play it here`:`Its server is not answering`))}async function l(){i(`#all`).hidden=!1;let e=await fetch(`/api/v1/guide/vods`,{cache:`no-store`}).catch(()=>null),t=e?.ok?(await e.json()).vods:[],n=i(`#list`);for(let e of t){let t=document.createElement(`a`);t.href=new URL(e.page).pathname;let r=document.createElement(`div`);r.className=`vod-name`,r.textContent=e.name;let i=document.createElement(`div`);i.className=`vod-meta`,i.textContent=[e.kind===`video`?`Video`:`Audio`,e.nowPlaying?.title,e.nowPlaying?.artist,e.state===`offline`?`not answering`:``].filter(Boolean).join(` · `),t.append(r,i);let a=document.createElement(`li`);a.append(t),n.append(a)}i(`#none`).hidden=t.length>0}o?c():l();
@@ -1 +0,0 @@
1
- import{r as e}from"./chunk-Q2XQMA4B-PTuZPMen.js";/* empty css */function t(e){let t;try{t=new URL(e)}catch{return null}if(t.protocol!==`https:`&&!(t.protocol===`http:`&&/^(127\.0\.0\.1|localhost)$/.test(t.hostname)))return null;let n=/^\/api\/channels\/([A-Za-z0-9._~-]{1,120})\/?$/.exec(t.pathname),r=/^\/api\/live\/?$/.test(t.pathname),i=t.searchParams.get(`k`)??``;if(!n&&!r||!/^[A-Za-z0-9_-]{8,128}$/.test(i))return null;let a=n?`/api/channels/${n[1]}`:`/api/live`;return{origin:t.origin,channel:n?n[1]:null,key:i,play:`${t.origin}${a}?k=${i}`}}var n=e=>document.querySelector(e),r=/^\/room\/([a-z0-9-]{1,60})\/?$/.exec(location.pathname)?.[1]??``,i=r?null:t(new URLSearchParams(location.search).get(`play`)??``),a=r?/ · [^·]+$/.exec(document.title)?.[0]??` · live`:` · live`,o=!1,s=null,c=``,l=null,u=!1,d=0,f=0,p=0,m=(e,t)=>{let r=n(`#state`);r.className=`station-chip `+e,r.textContent=t},h=e=>{n(`#announce`).textContent=e},g=()=>typeof MediaSource>`u`&&window.ManagedMediaSource===void 0;function _(e){if(r)return e.kind===`video`&&o&&(g()||e.folder)?{src:`/room/${r}/hls/index.m3u8`,kind:`hls`}:{src:`/room/${r}/stream?n=${Date.now()}`,kind:e.kind===`video`?`mp4`:`audio`};let t=`&n=${Date.now()}`;return e.kind===`video`&&i.channel!==null&&(g()||e.folder)?{src:`${i.origin}/api/channels/${i.channel}/hls/index.m3u8?k=${i.key}`,kind:`hls`}:{src:i.play+t,kind:e.kind===`video`?`mp4`:`audio`}}function v(){let e=s;s=null,c=``,e?.destroy()}function y(t,r){v();let{src:i,kind:a}=_(t),o=e(n(`#stage`),{src:i,kind:a,audio:t.kind===`audio`,live:!0,autoplay:r});s=o,c=t.kind;let f=o.media,m=()=>s===o;f.addEventListener(`playing`,()=>{m()&&(d&&h(`Back on`),d=0,x())}),f.addEventListener(`error`,()=>{m()&&b()}),f.addEventListener(`ended`,()=>{m()&&b()}),f.addEventListener(`stalled`,()=>{m()&&f.readyState<3&&b()}),f.addEventListener(`pause`,()=>{!m()||f.ended||f.error||(u=!1,p=Date.now())}),f.addEventListener(`play`,()=>{m()&&(u=!0,p&&Date.now()-p>3e3&&l&&(p=0,y(l,!0)))})}function b(){u&&l&&(d+=1,x(),clearTimeout(f),f=window.setTimeout(()=>{l&&y(l,!0)},Math.min(15e3,1e3*2**Math.min(d,4))))}function x(){l&&(document.title=`${l.name}${a}`,n(`#name`).textContent=l.name,n(`#title`).textContent=l.title,n(`#by`).textContent=l.by,d>0?m(`reconnecting`,`Reconnecting`):l.live?m(`live`,l.kind===`video`?`Live · TV`:`Live · radio`):m(`stopped`,`Off the air`))}async function S(){if(r){let e=await fetch(`/room/${r}/state`,{cache:`no-store`});if(!e.ok)return null;let t=await e.json();return o=t.hls===!0,{name:String(t.name??`Live`),kind:t.kind===`video`?`video`:`audio`,live:t.live!==!1,folder:t.folder===!0,title:String(t.title??``),by:[t.artist,t.album].filter(Boolean).join(` · `)}}if(i.channel!==null){let e=await fetch(`${i.origin}/api/channels?k=${i.key}`,{cache:`no-store`});if(!e.ok)return null;let t=(await e.json()).channels?.find(e=>e.id===i.channel);if(!t)return null;let n=t.codecs?.tags??{};return{name:String(t.name??i.channel).replace(/\/+$/,``),kind:t.kind===`video`?`video`:`audio`,live:t.live!==!1,folder:i.channel.startsWith(`folder-`)||(t.playlist?.length??0)>1,title:String(n.title??``),by:[n.artist,n.album].filter(Boolean).join(` · `)}}let e=new AbortController;try{let t=await fetch(i.play+`&n=${Date.now()}`,{signal:e.signal,cache:`no-store`}),n=t.headers.get(`content-type`)??``;return e.abort(),t.ok?{name:`Live`,kind:n.startsWith(`video/`)?`video`:`audio`,live:!0,folder:!1,title:``,by:``}:null}catch{return null}}async function C(){try{let e=await S();if(!e){n(`#name`).textContent=`This room is not on the air`,m(`unavailable`,`Unavailable`);return}l=e,e.live&&c!==e.kind&&y(e,u),x()}catch{}}r?(n(`#raw`).href=`/room/${r}/stream`,C(),setInterval(()=>void C(),1e4)):i?(n(`#raw`).href=i.play,n(`#nixamp`).href=`https://nixamp.com/?play=${encodeURIComponent(i.play)}`,C(),setInterval(()=>void C(),1e4)):(n(`#name`).textContent=`That is not a room link`,n(`#about`).textContent=`A room link is the address a nixamp Share gives you: https://…/api/channels/<id>?k=…`,n(`#about`).hidden=!1,m(`unavailable`,`Unavailable`));