feat: add Qobuzissimes and Editor's Picks sections

- Add qobuzissimes and editorPicks sections (disabled by default)
- Conditional loading to save API calls when sections are hidden
- Note: These API types may not be confirmed working
This commit is contained in:
vicrodh committed 2026-01-11 01:07:26 -06:00
1 parent 23e6df6efe
commit 8cbb65aaee
2 files changed
+64

No files matched your search

+60
View File
@@ -87,6 +87,8 @@
let loadingNewReleases = $state(true);
let loadingPressAwards = $state(true);
let loadingMostStreamed = $state(true);
let loadingQobuzissimes = $state(true);
let loadingEditorPicks = $state(true);
let loadingRecentAlbums = $state(true);
let loadingContinueTracks = $state(true);
let loadingTopArtists = $state(true);
@@ -96,6 +98,8 @@
let newReleases = $state<AlbumCardData[]>([]);
let pressAwards = $state<AlbumCardData[]>([]);
let mostStreamed = $state<AlbumCardData[]>([]);
let qobuzissimes = $state<AlbumCardData[]>([]);
let editorPicks = $state<AlbumCardData[]>([]);
// User-specific content
let recentAlbums = $state<AlbumCardData[]>([]);
@@ -109,6 +113,8 @@
newReleases.length > 0
|| pressAwards.length > 0
|| mostStreamed.length > 0
|| qobuzissimes.length > 0
|| editorPicks.length > 0
|| recentAlbums.length > 0
|| continueTracks.length > 0
|| topArtists.length > 0
@@ -254,6 +260,8 @@
loadingNewReleases = true;
loadingPressAwards = true;
loadingMostStreamed = true;
loadingQobuzissimes = true;
loadingEditorPicks = true;
loadingRecentAlbums = true;
loadingContinueTracks = true;
loadingTopArtists = true;
@@ -291,6 +299,24 @@
loadingMostStreamed = false;
}
if (isSectionVisible('qobuzissimes')) {
fetchFeaturedAlbums('qobuzissimes', LIMITS.featuredAlbums).then(albums => {
qobuzissimes = albums;
loadingQobuzissimes = false;
});
} else {
loadingQobuzissimes = false;
}
if (isSectionVisible('editorPicks')) {
fetchFeaturedAlbums('editor-picks', LIMITS.featuredAlbums).then(albums => {
editorPicks = albums;
loadingEditorPicks = false;
});
} else {
loadingEditorPicks = false;
}
try {
// ML-based scoring for personalized recommendations (falls back to simple queries if no scores)
const seeds = await invoke<HomeSeeds>('reco_get_home_ml', {
@@ -440,6 +466,40 @@
</HorizontalScrollRow>
{/if}
{#if sectionId === 'qobuzissimes' && qobuzissimes.length > 0}
<HorizontalScrollRow title="Qobuzissimes">
{#snippet children()}
{#each qobuzissimes as album}
<AlbumCard
artwork={album.artwork}
title={album.title}
artist={album.artist}
quality={album.quality}
onclick={() => onAlbumClick?.(album.id)}
/>
{/each}
<div class="spacer"></div>
{/snippet}
</HorizontalScrollRow>
{/if}
{#if sectionId === 'editorPicks' && editorPicks.length > 0}
<HorizontalScrollRow title="Editor's Picks">
{#snippet children()}
{#each editorPicks as album}
<AlbumCard
artwork={album.artwork}
title={album.title}
artist={album.artist}
quality={album.quality}
onclick={() => onAlbumClick?.(album.id)}
/>
{/each}
<div class="spacer"></div>
{/snippet}
</HorizontalScrollRow>
{/if}
{#if sectionId === 'recentAlbums' && recentAlbums.length > 0}
<HorizontalScrollRow title="Recently Played">
{#snippet children()}
+4
View File
@@ -10,6 +10,8 @@ export type HomeSectionId =
| 'newReleases'
| 'pressAwards'
| 'mostStreamed'
| 'qobuzissimes'
| 'editorPicks'
| 'recentAlbums'
| 'continueTracks'
| 'topArtists'
@@ -37,6 +39,8 @@ const DEFAULT_SECTIONS: HomeSection[] = [
{ id: 'newReleases', label: 'New Releases', visible: true, source: 'qobuz' },
{ id: 'pressAwards', label: 'Press Awards', visible: true, source: 'qobuz' },
{ id: 'mostStreamed', label: 'Popular Albums', visible: false, source: 'qobuz' },
{ id: 'qobuzissimes', label: 'Qobuzissimes', visible: false, source: 'qobuz' },
{ id: 'editorPicks', label: "Editor's Picks", visible: false, source: 'qobuz' },
{ id: 'recentAlbums', label: 'Recently Played', visible: true, source: 'ml' },
{ id: 'continueTracks', label: 'Continue Listening', visible: true, source: 'ml' },
{ id: 'topArtists', label: 'Your Top Artists', visible: true, source: 'ml' },