diff options
Diffstat (limited to 'server/tools')
-rw-r--r-- | server/tools/cli.ts | 42 | ||||
-rw-r--r-- | server/tools/peertube-auth.ts | 10 | ||||
-rw-r--r-- | server/tools/peertube-import-videos.ts | 83 | ||||
-rw-r--r-- | server/tools/peertube-plugins.ts | 11 | ||||
-rw-r--r-- | server/tools/peertube-redundancy.ts | 19 | ||||
-rw-r--r-- | server/tools/peertube-repl.ts | 41 | ||||
-rw-r--r-- | server/tools/peertube-upload.ts | 21 | ||||
-rw-r--r-- | server/tools/peertube-watch.ts | 10 | ||||
-rw-r--r-- | server/tools/peertube.ts | 23 |
9 files changed, 138 insertions, 122 deletions
diff --git a/server/tools/cli.ts b/server/tools/cli.ts index 15ac6c6a8..d1a631b69 100644 --- a/server/tools/cli.ts +++ b/server/tools/cli.ts | |||
@@ -31,7 +31,7 @@ async function getAdminTokenOrDie (url: string, username: string, password: stri | |||
31 | } | 31 | } |
32 | 32 | ||
33 | interface Settings { | 33 | interface Settings { |
34 | remotes: any[], | 34 | remotes: any[] |
35 | default: number | 35 | default: number |
36 | } | 36 | } |
37 | 37 | ||
@@ -90,9 +90,9 @@ function getRemoteObjectOrDie ( | |||
90 | if (!program['url'] || !program['username'] || !program['password']) { | 90 | if (!program['url'] || !program['username'] || !program['password']) { |
91 | // No remote and we don't have program parameters: quit | 91 | // No remote and we don't have program parameters: quit |
92 | if (settings.remotes.length === 0 || Object.keys(netrc.machines).length === 0) { | 92 | if (settings.remotes.length === 0 || Object.keys(netrc.machines).length === 0) { |
93 | if (!program[ 'url' ]) console.error('--url field is required.') | 93 | if (!program['url']) console.error('--url field is required.') |
94 | if (!program[ 'username' ]) console.error('--username field is required.') | 94 | if (!program['username']) console.error('--username field is required.') |
95 | if (!program[ 'password' ]) console.error('--password field is required.') | 95 | if (!program['password']) console.error('--password field is required.') |
96 | 96 | ||
97 | return process.exit(-1) | 97 | return process.exit(-1) |
98 | } | 98 | } |
@@ -112,9 +112,9 @@ function getRemoteObjectOrDie ( | |||
112 | } | 112 | } |
113 | 113 | ||
114 | return { | 114 | return { |
115 | url: program[ 'url' ], | 115 | url: program['url'], |
116 | username: program[ 'username' ], | 116 | username: program['username'], |
117 | password: program[ 'password' ] | 117 | password: program['password'] |
118 | } | 118 | } |
119 | } | 119 | } |
120 | 120 | ||
@@ -150,8 +150,8 @@ async function buildVideoAttributesFromCommander (url: string, command: Command, | |||
150 | const booleanAttributes: { [id in keyof typeof defaultBooleanAttributes]: boolean } | {} = {} | 150 | const booleanAttributes: { [id in keyof typeof defaultBooleanAttributes]: boolean } | {} = {} |
151 | 151 | ||
152 | for (const key of Object.keys(defaultBooleanAttributes)) { | 152 | for (const key of Object.keys(defaultBooleanAttributes)) { |
153 | if (command[ key ] !== undefined) { | 153 | if (command[key] !== undefined) { |
154 | booleanAttributes[key] = command[ key ] | 154 | booleanAttributes[key] = command[key] |
155 | } else if (defaultAttributes[key] !== undefined) { | 155 | } else if (defaultAttributes[key] !== undefined) { |
156 | booleanAttributes[key] = defaultAttributes[key] | 156 | booleanAttributes[key] = defaultAttributes[key] |
157 | } else { | 157 | } else { |
@@ -160,19 +160,19 @@ async function buildVideoAttributesFromCommander (url: string, command: Command, | |||
160 | } | 160 | } |
161 | 161 | ||
162 | const videoAttributes = { | 162 | const videoAttributes = { |
163 | name: command[ 'videoName' ] || defaultAttributes.name, | 163 | name: command['videoName'] || defaultAttributes.name, |
164 | category: command[ 'category' ] || defaultAttributes.category || undefined, | 164 | category: command['category'] || defaultAttributes.category || undefined, |
165 | licence: command[ 'licence' ] || defaultAttributes.licence || undefined, | 165 | licence: command['licence'] || defaultAttributes.licence || undefined, |
166 | language: command[ 'language' ] || defaultAttributes.language || undefined, | 166 | language: command['language'] || defaultAttributes.language || undefined, |
167 | privacy: command[ 'privacy' ] || defaultAttributes.privacy || VideoPrivacy.PUBLIC, | 167 | privacy: command['privacy'] || defaultAttributes.privacy || VideoPrivacy.PUBLIC, |
168 | support: command[ 'support' ] || defaultAttributes.support || undefined, | 168 | support: command['support'] || defaultAttributes.support || undefined, |
169 | description: command[ 'videoDescription' ] || defaultAttributes.description || undefined, | 169 | description: command['videoDescription'] || defaultAttributes.description || undefined, |
170 | tags: command[ 'tags' ] || defaultAttributes.tags || undefined | 170 | tags: command['tags'] || defaultAttributes.tags || undefined |
171 | } | 171 | } |
172 | 172 | ||
173 | Object.assign(videoAttributes, booleanAttributes) | 173 | Object.assign(videoAttributes, booleanAttributes) |
174 | 174 | ||
175 | if (command[ 'channelName' ]) { | 175 | if (command['channelName']) { |
176 | const res = await getVideoChannel(url, command['channelName']) | 176 | const res = await getVideoChannel(url, command['channelName']) |
177 | const videoChannel: VideoChannel = res.body | 177 | const videoChannel: VideoChannel = res.body |
178 | 178 | ||
@@ -188,9 +188,9 @@ async function buildVideoAttributesFromCommander (url: string, command: Command, | |||
188 | 188 | ||
189 | function getServerCredentials (program: any) { | 189 | function getServerCredentials (program: any) { |
190 | return Promise.all([ getSettings(), getNetrc() ]) | 190 | return Promise.all([ getSettings(), getNetrc() ]) |
191 | .then(([ settings, netrc ]) => { | 191 | .then(([ settings, netrc ]) => { |
192 | return getRemoteObjectOrDie(program, settings, netrc) | 192 | return getRemoteObjectOrDie(program, settings, netrc) |
193 | }) | 193 | }) |
194 | } | 194 | } |
195 | 195 | ||
196 | function getLogger (logLevel = 'info') { | 196 | function getLogger (logLevel = 'info') { |
diff --git a/server/tools/peertube-auth.ts b/server/tools/peertube-auth.ts index acac75034..6b486e575 100644 --- a/server/tools/peertube-auth.ts +++ b/server/tools/peertube-auth.ts | |||
@@ -1,3 +1,5 @@ | |||
1 | // eslint-disable @typescript-eslint/no-unnecessary-type-assertion | ||
2 | |||
1 | import { registerTSPaths } from '../helpers/register-ts-paths' | 3 | import { registerTSPaths } from '../helpers/register-ts-paths' |
2 | registerTSPaths() | 4 | registerTSPaths() |
3 | 5 | ||
@@ -5,7 +7,7 @@ import * as program from 'commander' | |||
5 | import * as prompt from 'prompt' | 7 | import * as prompt from 'prompt' |
6 | import { getNetrc, getSettings, writeSettings } from './cli' | 8 | import { getNetrc, getSettings, writeSettings } from './cli' |
7 | import { isUserUsernameValid } from '../helpers/custom-validators/users' | 9 | import { isUserUsernameValid } from '../helpers/custom-validators/users' |
8 | import { getAccessToken, login } from '../../shared/extra-utils' | 10 | import { getAccessToken } from '../../shared/extra-utils' |
9 | import * as CliTable3 from 'cli-table3' | 11 | import * as CliTable3 from 'cli-table3' |
10 | 12 | ||
11 | async function delInstance (url: string) { | 13 | async function delInstance (url: string) { |
@@ -108,9 +110,9 @@ program | |||
108 | const [ settings, netrc ] = await Promise.all([ getSettings(), getNetrc() ]) | 110 | const [ settings, netrc ] = await Promise.all([ getSettings(), getNetrc() ]) |
109 | 111 | ||
110 | const table = new CliTable3({ | 112 | const table = new CliTable3({ |
111 | head: ['instance', 'login'], | 113 | head: [ 'instance', 'login' ], |
112 | colWidths: [30, 30] | 114 | colWidths: [ 30, 30 ] |
113 | }) as CliTable3.HorizontalTable | 115 | }) as any |
114 | 116 | ||
115 | settings.remotes.forEach(element => { | 117 | settings.remotes.forEach(element => { |
116 | if (!netrc.machines[element]) return | 118 | if (!netrc.machines[element]) return |
diff --git a/server/tools/peertube-import-videos.ts b/server/tools/peertube-import-videos.ts index c7e85b570..0efe87810 100644 --- a/server/tools/peertube-import-videos.ts +++ b/server/tools/peertube-import-videos.ts | |||
@@ -12,7 +12,7 @@ import { accessSync, constants } from 'fs' | |||
12 | import { remove } from 'fs-extra' | 12 | import { remove } from 'fs-extra' |
13 | import { sha256 } from '../helpers/core-utils' | 13 | import { sha256 } from '../helpers/core-utils' |
14 | import { buildOriginallyPublishedAt, safeGetYoutubeDL } from '../helpers/youtube-dl' | 14 | import { buildOriginallyPublishedAt, safeGetYoutubeDL } from '../helpers/youtube-dl' |
15 | import { buildCommonVideoOptions, buildVideoAttributesFromCommander, getServerCredentials, getLogger } from './cli' | 15 | import { buildCommonVideoOptions, buildVideoAttributesFromCommander, getLogger, getServerCredentials } from './cli' |
16 | 16 | ||
17 | type UserInfo = { | 17 | type UserInfo = { |
18 | username: string | 18 | username: string |
@@ -40,30 +40,29 @@ command | |||
40 | .option('-T, --tmpdir <tmpdir>', 'Working directory', __dirname) | 40 | .option('-T, --tmpdir <tmpdir>', 'Working directory', __dirname) |
41 | .parse(process.argv) | 41 | .parse(process.argv) |
42 | 42 | ||
43 | let log = getLogger(program[ 'verbose' ]) | 43 | const log = getLogger(program['verbose']) |
44 | 44 | ||
45 | getServerCredentials(command) | 45 | getServerCredentials(command) |
46 | .then(({ url, username, password }) => { | 46 | .then(({ url, username, password }) => { |
47 | if (!program[ 'targetUrl' ]) { | 47 | if (!program['targetUrl']) { |
48 | exitError('--target-url field is required.') | 48 | exitError('--target-url field is required.') |
49 | } | 49 | } |
50 | 50 | ||
51 | try { | 51 | try { |
52 | accessSync(program[ 'tmpdir' ], constants.R_OK | constants.W_OK) | 52 | accessSync(program['tmpdir'], constants.R_OK | constants.W_OK) |
53 | } catch (e) { | 53 | } catch (e) { |
54 | exitError('--tmpdir %s: directory does not exist or is not accessible', program[ 'tmpdir' ]) | 54 | exitError('--tmpdir %s: directory does not exist or is not accessible', program['tmpdir']) |
55 | } | 55 | } |
56 | 56 | ||
57 | url = normalizeTargetUrl(url) | 57 | url = normalizeTargetUrl(url) |
58 | program[ 'targetUrl' ] = normalizeTargetUrl(program[ 'targetUrl' ]) | 58 | program['targetUrl'] = normalizeTargetUrl(program['targetUrl']) |
59 | 59 | ||
60 | const user = { username, password } | 60 | const user = { username, password } |
61 | 61 | ||
62 | run(url, user) | 62 | run(url, user) |
63 | .catch(err => { | 63 | .catch(err => exitError(err)) |
64 | exitError(err) | ||
65 | }) | ||
66 | }) | 64 | }) |
65 | .catch(err => console.error(err)) | ||
67 | 66 | ||
68 | async function run (url: string, user: UserInfo) { | 67 | async function run (url: string, user: UserInfo) { |
69 | if (!user.password) { | 68 | if (!user.password) { |
@@ -73,7 +72,7 @@ async function run (url: string, user: UserInfo) { | |||
73 | const youtubeDL = await safeGetYoutubeDL() | 72 | const youtubeDL = await safeGetYoutubeDL() |
74 | 73 | ||
75 | const options = [ '-j', '--flat-playlist', '--playlist-reverse' ] | 74 | const options = [ '-j', '--flat-playlist', '--playlist-reverse' ] |
76 | youtubeDL.getInfo(program[ 'targetUrl' ], options, processOptions, async (err, info) => { | 75 | youtubeDL.getInfo(program['targetUrl'], options, processOptions, async (err, info) => { |
77 | if (err) { | 76 | if (err) { |
78 | exitError(err.message) | 77 | exitError(err.message) |
79 | } | 78 | } |
@@ -82,10 +81,10 @@ async function run (url: string, user: UserInfo) { | |||
82 | 81 | ||
83 | // Normalize utf8 fields | 82 | // Normalize utf8 fields |
84 | infoArray = [].concat(info) | 83 | infoArray = [].concat(info) |
85 | if (program[ 'first' ]) { | 84 | if (program['first']) { |
86 | infoArray = infoArray.slice(0, program[ 'first' ]) | 85 | infoArray = infoArray.slice(0, program['first']) |
87 | } else if (program[ 'last' ]) { | 86 | } else if (program['last']) { |
88 | infoArray = infoArray.slice(-program[ 'last' ]) | 87 | infoArray = infoArray.slice(-program['last']) |
89 | } | 88 | } |
90 | infoArray = infoArray.map(i => normalizeObject(i)) | 89 | infoArray = infoArray.map(i => normalizeObject(i)) |
91 | 90 | ||
@@ -93,22 +92,22 @@ async function run (url: string, user: UserInfo) { | |||
93 | 92 | ||
94 | for (const info of infoArray) { | 93 | for (const info of infoArray) { |
95 | await processVideo({ | 94 | await processVideo({ |
96 | cwd: program[ 'tmpdir' ], | 95 | cwd: program['tmpdir'], |
97 | url, | 96 | url, |
98 | user, | 97 | user, |
99 | youtubeInfo: info | 98 | youtubeInfo: info |
100 | }) | 99 | }) |
101 | } | 100 | } |
102 | 101 | ||
103 | log.info('Video/s for user %s imported: %s', user.username, program[ 'targetUrl' ]) | 102 | log.info('Video/s for user %s imported: %s', user.username, program['targetUrl']) |
104 | process.exit(0) | 103 | process.exit(0) |
105 | }) | 104 | }) |
106 | } | 105 | } |
107 | 106 | ||
108 | function processVideo (parameters: { | 107 | function processVideo (parameters: { |
109 | cwd: string, | 108 | cwd: string |
110 | url: string, | 109 | url: string |
111 | user: { username: string, password: string }, | 110 | user: { username: string, password: string } |
112 | youtubeInfo: any | 111 | youtubeInfo: any |
113 | }) { | 112 | }) { |
114 | const { youtubeInfo, cwd, url, user } = parameters | 113 | const { youtubeInfo, cwd, url, user } = parameters |
@@ -119,17 +118,17 @@ function processVideo (parameters: { | |||
119 | const videoInfo = await fetchObject(youtubeInfo) | 118 | const videoInfo = await fetchObject(youtubeInfo) |
120 | log.debug('Fetched object.', videoInfo) | 119 | log.debug('Fetched object.', videoInfo) |
121 | 120 | ||
122 | if (program[ 'since' ]) { | 121 | if (program['since']) { |
123 | if (buildOriginallyPublishedAt(videoInfo).getTime() < program[ 'since' ].getTime()) { | 122 | if (buildOriginallyPublishedAt(videoInfo).getTime() < program['since'].getTime()) { |
124 | log.info('Video "%s" has been published before "%s", don\'t upload it.\n', | 123 | log.info('Video "%s" has been published before "%s", don\'t upload it.\n', |
125 | videoInfo.title, formatDate(program[ 'since' ])) | 124 | videoInfo.title, formatDate(program['since'])) |
126 | return res() | 125 | return res() |
127 | } | 126 | } |
128 | } | 127 | } |
129 | if (program[ 'until' ]) { | 128 | if (program['until']) { |
130 | if (buildOriginallyPublishedAt(videoInfo).getTime() > program[ 'until' ].getTime()) { | 129 | if (buildOriginallyPublishedAt(videoInfo).getTime() > program['until'].getTime()) { |
131 | log.info('Video "%s" has been published after "%s", don\'t upload it.\n', | 130 | log.info('Video "%s" has been published after "%s", don\'t upload it.\n', |
132 | videoInfo.title, formatDate(program[ 'until' ])) | 131 | videoInfo.title, formatDate(program['until'])) |
133 | return res() | 132 | return res() |
134 | } | 133 | } |
135 | } | 134 | } |
@@ -174,11 +173,11 @@ function processVideo (parameters: { | |||
174 | } | 173 | } |
175 | 174 | ||
176 | async function uploadVideoOnPeerTube (parameters: { | 175 | async function uploadVideoOnPeerTube (parameters: { |
177 | videoInfo: any, | 176 | videoInfo: any |
178 | videoPath: string, | 177 | videoPath: string |
179 | cwd: string, | 178 | cwd: string |
180 | url: string, | 179 | url: string |
181 | user: { username: string; password: string } | 180 | user: { username: string, password: string } |
182 | }) { | 181 | }) { |
183 | const { videoInfo, videoPath, cwd, url, user } = parameters | 182 | const { videoInfo, videoPath, cwd, url, user } = parameters |
184 | 183 | ||
@@ -206,9 +205,9 @@ async function uploadVideoOnPeerTube (parameters: { | |||
206 | 205 | ||
207 | const defaultAttributes = { | 206 | const defaultAttributes = { |
208 | name: truncate(videoInfo.title, { | 207 | name: truncate(videoInfo.title, { |
209 | 'length': CONSTRAINTS_FIELDS.VIDEOS.NAME.max, | 208 | length: CONSTRAINTS_FIELDS.VIDEOS.NAME.max, |
210 | 'separator': /,? +/, | 209 | separator: /,? +/, |
211 | 'omission': ' […]' | 210 | omission: ' […]' |
212 | }), | 211 | }), |
213 | category, | 212 | category, |
214 | licence, | 213 | licence, |
@@ -255,7 +254,7 @@ async function uploadVideoOnPeerTube (parameters: { | |||
255 | async function getCategory (categories: string[], url: string) { | 254 | async function getCategory (categories: string[], url: string) { |
256 | if (!categories) return undefined | 255 | if (!categories) return undefined |
257 | 256 | ||
258 | const categoryString = categories[ 0 ] | 257 | const categoryString = categories[0] |
259 | 258 | ||
260 | if (categoryString === 'News & Politics') return 11 | 259 | if (categoryString === 'News & Politics') return 11 |
261 | 260 | ||
@@ -263,7 +262,7 @@ async function getCategory (categories: string[], url: string) { | |||
263 | const categoriesServer = res.body | 262 | const categoriesServer = res.body |
264 | 263 | ||
265 | for (const key of Object.keys(categoriesServer)) { | 264 | for (const key of Object.keys(categoriesServer)) { |
266 | const categoryServer = categoriesServer[ key ] | 265 | const categoryServer = categoriesServer[key] |
267 | if (categoryString.toLowerCase() === categoryServer.toLowerCase()) return parseInt(key, 10) | 266 | if (categoryString.toLowerCase() === categoryServer.toLowerCase()) return parseInt(key, 10) |
268 | } | 267 | } |
269 | 268 | ||
@@ -285,12 +284,12 @@ function normalizeObject (obj: any) { | |||
285 | // Deprecated key | 284 | // Deprecated key |
286 | if (key === 'resolution') continue | 285 | if (key === 'resolution') continue |
287 | 286 | ||
288 | const value = obj[ key ] | 287 | const value = obj[key] |
289 | 288 | ||
290 | if (typeof value === 'string') { | 289 | if (typeof value === 'string') { |
291 | newObj[ key ] = value.normalize() | 290 | newObj[key] = value.normalize() |
292 | } else { | 291 | } else { |
293 | newObj[ key ] = value | 292 | newObj[key] = value |
294 | } | 293 | } |
295 | } | 294 | } |
296 | 295 | ||
@@ -302,7 +301,7 @@ function fetchObject (info: any) { | |||
302 | 301 | ||
303 | return new Promise<any>(async (res, rej) => { | 302 | return new Promise<any>(async (res, rej) => { |
304 | const youtubeDL = await safeGetYoutubeDL() | 303 | const youtubeDL = await safeGetYoutubeDL() |
305 | youtubeDL.getInfo(url, undefined, processOptions, async (err, videoInfo) => { | 304 | youtubeDL.getInfo(url, undefined, processOptions, (err, videoInfo) => { |
306 | if (err) return rej(err) | 305 | if (err) return rej(err) |
307 | 306 | ||
308 | const videoInfoWithUrl = Object.assign(videoInfo, { url }) | 307 | const videoInfoWithUrl = Object.assign(videoInfo, { url }) |
@@ -313,10 +312,10 @@ function fetchObject (info: any) { | |||
313 | 312 | ||
314 | function buildUrl (info: any) { | 313 | function buildUrl (info: any) { |
315 | const webpageUrl = info.webpage_url as string | 314 | const webpageUrl = info.webpage_url as string |
316 | if (webpageUrl && webpageUrl.match(/^https?:\/\//)) return webpageUrl | 315 | if (webpageUrl?.match(/^https?:\/\//)) return webpageUrl |
317 | 316 | ||
318 | const url = info.url as string | 317 | const url = info.url as string |
319 | if (url && url.match(/^https?:\/\//)) return url | 318 | if (url?.match(/^https?:\/\//)) return url |
320 | 319 | ||
321 | // It seems youtube-dl does not return the video url | 320 | // It seems youtube-dl does not return the video url |
322 | return 'https://www.youtube.com/watch?v=' + info.id | 321 | return 'https://www.youtube.com/watch?v=' + info.id |
@@ -384,7 +383,7 @@ function parseDate (dateAsStr: string): Date { | |||
384 | } | 383 | } |
385 | 384 | ||
386 | function formatDate (date: Date): string { | 385 | function formatDate (date: Date): string { |
387 | return date.toISOString().split('T')[ 0 ] | 386 | return date.toISOString().split('T')[0] |
388 | } | 387 | } |
389 | 388 | ||
390 | function exitError (message: string, ...meta: any[]) { | 389 | function exitError (message: string, ...meta: any[]) { |
diff --git a/server/tools/peertube-plugins.ts b/server/tools/peertube-plugins.ts index b341c14c1..05b75fab2 100644 --- a/server/tools/peertube-plugins.ts +++ b/server/tools/peertube-plugins.ts | |||
@@ -1,3 +1,5 @@ | |||
1 | // eslint-disable @typescript-eslint/no-unnecessary-type-assertion | ||
2 | |||
1 | import { registerTSPaths } from '../helpers/register-ts-paths' | 3 | import { registerTSPaths } from '../helpers/register-ts-paths' |
2 | registerTSPaths() | 4 | registerTSPaths() |
3 | 5 | ||
@@ -79,9 +81,9 @@ async function pluginsListCLI () { | |||
79 | const plugins: PeerTubePlugin[] = res.body.data | 81 | const plugins: PeerTubePlugin[] = res.body.data |
80 | 82 | ||
81 | const table = new CliTable3({ | 83 | const table = new CliTable3({ |
82 | head: ['name', 'version', 'homepage'], | 84 | head: [ 'name', 'version', 'homepage' ], |
83 | colWidths: [ 50, 10, 50 ] | 85 | colWidths: [ 50, 10, 50 ] |
84 | }) as CliTable3.HorizontalTable | 86 | }) as any |
85 | 87 | ||
86 | for (const plugin of plugins) { | 88 | for (const plugin of plugins) { |
87 | const npmName = plugin.type === PluginType.PLUGIN | 89 | const npmName = plugin.type === PluginType.PLUGIN |
@@ -124,7 +126,6 @@ async function installPluginCLI (options: any) { | |||
124 | } catch (err) { | 126 | } catch (err) { |
125 | console.error('Cannot install plugin.', err) | 127 | console.error('Cannot install plugin.', err) |
126 | process.exit(-1) | 128 | process.exit(-1) |
127 | return | ||
128 | } | 129 | } |
129 | 130 | ||
130 | console.log('Plugin installed.') | 131 | console.log('Plugin installed.') |
@@ -156,7 +157,6 @@ async function updatePluginCLI (options: any) { | |||
156 | } catch (err) { | 157 | } catch (err) { |
157 | console.error('Cannot update plugin.', err) | 158 | console.error('Cannot update plugin.', err) |
158 | process.exit(-1) | 159 | process.exit(-1) |
159 | return | ||
160 | } | 160 | } |
161 | 161 | ||
162 | console.log('Plugin updated.') | 162 | console.log('Plugin updated.') |
@@ -177,12 +177,11 @@ async function uninstallPluginCLI (options: any) { | |||
177 | await uninstallPlugin({ | 177 | await uninstallPlugin({ |
178 | url, | 178 | url, |
179 | accessToken, | 179 | accessToken, |
180 | npmName: options[ 'npmName' ] | 180 | npmName: options['npmName'] |
181 | }) | 181 | }) |
182 | } catch (err) { | 182 | } catch (err) { |
183 | console.error('Cannot uninstall plugin.', err) | 183 | console.error('Cannot uninstall plugin.', err) |
184 | process.exit(-1) | 184 | process.exit(-1) |
185 | return | ||
186 | } | 185 | } |
187 | 186 | ||
188 | console.log('Plugin uninstalled.') | 187 | console.log('Plugin uninstalled.') |
diff --git a/server/tools/peertube-redundancy.ts b/server/tools/peertube-redundancy.ts index a71f48104..1ab58a438 100644 --- a/server/tools/peertube-redundancy.ts +++ b/server/tools/peertube-redundancy.ts | |||
@@ -1,3 +1,5 @@ | |||
1 | // eslint-disable @typescript-eslint/no-unnecessary-type-assertion | ||
2 | |||
1 | import { registerTSPaths } from '../helpers/register-ts-paths' | 3 | import { registerTSPaths } from '../helpers/register-ts-paths' |
2 | registerTSPaths() | 4 | registerTSPaths() |
3 | 5 | ||
@@ -6,11 +8,12 @@ import { getAdminTokenOrDie, getServerCredentials } from './cli' | |||
6 | import { VideoRedundanciesTarget, VideoRedundancy } from '@shared/models' | 8 | import { VideoRedundanciesTarget, VideoRedundancy } from '@shared/models' |
7 | import { addVideoRedundancy, listVideoRedundancies, removeVideoRedundancy } from '@shared/extra-utils/server/redundancy' | 9 | import { addVideoRedundancy, listVideoRedundancies, removeVideoRedundancy } from '@shared/extra-utils/server/redundancy' |
8 | import validator from 'validator' | 10 | import validator from 'validator' |
9 | import bytes = require('bytes') | ||
10 | import * as CliTable3 from 'cli-table3' | 11 | import * as CliTable3 from 'cli-table3' |
11 | import { parse } from 'url' | 12 | import { URL } from 'url' |
12 | import { uniq } from 'lodash' | 13 | import { uniq } from 'lodash' |
13 | 14 | ||
15 | import bytes = require('bytes') | ||
16 | |||
14 | program | 17 | program |
15 | .name('plugins') | 18 | .name('plugins') |
16 | .usage('[command] [options]') | 19 | .usage('[command] [options]') |
@@ -65,7 +68,7 @@ async function listRedundanciesCLI (target: VideoRedundanciesTarget) { | |||
65 | 68 | ||
66 | const table = new CliTable3({ | 69 | const table = new CliTable3({ |
67 | head: [ 'video id', 'video name', 'video url', 'files', 'playlists', 'by instances', 'total size' ] | 70 | head: [ 'video id', 'video name', 'video url', 'files', 'playlists', 'by instances', 'total size' ] |
68 | }) as CliTable3.HorizontalTable | 71 | }) as any |
69 | 72 | ||
70 | for (const redundancy of redundancies) { | 73 | for (const redundancy of redundancies) { |
71 | const webtorrentFiles = redundancy.redundancies.files | 74 | const webtorrentFiles = redundancy.redundancies.files |
@@ -82,7 +85,7 @@ async function listRedundanciesCLI (target: VideoRedundanciesTarget) { | |||
82 | const instances = uniq( | 85 | const instances = uniq( |
83 | webtorrentFiles.concat(streamingPlaylists) | 86 | webtorrentFiles.concat(streamingPlaylists) |
84 | .map(r => r.fileUrl) | 87 | .map(r => r.fileUrl) |
85 | .map(u => parse(u).host) | 88 | .map(u => new URL(u).host) |
86 | ) | 89 | ) |
87 | 90 | ||
88 | table.push([ | 91 | table.push([ |
@@ -104,7 +107,7 @@ async function addRedundancyCLI (options: { videoId: number }) { | |||
104 | const { url, username, password } = await getServerCredentials(program) | 107 | const { url, username, password } = await getServerCredentials(program) |
105 | const accessToken = await getAdminTokenOrDie(url, username, password) | 108 | const accessToken = await getAdminTokenOrDie(url, username, password) |
106 | 109 | ||
107 | if (!options[ 'video' ] || validator.isInt('' + options[ 'video' ]) === false) { | 110 | if (!options['video'] || validator.isInt('' + options['video']) === false) { |
108 | console.error('You need to specify the video id to duplicate and it should be a number.\n') | 111 | console.error('You need to specify the video id to duplicate and it should be a number.\n') |
109 | program.outputHelp() | 112 | program.outputHelp() |
110 | process.exit(-1) | 113 | process.exit(-1) |
@@ -114,7 +117,7 @@ async function addRedundancyCLI (options: { videoId: number }) { | |||
114 | await addVideoRedundancy({ | 117 | await addVideoRedundancy({ |
115 | url, | 118 | url, |
116 | accessToken, | 119 | accessToken, |
117 | videoId: options[ 'video' ] | 120 | videoId: options['video'] |
118 | }) | 121 | }) |
119 | 122 | ||
120 | console.log('Video will be duplicated by your instance!') | 123 | console.log('Video will be duplicated by your instance!') |
@@ -137,13 +140,13 @@ async function removeRedundancyCLI (options: { videoId: number }) { | |||
137 | const { url, username, password } = await getServerCredentials(program) | 140 | const { url, username, password } = await getServerCredentials(program) |
138 | const accessToken = await getAdminTokenOrDie(url, username, password) | 141 | const accessToken = await getAdminTokenOrDie(url, username, password) |
139 | 142 | ||
140 | if (!options[ 'video' ] || validator.isInt('' + options[ 'video' ]) === false) { | 143 | if (!options['video'] || validator.isInt('' + options['video']) === false) { |
141 | console.error('You need to specify the video id to remove from your redundancies.\n') | 144 | console.error('You need to specify the video id to remove from your redundancies.\n') |
142 | program.outputHelp() | 145 | program.outputHelp() |
143 | process.exit(-1) | 146 | process.exit(-1) |
144 | } | 147 | } |
145 | 148 | ||
146 | const videoId = parseInt(options[ 'video' ] + '', 10) | 149 | const videoId = parseInt(options['video'] + '', 10) |
147 | 150 | ||
148 | let redundancies = await listVideoRedundanciesData(url, accessToken, 'my-videos') | 151 | let redundancies = await listVideoRedundanciesData(url, accessToken, 'my-videos') |
149 | let videoRedundancy = redundancies.find(r => videoId === r.id) | 152 | let videoRedundancy = redundancies.find(r => videoId === r.id) |
diff --git a/server/tools/peertube-repl.ts b/server/tools/peertube-repl.ts index ab6e215d9..7c936ae0d 100644 --- a/server/tools/peertube-repl.ts +++ b/server/tools/peertube-repl.ts | |||
@@ -1,6 +1,4 @@ | |||
1 | import { registerTSPaths } from '../helpers/register-ts-paths' | 1 | import { registerTSPaths } from '../helpers/register-ts-paths' |
2 | registerTSPaths() | ||
3 | |||
4 | import * as repl from 'repl' | 2 | import * as repl from 'repl' |
5 | import * as path from 'path' | 3 | import * as path from 'path' |
6 | import * as _ from 'lodash' | 4 | import * as _ from 'lodash' |
@@ -23,6 +21,8 @@ import * as signupUtils from '../helpers/signup' | |||
23 | import * as utils from '../helpers/utils' | 21 | import * as utils from '../helpers/utils' |
24 | import * as YoutubeDLUtils from '../helpers/youtube-dl' | 22 | import * as YoutubeDLUtils from '../helpers/youtube-dl' |
25 | 23 | ||
24 | registerTSPaths() | ||
25 | |||
26 | const start = async () => { | 26 | const start = async () => { |
27 | await initDatabaseModels(true) | 27 | await initDatabaseModels(true) |
28 | 28 | ||
@@ -31,22 +31,39 @@ const start = async () => { | |||
31 | const initContext = (replServer) => { | 31 | const initContext = (replServer) => { |
32 | return (context) => { | 32 | return (context) => { |
33 | const properties = { | 33 | const properties = { |
34 | context, repl: replServer, env: process.env, | 34 | context, |
35 | lodash: _, path, | 35 | repl: replServer, |
36 | uuidv1, uuidv3, uuidv4, uuidv5, | 36 | env: process.env, |
37 | cli, logger, constants, | 37 | lodash: _, |
38 | Sequelize, sequelizeTypescript, modelsUtils, | 38 | path, |
39 | models: sequelizeTypescript.models, transaction: sequelizeTypescript.transaction, | 39 | uuidv1, |
40 | query: sequelizeTypescript.query, queryInterface: sequelizeTypescript.getQueryInterface(), | 40 | uuidv3, |
41 | uuidv4, | ||
42 | uuidv5, | ||
43 | cli, | ||
44 | logger, | ||
45 | constants, | ||
46 | Sequelize, | ||
47 | sequelizeTypescript, | ||
48 | modelsUtils, | ||
49 | models: sequelizeTypescript.models, | ||
50 | transaction: sequelizeTypescript.transaction, | ||
51 | query: sequelizeTypescript.query, | ||
52 | queryInterface: sequelizeTypescript.getQueryInterface(), | ||
41 | YoutubeDL, | 53 | YoutubeDL, |
42 | coreUtils, ffmpegUtils, peertubeCryptoUtils, signupUtils, utils, YoutubeDLUtils | 54 | coreUtils, |
55 | ffmpegUtils, | ||
56 | peertubeCryptoUtils, | ||
57 | signupUtils, | ||
58 | utils, | ||
59 | YoutubeDLUtils | ||
43 | } | 60 | } |
44 | 61 | ||
45 | for (let prop in properties) { | 62 | for (const prop in properties) { |
46 | Object.defineProperty(context, prop, { | 63 | Object.defineProperty(context, prop, { |
47 | configurable: false, | 64 | configurable: false, |
48 | enumerable: true, | 65 | enumerable: true, |
49 | value: properties[ prop ] | 66 | value: properties[prop] |
50 | }) | 67 | }) |
51 | } | 68 | } |
52 | } | 69 | } |
diff --git a/server/tools/peertube-upload.ts b/server/tools/peertube-upload.ts index f604c9bee..8de952e7b 100644 --- a/server/tools/peertube-upload.ts +++ b/server/tools/peertube-upload.ts | |||
@@ -24,14 +24,14 @@ command | |||
24 | 24 | ||
25 | getServerCredentials(command) | 25 | getServerCredentials(command) |
26 | .then(({ url, username, password }) => { | 26 | .then(({ url, username, password }) => { |
27 | if (!program[ 'videoName' ] || !program[ 'file' ]) { | 27 | if (!program['videoName'] || !program['file']) { |
28 | if (!program[ 'videoName' ]) console.error('--video-name is required.') | 28 | if (!program['videoName']) console.error('--video-name is required.') |
29 | if (!program[ 'file' ]) console.error('--file is required.') | 29 | if (!program['file']) console.error('--file is required.') |
30 | 30 | ||
31 | process.exit(-1) | 31 | process.exit(-1) |
32 | } | 32 | } |
33 | 33 | ||
34 | if (isAbsolute(program[ 'file' ]) === false) { | 34 | if (isAbsolute(program['file']) === false) { |
35 | console.error('File path should be absolute.') | 35 | console.error('File path should be absolute.') |
36 | process.exit(-1) | 36 | process.exit(-1) |
37 | } | 37 | } |
@@ -41,25 +41,26 @@ getServerCredentials(command) | |||
41 | process.exit(-1) | 41 | process.exit(-1) |
42 | }) | 42 | }) |
43 | }) | 43 | }) |
44 | .catch(err => console.error(err)) | ||
44 | 45 | ||
45 | async function run (url: string, username: string, password: string) { | 46 | async function run (url: string, username: string, password: string) { |
46 | const accessToken = await getAccessToken(url, username, password) | 47 | const accessToken = await getAccessToken(url, username, password) |
47 | 48 | ||
48 | await access(program[ 'file' ], constants.F_OK) | 49 | await access(program['file'], constants.F_OK) |
49 | 50 | ||
50 | console.log('Uploading %s video...', program[ 'videoName' ]) | 51 | console.log('Uploading %s video...', program['videoName']) |
51 | 52 | ||
52 | const videoAttributes = await buildVideoAttributesFromCommander(url, program) | 53 | const videoAttributes = await buildVideoAttributesFromCommander(url, program) |
53 | 54 | ||
54 | Object.assign(videoAttributes, { | 55 | Object.assign(videoAttributes, { |
55 | fixture: program[ 'file' ], | 56 | fixture: program['file'], |
56 | thumbnailfile: program[ 'thumbnail' ], | 57 | thumbnailfile: program['thumbnail'], |
57 | previewfile: program[ 'preview' ] | 58 | previewfile: program['preview'] |
58 | }) | 59 | }) |
59 | 60 | ||
60 | try { | 61 | try { |
61 | await uploadVideo(url, accessToken, videoAttributes) | 62 | await uploadVideo(url, accessToken, videoAttributes) |
62 | console.log(`Video ${program[ 'videoName' ]} uploaded.`) | 63 | console.log(`Video ${program['videoName']} uploaded.`) |
63 | process.exit(0) | 64 | process.exit(0) |
64 | } catch (err) { | 65 | } catch (err) { |
65 | console.error(require('util').inspect(err)) | 66 | console.error(require('util').inspect(err)) |
diff --git a/server/tools/peertube-watch.ts b/server/tools/peertube-watch.ts index 9ac1d05f9..5f7d1bb07 100644 --- a/server/tools/peertube-watch.ts +++ b/server/tools/peertube-watch.ts | |||
@@ -29,16 +29,10 @@ program | |||
29 | console.log(' $ peertube watch https://peertube.cpy.re/videos/watch/e8a1af4e-414a-4d58-bfe6-2146eed06d10') | 29 | console.log(' $ peertube watch https://peertube.cpy.re/videos/watch/e8a1af4e-414a-4d58-bfe6-2146eed06d10') |
30 | console.log() | 30 | console.log() |
31 | }) | 31 | }) |
32 | .action((url, cmd) => { | 32 | .action((url, cmd) => run(url, cmd)) |
33 | run(url, cmd) | ||
34 | .catch(err => { | ||
35 | console.error(err) | ||
36 | process.exit(-1) | ||
37 | }) | ||
38 | }) | ||
39 | .parse(process.argv) | 33 | .parse(process.argv) |
40 | 34 | ||
41 | async function run (url: string, program: any) { | 35 | function run (url: string, program: any) { |
42 | if (!url) { | 36 | if (!url) { |
43 | console.error('<url> positional argument is required.') | 37 | console.error('<url> positional argument is required.') |
44 | process.exit(-1) | 38 | process.exit(-1) |
diff --git a/server/tools/peertube.ts b/server/tools/peertube.ts index 9883bbf05..88dd5f7f6 100644 --- a/server/tools/peertube.ts +++ b/server/tools/peertube.ts | |||
@@ -1,13 +1,12 @@ | |||
1 | #!/usr/bin/env node | 1 | #!/usr/bin/env node |
2 | 2 | ||
3 | /* eslint-disable no-useless-escape */ | ||
4 | |||
3 | import { registerTSPaths } from '../helpers/register-ts-paths' | 5 | import { registerTSPaths } from '../helpers/register-ts-paths' |
4 | registerTSPaths() | 6 | registerTSPaths() |
5 | 7 | ||
6 | import * as program from 'commander' | 8 | import * as program from 'commander' |
7 | import { | 9 | import { getSettings, version } from './cli' |
8 | version, | ||
9 | getSettings | ||
10 | } from './cli' | ||
11 | 10 | ||
12 | program | 11 | program |
13 | .version(version, '-v, --version') | 12 | .version(version, '-v, --version') |
@@ -26,14 +25,15 @@ program | |||
26 | 25 | ||
27 | /* Not Yet Implemented */ | 26 | /* Not Yet Implemented */ |
28 | program | 27 | program |
29 | .command('diagnostic [action]', | 28 | .command( |
30 | 'like couple therapy, but for your instance', | 29 | 'diagnostic [action]', |
31 | { noHelp: true } as program.CommandOptions | 30 | 'like couple therapy, but for your instance', |
32 | ).alias('d') | 31 | { noHelp: true } as program.CommandOptions |
32 | ).alias('d') | ||
33 | .command('admin', | 33 | .command('admin', |
34 | 'manage an instance where you have elevated rights', | 34 | 'manage an instance where you have elevated rights', |
35 | { noHelp: true } as program.CommandOptions | 35 | { noHelp: true } as program.CommandOptions |
36 | ).alias('a') | 36 | ).alias('a') |
37 | 37 | ||
38 | // help on no command | 38 | // help on no command |
39 | if (!process.argv.slice(2).length) { | 39 | if (!process.argv.slice(2).length) { |
@@ -82,3 +82,4 @@ getSettings() | |||
82 | }) | 82 | }) |
83 | .parse(process.argv) | 83 | .parse(process.argv) |
84 | }) | 84 | }) |
85 | .catch(err => console.error(err)) | ||