diff --git a/plugins/README.md b/plugins/README.md new file mode 100644 index 0000000..6db6d68 --- /dev/null +++ b/plugins/README.md @@ -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 | diff --git a/plugins/webamp/plugin.json b/plugins/webamp/plugin.json new file mode 100644 index 0000000..d644739 --- /dev/null +++ b/plugins/webamp/plugin.json @@ -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" + } +} diff --git a/plugins/webamp/public/assets/plugins/webamp/webamp-mod.js b/plugins/webamp/public/assets/plugins/webamp/webamp-mod.js new file mode 100644 index 0000000..931b9c8 --- /dev/null +++ b/plugins/webamp/public/assets/plugins/webamp/webamp-mod.js @@ -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 {} diff --git a/plugins/webamp/templates/custom/footer.tmpl b/plugins/webamp/templates/custom/footer.tmpl new file mode 100644 index 0000000..770cec0 --- /dev/null +++ b/plugins/webamp/templates/custom/footer.tmpl @@ -0,0 +1,2 @@ +{{/* teahub plugin: webamp */}} +