From fa5069f31005ee35ebbdb6cb2aed0ca4c1804759 Mon Sep 17 00:00:00 2001 From: marcobaobao Date: Tue, 30 Aug 2022 18:28:40 +0200 Subject: [PATCH] Code refactoring and minor bugfixes --- frontend/src/Home.tsx | 43 ++++++++++++++++------------- frontend/src/events.ts | 7 +++++ server/src/core/downloader.ts | 51 +++++++++++++++++++++++------------ server/src/core/states.ts | 9 +++++++ server/src/utils/logger.ts | 6 +++-- 5 files changed, 79 insertions(+), 37 deletions(-) create mode 100644 server/src/core/states.ts diff --git a/frontend/src/Home.tsx b/frontend/src/Home.tsx index ec9e7ca..ee6e3ab 100644 --- a/frontend/src/Home.tsx +++ b/frontend/src/Home.tsx @@ -1,4 +1,4 @@ -import React, { Fragment, useEffect, useState } from "react"; +import { FileUpload } from "@mui/icons-material"; import { Backdrop, Button, @@ -12,17 +12,18 @@ import { Snackbar, styled, TextField, - Typography, + Typography } from "@mui/material"; +import { Buffer } from 'buffer'; +import React, { Fragment, useEffect, useState } from "react"; import { useDispatch, useSelector } from "react-redux"; import { Socket } from "socket.io-client"; import { StackableResult } from "./components/StackableResult"; +import { serverStates } from "./events"; import { connected, downloading, finished } from "./features/status/statusSlice"; import { IDLMetadata, IDLMetadataAndPID, IMessage } from "./interfaces"; import { RootState } from "./stores/store"; -import { isValidURL, toFormatArgs, updateInStateMap, } from "./utils"; -import { FileUpload } from "@mui/icons-material"; -import { Buffer } from 'buffer'; +import { isValidURL, toFormatArgs, updateInStateMap } from "./utils"; type Props = { socket: Socket @@ -86,9 +87,9 @@ export default function Home({ socket }: Props) { /* Handle per-download progress */ useEffect(() => { socket.on('progress', (data: IMessage) => { - if (data.status === 'Done!' || data.status === 'Aborted') { + if (data.status === serverStates.PROG_DONE || data.status === serverStates.PROC_ABORT) { setShowBackdrop(false) - updateInStateMap(data.pid, 'Done!', messageMap, setMessageMap); + updateInStateMap(data.pid, serverStates.PROG_DONE, messageMap, setMessageMap); updateInStateMap(data.pid, 0, progressMap, setProgressMap); socket.emit('disk-space') dispatch(finished()) @@ -290,11 +291,14 @@ export default function Home({ socket }: Props) { {/* video only */} - - - Video data - - + {downloadFormats.formats.filter(format => format.acodec === 'none' && format.vcodec !== 'none').length ? + + + Video data {downloadFormats.formats[1].acodec} + + + : null + } {downloadFormats.formats .filter(format => format.acodec === 'none' && format.vcodec !== 'none') .map((format, idx) => ( @@ -312,11 +316,14 @@ export default function Home({ socket }: Props) { )) } - - - Audio data - - + {downloadFormats.formats.filter(format => format.acodec === 'none' && format.vcodec !== 'none').length ? + + + Audio data + + + : null + } {downloadFormats.formats .filter(format => format.acodec !== 'none' && format.vcodec === 'none') .map((format, idx) => ( @@ -360,7 +367,7 @@ export default function Home({ socket }: Props) { Array .from(messageMap) .filter(flattened => [...flattened][0]) - .filter(flattened => [...flattened][1].toString() !== 'Done!') + .filter(flattened => [...flattened][1].toString() !== serverStates.PROG_DONE) .flatMap(message => ( { diff --git a/frontend/src/events.ts b/frontend/src/events.ts index 41da9c6..9b5ee33 100644 --- a/frontend/src/events.ts +++ b/frontend/src/events.ts @@ -1,3 +1,10 @@ export function on(eventType: string, listener: any) { document.addEventListener(eventType, listener) +} + +export const serverStates = { + PROC_DOWNLOAD: 'download', + PROC_MERGING: 'merging', + PROC_ABORT: 'abort', + PROG_DONE: 'status_done', } \ No newline at end of file diff --git a/server/src/core/downloader.ts b/server/src/core/downloader.ts index f0d4e94..d39d621 100644 --- a/server/src/core/downloader.ts +++ b/server/src/core/downloader.ts @@ -2,15 +2,15 @@ import { spawn } from 'child_process'; import { from, interval } from 'rxjs'; import { map, throttle } from 'rxjs/operators'; import { Socket } from 'socket.io'; +import MemoryDB from '../db/memoryDB'; import { IPayload } from '../interfaces/IPayload'; import { ISettings } from '../interfaces/ISettings'; import Logger from '../utils/BetterLogger'; import Process from './Process'; -import MemoryDB from '../db/memoryDB'; +import { states } from './states'; // settings read from settings.json let settings: ISettings; -let coldRestart = true; const log = Logger.instance; const mem_db = new MemoryDB(); @@ -29,9 +29,18 @@ catch (e) { */ export async function getFormatsAndMetadata(socket: Socket, url: string) { let p = new Process(url, [], settings); - const formats = await p.getMetadata(); - socket.emit('available-formats', formats) - p = null; + try { + const formats = await p.getMetadata(); + socket.emit('available-formats', formats) + } catch (e) { + log.warn('dl', e) + socket.emit('progress', { + status: states.PROG_DONE, + pid: -1, + }); + } finally { + p = null; + } } /** @@ -43,7 +52,7 @@ export async function getFormatsAndMetadata(socket: Socket, url: string) { */ export async function download(socket: Socket, payload: IPayload) { if (!payload || payload.url === '' || payload.url === null) { - socket.emit('progress', { status: 'Done!' }); + socket.emit('progress', { status: states.PROG_DONE }); return; } @@ -67,12 +76,20 @@ export async function download(socket: Socket, payload: IPayload) { * @param socket */ function displayDownloadMetadata(process: Process, socket: Socket) { - process.getMetadata().then(metadata => { - socket.emit('metadata', { - pid: process.getPid(), - metadata: metadata, - }); - }); + process.getMetadata() + .then(metadata => { + socket.emit('metadata', { + pid: process.getPid(), + metadata: metadata, + }); + }) + .catch((e) => { + socket.emit('progress', { + status: states.PROG_DONE, + pid: process.getPid(), + }); + log.warn('dl', e) + }) } /** @@ -83,7 +100,7 @@ function displayDownloadMetadata(process: Process, socket: Socket) { function streamProcess(process: Process, socket: Socket) { const emitAbort = () => { socket.emit('progress', { - status: 'Done!', + status: states.PROG_DONE, pid: process.getPid(), }); } @@ -168,7 +185,7 @@ export function abortDownload(socket: Socket, args: any) { spawn('kill', [pid]) .on('exit', () => { socket.emit('progress', { - status: 'Aborted', + status: states.PROC_ABORT, process: pid, }); log.warn('dl', `Aborting download ${pid}`); @@ -182,7 +199,7 @@ export function abortDownload(socket: Socket, args: any) { export function abortAllDownloads(socket: Socket) { spawn('killall', ['yt-dlp']) .on('exit', () => { - socket.emit('progress', { status: 'Aborted' }); + socket.emit('progress', { status: states.PROC_ABORT }); log.info('dl', 'Aborting downloads'); }); mem_db.flush(); @@ -209,7 +226,7 @@ const formatter = (stdout: string, pid: number) => { switch (status) { case 'download': return { - status: 'download', + status: states.PROC_DOWNLOAD, progress: cleanStdout[1], size: cleanStdout[3], dlSpeed: cleanStdout[5], @@ -217,7 +234,7 @@ const formatter = (stdout: string, pid: number) => { } case 'merge': return { - status: 'merging', + status: states.PROC_MERGING, progress: '100', } default: diff --git a/server/src/core/states.ts b/server/src/core/states.ts new file mode 100644 index 0000000..788786c --- /dev/null +++ b/server/src/core/states.ts @@ -0,0 +1,9 @@ +/** + * Possible server states map + */ +export const states = { + PROC_DOWNLOAD: 'download', + PROC_MERGING: 'merging', + PROC_ABORT: 'abort', + PROG_DONE: 'status_done', +} \ No newline at end of file diff --git a/server/src/utils/logger.ts b/server/src/utils/logger.ts index 2676348..646da5e 100644 --- a/server/src/utils/logger.ts +++ b/server/src/utils/logger.ts @@ -13,11 +13,13 @@ export const logger = (proto: string, args: string) => { */ export const splash = () => { - console.log(" __ ____ __ __ ______") + const fg = "\u001b[38;2;50;113;168m" + const reset = "\u001b[0m" + console.log(`${fg} __ ____ __ __ ______`) console.log(" __ __/ /________/ / /__ _ _____ / / / / / / _/") console.log(" / // / __/___/ _ / / _ \ | |/|/ / -_) _ \/ /_/ // / ") console.log(" \_, /\__/ \_,_/_/ .__/ |__,__/\__/_.__/\____/___/ ") - console.log("/___/ /_/ \n") + console.log(`/___/ /_/ \n${reset}`) console.log(" yt-dlp-webUI - A web-ui for yt-dlp, simply enough") console.log("---------------------------------------------------\n") } \ No newline at end of file