From 6919954467f3f2e4ca2f02e34eda827df9f5f83d Mon Sep 17 00:00:00 2001 From: bobzel Date: Tue, 18 May 2021 14:58:18 -0400 Subject: added downloading of youtube videos if https://youtube-dl.org/ is installed on the server's path --- src/server/ApiManagers/UploadManager.ts | 21 +++++++++++++++++++++ src/server/DashUploadUtils.ts | 18 ++++++++++++++++++ 2 files changed, 39 insertions(+) (limited to 'src/server') diff --git a/src/server/ApiManagers/UploadManager.ts b/src/server/ApiManagers/UploadManager.ts index d6950d46a..02f6462aa 100644 --- a/src/server/ApiManagers/UploadManager.ts +++ b/src/server/ApiManagers/UploadManager.ts @@ -16,6 +16,7 @@ const imageDataUri = require('image-data-uri'); import { isWebUri } from "valid-url"; import { Opt } from "../../fields/Doc"; import { SolrManager } from "./SearchManager"; +import { StringDecoder } from "string_decoder"; export enum Directory { parsed_files = "parsed_files", @@ -64,6 +65,26 @@ export default class UploadManager extends ApiManager { } }); + register({ + method: Method.POST, + subscription: "/uploadYoutubeVideo", + secureHandler: async ({ req, res }) => { + //req.readableBuffer.head.data + return new Promise(async resolve => { + req.addListener("data", async (args) => { + console.log(args); + const payload = String.fromCharCode.apply(String, args); + const videoId = JSON.parse(payload).videoId; + const results: Upload.FileResponse[] = []; + const result = await DashUploadUtils.uploadYoutube(videoId); + result && !(result.result instanceof Error) && results.push(result); + _success(res, results); + resolve(); + }); + }); + } + }); + register({ method: Method.POST, subscription: new RouteSubscriber("youtubeScreenshot"), diff --git a/src/server/DashUploadUtils.ts b/src/server/DashUploadUtils.ts index ff6b2381c..555e3bf3b 100644 --- a/src/server/DashUploadUtils.ts +++ b/src/server/DashUploadUtils.ts @@ -15,6 +15,7 @@ import { clientPathToFile, Directory, pathToDirectory, serverPathToFile } from ' import { resolvedServerUrl } from "./server_Initialization"; import { AcceptableMedia, Upload } from './SharedMediaTypes'; import request = require('request-promise'); +const { exec } = require("child_process"); const parse = require('pdf-parse'); const ffmpeg = require("fluent-ffmpeg"); const requestImageSize = require("../client/util/request-image-size"); @@ -57,6 +58,23 @@ export namespace DashUploadUtils { const { imageFormats, videoFormats, applicationFormats, audioFormats } = AcceptableMedia; + export function uploadYoutube(videoId: string): Promise { + console.log("UPLOAD " + videoId); + return new Promise>((res, rej) => { + exec('/usr/local/bin/youtube-dl -o ' + (videoId + ".mp4") + ' https://www.youtube.com/watch?v=' + videoId + ' -f `/usr/local/bin/youtube-dl https://www.youtube.com/watch?v=' + videoId + ' -F | grep "(best)" | sed -e "s/ .*//"`', + (error: any, stdout: any, stderr: any) => { + if (error) console.log(`error: ${error.message}`); + else if (stderr) console.log(`stderr: ${stderr}`); + else { + console.log(`stdout: ${stdout}`); + const data = { size: 0, path: videoId + ".mp4", name: videoId, type: "video/mp4" }; + const file = { ...data, toJSON: () => data }; + res(MoveParsedFile(file, Directory.videos)); + } + }); + }); + } + export async function upload(file: File): Promise { const { type, path, name } = file; const types = type.split("/"); -- cgit v1.2.3-70-g09d2