From 36d321649d46b17176d2bf8b14b2ffa73d96160e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20G=C3=B3mez?= Date: Thu, 26 Feb 2026 22:51:53 +0100 Subject: [PATCH] ui: show hashtags as labels, not metadata --- .../nostr/kinds/MusicTrackRenderer.tsx | 46 +++++++++++-------- src/lib/music-helpers.ts | 8 ++++ 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/src/components/nostr/kinds/MusicTrackRenderer.tsx b/src/components/nostr/kinds/MusicTrackRenderer.tsx index 37da5ae..f1ea5f2 100644 --- a/src/components/nostr/kinds/MusicTrackRenderer.tsx +++ b/src/components/nostr/kinds/MusicTrackRenderer.tsx @@ -5,6 +5,7 @@ import { getTrackArtist, getTrackImage, getTrackMetadata, + getTrackHashtags, } from "@/lib/music-helpers"; import { BaseEventContainer, ClickableEventTitle } from "./BaseEventRenderer"; import type { BaseEventProps } from "./BaseEventRenderer"; @@ -18,6 +19,7 @@ export function MusicTrackRenderer({ event }: BaseEventProps) { const artist = getTrackArtist(event); const trackUrl = getTrackUrl(event); const metadata = getTrackMetadata(event); + const hashtags = getTrackHashtags(event); return ( @@ -31,23 +33,29 @@ export function MusicTrackRenderer({ event }: BaseEventProps) { {title || "Untitled Track"} - {/* Artist & Album */} -
- {artist && {artist}} - {artist && metadata.album && · } - {metadata.album && {metadata.album}} -
+ {/* Artist */} + {artist && ( +
{artist}
+ )} - {/* Labels */} -
- {metadata.language && } - {metadata.aiGenerated && ( - - )} -
+ {/* Tags */} + {(hashtags.length > 0 || metadata.aiGenerated) && ( +
+ {hashtags.map((tag) => ( + + ))} + {metadata.aiGenerated && ( + + )} +
+ )} {/* Audio player */} @@ -103,8 +111,10 @@ export function MusicTrackDetailRenderer({ event }: { event: NostrEvent }) { {metadata.language && } {metadata.aiGenerated && ( )} {metadata.license && } diff --git a/src/lib/music-helpers.ts b/src/lib/music-helpers.ts index 668bc02..3ac6562 100644 --- a/src/lib/music-helpers.ts +++ b/src/lib/music-helpers.ts @@ -47,6 +47,14 @@ export function getTrackMetadata(event: NostrEvent): TrackMetadata { }); } +const TrackHashtagsSymbol = Symbol("trackHashtags"); + +export function getTrackHashtags(event: NostrEvent): string[] { + return getOrComputeCachedValue(event, TrackHashtagsSymbol, () => { + return event.tags.filter((t) => t[0] === "t" && t[1]).map((t) => t[1]); + }); +} + // Playlist helpers export function getPlaylistTitle(event: NostrEvent): string | undefined {