import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import dayjs from 'dayjs' import { Event } from 'nostr-tools' import AudioPlayer from '@/components/AudioPlayer' interface MusicTrackNoteProps { event: Event className?: string } export default function MusicTrackNote({ event, className }: MusicTrackNoteProps) { const { t } = useTranslation() const metadata = useMemo(() => { const getTagValue = (tagName: string) => { const tag = event.tags.find(tag => tag[0] === tagName) return tag?.[1] || null } const getTagValues = (tagName: string) => { return event.tags .filter(tag => tag[0] === tagName) .map(tag => tag[1]) .filter(Boolean) } let lyrics = null let credits = null if (event.content) { const creditsMatch = event.content.match(/Credits:\s*\n([\s\S]*)/i) if (creditsMatch) { credits = creditsMatch[1].trim() const lyricsMatch = event.content.match(/^([\s\S]*?)Credits:/i) lyrics = lyricsMatch ? lyricsMatch[1].trim() : null } else { lyrics = event.content } } return { title: getTagValue('title') || t('music.untitled'), url: getTagValue('url'), image: getTagValue('image'), license: getTagValue('license'), alt: getTagValue('alt'), releaseDate: getTagValue('released'), artist: getTagValue('artist'), album: getTagValue('album'), trackNumber: getTagValue('track_number'), duration: getTagValue('duration'), genres: getTagValues('t').filter(tag => !['music'].includes(tag) ), lyrics, credits } }, [event, t]) if (!metadata.url) { return (
{t('music.by')} {metadata.artist}
)} {metadata.album && ({t('music.album')}: {metadata.album} {metadata.trackNumber && ` • ${t('music.track')} ${metadata.trackNumber}`}
)} {metadata.releaseDate && ({t('music.released')}: {dayjs(metadata.releaseDate).format('MMMM D, YYYY')}
)} {/* Audio Player */}{metadata.lyrics}
{t('music.credits')}:
{metadata.credits}
{t('music.license')}: {metadata.license}
)} {metadata.genres.length > 0 && (