Konfigureras på inställningssidan (server-URL, topic, på/av-toggle,
testknapp) med NTFY_URL/NTFY_TOPIC som env-fallback. Notisen är
fire-and-forget och kan aldrig fälla själva tillägget.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Full bredd längst ner: play/paus, förfluten tid/längd, sökbar progress,
låttitel och volym. Videon göms off-screen och styrs via YouTube
IFrame-API:t (loadVideoById/seekTo/setVolume); raden ligger kvar
mellan låtar och stängs med ✕. Innehållet får bottenmarginal när
spelaren är aktiv.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01824ZrvG2mDYYrmwqypLNup
Alla autentiserade ytmusicapi-anrop med TV-OAuth-token får 400 'invalid
argument' — känd Google-begränsning. Ny väg: klistra in request-headers
från inloggad music.youtube.com i settings → POST /api/ytmusic/headers
bygger ytmusicapi-kompatibel browser.json i Youtubarrs datamapp.
Youtubarr-forken föredrar browser.json framför oauth.json. Testern
rapporterar header-kopplingen. 2 nya tester, totalt 33.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01824ZrvG2mDYYrmwqypLNup
- GET /api/play?q=: slår upp spelbart videoId via YouTube Data API
(kategori musik, YOUTUBE_API_KEY i stackens .env)
- MiniPlayer: fast spelare nere till höger (YouTube-embed, autoplay),
ligger kvar medan man bläddrar; stängs med ✕
- MusicCard: ▶-knapp på artist/album/låt/sångare (genrer behåller sina
två knappar); YT-länken heter nu 'YT ↗'
- 2 nya tester, totalt 31
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01824ZrvG2mDYYrmwqypLNup
Tre knappar (Artister & album / Låtar / Genrer) ersätter batch-listan;
huvudspalten visar alla cachade fynd av vald typ i tidsordning med
nyast först, grupperade per körning med datum-avdelare. Nytt API
GET /api/suggest/items?type=X (plattar batcher med batch-metadata).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01824ZrvG2mDYYrmwqypLNup
Utforska-popupen renderar två MusicCard-grids (bilder, Hämta, ▶ YT) —
genrens låtar berikas nu också med artist-mbid/omslag i backend
(cachade uppslag så samma artist inte slås upp dubbelt). Äldre
batcher normaliseras i modalen.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01824ZrvG2mDYYrmwqypLNup
Rättelse per Björn: tredje förslags-typen ska vara genrer, inte sångare.
Gemini föreslår genrer utifrån artisterna i gillat/spelat; varje genre
får 5 toppartister (filtrerade mot biblioteket, Hämta-knapp i modalen)
och 5 topplåtar (filtrerade mot gillalistan, YT-länkar). Genrekortet
lånar första toppartistens omslag. Gamla sångar-batcher renderas
fortfarande. DetailModal generaliserad.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01824ZrvG2mDYYrmwqypLNup
- Ny batch-typ 'singers': baseras på de 10 senaste unika sångarna ur
gillat (YT Music) + spelat (Jellyfin); Gemini ger per sångare 5
topplåtar + 3 relaterade artister, filtrerade mot Lidarr-biblioteket
och gillalistan; klick på kortet öppnar modal med YT-länkar och
Hämta-knappar
- Förslags-scheman per typ: intervall med enhet (timmar/dagar/månader),
antal förslag (1-25) och källo-toggles; gamla intervalHours/
trackIntervalDays migreras automatiskt; schemaläggaren kör alla tre
- Inställningar: Förslag-kortet omgjort till hopfällbara sektioner per
typ (details/summary) så det inte blir överväldigande
- ytmusic: tydligt fel om oauth.json inte kan skrivas (root-ägd mapp
var orsaken till 'inte kopplad än' — ägarskap fixat på Pi5)
- 28 tester gröna
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01824ZrvG2mDYYrmwqypLNup
- MusicCard: ▶ YT-knapp öppnar music.youtube.com-sökning på artist/låt/album
- Låtförslag: egen batch-typ 'tracks' — signaler: 10 senast gillade
(Liked Music-listan i Youtubarr-DB, fallback senaste tillägg) + 10 mest
spelade i Jellyfin (SortBy=PlayCount); egen Gemini-prompt för enskilda
låtar; berikas med artist-MBID så Hämta lägger in artisten i Lidarr
- Upptäck: egen 'Veckans låtar'-ruta med senaste 10 + generera-knapp
- Schema: trackIntervalDays (default 7, 0 = av) i inställningarna,
schemaläggaren kör båda typerna oberoende
- Förslag-sidan märker batcher med typ; 26 tester gröna
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01824ZrvG2mDYYrmwqypLNup
- suggest.js: samlar signaler (Lidarr-bibliotek, Jellyfin senast spelat,
Youtubarr-DB senast tillagt/gillat via better-sqlite3 ro), bygger svensk
Gemini-prompt (JSON-svar), berikar förslagen med MBID/omslag via Lidarrs
metadata-API, cachar batcher i /data/suggestions.json
- API: POST /api/suggest/run, GET latest (10 senaste till Upptäck),
GET batches + batches/:id (bläddring)
- Schemaläggare i server.js: kollar var 10:e minut mot inställningen
suggest.intervalHours (default 24, 0 = av) — ställs in under ⚙
- Upptäck: senaste 10 som kort med motivering + '✨ Generera nya förslag';
ny Förslag-sida bläddrar alla cachade batcher; delat MusicCard-kort
(sök + förslag) med Hämta-knapp
- Dockerfile: byggverktyg för better-sqlite3; 4 nya tester, totalt 25
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01824ZrvG2mDYYrmwqypLNup
- POST /api/ytmusic/start + /poll: kör device-flödet mot Google och
skriver ytmusicapi-kompatibel oauth.json till Youtubarrs datamapp
(mounten byts till rw i stacken)
- Settings-sektion: Client ID/secret, 'Spara & koppla' visar kod + länk
och pollar tills godkänt; 'Testa kopplingen' verifierar med en
token-förnyelse mot Google
- 4 nya tester, totalt 21
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01824ZrvG2mDYYrmwqypLNup
- settings.json i /data (UI-värden har företräde framför env), hemligheter
maskeras i GET (bara apiKeySet-flagga)
- POST /api/settings/test kör live-test per tjänst: Gemini (nyckel+modell),
Jellyfin (System/Info + användarlista för dropdown), Lidarr, Youtubarr
(healthz + db-mount)
- Inställningssida (kugghjulet): Spara & testa i samma steg per sektion,
Jellyfin-användarväljare fylls från lyckat test
- 6 nya tester, totalt 17
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01824ZrvG2mDYYrmwqypLNup
- Ikon: SVG-favicon (indigo-gradient + balknot), används i topbar,
login och som favicon
- GET /api/search: artister/album via Lidarrs metadata-API (funkar även
när musicbrainz.org är nere), låtar via MusicBrainz recording-sök;
503 med svenskt felmeddelande när källan inte svarar
- POST /api/add: slår upp via lidarr:<mbid>, artist läggs bevakad med
searchForMissingAlbums, album bevakat med searchForNewAlbum (artisten
följer med obevakad), låtar mappas till album/artist; 'already' när
det redan finns
- Söksida med Jellyseerr-lik kortgrid: poster/fallback, typ-badge,
Hämta-knapp med busy/klar/finns-lägen; sökfältet i topbaren aktivt
- 7 nya tester (mappning + rutter med stubbat Lidarr), totalt 11
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01824ZrvG2mDYYrmwqypLNup
- backend: /api/health, /api/login|logout|session, sessionscookie,
timingSafeEqual-lösenordskoll, allt annat under /api kräver inloggning,
serverar byggd frontend med SPA-fallback; 4 tester (node:test)
- frontend: Vue 3 + Vite, login-sida, Upptäck-skal, sökfält (stub),
mörkt tema enligt Jellyseerr-förlagan
- docker: multi-stage arm64-image; config-plumbing för Lidarr/Jellyfin/
Gemini via env (Jellyfin-historik prioriterad som signal per Björn)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01824ZrvG2mDYYrmwqypLNup
lyssnarr — musik-discovery på Pi5. Jellyseerr-lik UI, sök (MusicBrainz +
YT Music), schemalagda Gemini-förslag från Lidarr-bibliotek + Youtubarr-
spellistor, add-to-Lidarr / spela inline / öppna i YT Music.
Plan i doc/plan.md — implementation börjar när planen är bekräftad.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01824ZrvG2mDYYrmwqypLNup