feat: show artist and original artist on song detail page
Some checks failed
Deploy Fediversion / deploy (push) Failing after 1s

This commit is contained in:
fullsizemalt 2025-12-31 09:34:12 -08:00
parent 4795d624cb
commit dfeeb2ae81
3 changed files with 19 additions and 6 deletions

View file

@ -54,7 +54,15 @@ def read_songs(
@router.get("/{slug}", response_model=SongReadWithStats)
def read_song(slug: str, session: Session = Depends(get_session)):
song = session.exec(select(Song).where(Song.slug == slug)).first()
from sqlalchemy.orm import joinedload
song = session.exec(
select(Song)
.where(Song.slug == slug)
.options(
joinedload(Song.artist),
joinedload(Song.vertical)
)
).first()
if not song:
raise HTTPException(status_code=404, detail="Song not found")

View file

@ -83,6 +83,8 @@ class SongRead(SongBase):
id: int
slug: Optional[str] = None
tags: List["TagRead"] = []
artist: Optional["ArtistRead"] = None
vertical: Optional["VerticalSimple"] = None

View file

@ -73,14 +73,17 @@ export default async function SongDetailPage({ params }: { params: Promise<{ slu
<div>
<div className="flex items-baseline gap-3">
<h1 className="text-3xl font-bold tracking-tight">{song.title}</h1>
{song.artist ? (
{song.artist && (
<Link href={`/artists/${song.artist.slug}`} className="text-lg text-muted-foreground font-medium hover:text-primary transition-colors">
({song.artist.name})
{song.artist.name}
</Link>
) : song.original_artist ? (
<span className="text-lg text-muted-foreground font-medium">({song.original_artist})</span>
) : null}
)}
</div>
{song.original_artist && (
<div className="text-sm text-muted-foreground mt-1">
Original Artist: <span className="font-medium text-foreground">{song.original_artist}</span>
</div>
)}
{song.tags && song.tags.length > 0 && (
<div className="flex flex-wrap gap-2 mt-2">
{song.tags.map((tag: any) => (