+// 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 <url>', 'Server url')
.option('-U, --username <username>', 'Username')
.option('-p, --password <token>', 'Password')
.option('-t, --target-url <targetUrl>', 'Video target URL')
- .option('-l, --language <languageCode>', 'Language code')
+ .option('-l, --language <languageCode>', '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,
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[]
})
}
-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')
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)
}
}
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,
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)
}
}
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
+}