Array of AniList media entries.
Array of media IDs that failed in the previous sync.
The user's authentication token.
OptionalonProgress: (progress: SyncProgress) => voidOptional callback for progress updates.
OptionalabortSignal: AbortSignalOptional abort signal to cancel the retry.
OptionalonBatchComplete: (Optional callback fired after each media ID completes.
A promise resolving to a SyncReport object.
export async function retryFailedUpdates(
entries: AniListMediaEntry[],
failedMediaIds: number[],
token: string,
onProgress?: (progress: SyncProgress) => void,
abortSignal?: AbortSignal,
onBatchComplete?: (
progress: SyncProgress,
batchResult: { mediaId: number; success: boolean; error?: string },
) => void,
): Promise<SyncReport> {
// Filter entries to only include previously failed ones
const entriesToRetry = entries.filter((mediaEntry) =>
failedMediaIds.includes(mediaEntry.mediaId),
);
console.info(
`[AniListSync] 🔄 Retrying ${entriesToRetry.length} failed updates out of ${entries.length} total entries`,
);
// Add retry metadata to each entry
for (const mediaEntry of entriesToRetry) {
// Initialize the syncMetadata if it doesn't exist
if (mediaEntry.syncMetadata) {
// Update existing syncMetadata
mediaEntry.syncMetadata = {
...mediaEntry.syncMetadata,
isRetry: true,
retryTimestamp: Date.now(),
retryCount: (mediaEntry.syncMetadata.retryCount || 0) + 1,
};
} else {
mediaEntry.syncMetadata = {
useIncrementalSync: false,
targetProgress: mediaEntry.progress,
progress: mediaEntry.progress,
isRetry: true,
retryTimestamp: Date.now(),
retryCount: 1,
};
}
}
// Run the sync with only the failed entries
return syncMangaBatch(
entriesToRetry,
token,
onProgress,
abortSignal,
undefined,
onBatchComplete,
);
}
Retry failed updates from a previous sync.