• 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.

    • OptionalonBatchComplete: (
          progress: SyncProgress,
          batchResult: { mediaId: number; success: boolean; error?: string },
      ) => void

      Optional callback fired after each media ID completes.

    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,
    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,
    );
    }