Sångare -> Genrer: kategorin föreslår musikgenrer med toppartister/topplåtar
All checks were successful
build-and-push / build (push) Successful in 14s

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
This commit is contained in:
2026-08-01 02:43:53 +02:00
parent 3ae0289f44
commit 43a41b300e
11 changed files with 107 additions and 105 deletions

View File

@@ -1,12 +1,12 @@
<script setup>
import { onMounted, ref } from 'vue'
import MusicCard from '../components/MusicCard.vue'
import SingerModal from '../components/SingerModal.vue'
import DetailModal from '../components/DetailModal.vue'
const batches = ref([])
const selected = ref(null)
const loading = ref(false)
const openSinger = ref(null)
const openDetail = ref(null)
async function load() {
const res = await fetch('/api/suggest/batches')
@@ -44,7 +44,7 @@ onMounted(load)
@click="pick(b.id)"
>
<strong>#{{ b.id }}</strong> {{ fmt(b.createdAt) }}
<span class="dim">{{ { tracks: 'låtar', singers: 'sångare' }[b.type] ?? 'artister/album' }} · {{ b.count }} förslag · {{ b.trigger }}</span>
<span class="dim">{{ { tracks: 'låtar', singers: 'sångare', genres: 'genrer' }[b.type] ?? 'artister/album' }} · {{ b.count }} förslag · {{ b.trigger }}</span>
</button>
</aside>
@@ -59,13 +59,13 @@ onMounted(load)
v-for="(r, i) in selected.items"
:key="`${selected.id}-${r.mbid ?? i}`"
:item="r"
@detail="openSinger = $event"
@detail="openDetail = $event"
/>
</div>
</template>
<p v-else-if="loading" class="dim">Laddar</p>
</div>
<SingerModal v-if="openSinger" :singer="openSinger" @close="openSinger = null" />
<DetailModal v-if="openDetail" :item="openDetail" @close="openDetail = null" />
</section>
</template>