Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3ff4bc532b | ||
|
|
dc5b97ecf4 | ||
|
|
a2f7a7fceb | ||
|
|
9c85c8ec5e | ||
|
|
7f86ca8e66 | ||
|
|
ed39a7ee4a |
@@ -20,10 +20,10 @@
|
||||
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
<script src="./js/marked.min.js"></script>
|
||||
<script type="text/javascript" src="./js/qrcode-svg.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/dompurify@3.2.6/dist/purify.min.js"></script>
|
||||
<script src="./js/vendor/purify.min.js"></script>
|
||||
|
||||
<style>
|
||||
#divBody {
|
||||
|
||||
@@ -23,11 +23,11 @@
|
||||
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
<script src="./js/marked.min.js"></script>
|
||||
<script type="text/javascript" src="./js/qrcode-generator.min.js"></script>
|
||||
<script type="text/javascript" src="./js/qrcode-svg.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/dompurify@3.2.6/dist/purify.min.js"></script>
|
||||
<script src="./js/vendor/purify.min.js"></script>
|
||||
|
||||
<style>
|
||||
#divBody {
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<!-- Initialize theme BEFORE any components load -->
|
||||
<script>
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
</script>
|
||||
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style>
|
||||
#divBody {
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
});
|
||||
</script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style media="screen">
|
||||
#divBody {
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style media="screen">
|
||||
#divBody {
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style>
|
||||
#divBody {
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
<style>
|
||||
#divBody {
|
||||
flex-direction: column !important;
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style media="screen">
|
||||
#divBody {
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style media="screen">
|
||||
#divBody {
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
</script>
|
||||
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style>
|
||||
#divBody {
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
</script>
|
||||
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style>
|
||||
#divBody {
|
||||
|
||||
@@ -20,10 +20,10 @@
|
||||
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
<script src="./js/marked.min.js"></script>
|
||||
<script type="text/javascript" src="./js/qrcode-svg.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/dompurify@3.2.6/dist/purify.min.js"></script>
|
||||
<script src="./js/vendor/purify.min.js"></script>
|
||||
|
||||
<style>
|
||||
#divBody {
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
|
||||
<style media="screen">
|
||||
|
||||
8
www/js/vendor/client-zip.esm.js
vendored
Normal file
8
www/js/vendor/client-zip.esm.js
vendored
Normal file
File diff suppressed because one or more lines are too long
3
www/js/vendor/dash.all.min.js
vendored
Normal file
3
www/js/vendor/dash.all.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
www/js/vendor/hls.min.js
vendored
Normal file
2
www/js/vendor/hls.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
3
www/js/vendor/purify.min.js
vendored
Normal file
3
www/js/vendor/purify.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
3
www/js/vendor/svg.min.js
vendored
Normal file
3
www/js/vendor/svg.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"VERSION": "v0.0.1",
|
||||
"VERSION_NUMBER": "0.0.1",
|
||||
"BUILD_DATE": "2026-04-17T20:53:38.555Z"
|
||||
"VERSION": "v0.7.5",
|
||||
"VERSION_NUMBER": "0.7.5",
|
||||
"BUILD_DATE": "2026-04-19T18:31:26.580Z"
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
})();
|
||||
</script>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style>
|
||||
#divBody {
|
||||
|
||||
@@ -26,10 +26,10 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
<script src="./js/marked.min.js"></script>
|
||||
<script type="text/javascript" src="./js/qrcode-generator.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/dompurify@3.2.6/dist/purify.min.js"></script>
|
||||
<script src="./js/vendor/purify.min.js"></script>
|
||||
|
||||
<style>
|
||||
#divBody {
|
||||
|
||||
103
www/music.html
103
www/music.html
@@ -25,8 +25,8 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="https://cdn.dashjs.org/latest/dash.all.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
<script src="./js/vendor/dash.all.min.js"></script>
|
||||
|
||||
<style>
|
||||
#divBody {
|
||||
@@ -1367,7 +1367,6 @@
|
||||
import { HamburgerMorphing } from "./hamburger_morphing/hamburger.mjs";
|
||||
import { initFooterRelayStatus, updateFooterRelayStatus, initSidenavRelaySection, updateSidenavRelaySection, setRelayActivityState } from './js/relay-ui.mjs';
|
||||
import { initBlossomSection, updateBlossomSection } from './js/blossom-ui.mjs';
|
||||
|
||||
import { initAiSectionWithLocalConfig } from './js/ai-ui.mjs';
|
||||
import { GreyscaleAPI } from './js/greyscale-api.mjs';
|
||||
import { SimplePlayer } from './js/greyscale-player.mjs';
|
||||
@@ -1617,6 +1616,21 @@ import { GreyscaleAPI } from './js/greyscale-api.mjs';
|
||||
return message.includes('authentication required');
|
||||
}
|
||||
|
||||
async function tryGetPubkeyWithoutPrompt({ attempts = 8, delayMs = 350 } = {}) {
|
||||
for (let i = 0; i < attempts; i += 1) {
|
||||
try {
|
||||
const pubkey = await getPubkey();
|
||||
if (pubkey) return pubkey;
|
||||
} catch {
|
||||
// Signer can attach slightly after initial script execution.
|
||||
}
|
||||
if (i < attempts - 1) {
|
||||
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
||||
}
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
function isReadOnlyTargetMode() {
|
||||
return Boolean(targetPubkey && (!currentPubkey || targetPubkey !== currentPubkey));
|
||||
}
|
||||
@@ -1695,13 +1709,8 @@ import { GreyscaleAPI } from './js/greyscale-api.mjs';
|
||||
throw error;
|
||||
}
|
||||
|
||||
try {
|
||||
currentPubkey = await getPubkey();
|
||||
isAuthenticated = Boolean(currentPubkey);
|
||||
} catch {
|
||||
currentPubkey = null;
|
||||
isAuthenticated = false;
|
||||
}
|
||||
currentPubkey = await tryGetPubkeyWithoutPrompt();
|
||||
isAuthenticated = Boolean(currentPubkey);
|
||||
}
|
||||
|
||||
async function initializeAuthenticatedPageFeatures() {
|
||||
@@ -4327,19 +4336,75 @@ import { GreyscaleAPI } from './js/greyscale-api.mjs';
|
||||
}
|
||||
|
||||
async function loadClientZipModule() {
|
||||
return import('https://cdn.jsdelivr.net/npm/client-zip@2.4.5/+esm');
|
||||
return import('./js/vendor/client-zip.esm.js');
|
||||
}
|
||||
|
||||
async function fetchDownloadBlobForTrack(track) {
|
||||
if (!track?.id) throw new Error('Track not available for download.');
|
||||
const stream = await musicApi.getTrackStream(track.id, 'LOSSLESS');
|
||||
const streamUrl = stream?.streamUrl;
|
||||
if (!streamUrl) throw new Error('No stream URL for download');
|
||||
const res = await fetch(streamUrl);
|
||||
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
||||
const blob = await res.blob();
|
||||
const ext = extensionFromMime(blob.type);
|
||||
return { blob, ext };
|
||||
|
||||
console.debug('[music][download] start', {
|
||||
trackId: track.id,
|
||||
title: track.title || '',
|
||||
});
|
||||
|
||||
const qualityCandidates = ['HIGH', 'MP3_320', 'LOSSLESS'];
|
||||
let lastError = null;
|
||||
|
||||
for (const quality of qualityCandidates) {
|
||||
try {
|
||||
console.debug('[music][download] requesting stream', { trackId: track.id, quality });
|
||||
|
||||
const stream = await musicApi.getTrackStream(track.id, quality);
|
||||
const streamUrl = stream?.streamUrl;
|
||||
if (!streamUrl) {
|
||||
lastError = new Error(`No stream URL for quality ${quality}`);
|
||||
console.warn('[music][download] missing stream URL', { trackId: track.id, quality });
|
||||
continue;
|
||||
}
|
||||
|
||||
console.debug('[music][download] fetching stream URL', {
|
||||
trackId: track.id,
|
||||
quality,
|
||||
streamUrl,
|
||||
});
|
||||
|
||||
const res = await fetch(streamUrl);
|
||||
if (!res.ok) {
|
||||
lastError = new Error(`HTTP ${res.status} for quality ${quality}`);
|
||||
console.warn('[music][download] fetch failed', {
|
||||
trackId: track.id,
|
||||
quality,
|
||||
status: res.status,
|
||||
statusText: res.statusText,
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
const blob = await res.blob();
|
||||
const ext = extensionFromMime(blob.type);
|
||||
console.debug('[music][download] success', {
|
||||
trackId: track.id,
|
||||
quality,
|
||||
mimeType: blob.type,
|
||||
size: blob.size,
|
||||
ext,
|
||||
});
|
||||
return { blob, ext };
|
||||
} catch (error) {
|
||||
lastError = error instanceof Error ? error : new Error(String(error || 'Unknown error'));
|
||||
console.warn('[music][download] quality attempt threw', {
|
||||
trackId: track.id,
|
||||
quality,
|
||||
error: lastError.message,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
console.error('[music][download] all quality attempts failed', {
|
||||
trackId: track.id,
|
||||
error: lastError?.message || 'No stream URL for download',
|
||||
});
|
||||
throw (lastError || new Error('No stream URL for download'));
|
||||
}
|
||||
|
||||
async function downloadTrackFile(track, { suppressStatus = false } = {}) {
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style media="screen">
|
||||
#divBody {
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
</script>
|
||||
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style>
|
||||
#divBody {
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style media="screen">
|
||||
#divQRContainer {
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="../js/vendor/svg.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="../js/vendor/svg.min.js"></script>
|
||||
|
||||
<style media="screen">
|
||||
#divBody {
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="../js/vendor/svg.min.js"></script>
|
||||
|
||||
<style media="screen">
|
||||
#divBody {
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="../js/vendor/svg.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="../js/vendor/svg.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
@@ -22,11 +22,11 @@
|
||||
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="../js/vendor/svg.min.js"></script>
|
||||
<script src="./js/marked.min.js"></script>
|
||||
<script type="text/javascript" src="./js/qrcode-generator.min.js"></script>
|
||||
<script type="text/javascript" src="./js/qrcode-svg.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/dompurify@3.2.6/dist/purify.min.js"></script>
|
||||
<script src="../js/vendor/purify.min.js"></script>
|
||||
|
||||
<style>
|
||||
#divBody {
|
||||
|
||||
@@ -173,8 +173,8 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
|
||||
<script src="../js/vendor/svg.min.js"></script>
|
||||
<script src="../js/vendor/hls.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
@@ -172,8 +172,8 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
|
||||
<script src="../js/vendor/svg.min.js"></script>
|
||||
<script src="../js/vendor/hls.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
</script>
|
||||
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style>
|
||||
#divBody {
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
</script>
|
||||
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style>
|
||||
#divBody {
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style media="screen">
|
||||
#divBody {
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
});
|
||||
</script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style media="screen">
|
||||
#divBody {
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style media="screen">
|
||||
/* ================================================================
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
})();
|
||||
</script>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style>
|
||||
#divBody {
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
</script>
|
||||
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style>
|
||||
#divBody {
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<!-- Strudel REPL Library (locally built from source) -->
|
||||
<script type="module" src="./strudel-repl/index.js"></script>
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style>
|
||||
/* ================================================================
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
|
||||
<style media="screen">
|
||||
#divBody {
|
||||
|
||||
@@ -175,7 +175,7 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
@@ -26,9 +26,9 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="./favicon/favicon-dots2.ico" />
|
||||
|
||||
<!-- SVG.js library (required by HamburgerMorphing) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
|
||||
<script src="https://cdn.dashjs.org/latest/dash.all.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
|
||||
<script src="./js/vendor/svg.min.js"></script>
|
||||
<script src="./js/vendor/dash.all.min.js"></script>
|
||||
<script src="./js/vendor/hls.min.js"></script>
|
||||
|
||||
<style>
|
||||
#divBody {
|
||||
@@ -5609,7 +5609,7 @@
|
||||
}
|
||||
|
||||
async function loadClientZipModule() {
|
||||
return import('https://cdn.jsdelivr.net/npm/client-zip@2.4.5/+esm');
|
||||
return import('./js/vendor/client-zip.esm.js');
|
||||
}
|
||||
|
||||
async function fetchDownloadBlobForTrack(track) {
|
||||
|
||||
Reference in New Issue
Block a user