diff --git a/js/ui.js b/js/ui.js
index fc44dd8..9fd303e 100644
--- a/js/ui.js
+++ b/js/ui.js
@@ -1,5 +1,5 @@
//js/ui.js
-import { SVG_PLAY, SVG_DOWNLOAD, SVG_MENU, SVG_HEART, formatTime, createPlaceholder, trackDataStore, hasExplicitContent, getTrackArtists, getTrackTitle, calculateTotalDuration, formatDuration } from './utils.js';
+import { SVG_PLAY, SVG_DOWNLOAD, SVG_MENU, SVG_HEART, formatTime, createPlaceholder, trackDataStore, hasExplicitContent, getTrackArtists, getTrackTitle, calculateTotalDuration, formatDuration, escapeHtml } from './utils.js';
import { openLyricsPanel } from './lyrics.js';
import { recentActivityManager, backgroundSettings, trackListSettings, cardSettings } from './storage.js';
import { db } from './db.js';
@@ -198,10 +198,10 @@ export class UIRenderer {
- ${trackTitle}
+ ${escapeHtml(trackTitle)}
${explicitBadge}
-
${trackArtists}${yearDisplay}
+
${escapeHtml(trackArtists)}${yearDisplay}
${formatTime(track.duration)}
@@ -327,7 +327,7 @@ export class UIRenderer {
// Actually Base uses type for data attributes. play-card uses data-type="user-playlist" which is correct.
id: playlist.id,
href: `#userplaylist/${playlist.id}`,
- title: playlist.name,
+ title: escapeHtml(playlist.name),
subtitle: `${playlist.tracks ? playlist.tracks.length : (playlist.numberOfTracks || 0)} tracks`,
imageHTML: imageHTML,
actionButtonsHTML: `
@@ -370,9 +370,9 @@ export class UIRenderer {
type: 'album',
id: album.id,
href: `#album/${album.id}`,
- title: `${album.title} ${explicitBadge}`,
- subtitle: `${album.artist?.name ?? ''} • ${yearDisplay}${typeLabel}`,
- imageHTML: `
`,
+ title: `${escapeHtml(album.title)} ${explicitBadge}`,
+ subtitle: `${escapeHtml(album.artist?.name ?? '')} • ${yearDisplay}${typeLabel}`,
+ imageHTML: `
`,
actionButtonsHTML: `