• Retry failed updates from a previous sync.

    Parameters

    • entries: AniListMediaEntry[]

      Array of AniList media entries.

    • failedMediaIds: number[]

      Array of media IDs that failed in the previous sync.

    • token: string

      The user's authentication token.

    • OptionalonProgress: (progress: SyncProgress) => void

      Optional callback for progress updates.

    • OptionalabortSignal: AbortSignal

      Optional abort signal to cancel the retry.

    Returns Promise<SyncReport>

    A promise resolving to a SyncReport object.

    export async function retryFailedUpdates(
    entries: AniListMediaEntry[],
    failedMediaIds: number[],
    token: string,
    onProgress?: (progress: SyncProgress) => void,
    abortSignal?: AbortSignal,
    ): Promise<SyncReport> {
    // Filter entries to only include previously failed ones
    const entriesToRetry = entries.filter((entry) =>
    failedMediaIds.includes(entry.mediaId),
    );

    console.log(
    `🔄 Retrying ${entriesToRetry.length} failed updates out of ${entries.length} total entries`,
    );

    // Add retry metadata to each entry
    entriesToRetry.forEach((entry) => {
    // Initialize the syncMetadata if it doesn't exist
    if (!entry.syncMetadata) {
    entry.syncMetadata = {
    useIncrementalSync: false,
    targetProgress: entry.progress,
    progress: entry.progress,
    isRetry: true,
    retryTimestamp: Date.now(),
    retryCount: 1,
    };
    } else {
    // Update existing syncMetadata
    entry.syncMetadata = {
    ...entry.syncMetadata,
    isRetry: true,
    retryTimestamp: Date.now(),
    retryCount: (entry.syncMetadata.retryCount || 0) + 1,
    };
    }
    });

    // Run the sync with only the failed entries
    return syncMangaBatch(entriesToRetry, token, onProgress, abortSignal);
    }