aboutsummaryrefslogtreecommitdiffhomepage
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/tools/import-youtube.ts73
1 files changed, 39 insertions, 34 deletions
diff --git a/server/tools/import-youtube.ts b/server/tools/import-youtube.ts
index b4405c452..d57798d5b 100644
--- a/server/tools/import-youtube.ts
+++ b/server/tools/import-youtube.ts
@@ -11,7 +11,7 @@ program
11 .option('-u, --url <url>', 'Server url') 11 .option('-u, --url <url>', 'Server url')
12 .option('-U, --username <username>', 'Username') 12 .option('-U, --username <username>', 'Username')
13 .option('-p, --password <token>', 'Password') 13 .option('-p, --password <token>', 'Password')
14 .option('-y, --youtube-url <directory>', 'Youtube URL') 14 .option('-y, --youtube-url <youtubeUrl>', 'Youtube URL')
15 .parse(process.argv) 15 .parse(process.argv)
16 16
17if ( 17if (
@@ -45,6 +45,9 @@ async function run () {
45 youtubeDL.getInfo(program['youtubeUrl'], [ '-j', '--flat-playlist' ], async (err, info) => { 45 youtubeDL.getInfo(program['youtubeUrl'], [ '-j', '--flat-playlist' ], async (err, info) => {
46 if (err) throw err 46 if (err) throw err
47 47
48 // Normalize utf8 fields
49 info = info.map(i => normalizeObject(i))
50
48 const videos = info.map(i => { 51 const videos = info.map(i => {
49 return { url: 'https://www.youtube.com/watch?v=' + i.id, name: i.title } 52 return { url: 'https://www.youtube.com/watch?v=' + i.id, name: i.title }
50 }) 53 })
@@ -60,54 +63,37 @@ async function run () {
60 }) 63 })
61} 64}
62 65
63function processVideo (videoUrlName: { name: string, url: string }) { 66function processVideo (video: { name: string, url: string }) {
64 return new Promise(async res => { 67 return new Promise(async res => {
65 const result = await searchVideo(program['url'], videoUrlName.name) 68 const result = await searchVideo(program['url'], video.name)
69
70 console.log('############################################################\n')
71
66 if (result.body.total !== 0) { 72 if (result.body.total !== 0) {
67 console.log('Video "%s" already exist, don\'t reupload it.\n', videoUrlName.name) 73 console.log('Video "%s" already exists, don\'t reupload it.\n', video.name)
68 return res() 74 return res()
69 } 75 }
70 76
71 const video = youtubeDL(videoUrlName.url) 77 const path = join(__dirname, new Date().getTime() + '.mp4')
72 let videoInfo
73 let videoPath: string
74 78
75 video.on('error', err => console.error(err)) 79 console.log('Downloading video "%s"...', video.name)
76 80
77 let size = 0 81 youtubeDL.exec(video.url, [ '-f', 'bestvideo[ext=mp4]+bestaudio[ext=m4a]', '-o', path ], {}, async (err, output) => {
78 video.on('info', info => { 82 if (err) return console.error(err)
79 videoInfo = info
80 size = info.size
81 83
82 videoPath = join(__dirname, size + '.mp4') 84 console.log(output.join('\n'))
83 console.log('Creating "%s" of video "%s".', videoPath, videoInfo.title)
84 85
85 video.pipe(createWriteStream(videoPath)) 86 youtubeDL.getInfo(video.url, async (err, videoInfo) => {
86 }) 87 if (err) return console.error(err)
87 88
88 let pos = 0 89 await uploadVideoOnPeerTube(normalizeObject(videoInfo), path)
89 video.on('data', chunk => {
90 pos += chunk.length
91 // `size` should not be 0 here.
92 if (size) {
93 const percent = (pos / size * 100).toFixed(2)
94 writeWaitingPercent(percent)
95 }
96 })
97 90
98 video.on('end', async () => { 91 return res()
99 await uploadVideoOnPeerTube(videoInfo, videoPath) 92 })
100
101 return res()
102 }) 93 })
103 }) 94 })
104} 95}
105 96
106function writeWaitingPercent (p: string) {
107 cursorTo(process.stdout, 0)
108 process.stdout.write(`waiting ... ${p}%`)
109}
110
111async function uploadVideoOnPeerTube (videoInfo: any, videoPath: string) { 97async function uploadVideoOnPeerTube (videoInfo: any, videoPath: string) {
112 const category = await getCategory(videoInfo.categories) 98 const category = await getCategory(videoInfo.categories)
113 const licence = getLicence(videoInfo.license) 99 const licence = getLicence(videoInfo.license)
@@ -153,3 +139,22 @@ function getLicence (licence: string) {
153 139
154 return undefined 140 return undefined
155} 141}
142
143function normalizeObject (obj: any) {
144 const newObj: any = {}
145
146 for (const key of Object.keys(obj)) {
147 // Deprecated key
148 if (key === 'resolution') continue
149
150 const value = obj[key]
151
152 if (typeof value === 'string') {
153 newObj[key] = value.normalize()
154 } else {
155 newObj[key] = value
156 }
157 }
158
159 return newObj
160}