X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Ftools%2Fcli.ts;h=4aa3d9ce84fec0ff02f223d58bca3f9be14bc3dc;hb=1205823fece15f249e0dbad42e096cf9b81c3ba5;hp=9a170d4da59ae35c023ca60e454fe1f7ee85743e;hpb=dc27668fceb1d0270c391c93c3bbc95d12e83218;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/tools/cli.ts b/server/tools/cli.ts index 9a170d4da..4aa3d9ce8 100644 --- a/server/tools/cli.ts +++ b/server/tools/cli.ts @@ -1,63 +1,170 @@ -const config = require('application-config')('PeerTube/CLI') -const netrc = require('netrc-parser').default +import { Netrc } from 'netrc-parser' +import { getAppNumber, isTestInstance } from '../helpers/core-utils' +import { join } from 'path' +import { getVideoChannel, root } from '../../shared/extra-utils' +import { Command } from 'commander' +import { VideoChannel, VideoPrivacy } from '../../shared/models/videos' -const version = () => { - const tag = require('child_process') - .execSync('[[ ! -d .git ]] || git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null || true', { stdio: [0,1,2] }) - if (tag) return tag +let configName = 'PeerTube/CLI' +if (isTestInstance()) configName += `-${getAppNumber()}` - const version = require('child_process') - .execSync('[[ ! -d .git ]] || git rev-parse --short HEAD').toString().trim() - if (version) return version +const config = require('application-config')(configName) - return require('../../../package.json').version -} - -let settings = { - remotes: [], - default: 0 -} +const version = require('../../../package.json').version interface Settings { remotes: any[], default: number } -async function getSettings () { +function getSettings () { return new Promise((res, rej) => { - let settings = { + const defaultSettings = { remotes: [], - default: 0 - } as Settings + default: -1 + } + config.read((err, data) => { - if (err) { - return rej(err) - } - return res(data || settings) + if (err) return rej(err) + + return res(Object.keys(data).length === 0 ? defaultSettings : data) + }) + }) +} + +async function getNetrc () { + const Netrc = require('netrc-parser').Netrc + + const netrc = isTestInstance() + ? new Netrc(join(root(), 'test' + getAppNumber(), 'netrc')) + : new Netrc() + + await netrc.load() + + return netrc +} + +function writeSettings (settings) { + return new Promise((res, rej) => { + config.write(settings, err => { + if (err) return rej(err) + + return res() }) }) } -async function writeSettings (settings) { +function deleteSettings () { return new Promise((res, rej) => { - config.write(settings, function (err) { - if (err) { - return rej(err) - } + config.trash((err) => { + if (err) return rej(err) + return res() }) }) } -netrc.loadSync() +function getRemoteObjectOrDie (program: any, settings: Settings, netrc: Netrc) { + if (!program['url'] || !program['username'] || !program['password']) { + // No remote and we don't have program parameters: quit + if (settings.remotes.length === 0 || Object.keys(netrc.machines).length === 0) { + if (!program[ 'url' ]) console.error('--url field is required.') + if (!program[ 'username' ]) console.error('--username field is required.') + if (!program[ 'password' ]) console.error('--password field is required.') + + return process.exit(-1) + } + + let url: string = program['url'] + let username: string = program['username'] + let password: string = program['password'] + + if (!url && settings.default !== -1) url = settings.remotes[settings.default] + + const machine = netrc.machines[url] + + if (!username && machine) username = machine.login + if (!password && machine) password = machine.password + + return { url, username, password } + } + + return { + url: program[ 'url' ], + username: program[ 'username' ], + password: program[ 'password' ] + } +} + +function buildCommonVideoOptions (command: Command) { + function list (val) { + return val.split(',') + } + + return command + .option('-n, --video-name ', 'Video name') + .option('-c, --category ', 'Category number') + .option('-l, --licence ', 'Licence number') + .option('-L, --language ', 'Language ISO 639 code (fr or en...)') + .option('-t, --tags ', 'Video tags', list) + .option('-N, --nsfw', 'Video is Not Safe For Work') + .option('-d, --video-description ', 'Video description') + .option('-P, --privacy ', 'Privacy') + .option('-C, --channel-name ', 'Channel name') + .option('-m, --comments-enabled', 'Enable comments') + .option('-s, --support ', 'Video support text') + .option('-w, --wait-transcoding', 'Wait transcoding before publishing the video') +} + +async function buildVideoAttributesFromCommander (url: string, command: Command, defaultAttributes: any) { + const booleanAttributes: { [id: string]: boolean } = {} + + for (const key of [ 'nsfw', 'commentsEnabled', 'downloadEnabled', 'waitTranscoding' ]) { + if (command[ key ] !== undefined) { + booleanAttributes[key] = command[ key ] + } else if (defaultAttributes[key] !== undefined) { + booleanAttributes[key] = defaultAttributes[key] + } else { + booleanAttributes[key] = false + } + } + + const videoAttributes = { + name: command[ 'videoName' ] || defaultAttributes.name, + category: command[ 'category' ] || defaultAttributes.category || undefined, + licence: command[ 'licence' ] || defaultAttributes.licence || undefined, + language: command[ 'language' ] || defaultAttributes.language || undefined, + privacy: command[ 'privacy' ] || defaultAttributes.privacy || VideoPrivacy.PUBLIC, + support: command[ 'support' ] || defaultAttributes.support || undefined + } + + Object.assign(videoAttributes, booleanAttributes) + + if (command[ 'channelName' ]) { + const res = await getVideoChannel(url, command['channelName']) + const videoChannel: VideoChannel = res.body + + Object.assign(videoAttributes, { channelId: videoChannel.id }) + + if (!videoAttributes.support && videoChannel.support) { + Object.assign(videoAttributes, { support: videoChannel.support }) + } + } + + return videoAttributes +} // --------------------------------------------------------------------------- export { version, config, - settings, getSettings, + getNetrc, + getRemoteObjectOrDie, writeSettings, - netrc + deleteSettings, + + buildCommonVideoOptions, + buildVideoAttributesFromCommander }