import { redirect } from 'next/navigation' import { canAccess, getAdminContext, PERMS } from '@/lib/permissions' import { prisma } from '@/lib/prisma' import { siteSettings } from '@/lib/services/site-settings' import { DEFAULT_SOUNDTRACK_BASE_URL, parseTrackSamples } from '@/lib/services/soundtracks' import { SoundsClient } from './sounds-client' export default async function SoundsPage() { const { session, permissions } = await getAdminContext() if (!canAccess(permissions, PERMS.CATALOG_VIEW, session.user.rank)) { redirect('/admin') } const canEdit = canAccess(permissions, PERMS.CATALOG_EDIT, session.user.rank) const [rows, usage, baseUrlSetting] = await Promise.all([ prisma.soundtracks.findMany({ orderBy: { id: 'asc' }, select: { id: true, code: true, name: true, author: true, length: true, track: true, }, }), prisma.catalogItem.groupBy({ by: ['songId'], where: { songId: { gt: 0 } }, _count: { _all: true }, }), siteSettings.get('soundtrack_base_url', DEFAULT_SOUNDTRACK_BASE_URL), ]) const usageMap: Record = {} for (const row of usage) { if (row.songId != null) usageMap[row.songId] = row._count._all } const soundtracks = rows.map((r) => { const samples = parseTrackSamples(r.track) return { id: r.id, code: r.code, name: r.name, author: r.author, length: r.length, track: r.track, samples, kind: (samples.length > 0 ? 'composition' : 'single') as 'composition' | 'single', usedBy: usageMap[r.id] ?? 0, } }) // Normalize: ensure trailing slash so ${base}${code}.mp3 yields a valid URL. const baseUrl = baseUrlSetting.endsWith('/') ? baseUrlSetting : `${baseUrlSetting}/` return (

Song Disks

Carica e gestisci i file MP3 dei song disk riprodotti dai jukebox in-game. I file sono serviti da {baseUrl} (configurabile in{' '} Impostazioni > CMS ).

) }