import clsx from "clsx"; import { ProxyImage } from "@/components/custom/proxyImage"; import { AspectRatio } from "@/components/ui/aspect-ratio"; import { Separator } from "@/components/ui/separator"; import { useDownloaderPageStatesStore } from "@/services/store"; import { formatBitrate, formatDurationString, formatReleaseDate, formatYtStyleCount, isObjEmpty } from "@/utils"; import { Calendar, Clock, DownloadCloud, Eye, Info, ThumbsUp, AlertCircleIcon } from "lucide-react"; import { FormatSelectionGroup, FormatSelectionGroupItem } from "@/components/custom/formatSelectionGroup"; import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"; import { RawVideoInfo, VideoFormat } from "@/types/video"; // import { PlaylistToggleGroup, PlaylistToggleGroupItem } from "@/components/custom/playlistToggleGroup"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from "@/components/ui/resizable"; interface VideoPreviewProps { videoMetadata: RawVideoInfo; } interface SelectiveVideoDownloadProps { videoMetadata: RawVideoInfo; audioOnlyFormats: VideoFormat[] | undefined; videoOnlyFormats: VideoFormat[] | undefined; combinedFormats: VideoFormat[] | undefined; qualityPresetFormats: VideoFormat[] | undefined; subtitleLanguages: { code: string; lang: string }[]; } interface CombinedVideoDownloadProps { audioOnlyFormats: VideoFormat[] | undefined; videoOnlyFormats: VideoFormat[] | undefined; subtitleLanguages: { code: string; lang: string }[]; } interface VideoDownloaderProps { videoMetadata: RawVideoInfo; audioOnlyFormats: VideoFormat[] | undefined; videoOnlyFormats: VideoFormat[] | undefined; combinedFormats: VideoFormat[] | undefined; qualityPresetFormats: VideoFormat[] | undefined; subtitleLanguages: { code: string; lang: string }[]; } function VideoPreview({ videoMetadata }: VideoPreviewProps) { return (

Metadata

{videoMetadata.title ? videoMetadata.title : 'UNTITLED'}

{videoMetadata.creator || videoMetadata.channel || videoMetadata.uploader || 'unknown'}

{videoMetadata.duration_string ? formatDurationString(videoMetadata.duration_string) : 'unknown'} {videoMetadata.view_count ? formatYtStyleCount(videoMetadata.view_count) : 'unknown'} {videoMetadata.like_count ? formatYtStyleCount(videoMetadata.like_count) : 'unknown'}

{videoMetadata.upload_date ? formatReleaseDate(videoMetadata.upload_date) : 'unknown'}

