"use client"; import { useState } from "react"; import Link from "next/link"; import { StreamActionLog } from "yt-dlp-transcript-common/components/StreamActionLog"; import { formatBytes } from "yt-dlp-transcript-common/lib/format"; import { Badge } from "yt-dlp-transcript-common/components/ui/badge"; import { cancelJobAction } from "../../jobs/actions"; import { cleanAudioAction, cleanExtraAudioFormatsAction, removeWrongFormatAudioAction, clearFailedTranscriptionsAction, } from "../../channels/[slug]/whisperActions"; import { ChannelCleanupToggle } from "./ChannelCleanupToggle"; export type ChannelCleanupCardProps = { slug: string; name: string; included: boolean; transcribedBytes: number; extraFormatsBytes: number; foreignBytes: number; hasTargetFormat: boolean; failedTranscriptions: number; }; export function ChannelCleanupCard({ slug, name, included, transcribedBytes, extraFormatsBytes, foreignBytes, hasTargetFormat, failedTranscriptions, }: ChannelCleanupCardProps) { const queueKey = `channel:${slug}`; const [armed, setArmed] = useState(false); const nothingToReclaim = transcribedBytes <= 0 && extraFormatsBytes <= 0 && foreignBytes <= 0; const noHousekeeping = failedTranscriptions === 0; return (
{name} {!included && ( Excluded from total )} {transcribedBytes > 0 ? `~${formatBytes(transcribedBytes)}` : "—"}
{nothingToReclaim && noHousekeeping ? (

Nothing to reclaim in the last report.

) : (
{transcribedBytes > 0 && ( cleanAudioAction(slug, queueKey)} cancelAction={cancelJobAction} buttonLabel="Clean audio" runningLabel="Cleaning…" label={`Clean audio ${slug}`} /> )} {hasTargetFormat && extraFormatsBytes > 0 && ( cleanExtraAudioFormatsAction(slug, queueKey)} cancelAction={cancelJobAction} buttonLabel="Clean extra formats" runningLabel="Cleaning…" label={`Clean extra audio formats ${slug}`} /> )} {hasTargetFormat && foreignBytes > 0 && ( removeWrongFormatAudioAction(slug, queueKey)} cancelAction={cancelJobAction} buttonLabel="Remove wrong-format" runningLabel="Removing…" label={`Remove wrong-format audio ${slug}`} disabled={!armed} /> )} {!noHousekeeping && (
Housekeeping {failedTranscriptions > 0 && ( clearFailedTranscriptionsAction(slug, queueKey)} cancelAction={cancelJobAction} buttonLabel={`Clear failed transcriptions (${failedTranscriptions})`} runningLabel="Clearing…" label={`Clear failed transcriptions ${slug}`} /> )}
)}
)}
); } function SweepRow({ estimate, caption, children, }: { estimate: number; caption: string; children: React.ReactNode; }) { return (

{caption}

~{formatBytes(estimate)}

{children}
); }