Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
443001a49b |
No files matched your search
@@ -0,0 +1,13 @@
|
||||
# Teahub plugins
|
||||
|
||||
Each folder is one plugin: a `plugin.json` manifest plus the files it drops into Gitea's custom dir (`$GITEA_CUSTOM`, `/data/gitea` on prod).
|
||||
|
||||
- `slots` — templates appended into Gitea's custom template slots (e.g. `footer`).
|
||||
- `assets` — files served under `/assets/...`.
|
||||
- `config` — plugin settings.
|
||||
|
||||
Install today is manual: back up the slot template, append the plugin's template, copy assets, restart Gitea. An install Action that reads the manifest is next.
|
||||
|
||||
| Plugin | Status |
|
||||
|---|---|
|
||||
| webamp | live on prod |
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "webamp",
|
||||
"title": "Webamp",
|
||||
"version": "0.1.0",
|
||||
"description": "A Winamp-style player on every Teahub page, fed by gandora.",
|
||||
"slots": {
|
||||
"footer": "templates/custom/footer.tmpl"
|
||||
},
|
||||
"assets": ["public/assets/plugins/webamp/webamp-mod.js"],
|
||||
"config": {
|
||||
"playlist_url": "https://gandora.yolopreneur.lol/playlist.json"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
// teahub plugin: webamp — a Winamp-style player docked on every Teahub page.
|
||||
// Loads Webamp from the CDN on first click, so pages stay fast for everyone else.
|
||||
|
||||
// Module scripts have no document.currentScript, so find our tag by its data attribute.
|
||||
const script = document.querySelector('script[src*="plugins/webamp/webamp-mod.js"]');
|
||||
const PLAYLIST_URL = script?.dataset.playlist;
|
||||
const KEY = 'teahub-webamp-open';
|
||||
|
||||
const FALLBACK = [
|
||||
{
|
||||
metaData: { artist: 'DJ Mike Llama', title: "Llama Whippin' Intro" },
|
||||
url: 'https://cdn.jsdelivr.net/gh/captbaritone/webamp@43434d82/mp3/llama-2.91.mp3',
|
||||
duration: 5.322286,
|
||||
},
|
||||
];
|
||||
|
||||
async function loadTracks() {
|
||||
if (!PLAYLIST_URL) return FALLBACK;
|
||||
try {
|
||||
const res = await fetch(PLAYLIST_URL, { mode: 'cors' });
|
||||
if (!res.ok) throw new Error(res.status);
|
||||
const list = await res.json();
|
||||
// gandora format: [{ title, artist, url, duration? }]
|
||||
const tracks = list
|
||||
.filter((t) => t && t.url)
|
||||
.map((t) => ({
|
||||
metaData: { artist: t.artist || 'gandora', title: t.title || 'untitled' },
|
||||
url: t.url,
|
||||
...(t.duration ? { duration: t.duration } : {}),
|
||||
}));
|
||||
return tracks.length ? tracks : FALLBACK;
|
||||
} catch {
|
||||
return FALLBACK;
|
||||
}
|
||||
}
|
||||
|
||||
let webamp = null;
|
||||
|
||||
async function open() {
|
||||
if (webamp) return;
|
||||
const { default: Webamp } = await import('https://unpkg.com/webamp@1.5.0/built/webamp.bundle.min.mjs');
|
||||
if (!Webamp.browserIsSupported()) return;
|
||||
webamp = new Webamp({ initialTracks: await loadTracks() });
|
||||
webamp.onClose(() => {
|
||||
webamp.dispose();
|
||||
webamp = null;
|
||||
try { localStorage.removeItem(KEY); } catch {}
|
||||
});
|
||||
await webamp.renderWhenReady(document.body.appendChild(document.createElement('div')));
|
||||
try { localStorage.setItem(KEY, '1'); } catch {}
|
||||
}
|
||||
|
||||
// Small launcher in the corner: the "sound system" button.
|
||||
const btn = document.createElement('button');
|
||||
btn.textContent = '▶ webamp';
|
||||
btn.title = 'Open Webamp';
|
||||
btn.style.cssText = [
|
||||
'position:fixed', 'right:12px', 'bottom:12px', 'z-index:9999',
|
||||
'font:12px/1 monospace', 'padding:6px 10px', 'border-radius:4px',
|
||||
'border:1px solid #1d3', 'background:#000', 'color:#1d3', 'cursor:pointer',
|
||||
].join(';');
|
||||
btn.addEventListener('click', open);
|
||||
document.body.appendChild(btn);
|
||||
|
||||
// Reopen if it was open on the last page.
|
||||
try { if (localStorage.getItem(KEY)) open(); } catch {}
|
||||
@@ -0,0 +1,2 @@
|
||||
{{/* teahub plugin: webamp */}}
|
||||
<script type="module" nonce="{{ctx.CspScriptNonce}}" src="{{AssetUrlPrefix}}/plugins/webamp/webamp-mod.js?v=010" data-playlist="https://gandora.yolopreneur.lol/playlist.json"></script>
|
||||
Reference in new issue
Block a user