nixamp 0.78.6 → 0.80.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.
- package/README.md +6 -5
- package/backtoschool/dist/assets/{ar-BBh9pRWn.js → ar-BYDVUbTZ.js} +1 -1
- package/backtoschool/dist/assets/{cs-DYDz-hZb.js → cs-DsCx7BAy.js} +1 -1
- package/backtoschool/dist/assets/{da-DL0tbrTr.js → da-5tLM7Wal.js} +1 -1
- package/backtoschool/dist/assets/{de-POU_MZN1.js → de-2Q8k6IKm.js} +1 -1
- package/backtoschool/dist/assets/{es-VLEhXfMp.js → es-CVwFkQ0E.js} +1 -1
- package/backtoschool/dist/assets/{fi-B__GWwbQ.js → fi-D7KuvUvL.js} +1 -1
- package/backtoschool/dist/assets/{fr-DDtDAMct.js → fr-CkWg-nDv.js} +1 -1
- package/backtoschool/dist/assets/{hi-C6MybeLD.js → hi-DayNvhO4.js} +1 -1
- package/backtoschool/dist/assets/{hls-OR5FY6YP-CL3tmveA.js → hls-OR5FY6YP-D2hwLr-P.js} +1 -1
- package/backtoschool/dist/assets/{hu-CgiQxTUY.js → hu-BqS46UyM.js} +1 -1
- package/backtoschool/dist/assets/{id-pzntv5iA.js → id-DTiKw_BS.js} +1 -1
- package/backtoschool/dist/assets/{index-DeCDKrPz.js → index-EM-0SwBp.js} +2 -2
- package/backtoschool/dist/assets/{it-dKw8vCrE.js → it-B60apeGa.js} +1 -1
- package/backtoschool/dist/assets/{mpegts-B6-Xba87.js → mpegts-C4v5WI5W.js} +1 -1
- package/backtoschool/dist/assets/{mpegts-Y2FARLFE-MgjbiVoD.js → mpegts-Y2FARLFE-D4OTyGyp.js} +1 -1
- package/backtoschool/dist/assets/{nl-DZ0o7967.js → nl-DctlIuWS.js} +1 -1
- package/backtoschool/dist/assets/{ru-s6C6TpM6.js → ru-CO8g0gfi.js} +1 -1
- package/backtoschool/dist/assets/{sv-BHj0BZlD.js → sv-CoFMz-Qg.js} +1 -1
- package/backtoschool/dist/assets/{uk-BH7Y4zb1.js → uk-C3_GprSP.js} +1 -1
- package/backtoschool/dist/assets/{vi-nf4HfTQk.js → vi-B0RDG4iN.js} +1 -1
- package/backtoschool/dist/assets/{zh-CT2P8jxm.js → zh--yO6izcR.js} +1 -1
- package/backtoschool/dist/index.html +1 -1
- package/dist/ai-keys.d.ts +1 -1
- package/dist/ai-keys.js +1 -1
- package/dist/ai-label.d.ts +38 -0
- package/dist/ai-label.js +237 -5
- package/dist/ai-text.d.ts +42 -1
- package/dist/ai-text.js +69 -7
- package/dist/event-writer.d.ts +10 -1
- package/dist/event-writer.js +27 -8
- package/dist/label-routes.js +9 -0
- package/dist/library-mcp.d.ts +6 -6
- package/dist/music-hub.d.ts +11 -0
- package/dist/music-hub.js +33 -2
- package/dist/nixamp-link-api.d.ts +5 -1
- package/dist/nixamp-link-api.js +12 -2
- package/dist/nixamp-link-types.d.ts +2 -0
- package/dist/nixamp-link.d.ts +22 -9
- package/dist/nixamp-link.js +75 -58
- package/dist/oauth.d.ts +1 -0
- package/dist/oauth.js +8 -1
- package/dist/server.js +18 -9
- package/dist/station-cli.js +24 -0
- package/dist/station-mcp.d.ts +6 -6
- package/dist/station-usage.d.ts +1 -1
- package/dist/station-usage.js +4 -1
- package/dist/universal-footer.d.ts +2 -0
- package/dist/universal-footer.js +39 -0
- package/package.json +7 -5
- package/src/ai-keys.ts +1 -1
- package/src/ai-label.ts +240 -5
- package/src/ai-text.ts +84 -8
- package/src/event-writer.ts +36 -11
- package/src/label-routes.ts +9 -0
- package/src/music-hub.ts +38 -2
- package/src/nixamp-link-api.ts +15 -3
- package/src/nixamp-link-types.ts +2 -0
- package/src/nixamp-link.ts +77 -61
- package/src/oauth.ts +9 -1
- package/src/server.ts +18 -9
- package/src/station-cli.ts +23 -0
- package/src/station-usage.ts +4 -1
- package/src/universal-footer.ts +41 -0
- package/web/dist/assets/{ar-7tVGBWgq.js → ar-C5qVRZh9.js} +1 -1
- package/web/dist/assets/{chunk-55GBNX64-BDcCEJUP.js → chunk-NW3WDGEQ-CnyjTRUh.js} +1 -1
- package/web/dist/assets/{cs-hTmkOWFS.js → cs-fajZsJrs.js} +1 -1
- package/web/dist/assets/{da-218F21ho.js → da-fycV1k1N.js} +1 -1
- package/web/dist/assets/{de-DesLnw7U.js → de-QUzTQ_9X.js} +1 -1
- package/web/dist/assets/{es-Bc9fW4qY.js → es-CQu2leAJ.js} +1 -1
- package/web/dist/assets/{fi-Df_rWRQA.js → fi-AgKEsukC.js} +1 -1
- package/web/dist/assets/{fr-D8xzxUiQ.js → fr-CRbHnW4y.js} +1 -1
- package/web/dist/assets/{hi-Ddh5AA1z.js → hi-BuU7xy9L.js} +1 -1
- package/web/dist/assets/{hls-OR5FY6YP-_WOdANsC.js → hls-OR5FY6YP-BxZwqFB9.js} +1 -1
- package/web/dist/assets/{hu-ChrJNlJD.js → hu-C40Z-HcJ.js} +1 -1
- package/web/dist/assets/{id-dNB_py4J.js → id-2b7626UL.js} +1 -1
- package/web/dist/assets/{it-DyHyXE3N.js → it-7sr3nJuS.js} +1 -1
- package/web/dist/assets/main-zuI3sOLC.js +33 -0
- package/web/dist/assets/{mpegts-CL9RC5Ls.js → mpegts-DPRtdBXL.js} +1 -1
- package/web/dist/assets/{mpegts-Y2FARLFE-C91SD8Pl.js → mpegts-Y2FARLFE-BY7parIQ.js} +1 -1
- package/web/dist/assets/{nl-DlwRNqNC.js → nl-BdDGgfzj.js} +1 -1
- package/web/dist/assets/{radio-BnQ78a-O.js → radio-CeRhNjpU.js} +1 -1
- package/web/dist/assets/{ru--N-8v6QS.js → ru-BMGI8Oa4.js} +1 -1
- package/web/dist/assets/{station-C_6L4CDU.js → station-D5tW9jq4.js} +1 -1
- package/web/dist/assets/station-D6KfgFXf.css +1 -0
- package/web/dist/assets/{sv-DbR0DO05.js → sv-BXASdl7c.js} +1 -1
- package/web/dist/assets/{uk-Bi3fEoz1.js → uk-urnhuqtG.js} +1 -1
- package/web/dist/assets/{vi-DqrcyLEz.js → vi-BhLPAKuD.js} +1 -1
- package/web/dist/assets/{vod-CbSC5NFA.js → vod-Dt73bt8P.js} +1 -1
- package/web/dist/assets/{watch-D-ZRxfJ_.js → watch-GxgHBQcI.js} +1 -1
- package/web/dist/assets/{zh-_4uBqFzc.js → zh-BaOCIB9u.js} +1 -1
- package/web/dist/index.html +58 -12
- package/web/dist/music.html +1 -1
- package/web/dist/radio.html +5 -5
- package/web/dist/station.html +4 -4
- package/web/dist/sw.js +30 -30
- package/web/dist/vod.html +4 -4
- package/web/dist/watch.html +4 -4
- package/dist/pit-footer.d.ts +0 -3
- package/dist/pit-footer.js +0 -40
- package/src/pit-footer.ts +0 -40
- package/web/dist/assets/main-D9XA9svM.js +0 -26
- package/web/dist/assets/station-CxJvFwzV.css +0 -1
- /package/web/dist/assets/{chunk-55GBNX64-DR1XNWCJ.css → chunk-NW3WDGEQ-DR1XNWCJ.css} +0 -0
package/web/dist/index.html
CHANGED
|
@@ -19,13 +19,13 @@
|
|
|
19
19
|
<meta property="og:title" content="nixamp: broadcast live radio, TV and film from your own machine" />
|
|
20
20
|
<meta property="og:description" content="Launch your own live radio, TV and film network from your machine. Listen free, go live in one command, get paid with x402." />
|
|
21
21
|
<meta property="og:type" content="website" />
|
|
22
|
-
<script type="module" crossorigin src="/assets/main-
|
|
22
|
+
<script type="module" crossorigin src="/assets/main-zuI3sOLC.js"></script>
|
|
23
23
|
<link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-P2Xu9kJm.js">
|
|
24
|
-
<link rel="modulepreload" crossorigin href="/assets/chunk-
|
|
24
|
+
<link rel="modulepreload" crossorigin href="/assets/chunk-NW3WDGEQ-CnyjTRUh.js">
|
|
25
25
|
<link rel="modulepreload" crossorigin href="/assets/client-D7waX8NA.js">
|
|
26
26
|
<link rel="modulepreload" crossorigin href="/assets/now-playing-DVQqWQIu.js">
|
|
27
27
|
<link rel="modulepreload" crossorigin href="/assets/remote-DJqvFdE6.js">
|
|
28
|
-
<link rel="stylesheet" crossorigin href="/assets/chunk-
|
|
28
|
+
<link rel="stylesheet" crossorigin href="/assets/chunk-NW3WDGEQ-DR1XNWCJ.css">
|
|
29
29
|
</head>
|
|
30
30
|
<body>
|
|
31
31
|
<nav class="skip-links" aria-label="Skip to a section" data-i18n-aria-label="Skip to a section">
|
|
@@ -550,7 +550,7 @@
|
|
|
550
550
|
|
|
551
551
|
<p id="note" class="note" hidden></p>
|
|
552
552
|
|
|
553
|
-
<
|
|
553
|
+
<div class="statusbar">
|
|
554
554
|
<span id="keyboard-help">With playback controls focused: <b>Space</b><span data-i18n="Play"> Play</span></span>
|
|
555
555
|
<span><b>↑↓</b><span data-i18n="Select"> Select</span></span>
|
|
556
556
|
<span><b>n/p</b><span data-i18n="Next/Prev"> Next/Prev</span></span>
|
|
@@ -562,14 +562,60 @@
|
|
|
562
562
|
<span class="muted"> · </span>
|
|
563
563
|
<span class="muted" id="app-version" aria-label="Nixamp version"></span>
|
|
564
564
|
<span class="muted"> · </span>
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
565
|
+
</div>
|
|
566
|
+
<!-- Shared @profullstack/footer fallback; embed.js refreshes it from the published template. -->
|
|
567
|
+
<div data-profullstack-footer data-site="https://nixamp.com/" data-since="2026" data-tagline="MIT License" data-links='[{"label":"Code","href":"https://github.com/profullstack/nixamp"},{"label":"r/nixamp","href":"https://www.reddit.com/r/nixamp"}]' data-badges='[{"src":"https://logicsrc.com/openicon/set/hq/svg/built-indie.svg","href":"https://built.indie.pit.world/for?site=https://nixamp.com/","alt":"Find this site on built.indie","width":32,"height":32},{"src":"https://logicsrc.com/openicon/set/hq/svg/pwamart.svg","href":"https://pwamart.com/for?site=https://nixamp.com/","alt":"Find this site on PwaMart","width":32,"height":32}]'><footer class="pfs-footer" data-pfs-footer="0.6.10"><style>.pfs-footer{--pfs-footer-muted:color-mix(in srgb,currentColor 62%,transparent);--pfs-footer-gap:.5rem 1.25rem;--pfs-footer-size:.875rem;border-top:1px solid color-mix(in srgb,currentColor 14%,transparent);font-size:var(--pfs-footer-size);color:inherit;line-height:1.5}.pfs-footer__inner{text-align:center;flex-direction:column;align-items:center;gap:.4rem;max-width:72rem;margin:0 auto;padding:.85rem 1rem;display:flex}.pfs-footer a{color:var(--pfs-footer-muted);text-decoration:none}.pfs-footer a:hover,.pfs-footer a:focus-visible{color:inherit;text-decoration:underline}.pfs-footer__links{flex-wrap:wrap;justify-content:center;gap:.35rem 1rem;display:flex}.pfs-footer__ring,.pfs-footer__badges{flex-wrap:wrap;justify-content:center;align-items:center;gap:.4rem;display:flex}.pfs-footer a.pfs-footer__badge{line-height:0;display:inline-block}.pfs-footer__badge img{width:200px;max-width:100%;height:44px;display:block}.pfs-footer__badge--site img{width:auto;height:auto}.pfs-footer__badge--publisher img,.pfs-footer__badge--square img{object-fit:contain;width:32px;max-width:none;height:32px}.pfs-footer__news{justify-content:center;display:flex}.pfs-footer__sub{flex-wrap:wrap;justify-content:center;align-items:center;gap:.35rem;margin:0;display:flex}.pfs-footer__sub input[type=email]{font:inherit;color:inherit;border:1px solid color-mix(in srgb,currentColor 25%,transparent);background:0 0;border-radius:.35rem;width:13.5rem;max-width:62vw;padding:.2rem .5rem;font-size:.8125rem}.pfs-footer__sub input[type=email]::placeholder{color:var(--pfs-footer-muted);opacity:1}.pfs-footer__sub input[type=email]:focus-visible{outline:2px solid color-mix(in srgb,currentColor 45%,transparent);outline-offset:1px}.pfs-footer__sub button{font:inherit;color:var(--pfs-footer-muted);border:1px solid color-mix(in srgb,currentColor 25%,transparent);cursor:pointer;background:0 0;border-radius:.35rem;padding:.2rem .6rem;font-size:.8125rem}.pfs-footer__sub button:hover,.pfs-footer__sub button:focus-visible{color:inherit}.pfs-footer__hp{opacity:0;width:1px;height:1px;position:absolute!important;left:-9999px!important}.pfs-footer__sub+.pfs-footer__sublink{display:none}.pfs-footer__msg{text-align:center;color:var(--pfs-footer-muted);flex-basis:100%;font-size:.8125rem}.pfs-footer__msg:empty{display:none}.pfs-footer__msg[data-state=ok]{color:inherit}.pfs-footer__msg[data-state=error]{color:#d92d20;color:var(--lightningcss-light,#b42318)var(--lightningcss-dark,#f97066)}.pfs-footer__copy{color:var(--pfs-footer-muted);margin:0}.pfs-footer__copy a{color:inherit}.pfs-footer__tagline{white-space:nowrap;display:inline-block}.pfs-footer__brand{vertical-align:middle;background:#202124;border-radius:3px;justify-content:center;align-items:center;margin-inline:.35rem;padding:2px 4px;line-height:0;display:inline-flex}.pfs-footer__brand img{width:20px;max-width:none;height:11px;display:block}</style><div class="pfs-footer__inner"><nav class="pfs-footer__links" aria-label="Footer"><a href="https://github.com/profullstack/nixamp">Code</a><a href="https://www.reddit.com/r/nixamp">r/nixamp</a><a href="https://pit.world/pro">Find a pro</a><a href="https://profullstack.com/terms">Terms</a><a href="https://profullstack.com/privacy">Privacy</a><a href="https://profullstack.com/media">Media</a><a href="https://github.com/profullstack" rel="noopener noreferrer">GitHub</a><a href="https://discord.gg/U7dEXfBA3s" rel="noopener noreferrer">Discord</a><a href="https://x.com/profullstackinc" rel="noopener noreferrer">X</a><a href="https://luma.com/profullstack" rel="noopener noreferrer">Events</a><a href="https://luma.com/mergenlaunch" rel="noopener noreferrer">Register for Event</a><a href="https://pairux.com/@profullstack" rel="noopener noreferrer">PairUX</a><a href="https://pairux.com/@moshcoding" rel="noopener noreferrer">Moshcoding</a></nav><nav class="pfs-footer__links" aria-label="Profullstack products"><a href="https://profullstack.com/stack/build">Agentic site builder</a><a href="https://crawlproof.com/surveys">CrawlProof Surveys</a></nav><nav class="webring pfs-footer__ring" aria-label="Profullstack webring"><a href="https://rssamplifier.com/ring/profullstack/previous?from=https%3A%2F%2Fnixamp.com%2F" rel="prev" title="Previous site"><<</a><a href="https://rssamplifier.com/ring/profullstack">Profullstack</a><a href="https://rssamplifier.com/ring/profullstack/next?from=https%3A%2F%2Fnixamp.com%2F" rel="next" title="Next site">>></a></nav><div class="pfs-footer__news"><form class="pfs-footer__sub" action="https://pit.world/subscribe" method="post" autocomplete="on"><input type="hidden" name="site" value="nixamp.com"><label for="pfs-footer-email">Email</label><input id="pfs-footer-email" type="email" name="email" required maxlength="254" autocomplete="email" placeholder="Email for our newsletter" aria-label="Email address for the Profullstack newsletter"><input class="pfs-footer__hp" name="website" type="text" tabindex="-1" autocomplete="off" aria-hidden="true"><button type="submit">Subscribe</button><span class="pfs-footer__msg" role="status" aria-live="polite"></span><script>(function wireSubscribe(form) {
|
|
568
|
+
if (!form || form.getAttribute('data-pfs-wired')) return;
|
|
569
|
+
form.setAttribute('data-pfs-wired', '1');
|
|
570
|
+
var msg = form.querySelector('.pfs-footer__msg');
|
|
571
|
+
var button = form.querySelector('button');
|
|
572
|
+
var reasons = {
|
|
573
|
+
invalid: "that doesn't look like an email address",
|
|
574
|
+
undeliverable: "that address's domain can't receive email",
|
|
575
|
+
failed: 'the confirmation email could not be sent, try again later',
|
|
576
|
+
};
|
|
577
|
+
function say(text, state) {
|
|
578
|
+
if (!msg) return;
|
|
579
|
+
msg.textContent = text;
|
|
580
|
+
msg.setAttribute('data-state', state);
|
|
581
|
+
}
|
|
582
|
+
form.addEventListener('submit', function (event) {
|
|
583
|
+
if (typeof fetch !== 'function') return; // let the plain POST go
|
|
584
|
+
event.preventDefault();
|
|
585
|
+
var data = new FormData(form);
|
|
586
|
+
var email = String(data.get('email') || '').trim();
|
|
587
|
+
// The honeypot: a bot that fills it gets the normal answer and nothing is sent.
|
|
588
|
+
if (data.get('website')) return say('Email confirmation sent. Check your inbox.', 'ok');
|
|
589
|
+
if (button) button.disabled = true;
|
|
590
|
+
say('Sending…', 'busy');
|
|
591
|
+
fetch(new URL('/api/subscribe', form.action).href, {
|
|
592
|
+
method: 'POST',
|
|
593
|
+
headers: { 'content-type': 'application/json' },
|
|
594
|
+
body: JSON.stringify({ email: email, site: data.get('site') }),
|
|
595
|
+
})
|
|
596
|
+
.then(function (res) {
|
|
597
|
+
return res
|
|
598
|
+
.json()
|
|
599
|
+
.catch(function () {
|
|
600
|
+
return {};
|
|
601
|
+
})
|
|
602
|
+
.then(function (body) {
|
|
603
|
+
if (res.ok && body.ok) {
|
|
604
|
+
say('Email confirmation sent to ' + email + '. Check your inbox.', 'ok');
|
|
605
|
+
form.reset();
|
|
606
|
+
} else {
|
|
607
|
+
say('Failed: ' + (body.error || reasons[body.status] || 'pit.world answered ' + res.status), 'error');
|
|
608
|
+
}
|
|
609
|
+
});
|
|
610
|
+
})
|
|
611
|
+
.catch(function (err) {
|
|
612
|
+
say('Failed: could not reach pit.world (' + ((err && err.message) || err) + ')', 'error');
|
|
613
|
+
})
|
|
614
|
+
.then(function () {
|
|
615
|
+
if (button) button.disabled = false;
|
|
616
|
+
});
|
|
617
|
+
});
|
|
618
|
+
})(document.currentScript.parentNode)</script></form><a class="pfs-footer__sublink" href="https://pit.world/subscribe?site=https://nixamp.com/">Newsletter</a></div><div class="pfs-footer__badges"><a class="pfs-footer__badge pfs-footer__badge--publisher" href="https://built.indie.pit.world/for?site=https://nixamp.com/"><img src="https://logicsrc.com/openicon/set/hq/svg/built-indie.svg" alt="Find this site on built.indie" width="32" height="32" loading="lazy"></a><a class="pfs-footer__badge pfs-footer__badge--publisher" href="https://pwamart.com/for?site=https://nixamp.com/"><img src="https://logicsrc.com/openicon/set/hq/svg/pwamart.svg" alt="Find this site on PwaMart" width="32" height="32" loading="lazy"></a></div><p class="pfs-footer__copy"><a href="tel:+18885264640">Phone: +1-888-526-4640</a></p><p class="pfs-footer__copy">© 2026 <a class="pfs-footer__brand" href="https://profullstack.com/" title="Profullstack, Inc."><img src="https://profullstack.com/assets/logo.svg" alt="" width="20" height="11" loading="lazy"></a> <a href="https://profullstack.com/">Profullstack, Inc.</a> <span class="pfs-footer__tagline">· MIT License</span></p></div></footer></div>
|
|
573
619
|
<script type="module" src="https://cdn.jsdelivr.net/npm/@profullstack/footer@latest/src/embed.js"></script>
|
|
574
620
|
</main>
|
|
575
621
|
<dialog id="streaming-publish" class="purchase-dialog" aria-labelledby="streaming-publish-title">
|
package/web/dist/music.html
CHANGED
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
<span id="who" class="who"></span>
|
|
29
29
|
</header>
|
|
30
30
|
<main id="view" class="view" tabindex="-1" aria-live="polite"></main>
|
|
31
|
-
<
|
|
31
|
+
<aside class="foot" aria-label="Nixamp music service information">Listening is free, with a short break every 10 minutes. Songs 10¢, albums $1, an artist's catalogue $2, paid with crypto through CoinPay. ℗ Profullstack, Inc. Music and words made with AI.</aside>
|
|
32
32
|
<section id="player" class="player" aria-label="Player" hidden>
|
|
33
33
|
<img id="player-art" class="player-art" alt="" width="56" height="56" />
|
|
34
34
|
<div class="player-text">
|
package/web/dist/radio.html
CHANGED
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
<title>Radio · 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/radio-
|
|
9
|
+
<script type="module" crossorigin src="/assets/radio-CeRhNjpU.js"></script>
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-P2Xu9kJm.js">
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/chunk-
|
|
11
|
+
<link rel="modulepreload" crossorigin href="/assets/chunk-NW3WDGEQ-CnyjTRUh.js">
|
|
12
12
|
<link rel="modulepreload" crossorigin href="/assets/remote-DJqvFdE6.js">
|
|
13
|
-
<link rel="stylesheet" crossorigin href="/assets/chunk-
|
|
13
|
+
<link rel="stylesheet" crossorigin href="/assets/chunk-NW3WDGEQ-DR1XNWCJ.css">
|
|
14
14
|
<link rel="stylesheet" crossorigin href="/assets/radio-Cmg6GPN2.css">
|
|
15
15
|
</head>
|
|
16
16
|
<body>
|
|
@@ -177,10 +177,10 @@
|
|
|
177
177
|
</details>
|
|
178
178
|
</section>
|
|
179
179
|
|
|
180
|
-
<
|
|
180
|
+
<div class="now-bar" role="region" aria-label="Now playing">
|
|
181
181
|
<audio id="audio" controls preload="none"></audio>
|
|
182
182
|
<span id="now" class="now"></span>
|
|
183
|
-
</
|
|
183
|
+
</div>
|
|
184
184
|
</main>
|
|
185
185
|
</body>
|
|
186
186
|
</html>
|
package/web/dist/station.html
CHANGED
|
@@ -7,12 +7,12 @@
|
|
|
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/station-
|
|
10
|
+
<script type="module" crossorigin src="/assets/station-D5tW9jq4.js"></script>
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-P2Xu9kJm.js">
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/chunk-
|
|
12
|
+
<link rel="modulepreload" crossorigin href="/assets/chunk-NW3WDGEQ-CnyjTRUh.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/assets/now-playing-DVQqWQIu.js">
|
|
14
|
-
<link rel="stylesheet" crossorigin href="/assets/chunk-
|
|
15
|
-
<link rel="stylesheet" crossorigin href="/assets/station-
|
|
14
|
+
<link rel="stylesheet" crossorigin href="/assets/chunk-NW3WDGEQ-DR1XNWCJ.css">
|
|
15
|
+
<link rel="stylesheet" crossorigin href="/assets/station-D6KfgFXf.css">
|
|
16
16
|
</head>
|
|
17
17
|
<body>
|
|
18
18
|
<main class="station-app">
|
package/web/dist/sw.js
CHANGED
|
@@ -1,49 +1,49 @@
|
|
|
1
1
|
/* nixamp service worker — generated, do not edit */
|
|
2
|
-
const CACHE = "nixamp-
|
|
2
|
+
const CACHE = "nixamp-1794346966722";
|
|
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-
|
|
8
|
+
"/assets/ar-C5qVRZh9.js",
|
|
9
9
|
"/assets/background.worker-F49brs4A.js",
|
|
10
|
-
"/assets/chunk-
|
|
11
|
-
"/assets/chunk-
|
|
10
|
+
"/assets/chunk-NW3WDGEQ-CnyjTRUh.js",
|
|
11
|
+
"/assets/chunk-NW3WDGEQ-DR1XNWCJ.css",
|
|
12
12
|
"/assets/client-D7waX8NA.js",
|
|
13
|
-
"/assets/cs-
|
|
14
|
-
"/assets/da-
|
|
15
|
-
"/assets/de-
|
|
16
|
-
"/assets/es-
|
|
17
|
-
"/assets/fi-
|
|
18
|
-
"/assets/fr-
|
|
19
|
-
"/assets/hi-
|
|
13
|
+
"/assets/cs-fajZsJrs.js",
|
|
14
|
+
"/assets/da-fycV1k1N.js",
|
|
15
|
+
"/assets/de-QUzTQ_9X.js",
|
|
16
|
+
"/assets/es-CQu2leAJ.js",
|
|
17
|
+
"/assets/fi-AgKEsukC.js",
|
|
18
|
+
"/assets/fr-CRbHnW4y.js",
|
|
19
|
+
"/assets/hi-BuU7xy9L.js",
|
|
20
20
|
"/assets/hls-CydbS6hn.js",
|
|
21
|
-
"/assets/hls-OR5FY6YP-
|
|
22
|
-
"/assets/hu-
|
|
23
|
-
"/assets/id-
|
|
24
|
-
"/assets/it-
|
|
25
|
-
"/assets/main-
|
|
21
|
+
"/assets/hls-OR5FY6YP-BxZwqFB9.js",
|
|
22
|
+
"/assets/hu-C40Z-HcJ.js",
|
|
23
|
+
"/assets/id-2b7626UL.js",
|
|
24
|
+
"/assets/it-7sr3nJuS.js",
|
|
25
|
+
"/assets/main-zuI3sOLC.js",
|
|
26
26
|
"/assets/modulepreload-polyfill-P2Xu9kJm.js",
|
|
27
|
-
"/assets/mpegts-
|
|
28
|
-
"/assets/mpegts-Y2FARLFE-
|
|
27
|
+
"/assets/mpegts-DPRtdBXL.js",
|
|
28
|
+
"/assets/mpegts-Y2FARLFE-BY7parIQ.js",
|
|
29
29
|
"/assets/music-ByEeUk4Z.js",
|
|
30
30
|
"/assets/music-DCGvVX_R.css",
|
|
31
31
|
"/assets/native-C7JTKWJH-BUyIoj0P.js",
|
|
32
|
-
"/assets/nl-
|
|
32
|
+
"/assets/nl-BdDGgfzj.js",
|
|
33
33
|
"/assets/now-playing-DVQqWQIu.js",
|
|
34
|
-
"/assets/radio-
|
|
34
|
+
"/assets/radio-CeRhNjpU.js",
|
|
35
35
|
"/assets/radio-Cmg6GPN2.css",
|
|
36
36
|
"/assets/remote-DJqvFdE6.js",
|
|
37
|
-
"/assets/ru
|
|
38
|
-
"/assets/station-
|
|
39
|
-
"/assets/station-
|
|
40
|
-
"/assets/station-
|
|
41
|
-
"/assets/sv-
|
|
42
|
-
"/assets/uk-
|
|
43
|
-
"/assets/vi-
|
|
44
|
-
"/assets/vod-
|
|
45
|
-
"/assets/watch-
|
|
46
|
-
"/assets/zh-
|
|
37
|
+
"/assets/ru-BMGI8Oa4.js",
|
|
38
|
+
"/assets/station-Bp-mujYd.js",
|
|
39
|
+
"/assets/station-D5tW9jq4.js",
|
|
40
|
+
"/assets/station-D6KfgFXf.css",
|
|
41
|
+
"/assets/sv-BXASdl7c.js",
|
|
42
|
+
"/assets/uk-urnhuqtG.js",
|
|
43
|
+
"/assets/vi-BhLPAKuD.js",
|
|
44
|
+
"/assets/vod-Dt73bt8P.js",
|
|
45
|
+
"/assets/watch-GxgHBQcI.js",
|
|
46
|
+
"/assets/zh-BaOCIB9u.js",
|
|
47
47
|
"/favicon.png",
|
|
48
48
|
"/hero.png",
|
|
49
49
|
"/icons/icon-192-maskable.png",
|
package/web/dist/vod.html
CHANGED
|
@@ -6,11 +6,11 @@
|
|
|
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-
|
|
9
|
+
<script type="module" crossorigin src="/assets/vod-Dt73bt8P.js"></script>
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-P2Xu9kJm.js">
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/chunk-
|
|
12
|
-
<link rel="stylesheet" crossorigin href="/assets/chunk-
|
|
13
|
-
<link rel="stylesheet" crossorigin href="/assets/station-
|
|
11
|
+
<link rel="modulepreload" crossorigin href="/assets/chunk-NW3WDGEQ-CnyjTRUh.js">
|
|
12
|
+
<link rel="stylesheet" crossorigin href="/assets/chunk-NW3WDGEQ-DR1XNWCJ.css">
|
|
13
|
+
<link rel="stylesheet" crossorigin href="/assets/station-D6KfgFXf.css">
|
|
14
14
|
</head>
|
|
15
15
|
<body>
|
|
16
16
|
<main class="station-app">
|
package/web/dist/watch.html
CHANGED
|
@@ -7,11 +7,11 @@
|
|
|
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-
|
|
10
|
+
<script type="module" crossorigin src="/assets/watch-GxgHBQcI.js"></script>
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-P2Xu9kJm.js">
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/chunk-
|
|
13
|
-
<link rel="stylesheet" crossorigin href="/assets/chunk-
|
|
14
|
-
<link rel="stylesheet" crossorigin href="/assets/station-
|
|
12
|
+
<link rel="modulepreload" crossorigin href="/assets/chunk-NW3WDGEQ-CnyjTRUh.js">
|
|
13
|
+
<link rel="stylesheet" crossorigin href="/assets/chunk-NW3WDGEQ-DR1XNWCJ.css">
|
|
14
|
+
<link rel="stylesheet" crossorigin href="/assets/station-D6KfgFXf.css">
|
|
15
15
|
</head>
|
|
16
16
|
<body>
|
|
17
17
|
<main class="station-app">
|
package/dist/pit-footer.d.ts
DELETED
package/dist/pit-footer.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The pit.world global footer (site name, search, ring, publish), fetched on
|
|
3
|
-
* the server and appended as the last thing in <body> of the nixamp.com pages.
|
|
4
|
-
*
|
|
5
|
-
* A module-level cache: the last good copy is served, and one older than an
|
|
6
|
-
* hour is refreshed in the background (3s timeout). A failed refresh keeps the
|
|
7
|
-
* old copy; with no copy at all the page goes out unchanged, so pit.world being
|
|
8
|
-
* down never breaks a page.
|
|
9
|
-
*/
|
|
10
|
-
const PIT_FOOTER_URL = "https://pit.world/snippets/footer.html?site=nixamp.com";
|
|
11
|
-
const MAX_AGE_MS = 60 * 60 * 1000;
|
|
12
|
-
let cached = "";
|
|
13
|
-
let fetchedAt = 0;
|
|
14
|
-
let inflight = null;
|
|
15
|
-
export function refreshPitFooter() {
|
|
16
|
-
inflight ??= fetch(PIT_FOOTER_URL, { signal: AbortSignal.timeout(3000) })
|
|
17
|
-
.then(async (res) => {
|
|
18
|
-
const text = res.ok ? await res.text() : "";
|
|
19
|
-
if (!text.includes("data-pit-footer"))
|
|
20
|
-
throw new Error(`pit footer: HTTP ${res.status}`);
|
|
21
|
-
cached = text;
|
|
22
|
-
fetchedAt = Date.now();
|
|
23
|
-
})
|
|
24
|
-
.catch(() => {
|
|
25
|
-
fetchedAt = Date.now() - MAX_AGE_MS + 60_000; // try again in a minute
|
|
26
|
-
})
|
|
27
|
-
.finally(() => {
|
|
28
|
-
inflight = null;
|
|
29
|
-
});
|
|
30
|
-
return inflight;
|
|
31
|
-
}
|
|
32
|
-
/** The page with the footer before its last </body>, or the page unchanged. */
|
|
33
|
-
export function withPitFooter(page) {
|
|
34
|
-
if (Date.now() - fetchedAt > MAX_AGE_MS)
|
|
35
|
-
void refreshPitFooter();
|
|
36
|
-
if (!cached || page.includes("data-pit-footer"))
|
|
37
|
-
return page;
|
|
38
|
-
const at = page.lastIndexOf("</body>");
|
|
39
|
-
return at < 0 ? page : page.slice(0, at) + cached + page.slice(at);
|
|
40
|
-
}
|
package/src/pit-footer.ts
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The pit.world global footer (site name, search, ring, publish), fetched on
|
|
3
|
-
* the server and appended as the last thing in <body> of the nixamp.com pages.
|
|
4
|
-
*
|
|
5
|
-
* A module-level cache: the last good copy is served, and one older than an
|
|
6
|
-
* hour is refreshed in the background (3s timeout). A failed refresh keeps the
|
|
7
|
-
* old copy; with no copy at all the page goes out unchanged, so pit.world being
|
|
8
|
-
* down never breaks a page.
|
|
9
|
-
*/
|
|
10
|
-
const PIT_FOOTER_URL = "https://pit.world/snippets/footer.html?site=nixamp.com";
|
|
11
|
-
const MAX_AGE_MS = 60 * 60 * 1000;
|
|
12
|
-
|
|
13
|
-
let cached = "";
|
|
14
|
-
let fetchedAt = 0;
|
|
15
|
-
let inflight: Promise<void> | null = null;
|
|
16
|
-
|
|
17
|
-
export function refreshPitFooter(): Promise<void> {
|
|
18
|
-
inflight ??= fetch(PIT_FOOTER_URL, { signal: AbortSignal.timeout(3000) })
|
|
19
|
-
.then(async (res) => {
|
|
20
|
-
const text = res.ok ? await res.text() : "";
|
|
21
|
-
if (!text.includes("data-pit-footer")) throw new Error(`pit footer: HTTP ${res.status}`);
|
|
22
|
-
cached = text;
|
|
23
|
-
fetchedAt = Date.now();
|
|
24
|
-
})
|
|
25
|
-
.catch(() => {
|
|
26
|
-
fetchedAt = Date.now() - MAX_AGE_MS + 60_000; // try again in a minute
|
|
27
|
-
})
|
|
28
|
-
.finally(() => {
|
|
29
|
-
inflight = null;
|
|
30
|
-
});
|
|
31
|
-
return inflight;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/** The page with the footer before its last </body>, or the page unchanged. */
|
|
35
|
-
export function withPitFooter(page: string): string {
|
|
36
|
-
if (Date.now() - fetchedAt > MAX_AGE_MS) void refreshPitFooter();
|
|
37
|
-
if (!cached || page.includes("data-pit-footer")) return page;
|
|
38
|
-
const at = page.lastIndexOf("</body>");
|
|
39
|
-
return at < 0 ? page : page.slice(0, at) + cached + page.slice(at);
|
|
40
|
-
}
|