Improve playlist download stability by skipping failed tracks
Added try-catch blocks in downloadPlaylistAsZip, downloadAlbumAsZip, and downloadDiscography to handle individual track download failures gracefully. Errors are now logged to the console, and the download process continues for the remaining tracks.
This commit is contained in:
parent
c5d4160e77
commit
2ae6b620f2
1 changed files with 89 additions and 77 deletions
166
js/downloads.js
166
js/downloads.js
|
|
@ -244,37 +244,40 @@ export async function downloadAlbumAsZip(album, tracks, api, quality, lyricsMana
|
|||
|
||||
updateBulkDownloadProgress(notification, i, tracks.length, trackTitle);
|
||||
|
||||
const blob = await downloadTrackBlob(track, quality, api);
|
||||
zip.file(`${folderName}/${filename}`, blob);
|
||||
|
||||
|
||||
try {
|
||||
const meta = buildTrackMetadata(track, api);
|
||||
const metaFilename = filename.replace(/\.[^.]+$/, '.json');
|
||||
zip.file(`${folderName}/${metaFilename}`, JSON.stringify(meta, null, 2));
|
||||
} catch (e) {
|
||||
console.warn('Could not attach metadata for', trackTitle, e);
|
||||
}
|
||||
|
||||
try {
|
||||
await addCoverToZipIfMissing(zip, folderName, albumCoverId || track.album?.cover, api);
|
||||
} catch (e) {
|
||||
const blob = await downloadTrackBlob(track, quality, api);
|
||||
zip.file(`${folderName}/${filename}`, blob);
|
||||
|
||||
}
|
||||
|
||||
if (lyricsManager && lyricsSettings.shouldDownloadLyrics()) {
|
||||
try {
|
||||
const lyricsData = await lyricsManager.fetchLyrics(track.id);
|
||||
if (lyricsData) {
|
||||
const lrcContent = lyricsManager.generateLRCContent(lyricsData, track);
|
||||
if (lrcContent) {
|
||||
const lrcFilename = filename.replace(/\.[^.]+$/, '.lrc');
|
||||
zip.file(`${folderName}/${lrcFilename}`, lrcContent);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('Could not add lyrics for:', trackTitle);
|
||||
const meta = buildTrackMetadata(track, api);
|
||||
const metaFilename = filename.replace(/\.[^.]+$/, '.json');
|
||||
zip.file(`${folderName}/${metaFilename}`, JSON.stringify(meta, null, 2));
|
||||
} catch (e) {
|
||||
console.warn('Could not attach metadata for', trackTitle, e);
|
||||
}
|
||||
|
||||
try {
|
||||
await addCoverToZipIfMissing(zip, folderName, albumCoverId || track.album?.cover, api);
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
|
||||
if (lyricsManager && lyricsSettings.shouldDownloadLyrics()) {
|
||||
try {
|
||||
const lyricsData = await lyricsManager.fetchLyrics(track.id);
|
||||
if (lyricsData) {
|
||||
const lrcContent = lyricsManager.generateLRCContent(lyricsData, track);
|
||||
if (lrcContent) {
|
||||
const lrcFilename = filename.replace(/\.[^.]+$/, '.lrc');
|
||||
zip.file(`${folderName}/${lrcFilename}`, lrcContent);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('Could not add lyrics for:', trackTitle);
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(`Failed to download track ${trackTitle}:`, err);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -323,36 +326,40 @@ export async function downloadPlaylistAsZip(playlist, tracks, api, quality, lyri
|
|||
|
||||
updateBulkDownloadProgress(notification, i, tracks.length, trackTitle);
|
||||
|
||||
const blob = await downloadTrackBlob(track, quality, api);
|
||||
zip.file(`${folderName}/${filename}`, blob);
|
||||
|
||||
// add metadata JSON
|
||||
try {
|
||||
const meta = buildTrackMetadata(track, api);
|
||||
const metaFilename = filename.replace(/\.[^.]+$/, '.json');
|
||||
zip.file(`${folderName}/${metaFilename}`, JSON.stringify(meta, null, 2));
|
||||
} catch (e) {
|
||||
console.warn('Could not attach metadata for', trackTitle, e);
|
||||
}
|
||||
const blob = await downloadTrackBlob(track, quality, api);
|
||||
zip.file(`${folderName}/${filename}`, blob);
|
||||
|
||||
// add cover per track/playlist (attempt once per track)
|
||||
try {
|
||||
await addCoverToZipIfMissing(zip, folderName, track.album?.cover, api);
|
||||
} catch (e) {}
|
||||
|
||||
if (lyricsManager && lyricsSettings.shouldDownloadLyrics()) {
|
||||
// add metadata JSON
|
||||
try {
|
||||
const lyricsData = await lyricsManager.fetchLyrics(track.id);
|
||||
if (lyricsData) {
|
||||
const lrcContent = lyricsManager.generateLRCContent(lyricsData, track);
|
||||
if (lrcContent) {
|
||||
const lrcFilename = filename.replace(/\.[^.]+$/, '.lrc');
|
||||
zip.file(`${folderName}/${lrcFilename}`, lrcContent);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('Could not add lyrics for:', trackTitle);
|
||||
const meta = buildTrackMetadata(track, api);
|
||||
const metaFilename = filename.replace(/\.[^.]+$/, '.json');
|
||||
zip.file(`${folderName}/${metaFilename}`, JSON.stringify(meta, null, 2));
|
||||
} catch (e) {
|
||||
console.warn('Could not attach metadata for', trackTitle, e);
|
||||
}
|
||||
|
||||
// add cover per track/playlist (attempt once per track)
|
||||
try {
|
||||
await addCoverToZipIfMissing(zip, folderName, track.album?.cover, api);
|
||||
} catch (e) {}
|
||||
|
||||
if (lyricsManager && lyricsSettings.shouldDownloadLyrics()) {
|
||||
try {
|
||||
const lyricsData = await lyricsManager.fetchLyrics(track.id);
|
||||
if (lyricsData) {
|
||||
const lrcContent = lyricsManager.generateLRCContent(lyricsData, track);
|
||||
if (lrcContent) {
|
||||
const lrcFilename = filename.replace(/\.[^.]+$/, '.lrc');
|
||||
zip.file(`${folderName}/${lrcFilename}`, lrcContent);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('Could not add lyrics for:', trackTitle);
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(`Failed to download track ${trackTitle}:`, err);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -410,34 +417,39 @@ export async function downloadDiscography(artist, api, quality, lyricsManager =
|
|||
|
||||
for (const track of tracks) {
|
||||
const filename = buildTrackFilename(track, quality);
|
||||
const blob = await downloadTrackBlob(track, quality, api);
|
||||
zip.file(`${rootFolder}/${albumFolder}/${filename}`, blob);
|
||||
|
||||
|
||||
try {
|
||||
const meta = buildTrackMetadata(track, api);
|
||||
const metaFilename = filename.replace(/\.[^.]+$/, '.json');
|
||||
zip.file(`${rootFolder}/${albumFolder}/${metaFilename}`, JSON.stringify(meta, null, 2));
|
||||
} catch (e) {
|
||||
console.warn('Could not attach metadata for', track.title, e);
|
||||
}
|
||||
const blob = await downloadTrackBlob(track, quality, api);
|
||||
zip.file(`${rootFolder}/${albumFolder}/${filename}`, blob);
|
||||
|
||||
try {
|
||||
await addCoverToZipIfMissing(zip, `${rootFolder}/${albumFolder}`, track.album?.cover || album.cover, api);
|
||||
} catch (e) {}
|
||||
|
||||
if (lyricsManager && lyricsSettings.shouldDownloadLyrics()) {
|
||||
try {
|
||||
const lyricsData = await lyricsManager.fetchLyrics(track.id);
|
||||
if (lyricsData) {
|
||||
const lrcContent = lyricsManager.generateLRCContent(lyricsData, track);
|
||||
if (lrcContent) {
|
||||
const lrcFilename = filename.replace(/\.[^.]+$/, '.lrc');
|
||||
zip.file(`${rootFolder}/${albumFolder}/${lrcFilename}`, lrcContent);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('Could not add lyrics for:', track.title);
|
||||
const meta = buildTrackMetadata(track, api);
|
||||
const metaFilename = filename.replace(/\.[^.]+$/, '.json');
|
||||
zip.file(`${rootFolder}/${albumFolder}/${metaFilename}`, JSON.stringify(meta, null, 2));
|
||||
} catch (e) {
|
||||
console.warn('Could not attach metadata for', track.title, e);
|
||||
}
|
||||
|
||||
try {
|
||||
await addCoverToZipIfMissing(zip, `${rootFolder}/${albumFolder}`, track.album?.cover || album.cover, api);
|
||||
} catch (e) {}
|
||||
|
||||
if (lyricsManager && lyricsSettings.shouldDownloadLyrics()) {
|
||||
try {
|
||||
const lyricsData = await lyricsManager.fetchLyrics(track.id);
|
||||
if (lyricsData) {
|
||||
const lrcContent = lyricsManager.generateLRCContent(lyricsData, track);
|
||||
if (lrcContent) {
|
||||
const lrcFilename = filename.replace(/\.[^.]+$/, '.lrc');
|
||||
zip.file(`${rootFolder}/${albumFolder}/${lrcFilename}`, lrcContent);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('Could not add lyrics for:', track.title);
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(`Failed to download track ${track.title} in album ${album.title}:`, err);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue