<div class="row">
<div class="col-md-12 col-xl-6">
+
<div class="about-instance-title">
- <div i18n>About {{ instanceName }} instance</div>
+ <div i18n class="title">About {{ instanceName }} instance</div>
<div *ngIf="isContactFormEnabled" (click)="openContactModal()" i18n role="button" class="contact-admin">Contact administrator</div>
</div>
<div *ngIf="isNSFW" class="dedicated-to-nsfw">This instance is dedicated to sensitive/NSFW content.</div>
</div>
- <div class="description">
+ <div class="middle-title" *ngIf="html.administrator || maintenanceLifetime || businessModel">
+ Administrators & sustainability
+ </div>
+
+ <div class="block administrator" *ngIf="html.administrator">
+ <div i18n class="section-title">Instance administrators</div>
+
+ <div [innerHTML]="html.administrator"></div>
+ </div>
+
+ <div class="block maintenance-lifetime" *ngIf="maintenanceLifetime">
+ <div i18n class="section-title">Maintenance lifetime</div>
+
+ <p>{{ maintenanceLifetime }}</p>
+ </div>
+
+ <div class="block business-model" *ngIf="businessModel">
+ <div i18n class="section-title">Business model</div>
+
+ <p>{{ businessModel }}</p>
+ </div>
+
+ <div class="middle-title" *ngIf="html.description">
+ Information
+ </div>
+
+ <div class="block description">
<div i18n class="section-title">Description</div>
- <div [innerHTML]="descriptionHTML"></div>
+ <div [innerHTML]="html.description"></div>
+ </div>
+
+ <div class="middle-title" *ngIf="html.moderationInformation || html.codeOfConduct || html.terms">
+ Moderation
+ </div>
+
+ <div class="block moderation-information" *ngIf="html.moderationInformation">
+ <div i18n class="section-title">Moderation information</div>
+
+ <div [innerHTML]="html.moderationInformation"></div>
+ </div>
+
+ <div class="block code-of-conduct" *ngIf="html.codeOfConduct">
+ <div i18n class="section-title">Code of conduct</div>
+
+ <div [innerHTML]="html.codeOfConduct"></div>
</div>
- <div class="terms" id="terms-section">
+ <div class="block terms" id="terms-section">
<div i18n class="section-title">Terms</div>
- <div [innerHTML]="termsHTML"></div>
+ <div [innerHTML]="html.terms"></div>
</div>
</div>
display: flex;
justify-content: space-between;
- & > div {
+ .title {
font-size: 20px;
- font-weight: bold;
margin-bottom: 15px;
+ font-weight: $font-semibold;
}
- & > .contact-admin {
+ .contact-admin {
@include peertube-button;
@include orange-button;
.section-title {
font-weight: $font-semibold;
- font-size: 20px;
+ font-size: 16px;
margin-bottom: 5px;
+ display: flex;
+ align-items: center;
+}
+
+.middle-title {
+ @include in-content-small-title;
+
+ margin-top: 45px;
+ margin-bottom: 25px;
}
-.short-description, .description, .terms, .signup {
+.block {
margin-bottom: 30px;
}
@ViewChild('contactAdminModal', { static: true }) contactAdminModal: ContactAdminModalComponent
shortDescription = ''
- descriptionHTML = ''
- termsHTML = ''
+
+ html = {
+ description: '',
+ terms: '',
+ codeOfConduct: '',
+ moderationInformation: '',
+ administrator: ''
+ }
+
+ maintenanceLifetime = ''
+ businessModel = ''
+
+ languages: string[] = []
+ categories: number[] = []
constructor (
private notifier: Notifier,
async res => {
this.shortDescription = res.instance.shortDescription
- this.descriptionHTML = await this.markdownService.textMarkdownToHTML(res.instance.description)
- this.termsHTML = await this.markdownService.textMarkdownToHTML(res.instance.terms)
+ this.maintenanceLifetime = res.instance.maintenanceLifetime
+ this.businessModel = res.instance.businessModel
+
+ for (const key of [ 'description', 'terms', 'codeOfConduct', 'moderationInformation', 'administrator' ]) {
+ this.html[key] = await this.markdownService.textMarkdownToHTML(res.instance[key])
+ }
+
+ this.languages = res.instance.languages
+ this.categories = res.instance.categories
},
() => this.notifier.error(this.i18n('Cannot get about information from server'))
<ngb-tabset class="root-tabset bootstrap">
- <ngb-tab i18n-title title="Basic configuration">
+ <ngb-tab i18n-title title="Instance information">
<ng-template ngbTabContent>
- <div i18n class="inner-form-title">Instance</div>
-
<ng-container formGroupName="instance">
+
+ <div i18n class="inner-form-title">Instance</div>
+
<div class="form-group">
<label i18n for="instanceName">Name</label>
<input
</div>
<div class="form-group">
- <label i18n for="instanceTerms">Terms</label><my-help helpType="markdownText"></my-help>
- <my-markdown-textarea
- id="instanceTerms" formControlName="terms" textareaWidth="500px" [previewColumn]="true"
- [ngClass]="{ 'input-error': formErrors['instance.terms'] }"
- ></my-markdown-textarea>
- <div *ngIf="formErrors.instance.terms" class="form-error">{{ formErrors.instance.terms }}</div>
+ <label i18n for="instanceCategories">Main instance categories</label>
+
+ <div>
+ <p-multiSelect
+ inputId="instanceCategories" [options]="categoryItems" formControlName="categories" showToggleAll="false"
+ [defaultLabel]="getDefaultCategoryLabel()" [selectedItemsLabel]="getSelectedCategoryLabel()"
+ emptyFilterMessage="No results found" i18n-emptyFilterMessage
+ ></p-multiSelect>
+ </div>
</div>
+ <div class="form-group">
+ <label i18n for="instanceLanguages">Main languages you/your moderators speak</label>
+
+ <div>
+ <p-multiSelect
+ inputId="instanceLanguages" [options]="languageItems" formControlName="languages" showToggleAll="false"
+ [defaultLabel]="getDefaultLanguageLabel()" [selectedItemsLabel]="getSelectedLanguageLabel()"
+ emptyFilterMessage="No results found" i18n-emptyFilterMessage
+ ></p-multiSelect>
+ </div>
+ </div>
+
+ <div i18n class="inner-form-title">Moderation & NSFW</div>
+
<div class="form-group">
<my-peertube-checkbox
inputName="instanceIsNSFW" formControlName="isNSFW"
- i18n-labelText labelText="Dedicated to sensitive or NSFW content"
+ i18n-labelText labelText="This instance is dedicated to sensitive or NSFW content"
i18n-helpHtml helpHtml="Enabling it will allow other administrators to know that you are mainly federating sensitive content.<br /><br />
Moreover, the NSFW checkbox on video upload will be automatically checked by default."
></my-peertube-checkbox>
</div>
- <div class="form-group">
- <label i18n for="instanceDefaultClientRoute">Default client route</label>
- <div class="peertube-select-container">
- <select id="instanceDefaultClientRoute" formControlName="defaultClientRoute">
- <option i18n value="/videos/overview">Videos Overview</option>
- <option i18n value="/videos/trending">Videos Trending</option>
- <option i18n value="/videos/recently-added">Videos Recently Added</option>
- <option i18n value="/videos/local">Local videos</option>
- </select>
- </div>
- <div *ngIf="formErrors.instance.defaultClientRoute" class="form-error">{{ formErrors.instance.defaultClientRoute }}</div>
- </div>
-
<div class="form-group">
<label i18n for="instanceDefaultNSFWPolicy">Policy on videos containing sensitive content</label>
<my-help
</div>
<div *ngIf="formErrors.instance.defaultNSFWPolicy" class="form-error">{{ formErrors.instance.defaultNSFWPolicy }}</div>
</div>
+
+ <div class="form-group">
+ <label i18n for="instanceTerms">Terms</label><my-help helpType="markdownText"></my-help>
+ <my-markdown-textarea
+ id="instanceTerms" formControlName="terms" textareaWidth="500px" [previewColumn]="true"
+ [ngClass]="{ 'input-error': formErrors['instance.terms'] }"
+ ></my-markdown-textarea>
+ <div *ngIf="formErrors.instance.terms" class="form-error">{{ formErrors.instance.terms }}</div>
+ </div>
+
+ <div class="form-group">
+ <label i18n for="instanceCodeOfConduct">Code of conduct</label><my-help helpType="markdownText"></my-help>
+ <my-markdown-textarea
+ id="instanceCodeOfConduct" formControlName="codeOfConduct" textareaWidth="500px" [previewColumn]="true"
+ [ngClass]="{ 'input-error': formErrors['instance.codeOfConduct'] }"
+ ></my-markdown-textarea>
+ <div *ngIf="formErrors.instance.codeOfConduct" class="form-error">{{ formErrors.instance.codeOfConduct }}</div>
+ </div>
+
+ <div class="form-group">
+ <label i18n for="instanceModerationInformation">Moderation information</label><my-help helpType="markdownText"></my-help>
+ <div class="label-small-info">Who moderates the instance? What is the policy regarding NSFW videos? Political videos? etc</div>
+
+ <my-markdown-textarea
+ id="instanceModerationInformation" formControlName="moderationInformation" textareaWidth="500px" [previewColumn]="true"
+ [ngClass]="{ 'input-error': formErrors['instance.moderationInformation'] }"
+ ></my-markdown-textarea>
+ <div *ngIf="formErrors.instance.moderationInformation" class="form-error">{{ formErrors.instance.moderationInformation }}</div>
+ </div>
+
+ <div i18n class="inner-form-title">You and your instance</div>
+
+ <div class="form-group">
+ <label i18n for="instanceAdministrator">Who is behind the instance? </label>
+ <div class="label-small-info">A single person? A non profit? A company?</div>
+
+ <textarea
+ id="instanceAdministrator" formControlName="administrator"
+ [ngClass]="{ 'input-error': formErrors['instance.administrator'] }"
+ ></textarea>
+ <div *ngIf="formErrors.instance.administrator" class="form-error">{{ formErrors.instance.administrator }}</div>
+ </div>
+
+ <div class="form-group">
+ <label i18n for="instanceMaintenanceLifetime">How long do you plan to maintain this instance?</label>
+ <div class="label-small-info">It's important to know for users who want to register on your instance</div>
+
+ <textarea
+ id="instanceMaintenanceLifetime" formControlName="maintenanceLifetime"
+ [ngClass]="{ 'input-error': formErrors['instance.maintenanceLifetime'] }"
+ ></textarea>
+ <div *ngIf="formErrors.instance.maintenanceLifetime" class="form-error">{{ formErrors.instance.maintenanceLifetime }}</div>
+ </div>
+
+ <div class="form-group">
+ <label i18n for="instanceBusinessModel">How will you pay the PeerTube instance server?</label>
+ <div class="label-small-info">With you own funds? With users donations? Advertising?</div>
+
+ <textarea
+ id="instanceBusinessModel" formControlName="businessModel"
+ [ngClass]="{ 'input-error': formErrors['instance.businessModel'] }"
+ ></textarea>
+ <div *ngIf="formErrors.instance.businessModel" class="form-error">{{ formErrors.instance.businessModel }}</div>
+ </div>
+
</ng-container>
+ </ng-template>
+ </ngb-tab>
+ <ngb-tab i18n-title title="Basic configuration">
+ <ng-template ngbTabContent>
- <div i18n class="inner-form-title">Theme</div>
+ <div i18n class="inner-form-title">Theme & Default route</div>
<ng-container formGroupName="theme">
<div class="form-group">
</ng-container>
+ <div class="form-group" formGroupName="instance">
+ <label i18n for="instanceDefaultClientRoute">Default client route</label>
+ <div class="peertube-select-container">
+ <select id="instanceDefaultClientRoute" formControlName="defaultClientRoute">
+ <option i18n value="/videos/overview">Videos Discover</option>
+ <option i18n value="/videos/trending">Videos Trending</option>
+ <option i18n value="/videos/recently-added">Videos Recently Added</option>
+ <option i18n value="/videos/local">Local videos</option>
+ </select>
+ </div>
+ <div *ngIf="formErrors.instance.defaultClientRoute" class="form-error">{{ formErrors.instance.defaultClientRoute }}</div>
+ </div>
+
<div i18n class="inner-form-title">Signup</div>
<ng-container formGroupName="signup">
@import '_variables';
@import '_mixins';
+.form-group {
+ margin-bottom: 25px;
+}
+
input[type=text] {
@include peertube-input-text(340px);
display: block;
height: 100px;
}
}
+
+.label-small-info {
+ font-style: italic;
+ margin-bottom: 10px;
+}
import { CustomConfig } from '../../../../../../shared/models/server/custom-config.model'
import { I18n } from '@ngx-translate/i18n-polyfill'
import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
+import { SelectItem } from 'primeng/api'
+import { forkJoin } from 'rxjs'
+import { first } from 'rxjs/operators'
@Component({
selector: 'my-edit-custom-config',
resolutions: { id: string, label: string }[] = []
transcodingThreadOptions: { label: string, value: number }[] = []
+ languageItems: SelectItem[] = []
+ categoryItems: SelectItem[] = []
+
constructor (
protected formValidatorService: FormValidatorService,
private customConfigValidatorsService: CustomConfigValidatorsService,
name: this.customConfigValidatorsService.INSTANCE_NAME,
shortDescription: this.customConfigValidatorsService.INSTANCE_SHORT_DESCRIPTION,
description: null,
- terms: null,
- defaultClientRoute: null,
+
isNSFW: false,
defaultNSFWPolicy: null,
+
+ terms: null,
+ codeOfConduct: null,
+ moderationInformation: null,
+ administrator: null,
+ maintenanceLifetime: null,
+ businessModel: null,
+
+ categories: null,
+ languages: null,
+
+ defaultClientRoute: null,
+
customizations: {
javascript: null,
css: null
this.buildForm(formGroupData)
- this.configService.getCustomConfig()
- .subscribe(
- res => {
- this.customConfig = res
+ forkJoin([
+ this.configService.getCustomConfig(),
+ this.serverService.videoLanguagesLoaded.pipe(first()), // First so the observable completes
+ this.serverService.videoCategoriesLoaded.pipe(first())
+ ]).subscribe(
+ ([ config ]) => {
+ this.customConfig = config
- this.updateForm()
- // Force form validation
- this.forceCheck()
- },
+ const languages = this.serverService.getVideoLanguages()
+ this.languageItems = languages.map(l => ({ label: l.label, value: l.id }))
- err => this.notifier.error(err.message)
- )
+ const categories = this.serverService.getVideoCategories()
+ this.categoryItems = categories.map(l => ({ label: l.label, value: l.id }))
+
+ this.updateForm()
+ // Force form validation
+ this.forceCheck()
+ },
+
+ err => this.notifier.error(err.message)
+ )
}
isTranscodingEnabled () {
)
}
+ getSelectedLanguageLabel () {
+ return this.i18n('{{\'{0} languages selected')
+ }
+
+ getDefaultLanguageLabel () {
+ return this.i18n('No language')
+ }
+
+ getSelectedCategoryLabel () {
+ return this.i18n('{{\'{0} categories selected')
+ }
+
+ getDefaultCategoryLabel () {
+ return this.i18n('No category')
+ }
+
private updateForm () {
this.form.patchValue(this.customConfig)
}
-
}
<div>
<p-multiSelect
- [options]="languageItems" formControlName="videoLanguages" showToggleAll="true"
+ inputId="videoLanguages" [options]="languageItems" formControlName="videoLanguages" showToggleAll="true"
[defaultLabel]="getDefaultVideoLanguageLabel()" [selectedItemsLabel]="getSelectedVideoLanguageLabel()"
emptyFilterMessage="No results found" i18n-emptyFilterMessage
></p-multiSelect>
import { FormReactive, User, UserService } from '../../../shared'
import { I18n } from '@ngx-translate/i18n-polyfill'
import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
-import { Subject } from 'rxjs'
+import { forkJoin, Subject } from 'rxjs'
import { SelectItem } from 'primeng/api'
-import { switchMap } from 'rxjs/operators'
+import { first } from 'rxjs/operators'
@Component({
selector: 'my-account-video-settings',
videoLanguages: null
})
- this.serverService.videoLanguagesLoaded
- .pipe(switchMap(() => this.userInformationLoaded))
- .subscribe(() => {
- const languages = this.serverService.getVideoLanguages()
-
- this.languageItems = [ { label: this.i18n('Unknown language'), value: '_unknown' } ]
- this.languageItems = this.languageItems
- .concat(languages.map(l => ({ label: l.label, value: l.id })))
-
- const videoLanguages = this.user.videoLanguages
- ? this.user.videoLanguages
- : this.languageItems.map(l => l.value)
-
- this.form.patchValue({
- nsfwPolicy: this.user.nsfwPolicy,
- webTorrentEnabled: this.user.webTorrentEnabled,
- autoPlayVideo: this.user.autoPlayVideo === true,
- videoLanguages
- })
- })
+ forkJoin([
+ this.serverService.videoLanguagesLoaded.pipe(first()),
+ this.userInformationLoaded.pipe(first())
+ ]).subscribe(() => {
+ const languages = this.serverService.getVideoLanguages()
+
+ this.languageItems = [ { label: this.i18n('Unknown language'), value: '_unknown' } ]
+ this.languageItems = this.languageItems
+ .concat(languages.map(l => ({ label: l.label, value: l.id })))
+
+ const videoLanguages = this.user.videoLanguages
+ ? this.user.videoLanguages
+ : this.languageItems.map(l => l.value)
+
+ this.form.patchValue({
+ nsfwPolicy: this.user.nsfwPolicy,
+ webTorrentEnabled: this.user.webTorrentEnabled,
+ autoPlayVideo: this.user.autoPlayVideo === true,
+ videoLanguages
+ })
+ })
}
updateDetails () {
- const nsfwPolicy = this.form.value['nsfwPolicy']
+ const nsfwPolicy = this.form.value[ 'nsfwPolicy' ]
const webTorrentEnabled = this.form.value['webTorrentEnabled']
const autoPlayVideo = this.form.value['autoPlayVideo']
} from '@app/+my-account/my-account-video-playlists/my-account-video-playlist-elements.component'
import { DragDropModule } from '@angular/cdk/drag-drop'
import { MyAccountChangeEmailComponent } from '@app/+my-account/my-account-settings/my-account-change-email'
-import { MultiSelectModule } from 'primeng/multiselect'
import { MyAccountInterfaceSettingsComponent } from '@app/+my-account/my-account-settings/my-account-interface'
@NgModule({
SharedModule,
TableModule,
InputSwitchModule,
- DragDropModule,
- MultiSelectModule
+ DragDropModule
],
declarations: [
import { MarkdownTextareaComponent } from '@app/shared/forms/markdown-textarea.component'
import { HelpComponent } from '@app/shared/misc/help.component'
import { InfiniteScrollerDirective } from '@app/shared/video/infinite-scroller.directive'
-
import { BytesPipe, KeysPipe, NgPipesModule } from 'ngx-pipes'
import { SharedModule as PrimeSharedModule } from 'primeng/components/common/shared'
-
import { AUTH_INTERCEPTOR_PROVIDER } from './auth'
import { ButtonComponent } from './buttons/button.component'
import { DeleteButtonComponent } from './buttons/delete-button.component'
import { VideoReportComponent } from '@app/shared/video/modals/video-report.component'
import { ClipboardModule } from 'ngx-clipboard'
import { FollowService } from '@app/shared/instance/follow.service'
+import { MultiSelectModule } from 'primeng/multiselect'
@NgModule({
imports: [
PrimeSharedModule,
InputMaskModule,
- NgPipesModule
+ NgPipesModule,
+ MultiSelectModule
],
declarations: [
InputMaskModule,
BytesPipe,
KeysPipe,
+ MultiSelectModule,
LoaderComponent,
SmallLoaderComponent,
short_description: 'PeerTube, a federated (ActivityPub) video streaming platform using P2P (BitTorrent) directly in the web browser with WebTorrent and Angular.'
description: 'Welcome to this PeerTube instance!' # Support markdown
terms: 'No terms for now.' # Support markdown
+ code_of_conduct: '' # Supports markdown
+
+ # Who moderates the instance? What is the policy regarding NSFW videos? Political videos? etc
+ moderation_information: '' # Supports markdown
+
+ # Who is behind the instance? A single person? A non profit?
+ administrator: ''
+
+ # How long do you plan to maintain this instance?
+ maintenance_lifetime: ''
+
+ # How will you pay the PeerTube instance server? With you own funds? With users donations? Advertising?
+ business_model: ''
+
+ # What are the main languages of your instance? To interact with your users for example
+ # Uncomment or add the languages you want
+ # List of supported languages: https://peertube.cpy.re/api/v1/videos/languages
+ languages:
+# - en
+# - es
+# - fr
+
+ # You can specify the main categories of your instance (dedicated to music, gaming or politics etc)
+ # Uncomment or add the category ids you want
+ # List of supported categories: https://peertube.cpy.re/api/v1/videos/categories
+ categories:
+# - 1 # Music
+# - 2 # Films
+# - 3 # Vehicles
+# - 4 # Art
+# - 5 # Sports
+# - 6 # Travels
+# - 7 # Gaming
+# - 8 # People
+# - 9 # Comedy
+# - 10 # Entertainment
+# - 11 # News & Politics
+# - 12 # How To
+# - 13 # Education
+# - 14 # Activism
+# - 15 # Science & Technology
+# - 16 # Animals
+# - 17 # Kids
+# - 18 # Food
+
default_client_route: '/videos/trending'
+
# Whether or not the instance is dedicated to NSFW content
# Enabling it will allow other administrators to know that you are mainly federating sensitive content
# Moreover, the NSFW checkbox on video upload will be automatically checked by default
# By default, "do_not_list" or "blur" or "display" NSFW videos
# Could be overridden per user with a setting
default_nsfw_policy: 'do_not_list'
+
customizations:
javascript: '' # Directly your JavaScript code (without <script> tags). Will be eval at runtime
css: '' # Directly your CSS code (without <style> tags). Will be injected at runtime
name: CONFIG.INSTANCE.NAME,
shortDescription: CONFIG.INSTANCE.SHORT_DESCRIPTION,
description: CONFIG.INSTANCE.DESCRIPTION,
- terms: CONFIG.INSTANCE.TERMS
+ terms: CONFIG.INSTANCE.TERMS,
+ codeOfConduct: CONFIG.INSTANCE.CODE_OF_CONDUCT,
+
+ moderationInformation: CONFIG.INSTANCE.MODERATION_INFORMATION,
+ administrator: CONFIG.INSTANCE.ADMINISTRATOR,
+ maintenanceLifetime: CONFIG.INSTANCE.MAINTENANCE_LIFETIME,
+ businessModel: CONFIG.INSTANCE.BUSINESS_MODEL,
+
+ languages: CONFIG.INSTANCE.LANGUAGES,
+ categories: CONFIG.INSTANCE.CATEGORIES
}
}
shortDescription: CONFIG.INSTANCE.SHORT_DESCRIPTION,
description: CONFIG.INSTANCE.DESCRIPTION,
terms: CONFIG.INSTANCE.TERMS,
+ codeOfConduct: CONFIG.INSTANCE.CODE_OF_CONDUCT,
+
+ moderationInformation: CONFIG.INSTANCE.MODERATION_INFORMATION,
+ administrator: CONFIG.INSTANCE.ADMINISTRATOR,
+ maintenanceLifetime: CONFIG.INSTANCE.MAINTENANCE_LIFETIME,
+ businessModel: CONFIG.INSTANCE.BUSINESS_MODEL,
+
+ languages: CONFIG.INSTANCE.LANGUAGES,
+ categories: CONFIG.INSTANCE.CATEGORIES,
+
isNSFW: CONFIG.INSTANCE.IS_NSFW,
defaultClientRoute: CONFIG.INSTANCE.DEFAULT_CLIENT_ROUTE,
defaultNSFWPolicy: CONFIG.INSTANCE.DEFAULT_NSFW_POLICY,
get SHORT_DESCRIPTION () { return config.get<string>('instance.short_description') },
get DESCRIPTION () { return config.get<string>('instance.description') },
get TERMS () { return config.get<string>('instance.terms') },
+ get CODE_OF_CONDUCT () { return config.get<string>('instance.code_of_conduct') },
+
+ get MODERATION_INFORMATION () { return config.get<string>('instance.moderation_information') },
+ get ADMINISTRATOR () { return config.get<string>('instance.administrator') },
+ get MAINTENANCE_LIFETIME () { return config.get<string>('instance.maintenance_lifetime') },
+ get BUSINESS_MODEL () { return config.get<string>('instance.business_model') },
+
+ get LANGUAGES () { return config.get<string[]>('instance.languages') || [] },
+ get CATEGORIES () { return config.get<number[]>('instance.categories') || [] },
+
get IS_NSFW () { return config.get<boolean>('instance.is_nsfw') },
get DEFAULT_CLIENT_ROUTE () { return config.get<string>('instance.default_client_route') },
get DEFAULT_NSFW_POLICY () { return config.get<NSFWPolicyType>('instance.default_nsfw_policy') },
shortDescription: 'my short description',
description: 'my super description',
terms: 'my super terms',
+ codeOfConduct: 'my super coc',
+
+ moderationInformation: 'my super moderation information',
+ administrator: 'Kuja',
+ maintenanceLifetime: 'forever',
+ businessModel: 'my super business model',
+
+ languages: [ 'en', 'es' ],
+ categories: [ 1, 2 ],
+
isNSFW: true,
defaultClientRoute: '/videos/recently-added',
defaultNSFWPolicy: 'blur',
'with WebTorrent and Angular.'
)
expect(data.instance.description).to.equal('Welcome to this PeerTube instance!')
+
expect(data.instance.terms).to.equal('No terms for now.')
+ expect(data.instance.codeOfConduct).to.be.empty
+ expect(data.instance.moderationInformation).to.be.empty
+ expect(data.instance.administrator).to.be.empty
+ expect(data.instance.maintenanceLifetime).to.be.empty
+ expect(data.instance.businessModel).to.be.empty
+
+ expect(data.instance.languages).to.have.lengthOf(0)
+ expect(data.instance.categories).to.have.lengthOf(0)
+
expect(data.instance.defaultClientRoute).to.equal('/videos/trending')
expect(data.instance.isNSFW).to.be.false
expect(data.instance.defaultNSFWPolicy).to.equal('display')
expect(data.instance.name).to.equal('PeerTube updated')
expect(data.instance.shortDescription).to.equal('my short description')
expect(data.instance.description).to.equal('my super description')
+
expect(data.instance.terms).to.equal('my super terms')
+ expect(data.instance.codeOfConduct).to.equal('my super coc')
+ expect(data.instance.moderationInformation).to.equal('my super moderation information')
+ expect(data.instance.administrator).to.equal('Kuja')
+ expect(data.instance.maintenanceLifetime).to.equal('forever')
+ expect(data.instance.businessModel).to.equal('my super business model')
+
+ expect(data.instance.languages).to.deep.equal([ 'en', 'es' ])
+ expect(data.instance.categories).to.deep.equal([ 1, 2 ])
+
expect(data.instance.defaultClientRoute).to.equal('/videos/recently-added')
expect(data.instance.isNSFW).to.be.true
expect(data.instance.defaultNSFWPolicy).to.equal('blur')
shortDescription: 'my short description',
description: 'my super description',
terms: 'my super terms',
+ codeOfConduct: 'my super coc',
+
+ moderationInformation: 'my super moderation information',
+ administrator: 'Kuja',
+ maintenanceLifetime: 'forever',
+ businessModel: 'my super business model',
+
+ languages: [ 'en', 'es' ],
+ categories: [ 1, 2 ],
+
defaultClientRoute: '/videos/recently-added',
isNSFW: true,
defaultNSFWPolicy: 'blur' as 'blur',
shortDescription: 'my short description',
description: 'my super description',
terms: 'my super terms',
+ codeOfConduct: 'my super coc',
+
+ moderationInformation: 'my super moderation information',
+ administrator: 'Kuja',
+ maintenanceLifetime: 'forever',
+ businessModel: 'my super business model',
+
+ languages: [ 'en', 'es' ],
+ categories: [ 1, 2 ],
+
defaultClientRoute: '/videos/recently-added',
isNSFW: true,
defaultNSFWPolicy: 'blur',
shortDescription: string
description: string
terms: string
+
+ codeOfConduct: string
+
+ moderationInformation: string
+ administrator: string
+ maintenanceLifetime: string
+ businessModel: string
+
+ languages: string[]
+ categories: number[]
}
}
shortDescription: string
description: string
terms: string
+ codeOfConduct: string
+
+ moderationInformation: string
+ administrator: string
+ maintenanceLifetime: string
+ businessModel: string
+
+ languages: string[]
+ categories: number[]
+
isNSFW: boolean
defaultClientRoute: string
defaultNSFWPolicy: NSFWPolicyType