-import * as youtubeDL from 'youtube-dl'
import { truncate } from 'lodash'
-import { CONFIG, CONSTRAINTS_FIELDS, VIDEO_CATEGORIES } from '../initializers'
-import { join } from 'path'
-import * as crypto from 'crypto'
+import { CONSTRAINTS_FIELDS, VIDEO_CATEGORIES } from '../initializers'
import { logger } from './logger'
+import { generateVideoTmpPath } from './utils'
+import { YoutubeDlUpdateScheduler } from '../lib/schedulers/youtube-dl-update-scheduler'
export type YoutubeDLInfo = {
- name: string
- description: string
- category: number
- licence: number
- nsfw: boolean
- tags: string[]
- thumbnailUrl: string
+ name?: string
+ description?: string
+ category?: number
+ licence?: number
+ nsfw?: boolean
+ tags?: string[]
+ thumbnailUrl?: string
}
function getYoutubeDLInfo (url: string): Promise<YoutubeDLInfo> {
- return new Promise<YoutubeDLInfo>((res, rej) => {
+ return new Promise<YoutubeDLInfo>(async (res, rej) => {
const options = [ '-j', '--flat-playlist' ]
+ const youtubeDL = await safeGetYoutubeDL()
youtubeDL.getInfo(url, options, (err, info) => {
if (err) return rej(err)
}
function downloadYoutubeDLVideo (url: string) {
- const hash = crypto.createHash('sha256').update(url).digest('base64')
- const path = join(CONFIG.STORAGE.VIDEOS_DIR, hash + '-import.mp4')
+ const path = generateVideoTmpPath(url)
- logger.info('Importing video %s', url)
+ logger.info('Importing youtubeDL video %s', url)
const options = [ '-f', 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best', '-o', path ]
- return new Promise<string>((res, rej) => {
+ return new Promise<string>(async (res, rej) => {
+ const youtubeDL = await safeGetYoutubeDL()
youtubeDL.exec(url, options, async (err, output) => {
if (err) return rej(err)
// ---------------------------------------------------------------------------
+async function safeGetYoutubeDL () {
+ let youtubeDL
+
+ try {
+ youtubeDL = require('youtube-dl')
+ } catch (e) {
+ // Download binary
+ await YoutubeDlUpdateScheduler.Instance.execute()
+ youtubeDL = require('youtube-dl')
+ }
+
+ return youtubeDL
+}
+
function normalizeObject (obj: any) {
const newObj: any = {}
}
function descriptionTruncation (description: string) {
- if (!description) return undefined
+ if (!description || description.length < CONSTRAINTS_FIELDS.VIDEOS.DESCRIPTION.min) return undefined
return truncate(description, {
'length': CONSTRAINTS_FIELDS.VIDEOS.DESCRIPTION.max,
function getLicence (licence: string) {
if (!licence) return undefined
- if (licence.indexOf('Creative Commons Attribution licence') !== -1) return 1
+ if (licence.indexOf('Creative Commons Attribution') !== -1) return 1
return undefined
}