diff --git a/js/qobuz-api.js b/js/qobuz-api.js
index 6d03049..806d196 100644
--- a/js/qobuz-api.js
+++ b/js/qobuz-api.js
@@ -330,6 +330,17 @@ export class QobuzAPI {
}
}
+ // Similar/recommendation methods
+ async getSimilarArtists(artistId) {
+ // Qobuz doesn't have a direct similar artists endpoint in this simplified API
+ return [];
+ }
+
+ async getSimilarAlbums(albumId) {
+ // Qobuz doesn't have a direct similar albums endpoint in this simplified API
+ return [];
+ }
+
// Unified search - search all types at once
async search(query, options = {}) {
const offset = options.offset || 0;
diff --git a/js/ui.js b/js/ui.js
index 9516dd4..38c75ce 100644
--- a/js/ui.js
+++ b/js/ui.js
@@ -91,6 +91,7 @@ export class UIRenderer {
this.searchAbortController = null;
this.vibrantColorCache = new Map();
this.visualizer = null;
+ this.renderLock = false;
// Listen for dynamic color reset events
window.addEventListener('reset-dynamic-color', () => {
@@ -575,13 +576,19 @@ export class UIRenderer {
else if (album.type === 'SINGLE') typeLabel = ' • Single';
const isCompact = cardSettings.isCompactAlbum();
+ let artistName = '';
+ if (album.artist) {
+ artistName = typeof album.artist === 'string' ? album.artist : album.artist.name;
+ } else if (album.artists?.length) {
+ artistName = album.artists.map((a) => a.name).join(', ');
+ }
return this.createBaseCardHTML({
type: 'album',
id: album.id,
href: `/album/${album.id}`,
title: `${escapeHtml(album.title)} ${explicitBadge} ${qualityBadge}`,
- subtitle: `${escapeHtml(album.artist?.name ?? '')} • ${yearDisplay}${typeLabel}`,
+ subtitle: `${escapeHtml(artistName)} • ${yearDisplay}${typeLabel}`,
imageHTML: `
`,
actionButtonsHTML: `