응원가 공유·플레이어 문구 '오늘의' → 제작일 표기 (예: 8월 28일 OO 응원가)

songs API에 dateKst(경기일) 추가, OG 공유 제목·프론트 shareText·artist에 적용
— 매일 갱신되는 콘텐츠임을 드러낸다

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
jwkim 2026-08-31 10:21:24 +09:00
parent df367070ce
commit bb930cc59f
4 changed files with 18 additions and 6 deletions

View File

@ -58,7 +58,10 @@ def _team_label(code: str | None) -> str:
async def song_share(
match_id: str, team_code: str, db: AsyncSession = Depends(get_db)
) -> HTMLResponse:
"""응원가 공유 OG — '오늘의 OO 응원가' 제목 + Suno 앨범아트 썸네일."""
"""응원가 공유 OG — '8월 28일 OO 응원가' 제목 + Suno 앨범아트 썸네일.
제목의 날짜는 제작일(경기일 KST) 매일 갱신되는 콘텐츠임을 드러낸다.
"""
s = (
await db.execute(
select(Song).where(Song.match_id == match_id, Song.team_code == team_code)
@ -66,9 +69,10 @@ async def song_share(
).scalar_one_or_none()
team = (s.team_name if s else "") or _team_label(team_code) or team_code
song_title = (s.title if s else "") or f"{team} 응원가"
title = f"오늘의 {team} 응원가 — {song_title}"
day = f"{s.date_kst.month}{s.date_kst.day}" if s and s.date_kst else "오늘의"
title = f"{day} {team} 응원가 — {song_title}"
desc = (
"AI가 오늘 경기(순위·선발 라인업·전날 결과)를 반영해 만든 응원가. "
"AI가 경기 당일(순위·선발 라인업·전날 결과)을 반영해 매일 새로 만드는 응원가. "
"듣고 나서 GPT·Claude·Gemini와 승부예측도 겨뤄보세요!"
)

View File

@ -40,6 +40,8 @@ def _song_out(s: Song) -> dict:
"teamName": s.team_name,
"title": s.title,
"lyrics": s.lyrics,
# 제작일(경기일 KST) — 공유·플레이어 문구의 "8월 28일 OO 응원가" 표기용
"dateKst": s.date_kst.isoformat() if s.date_kst else None,
"tracks": tracks,
}

View File

@ -57,6 +57,8 @@ export interface SongOut {
teamName: string;
title: string;
lyrics?: string;
/** 제작일(경기일 KST, YYYY-MM-DD) — "8월 28일 OO 응원가" 표기용 */
dateKst?: string | null;
tracks: SongTrackOut[];
}

View File

@ -42,14 +42,18 @@ function fetchMatchSongsCached(matchId: string): Promise<SongOut[]> {
function songToTracks(s: SongOut): Track[] {
const base = s.title || `${s.teamName} 응원가`;
// 공유는 응원가 전용 링크 — 크롤러에 "오늘의 OO 응원가" OG 카드가 나간다
// 제작일 표기 ("8월 28일") — 매일 갱신되는 콘텐츠임을 드러낸다. 날짜 없으면 "오늘의"
const day = s.dateKst
? `${Number(s.dateKst.slice(5, 7))}${Number(s.dateKst.slice(8, 10))}`
: "오늘의";
// 공유는 응원가 전용 링크 — 크롤러에 "8월 28일 OO 응원가" OG 카드가 나간다
const shareUrl = `${window.location.origin}/song/${s.matchId}/${s.teamCode}`;
const shareText = `오늘의 ${s.teamName} 응원가 「${base}」 — TriplePick`;
const shareText = `${day} ${s.teamName} 응원가 「${base}」 — TriplePick`;
return (s.tracks || [])
.filter((t) => t.audioUrl)
.map((t, i) => ({
title: s.tracks.length > 1 ? `${base} #${i + 1}` : base,
artist: `오늘의 ${s.teamName} 응원가`,
artist: `${day} ${s.teamName} 응원가`,
src: t.audioUrl,
cover: t.imageUrl,
lyrics: s.lyrics || undefined,