Sångare-förslag + schema/antal/källor per typ + YT Music-skrivfix
Some checks failed
build-and-push / build (push) Failing after 12s
Some checks failed
build-and-push / build (push) Failing after 12s
- 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
This commit is contained in:
@@ -134,6 +134,39 @@ test('run(tracks): gillade + mest spelade in i prompten, egen batch-typ', async
|
||||
assert.equal(engine.lastRun('mix'), null)
|
||||
})
|
||||
|
||||
test('run(singers): unika sångare i prompt, filtrering mot bibliotek + gillat', async () => {
|
||||
const { engine, fetchImpl } = setup({
|
||||
geminiResponse: JSON.stringify([
|
||||
{
|
||||
name: 'Floor Jansen',
|
||||
motivation: 'Kraftfull sopran.',
|
||||
topTracks: [
|
||||
{ name: 'Gimme! Gimme! Gimme!', artist: 'ABBA' },
|
||||
{ name: 'Storm', artist: 'Floor Jansen' },
|
||||
],
|
||||
relatedArtists: ['Powerwolf', 'Epica'],
|
||||
},
|
||||
]),
|
||||
})
|
||||
const batch = await engine.run('manuell', 'singers')
|
||||
|
||||
assert.match(fetchImpl.prompt, /SÅNGARE/)
|
||||
assert.match(fetchImpl.prompt, /ABBA/, 'sångare ur gillat ska in i prompten')
|
||||
assert.match(fetchImpl.prompt, /1000mods/, 'sångare ur spelat ska in i prompten')
|
||||
|
||||
assert.equal(batch.type, 'singers')
|
||||
const s = batch.items[0]
|
||||
assert.equal(s.kind, 'singer')
|
||||
assert.equal(s.topTracks.length, 1, 'gillad låt (Gimme! Gimme! Gimme!) ska filtreras bort')
|
||||
assert.equal(s.topTracks[0].name, 'Storm')
|
||||
assert.deepEqual(
|
||||
s.relatedArtists.map((a) => a.name),
|
||||
['Epica'],
|
||||
'Powerwolf finns i biblioteket och ska filtreras bort',
|
||||
)
|
||||
assert.equal(s.relatedArtists[0].mbid, 'mbid-x')
|
||||
})
|
||||
|
||||
test('run utan Gemini-nyckel ger begripligt fel', async () => {
|
||||
const { engine, dataDir } = setup()
|
||||
const store = settingsStore(dataDir)
|
||||
|
||||
Reference in New Issue
Block a user