feat(local-library): implement playback context tracking

Add proper context tracking for Local Library playback so the stack
icon shows correctly when playing from Local Library.

Changes:
- Add 'local_library' to ContextType enum (frontend and backend)
- Add 'Local Library' display label in context info
- Import setPlaybackContext in LocalLibraryView
- Call setPlaybackContext when playing tracks from Local Library
  - For album view: context is the album with album title
  - For tracks view: context is "Local Tracks"
- Track IDs and position are properly set for context navigation

Fixes issue where Local Library playback showed stale Qobuz context.

cc
This commit is contained in:
vicrodh committed 2026-01-19 18:17:04 -06:00
1 parent 873dcee10e
commit f2c3e8aedd
3 files changed
+32 -2

No files matched your search

+2
View File
@@ -22,6 +22,7 @@ pub enum ContextType {
ArtistTop, ArtistTop,
HomeList, HomeList,
Favorites, Favorites,
LocalLibrary,
} }
/// Source of the content (Qobuz or Local Library) /// Source of the content (Qobuz or Local Library)
@@ -120,6 +121,7 @@ impl PlaybackContext {
ContextType::ArtistTop => "Artist Top Songs", ContextType::ArtistTop => "Artist Top Songs",
ContextType::HomeList => "Home List", ContextType::HomeList => "Home List",
ContextType::Favorites => "Favorites", ContextType::Favorites => "Favorites",
ContextType::LocalLibrary => "Local Library",
}; };
format!("{} · {}", type_str, self.label) format!("{} · {}", type_str, self.label)
} }
@@ -24,6 +24,9 @@
subscribe as subscribeOffline, subscribe as subscribeOffline,
isOffline as checkIsOffline isOffline as checkIsOffline
} from '$lib/stores/offlineStore'; } from '$lib/stores/offlineStore';
import {
setPlaybackContext
} from '$lib/stores/playbackContextStore';
// Backend types matching Rust models // Backend types matching Rust models
interface LocalTrack { interface LocalTrack {
@@ -716,10 +719,34 @@
try { try {
if (selectedAlbum && albumTracks.length > 0) { if (selectedAlbum && albumTracks.length > 0) {
const trackIndex = albumTracks.findIndex(t => t.id === track.id); const trackIndex = albumTracks.findIndex(t => t.id === track.id);
const trackIds = albumTracks.map(t => t.id);
// Set playback context for Local Library album
await setPlaybackContext(
'local_library',
selectedAlbum.id,
selectedAlbum.title,
'local',
trackIds,
trackIndex >= 0 ? trackIndex : 0
);
await setQueueForAlbumTracks(albumTracks, trackIndex >= 0 ? trackIndex : 0); await setQueueForAlbumTracks(albumTracks, trackIndex >= 0 ? trackIndex : 0);
} else if (activeTab === 'tracks' && tracks.length > 0) { } else if (activeTab === 'tracks' && tracks.length > 0) {
const orderedTracks = getDisplayedTrackOrder(); const orderedTracks = getDisplayedTrackOrder();
const trackIndex = orderedTracks.findIndex(t => t.id === track.id); const trackIndex = orderedTracks.findIndex(t => t.id === track.id);
const trackIds = orderedTracks.map(t => t.id);
// Set playback context for Local Library tracks view
await setPlaybackContext(
'local_library',
'local-tracks',
'Local Tracks',
'local',
trackIds,
trackIndex >= 0 ? trackIndex : 0
);
await setQueueForLocalTracks(orderedTracks, trackIndex >= 0 ? trackIndex : 0); await setQueueForLocalTracks(orderedTracks, trackIndex >= 0 ? trackIndex : 0);
} }
+3 -2
View File
@@ -9,7 +9,7 @@ import { invoke } from '@tauri-apps/api/core';
// ============ Types ============ // ============ Types ============
export type ContextType = 'album' | 'playlist' | 'artist_top' | 'home_list' | 'favorites'; export type ContextType = 'album' | 'playlist' | 'artist_top' | 'home_list' | 'favorites' | 'local_library';
export type ContentSource = 'qobuz' | 'local'; export type ContentSource = 'qobuz' | 'local';
export interface PlaybackContext { export interface PlaybackContext {
@@ -138,7 +138,8 @@ export function getContextDisplayInfo(): string | null {
playlist: 'Playlist', playlist: 'Playlist',
artist_top: 'Artist Top Songs', artist_top: 'Artist Top Songs',
home_list: 'Home List', home_list: 'Home List',
favorites: 'Favorites' favorites: 'Favorites',
local_library: 'Local Library'
}[currentContext.type]; }[currentContext.type];
return `${typeStr} · ${currentContext.label}`; return `${typeStr} · ${currentContext.label}`;