import { io } from "socket.io-client"; import React, { useState, useEffect } from "react"; import { Container, Row, Col, ProgressBar, InputGroup, FormControl, Button, ButtonGroup, Toast, } from "react-bootstrap"; import { validateDomain, validateIP } from "./utils"; import { IDLInfo, IMessage } from "./interfaces"; import './App.css'; const socket = io(`http://${localStorage.getItem('server-addr') || 'localhost'}:3022`) export function App() { const [progress, setProgress] = useState(0) const [message, setMessage] = useState('') const [halt, setHalt] = useState(false) const [url, setUrl] = useState('') const [showToast, setShowToast] = useState(false) const [invalidIP, setInvalidIP] = useState(false) const [updatedBin, setUpdatedBin] = useState(false) const [showSettings, setShowSettings] = useState(false) const [darkMode, setDarkMode] = useState(localStorage.getItem('theme') === 'dark') const [downloadInfo, setDownloadInfo] = useState() useEffect(() => { socket.on('connect', () => { setShowToast(true) }) return () => { socket.disconnect() } }, []) useEffect(() => { darkMode ? document.body.classList.add('dark') : document.body.classList.remove('dark') }, [darkMode]) useEffect(() => { socket.on('info', (data: IDLInfo) => { setDownloadInfo(data) }) }, []) useEffect(() => { socket.on('progress', (data: IMessage) => { setMessage(`operation: ${data.status || '...'} \nprogress: ${data.progress || '?'} \nsize: ${data.size || '?'} \nspeed: ${data.dlSpeed || '?'}`) if (data.status === 'Done!') { setHalt(false) setMessage('Done!') setProgress(0) return } setProgress( Math.ceil(Number(data.progress.replace('%', ''))) ) }) }, []) useEffect(() => { socket.on('updated', () => { setUpdatedBin(true) setHalt(false) }) }, []) const sendUrl = () => { setHalt(true) socket.emit('send-url', url) } const handleUrlChange = (e: React.ChangeEvent) => { setUrl(e.target.value) } const handleAddrChange = (e: React.ChangeEvent) => { const input = e.target.value; if (validateIP(input)) { setInvalidIP(false) localStorage.setItem('server-addr', input) } else if (validateDomain(input)) { setInvalidIP(false) localStorage.setItem('server-addr', input) } else { setInvalidIP(true) } } const abort = () => { setDownloadInfo({ title: '', thumbnail: '' }) socket.emit('abort') setHalt(false) } const updateBinary = () => { setHalt(true) socket.emit('update-bin') } const toggleTheme = () => { if (darkMode) { localStorage.setItem('theme', 'light') setDarkMode(false) } else { localStorage.setItem('theme', 'dark') setDarkMode(true) } } return (

yt-dlp WebUI

{downloadInfo ?

{downloadInfo.title}

: null}
Status
{!message ?
Ready
: null}
{message}

{progress ? : null}
setShowSettings(!showSettings)}>Settings
{showSettings ?
Server address
ws:// :3022 {' '}
: null }
Once you close this page the download will continue in the background.
It won't be possible retriving the progress though.
Made with ❤️ by Marcobaobao setShowToast(false)} bg={'primary'} delay={1500} autohide className="mt-5" > {`Connected to ${localStorage.getItem('server-addr') || 'localhost'}`} setUpdatedBin(false)} bg={'primary'} delay={1500} autohide className="mt-5" > Updated yt-dlp binary! ) }