feat(dz): add local caching and UI for user favorites

This commit is contained in:
2025-10-02 12:17:04 -04:00
parent 0d7361db4b
commit d8456ce912
5 changed files with 864 additions and 226 deletions

View File

@@ -307,7 +307,7 @@ export class DeezerAPI {
const response = await this.apiCall('deezer.pageProfile', {
USER_ID: userId,
tab: 'playlists',
nb: 100
nb: -1
});
return response.TAB?.playlists?.data || [];
@@ -317,6 +317,86 @@ export class DeezerAPI {
}
}
// Get user albums
async getUserAlbums(): Promise<any[]> {
try {
const userData = await this.getUserData();
const userId = userData.USER.USER_ID;
const response = await this.apiCall('deezer.pageProfile', {
USER_ID: userId,
tab: 'albums',
nb: -1
});
return response.TAB?.albums?.data || [];
} catch (error) {
console.error('Error fetching albums:', error);
return [];
}
}
// Get user artists
async getUserArtists(): Promise<any[]> {
try {
const userData = await this.getUserData();
const userId = userData.USER.USER_ID;
const response = await this.apiCall('deezer.pageProfile', {
USER_ID: userId,
tab: 'artists',
nb: -1
});
return response.TAB?.artists?.data || [];
} catch (error) {
console.error('Error fetching artists:', error);
return [];
}
}
// Get user favorite tracks (uses the more reliable song.getFavoriteIds method)
async getUserTracks(): Promise<any[]> {
try {
// Get favorite track IDs
const idsResponse = await this.apiCall('song.getFavoriteIds', {
nb: -1,
start: 0,
checksum: null
});
const trackIds = idsResponse.data?.map((x: any) => x.SNG_ID) || [];
if (trackIds.length === 0) {
console.log('[Deezer] No favorite tracks found');
return [];
}
console.log(`[Deezer] Found ${trackIds.length} favorite track IDs, fetching details...`);
// Fetch track details in batches (Deezer API might have limits)
const batchSize = 100;
const tracks: any[] = [];
for (let i = 0; i < trackIds.length; i += batchSize) {
const batchIds = trackIds.slice(i, i + batchSize);
const batchResponse = await this.apiCall('song.getListData', {
SNG_IDS: batchIds
});
if (batchResponse.data) {
tracks.push(...batchResponse.data);
}
}
console.log(`[Deezer] Fetched ${tracks.length} track details`);
return tracks;
} catch (error) {
console.error('Error fetching favorite tracks:', error);
return [];
}
}
// Get album data
async getAlbumData(albumId: string): Promise<any> {
return this.apiCall('album.getData', { alb_id: albumId });