{videoMetadata.resolution && ( {videoMetadata.resolution} )} {videoMetadata.tbr && ( {formatBitrate(videoMetadata.tbr)} )} {videoMetadata.fps && ( {videoMetadata.fps} fps )} {videoMetadata.subtitles && !isObjEmpty(videoMetadata.subtitles) && ( SUB )} {videoMetadata.dynamic_range && videoMetadata.dynamic_range !== 'SDR' && ( {videoMetadata.dynamic_range} )}
Extracted from {videoMetadata.extractor ? videoMetadata.extractor.charAt(0).toUpperCase() + videoMetadata.extractor.slice(1) : 'Unknown'}
); } function SelectiveVideoDownload({ videoMetadata, audioOnlyFormats, videoOnlyFormats, combinedFormats, qualityPresetFormats, subtitleLanguages }: SelectiveVideoDownloadProps) { const selectedDownloadFormat = useDownloaderPageStatesStore((state) => state.selectedDownloadFormat); const selectedSubtitles = useDownloaderPageStatesStore((state) => state.selectedSubtitles); const setSelectedDownloadFormat = useDownloaderPageStatesStore((state) => state.setSelectedDownloadFormat); const setSelectedSubtitles = useDownloaderPageStatesStore((state) => state.setSelectedSubtitles); const setDownloadConfigurationKey = useDownloaderPageStatesStore((state) => state.setDownloadConfigurationKey); return (
{subtitleLanguages && subtitleLanguages.length > 0 && ( setSelectedSubtitles(value)} // disabled={selectedFormat?.ext !== 'mp4' && selectedFormat?.ext !== 'mkv' && selectedFormat?.ext !== 'webm'} >

Subtitle Languages

{subtitleLanguages.map((lang) => ( {lang.lang} ))}
)} { setSelectedDownloadFormat(value); // const currentlySelectedFormat = value === 'best' ? videoMetadata?.requested_downloads[0] : allFilteredFormats.find((format) => format.format_id === value); // if (currentlySelectedFormat?.ext !== 'mp4' && currentlySelectedFormat?.ext !== 'mkv' && currentlySelectedFormat?.ext !== 'webm') { // setSelectedSubtitles([]); // } setDownloadConfigurationKey('output_format', null); setDownloadConfigurationKey('embed_metadata', null); setDownloadConfigurationKey('embed_thumbnail', null); setDownloadConfigurationKey('sponsorblock', null); }} >

Suggested

{qualityPresetFormats && qualityPresetFormats.length > 0 && ( <>

Quality Presets

{qualityPresetFormats.map((format) => ( ))}
)} {audioOnlyFormats && audioOnlyFormats.length > 0 && ( <>

Audio

{audioOnlyFormats.map((format) => ( ))}
)} {videoOnlyFormats && videoOnlyFormats.length > 0 && ( <>

Video {videoOnlyFormats.every(format => format.acodec === 'none') ? '(no audio)' : ''}

{videoOnlyFormats.map((format) => ( ))}
)} {combinedFormats && combinedFormats.length > 0 && ( <>

Video

{combinedFormats.map((format) => ( ))}
)}
); } function CombinedVideoDownload({ audioOnlyFormats, videoOnlyFormats, subtitleLanguages }: CombinedVideoDownloadProps) { const selectedCombinableVideoFormat = useDownloaderPageStatesStore((state) => state.selectedCombinableVideoFormat); const selectedCombinableAudioFormat = useDownloaderPageStatesStore((state) => state.selectedCombinableAudioFormat); const selectedSubtitles = useDownloaderPageStatesStore((state) => state.selectedSubtitles); const setSelectedCombinableVideoFormat = useDownloaderPageStatesStore((state) => state.setSelectedCombinableVideoFormat); const setSelectedCombinableAudioFormat = useDownloaderPageStatesStore((state) => state.setSelectedCombinableAudioFormat); const setSelectedSubtitles = useDownloaderPageStatesStore((state) => state.setSelectedSubtitles); const setDownloadConfigurationKey = useDownloaderPageStatesStore((state) => state.setDownloadConfigurationKey); return (
{audioOnlyFormats && audioOnlyFormats.length > 0 && videoOnlyFormats && videoOnlyFormats.length > 0 && subtitleLanguages && subtitleLanguages.length > 0 && ( setSelectedSubtitles(value)} >

Subtitle Languages

{subtitleLanguages.map((lang) => ( {lang.lang} ))}
)} { setSelectedCombinableAudioFormat(value); setDownloadConfigurationKey('output_format', null); setDownloadConfigurationKey('embed_metadata', null); setDownloadConfigurationKey('embed_thumbnail', null); setDownloadConfigurationKey('sponsorblock', null); }} > {videoOnlyFormats && videoOnlyFormats.length > 0 && audioOnlyFormats && audioOnlyFormats.length > 0 && ( <>

Audio

{audioOnlyFormats.map((format) => ( ))}
)}
{ setSelectedCombinableVideoFormat(value); setDownloadConfigurationKey('output_format', null); setDownloadConfigurationKey('embed_metadata', null); setDownloadConfigurationKey('embed_thumbnail', null); setDownloadConfigurationKey('sponsorblock', null); }} > {audioOnlyFormats && audioOnlyFormats.length > 0 && videoOnlyFormats && videoOnlyFormats.length > 0 && ( <>

Video

{videoOnlyFormats.map((format) => ( ))}
)}
{(!videoOnlyFormats || videoOnlyFormats.length === 0 || !audioOnlyFormats || audioOnlyFormats.length === 0) && ( Unable to use Combine Mode! Cannot use combine mode for this video as it does not have both audio and video formats available. Use Selective Mode or try another video. )}
); } export function VideoDownloader({ videoMetadata, audioOnlyFormats, videoOnlyFormats, combinedFormats, qualityPresetFormats, subtitleLanguages }: VideoDownloaderProps) { const activeDownloadModeTab = useDownloaderPageStatesStore((state) => state.activeDownloadModeTab); const setActiveDownloadModeTab = useDownloaderPageStatesStore((state) => state.setActiveDownloadModeTab); const setDownloadConfigurationKey = useDownloaderPageStatesStore((state) => state.setDownloadConfigurationKey); const videoPanelSizes = useDownloaderPageStatesStore((state) => state.videoPanelSizes); const setVideoPanelSizes = useDownloaderPageStatesStore((state) => state.setVideoPanelSizes); return (
setVideoPanelSizes(sizes)} >
{ setActiveDownloadModeTab(tab) setDownloadConfigurationKey('output_format', null); setDownloadConfigurationKey('embed_metadata', null); setDownloadConfigurationKey('embed_thumbnail', null); setDownloadConfigurationKey('sponsorblock', null); }} >

Download Options

Selective Combine
); }