X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Ftools%2Fimport-videos.ts;h=3ff194c83110b083ae44ea9f1b290f24b19d9d7b;hb=91411dba928678c15a5e99d9795ae061909e397d;hp=d29a2c6f316f8700c4f61adc494cb1bf7cbf8428;hpb=b6fe1f985c34ced6895ec1482e68b356c0f21877;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/tools/import-videos.ts b/server/tools/import-videos.ts index d29a2c6f3..3ff194c83 100644 --- a/server/tools/import-videos.ts +++ b/server/tools/import-videos.ts @@ -1,47 +1,75 @@ +// FIXME: https://github.com/nodejs/node/pull/16853 +require('tls').DEFAULT_ECDH_CURVE = 'auto' + import * as program from 'commander' import { join } from 'path' import * as youtubeDL from 'youtube-dl' import { VideoPrivacy } from '../../shared/models/videos' -import { unlinkPromise } from '../helpers/core-utils' import { doRequestAndSaveToFile } from '../helpers/requests' import { CONSTRAINTS_FIELDS } from '../initializers' -import { getClient, getVideoCategories, login, searchVideo, uploadVideo } from '../tests/utils' +import { getClient, getVideoCategories, login, searchVideoWithSort, uploadVideo } from '../tests/utils' +import { truncate } from 'lodash' +import * as prompt from 'prompt' +import { remove } from 'fs-extra' program .option('-u, --url ', 'Server url') .option('-U, --username ', 'Username') .option('-p, --password ', 'Password') .option('-t, --target-url ', 'Video target URL') - .option('-l, --language ', 'Language code') + .option('-l, --language ', 'Language ISO 639 code (fr or en...)') .option('-v, --verbose', 'Verbose mode') .parse(process.argv) if ( !program['url'] || !program['username'] || - !program['password'] || !program['targetUrl'] ) { console.error('All arguments are required.') process.exit(-1) } -run().catch(err => console.error(err)) - -let accessToken: string -let client: { id: string, secret: string } - const user = { username: program['username'], password: program['password'] } +run().catch(err => console.error(err)) + +let accessToken: string +let client: { id: string, secret: string } + const processOptions = { cwd: __dirname, maxBuffer: Infinity } +async function promptPassword () { + return new Promise((res, rej) => { + prompt.start() + const schema = { + properties: { + password: { + hidden: true, + required: true + } + } + } + prompt.get(schema, function (err, result) { + if (err) { + return rej(err) + } + return res(result.password) + }) + }) +} + async function run () { + if (!user.password) { + user.password = await promptPassword() + } + const res = await getClient(program['url']) client = { id: res.body.client_id, @@ -53,7 +81,10 @@ async function run () { const options = [ '-j', '--flat-playlist', '--playlist-reverse' ] youtubeDL.getInfo(program['targetUrl'], options, processOptions, async (err, info) => { - if (err) throw err + if (err) { + console.log(err.message) + process.exit(1) + } let infoArray: any[] @@ -75,14 +106,14 @@ async function run () { }) } -function processVideo (info: any, languageCode: number) { +function processVideo (info: any, languageCode: string) { return new Promise(async res => { if (program['verbose']) console.log('Fetching object.', info) const videoInfo = await fetchObject(info) if (program['verbose']) console.log('Fetched object.', videoInfo) - const result = await searchVideo(program['url'], videoInfo.title) + const result = await searchVideoWithSort(program['url'], videoInfo.title, '-match') console.log('############################################################\n') @@ -96,25 +127,31 @@ function processVideo (info: any, languageCode: number) { console.log('Downloading video "%s"...', videoInfo.title) const options = [ '-f', 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best', '-o', path ] - youtubeDL.exec(videoInfo.url, options, processOptions, async (err, output) => { - if (err) return console.error(err) - - console.log(output.join('\n')) - - await uploadVideoOnPeerTube(normalizeObject(videoInfo), path, languageCode) - + try { + youtubeDL.exec(videoInfo.url, options, processOptions, async (err, output) => { + if (err) { + console.error(err) + return res() + } + + console.log(output.join('\n')) + await uploadVideoOnPeerTube(normalizeObject(videoInfo), path, languageCode) + return res() + }) + } catch (err) { + console.log(err.message) return res() - }) + } }) } -async function uploadVideoOnPeerTube (videoInfo: any, videoPath: string, language?: number) { +async function uploadVideoOnPeerTube (videoInfo: any, videoPath: string, language?: string) { const category = await getCategory(videoInfo.categories) const licence = getLicence(videoInfo.license) let tags = [] if (Array.isArray(videoInfo.tags)) { tags = videoInfo.tags - .filter(t => t.length < CONSTRAINTS_FIELDS.VIDEOS.TAG.max) + .filter(t => t.length < CONSTRAINTS_FIELDS.VIDEOS.TAG.max && t.length > CONSTRAINTS_FIELDS.VIDEOS.TAG.min) .map(t => t.normalize()) .slice(0, 5) } @@ -130,13 +167,19 @@ async function uploadVideoOnPeerTube (videoInfo: any, videoPath: string, languag } const videoAttributes = { - name: videoInfo.title, + name: truncate(videoInfo.title, { + 'length': CONSTRAINTS_FIELDS.VIDEOS.NAME.max, + 'separator': /,? +/, + 'omission': ' […]' + }), category, licence, language, - nsfw: false, + nsfw: isNSFW(videoInfo), + waitTranscoding: true, commentsEnabled: true, - description: videoInfo.description, + description: videoInfo.description || undefined, + support: undefined, tags, privacy: VideoPrivacy.PUBLIC, fixture: videoPath, @@ -156,14 +199,13 @@ async function uploadVideoOnPeerTube (videoInfo: any, videoPath: string, languag await uploadVideo(program['url'], accessToken, videoAttributes) } else { - throw err + console.log(err.message) + process.exit(1) } } - await unlinkPromise(videoPath) - if (thumbnailfile) { - await unlinkPromise(thumbnailfile) - } + await remove(videoPath) + if (thumbnailfile) await remove(thumbnailfile) console.log('Uploaded video "%s"!\n', videoAttributes.name) } @@ -227,9 +269,18 @@ function fetchObject (info: any) { } function buildUrl (info: any) { + const webpageUrl = info.webpage_url as string + if (webpageUrl && webpageUrl.match(/^https?:\/\//)) return webpageUrl + const url = info.url as string - if (url && url.match(/^https?:\/\//)) return info.url + if (url && url.match(/^https?:\/\//)) return url // It seems youtube-dl does not return the video url return 'https://www.youtube.com/watch?v=' + info.id } + +function isNSFW (info: any) { + if (info.age_limit && info.age_limit >= 16) return true + + return false +}