123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449 |
- import { merge } from 'lodash'
- import { About, CustomConfig, HttpStatusCode, ServerConfig } from '@shared/models'
- import { DeepPartial } from '@shared/typescript-utils'
- import { AbstractCommand, OverrideCommandOptions } from '../shared/abstract-command'
- export class ConfigCommand extends AbstractCommand {
- static getCustomConfigResolutions (enabled: boolean) {
- return {
- '144p': enabled,
- '240p': enabled,
- '360p': enabled,
- '480p': enabled,
- '720p': enabled,
- '1080p': enabled,
- '1440p': enabled,
- '2160p': enabled
- }
- }
- disableImports () {
- return this.setImportsEnabled(false)
- }
- enableImports () {
- return this.setImportsEnabled(true)
- }
- private setImportsEnabled (enabled: boolean) {
- return this.updateExistingSubConfig({
- newConfig: {
- import: {
- videos: {
- http: {
- enabled
- },
- torrent: {
- enabled
- }
- }
- }
- }
- })
- }
- private setChannelSyncEnabled (enabled: boolean) {
- return this.updateExistingSubConfig({
- newConfig: {
- import: {
- videoChannelSynchronization: {
- enabled
- }
- }
- }
- })
- }
- enableChannelSync () {
- return this.setChannelSyncEnabled(true)
- }
- disableChannelSync () {
- return this.setChannelSyncEnabled(false)
- }
- enableLive (options: {
- allowReplay?: boolean
- transcoding?: boolean
- resolutions?: 'min' | 'max' // Default max
- } = {}) {
- const { allowReplay, transcoding, resolutions = 'max' } = options
- return this.updateExistingSubConfig({
- newConfig: {
- live: {
- enabled: true,
- allowReplay: allowReplay ?? true,
- transcoding: {
- enabled: transcoding ?? true,
- resolutions: ConfigCommand.getCustomConfigResolutions(resolutions === 'max')
- }
- }
- }
- })
- }
- disableTranscoding () {
- return this.updateExistingSubConfig({
- newConfig: {
- transcoding: {
- enabled: false
- },
- videoStudio: {
- enabled: false
- }
- }
- })
- }
- enableTranscoding (webtorrent = true, hls = true) {
- return this.updateExistingSubConfig({
- newConfig: {
- transcoding: {
- enabled: true,
- allowAudioFiles: true,
- allowAdditionalExtensions: true,
- resolutions: ConfigCommand.getCustomConfigResolutions(true),
- webtorrent: {
- enabled: webtorrent
- },
- hls: {
- enabled: hls
- }
- }
- }
- })
- }
- enableMinimumTranscoding (webtorrent = true, hls = true) {
- return this.updateExistingSubConfig({
- newConfig: {
- transcoding: {
- enabled: true,
- resolutions: {
- ...ConfigCommand.getCustomConfigResolutions(false),
- '240p': true
- },
- webtorrent: {
- enabled: webtorrent
- },
- hls: {
- enabled: hls
- }
- }
- }
- })
- }
- enableStudio () {
- return this.updateExistingSubConfig({
- newConfig: {
- videoStudio: {
- enabled: true
- }
- }
- })
- }
- getConfig (options: OverrideCommandOptions = {}) {
- const path = '/api/v1/config'
- return this.getRequestBody<ServerConfig>({
- ...options,
- path,
- implicitToken: false,
- defaultExpectedStatus: HttpStatusCode.OK_200
- })
- }
- async getIndexHTMLConfig (options: OverrideCommandOptions = {}) {
- const text = await this.getRequestText({
- ...options,
- path: '/',
- implicitToken: false,
- defaultExpectedStatus: HttpStatusCode.OK_200
- })
- const match = text.match('<script type="application/javascript">window.PeerTubeServerConfig = (".+?")</script>')
- // We parse the string twice, first to extract the string and then to extract the JSON
- return JSON.parse(JSON.parse(match[1])) as ServerConfig
- }
- getAbout (options: OverrideCommandOptions = {}) {
- const path = '/api/v1/config/about'
- return this.getRequestBody<About>({
- ...options,
- path,
- implicitToken: false,
- defaultExpectedStatus: HttpStatusCode.OK_200
- })
- }
- getCustomConfig (options: OverrideCommandOptions = {}) {
- const path = '/api/v1/config/custom'
- return this.getRequestBody<CustomConfig>({
- ...options,
- path,
- implicitToken: true,
- defaultExpectedStatus: HttpStatusCode.OK_200
- })
- }
- updateCustomConfig (options: OverrideCommandOptions & {
- newCustomConfig: CustomConfig
- }) {
- const path = '/api/v1/config/custom'
- return this.putBodyRequest({
- ...options,
- path,
- fields: options.newCustomConfig,
- implicitToken: true,
- defaultExpectedStatus: HttpStatusCode.OK_200
- })
- }
- deleteCustomConfig (options: OverrideCommandOptions = {}) {
- const path = '/api/v1/config/custom'
- return this.deleteRequest({
- ...options,
- path,
- implicitToken: true,
- defaultExpectedStatus: HttpStatusCode.OK_200
- })
- }
- async updateExistingSubConfig (options: OverrideCommandOptions & {
- newConfig: DeepPartial<CustomConfig>
- }) {
- const existing = await this.getCustomConfig({ ...options, expectedStatus: HttpStatusCode.OK_200 })
- return this.updateCustomConfig({ ...options, newCustomConfig: merge({}, existing, options.newConfig) })
- }
- updateCustomSubConfig (options: OverrideCommandOptions & {
- newConfig: DeepPartial<CustomConfig>
- }) {
- const newCustomConfig: CustomConfig = {
- instance: {
- name: 'PeerTube updated',
- shortDescription: 'my short description',
- description: 'my super description',
- terms: 'my super terms',
- codeOfConduct: 'my super coc',
- creationReason: 'my super creation reason',
- moderationInformation: 'my super moderation information',
- administrator: 'Kuja',
- maintenanceLifetime: 'forever',
- businessModel: 'my super business model',
- hardwareInformation: '2vCore 3GB RAM',
- languages: [ 'en', 'es' ],
- categories: [ 1, 2 ],
- isNSFW: true,
- defaultNSFWPolicy: 'blur',
- defaultClientRoute: '/videos/recently-added',
- customizations: {
- javascript: 'alert("coucou")',
- css: 'body { background-color: red; }'
- }
- },
- theme: {
- default: 'default'
- },
- services: {
- twitter: {
- username: '@MySuperUsername',
- whitelisted: true
- }
- },
- client: {
- videos: {
- miniature: {
- preferAuthorDisplayName: false
- }
- },
- menu: {
- login: {
- redirectOnSingleExternalAuth: false
- }
- }
- },
- cache: {
- previews: {
- size: 2
- },
- captions: {
- size: 3
- },
- torrents: {
- size: 4
- }
- },
- signup: {
- enabled: false,
- limit: 5,
- requiresEmailVerification: false,
- minimumAge: 16
- },
- admin: {
- email: 'superadmin1@example.com'
- },
- contactForm: {
- enabled: true
- },
- user: {
- videoQuota: 5242881,
- videoQuotaDaily: 318742
- },
- videoChannels: {
- maxPerUser: 20
- },
- transcoding: {
- enabled: true,
- allowAdditionalExtensions: true,
- allowAudioFiles: true,
- threads: 1,
- concurrency: 3,
- profile: 'default',
- resolutions: {
- '0p': false,
- '144p': false,
- '240p': false,
- '360p': true,
- '480p': true,
- '720p': false,
- '1080p': false,
- '1440p': false,
- '2160p': false
- },
- alwaysTranscodeOriginalResolution: true,
- webtorrent: {
- enabled: true
- },
- hls: {
- enabled: false
- }
- },
- live: {
- enabled: true,
- allowReplay: false,
- latencySetting: {
- enabled: false
- },
- maxDuration: -1,
- maxInstanceLives: -1,
- maxUserLives: 50,
- transcoding: {
- enabled: true,
- threads: 4,
- profile: 'default',
- resolutions: {
- '144p': true,
- '240p': true,
- '360p': true,
- '480p': true,
- '720p': true,
- '1080p': true,
- '1440p': true,
- '2160p': true
- },
- alwaysTranscodeOriginalResolution: true
- }
- },
- videoStudio: {
- enabled: false
- },
- import: {
- videos: {
- concurrency: 3,
- http: {
- enabled: false
- },
- torrent: {
- enabled: false
- }
- },
- videoChannelSynchronization: {
- enabled: false,
- maxPerUser: 10
- }
- },
- trending: {
- videos: {
- algorithms: {
- enabled: [ 'hot', 'most-viewed', 'most-liked' ],
- default: 'hot'
- }
- }
- },
- autoBlacklist: {
- videos: {
- ofUsers: {
- enabled: false
- }
- }
- },
- followers: {
- instance: {
- enabled: true,
- manualApproval: false
- }
- },
- followings: {
- instance: {
- autoFollowBack: {
- enabled: false
- },
- autoFollowIndex: {
- indexUrl: 'https://instances.joinpeertube.org/api/v1/instances/hosts',
- enabled: false
- }
- }
- },
- broadcastMessage: {
- enabled: true,
- level: 'warning',
- message: 'hello',
- dismissable: true
- },
- search: {
- remoteUri: {
- users: true,
- anonymous: true
- },
- searchIndex: {
- enabled: true,
- url: 'https://search.joinpeertube.org',
- disableLocalSearch: true,
- isDefaultSearch: true
- }
- }
- }
- merge(newCustomConfig, options.newConfig)
- return this.updateCustomConfig({ ...options, newCustomConfig })
- }
- }
|