diff --git a/frontend/src/components/PlayerModal.tsx b/frontend/src/components/PlayerModal.tsx
index 0448c15..5f48ee3 100644
--- a/frontend/src/components/PlayerModal.tsx
+++ b/frontend/src/components/PlayerModal.tsx
@@ -201,8 +201,17 @@ export default function PlayerModal({
onClose: () => void;
onState: (id: string, status: string) => void;
}) {
- const { t } = useTranslation();
+ const { t, i18n } = useTranslation();
const qc = useQueryClient();
+ // Precise upload date shown inline after the relative time (e.g. "9 yr ago · 12 Jan 2017").
+ const fullDate = (d: string | null | undefined) =>
+ d
+ ? new Date(d).toLocaleDateString(i18n.language, {
+ year: "numeric",
+ month: "short",
+ day: "numeric",
+ })
+ : "";
// Track the playing item by id (not a frozen index) so it survives the queue changing
// under us — e.g. an item removed in another tab. The index is derived from the *live*
// queue, so the N / M counter and prev/next neighbours stay correct without disrupting
@@ -550,7 +559,10 @@ export default function PlayerModal({
{active.view_count != null && (
· {t("player.views", { count: active.view_count, formattedCount: formatViews(active.view_count) })}
)}
- · {relativeTime(active.published_at)}
+
+ · {relativeTime(active.published_at)}
+ {active.published_at && ` · ${fullDate(active.published_at)}`}
+
{active.duration_seconds != null && (
· {formatDuration(active.duration_seconds)}
)}
@@ -566,7 +578,11 @@ export default function PlayerModal({
{detail.data?.view_count != null && (
· {t("player.views", { count: detail.data.view_count, formattedCount: formatViews(detail.data.view_count) })}
)}
- {detail.data?.published_at && · {relativeTime(detail.data.published_at)}}
+ {detail.data?.published_at && (
+
+ · {relativeTime(detail.data.published_at)} · {fullDate(detail.data.published_at)}
+
+ )}
{detail.data?.duration_seconds != null && (
· {formatDuration(detail.data.duration_seconds)}
)}