import { useDownloaderPageStatesStore } from "@/services/store"; import { DownloadCloud, Info, ListVideo, 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 { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from "@/components/ui/resizable"; import { PlaylistToggleGroup, PlaylistToggleGroupItem } from "@/components/custom/playlistToggleGroup"; import { getMergedBestFormat } from "@/utils"; import { Switch } from "@/components/ui/switch"; import { FormatToggleGroup, FormatToggleGroupItem } from "@/components/custom/formatToggleGroup"; interface PlaylistPreviewSelectionProps { videoMetadata: RawVideoInfo; } interface SelectivePlaylistDownloadProps { videoMetadata: RawVideoInfo; audioOnlyFormats: VideoFormat[] | undefined; videoOnlyFormats: VideoFormat[] | undefined; combinedFormats: VideoFormat[] | undefined; qualityPresetFormats: VideoFormat[] | undefined; subtitleLanguages: { code: string; lang: string }[]; } interface CombinedPlaylistDownloadProps { audioOnlyFormats: VideoFormat[] | undefined; videoOnlyFormats: VideoFormat[] | undefined; subtitleLanguages: { code: string; lang: string }[]; } interface PlaylistDownloaderProps { videoMetadata: RawVideoInfo; audioOnlyFormats: VideoFormat[] | undefined; videoOnlyFormats: VideoFormat[] | undefined; combinedFormats: VideoFormat[] | undefined; qualityPresetFormats: VideoFormat[] | undefined; subtitleLanguages: { code: string; lang: string }[]; } function PlaylistPreviewSelection({ videoMetadata }: PlaylistPreviewSelectionProps) { const selectedPlaylistVideos = useDownloaderPageStatesStore((state) => state.selectedPlaylistVideos); const setSelectedDownloadFormat = useDownloaderPageStatesStore((state) => state.setSelectedDownloadFormat); const setSelectedCombinableVideoFormat = useDownloaderPageStatesStore((state) => state.setSelectedCombinableVideoFormat); const setSelectedCombinableAudioFormats = useDownloaderPageStatesStore((state) => state.setSelectedCombinableAudioFormats); const setSelectedSubtitles = useDownloaderPageStatesStore((state) => state.setSelectedSubtitles); const setSelectedPlaylistVideos = useDownloaderPageStatesStore((state) => state.setSelectedPlaylistVideos); const resetDownloadConfiguration = useDownloaderPageStatesStore((state) => state.resetDownloadConfiguration); const totalVideos = videoMetadata.entries.filter((entry) => entry).length; const allVideoIndices = videoMetadata.entries.filter((entry) => entry).map((entry) => entry.playlist_index.toString()); return (

Playlist ({videoMetadata.entries[0].n_entries})

0} onCheckedChange={(checked) => { if (checked) { setSelectedPlaylistVideos(allVideoIndices); } else { setSelectedPlaylistVideos(["1"]); } setSelectedDownloadFormat('best'); setSelectedSubtitles([]); setSelectedCombinableVideoFormat(''); setSelectedCombinableAudioFormats([]); resetDownloadConfiguration(); }} disabled={totalVideos <= 1} />

{videoMetadata.entries[0].playlist_title ? videoMetadata.entries[0].playlist_title : 'UNTITLED'}

{videoMetadata.entries[0].playlist_creator || videoMetadata.entries[0].playlist_channel || videoMetadata.entries[0].playlist_uploader || 'unknown'}

{ if (value.length > 0) { setSelectedPlaylistVideos(value); setSelectedDownloadFormat('best'); setSelectedSubtitles([]); setSelectedCombinableVideoFormat(''); setSelectedCombinableAudioFormats([]); resetDownloadConfiguration(); } }} > {videoMetadata.entries.map((entry) => entry ? ( ) : null)}
Extracted from {videoMetadata.entries[0].extractor ? videoMetadata.entries[0].extractor.charAt(0).toUpperCase() + videoMetadata.entries[0].extractor.slice(1) : 'Unknown'}
); } function SelectivePlaylistDownload({ videoMetadata, audioOnlyFormats, videoOnlyFormats, combinedFormats, qualityPresetFormats, subtitleLanguages }: SelectivePlaylistDownloadProps) { const selectedDownloadFormat = useDownloaderPageStatesStore((state) => state.selectedDownloadFormat); const selectedSubtitles = useDownloaderPageStatesStore((state) => state.selectedSubtitles); const selectedPlaylistVideos = useDownloaderPageStatesStore((state) => state.selectedPlaylistVideos); const setSelectedDownloadFormat = useDownloaderPageStatesStore((state) => state.setSelectedDownloadFormat); const setSelectedSubtitles = useDownloaderPageStatesStore((state) => state.setSelectedSubtitles); const resetDownloadConfiguration = useDownloaderPageStatesStore((state) => state.resetDownloadConfiguration); return (
{subtitleLanguages && subtitleLanguages.length > 0 && ( setSelectedSubtitles(value)} // disabled={selectedFormat?.ext !== 'mp4' && selectedFormat?.ext !== 'mkv' && selectedFormat?.ext !== 'webm'} >

Subtitle Languages

{subtitleLanguages.map((lang) => { const hasAutoSubSelected = selectedSubtitles.some(code => code.endsWith('-orig')); const hasNormalSubSelected = selectedSubtitles.some(code => !code.endsWith('-orig')); const isDisabled = (hasAutoSubSelected && !lang.code.endsWith('-orig')) || (hasNormalSubSelected && lang.code.endsWith('-orig')); return ( {lang.lang} ); })}
)} { setSelectedDownloadFormat(value); // const currentlySelectedFormat = value === 'best' ? videoMetadata?.entries[Number(value) - 1].requested_downloads[0] : allFilteredFormats.find((format) => format.format_id === value); // if (currentlySelectedFormat?.ext !== 'mp4' && currentlySelectedFormat?.ext !== 'mkv' && currentlySelectedFormat?.ext !== 'webm') { // setSelectedSubtitles([]); // } resetDownloadConfiguration(); }} >

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 CombinedPlaylistDownload({ audioOnlyFormats, videoOnlyFormats, subtitleLanguages }: CombinedPlaylistDownloadProps) { const selectedCombinableVideoFormat = useDownloaderPageStatesStore((state) => state.selectedCombinableVideoFormat); const selectedCombinableAudioFormats = useDownloaderPageStatesStore((state) => state.selectedCombinableAudioFormats); const selectedSubtitles = useDownloaderPageStatesStore((state) => state.selectedSubtitles); const setSelectedCombinableVideoFormat = useDownloaderPageStatesStore((state) => state.setSelectedCombinableVideoFormat); const setSelectedCombinableAudioFormats = useDownloaderPageStatesStore((state) => state.setSelectedCombinableAudioFormats); const setSelectedSubtitles = useDownloaderPageStatesStore((state) => state.setSelectedSubtitles); const resetDownloadConfiguration = useDownloaderPageStatesStore((state) => state.resetDownloadConfiguration); return (
{audioOnlyFormats && audioOnlyFormats.length > 0 && videoOnlyFormats && videoOnlyFormats.length > 0 && subtitleLanguages && subtitleLanguages.length > 0 && ( setSelectedSubtitles(value)} >

Subtitle Languages

{subtitleLanguages.map((lang) => { const hasAutoSubSelected = selectedSubtitles.some(code => code.endsWith('-orig')); const hasNormalSubSelected = selectedSubtitles.some(code => !code.endsWith('-orig')); const isDisabled = (hasAutoSubSelected && !lang.code.endsWith('-orig')) || (hasNormalSubSelected && lang.code.endsWith('-orig')); return ( {lang.lang} ); })}
)} { setSelectedCombinableAudioFormats(value); resetDownloadConfiguration(); }} > {videoOnlyFormats && videoOnlyFormats.length > 0 && audioOnlyFormats && audioOnlyFormats.length > 0 && ( <>

Audio

{audioOnlyFormats.map((format) => ( ))}
)}
{ setSelectedCombinableVideoFormat(value); resetDownloadConfiguration(); }} > {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 PlaylistDownloader({ videoMetadata, audioOnlyFormats, videoOnlyFormats, combinedFormats, qualityPresetFormats, subtitleLanguages }: PlaylistDownloaderProps) { const activeDownloadModeTab = useDownloaderPageStatesStore((state) => state.activeDownloadModeTab); const setActiveDownloadModeTab = useDownloaderPageStatesStore((state) => state.setActiveDownloadModeTab); const playlistPanelSizes = useDownloaderPageStatesStore((state) => state.playlistPanelSizes); const setPlaylistPanelSizes = useDownloaderPageStatesStore((state) => state.setPlaylistPanelSizes); const resetDownloadConfiguration = useDownloaderPageStatesStore((state) => state.resetDownloadConfiguration); return (
setPlaylistPanelSizes(sizes)} >
{ setActiveDownloadModeTab(tab); resetDownloadConfiguration(); }} >

Download Options

Selective Combine
); }