X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2Fcore%2Fserver%2Fserver.service.ts;h=8e76bebb1c417dc037b68554568d0ce82a1e21e3;hb=5a71acd2547c098657ae6e0e31e0862094585088;hp=553ad8af6f8550cdf7dff72f643ffaf161b614ad;hpb=6de36768980ef6063b8fcd730b59fa685dd2b99c;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/app/core/server/server.service.ts b/client/src/app/core/server/server.service.ts index 553ad8af6..8e76bebb1 100644 --- a/client/src/app/core/server/server.service.ts +++ b/client/src/app/core/server/server.service.ts @@ -1,32 +1,74 @@ +import { map, shareReplay, switchMap, tap } from 'rxjs/operators' import { HttpClient } from '@angular/common/http' -import { Injectable } from '@angular/core' -import 'rxjs/add/operator/do' -import { ReplaySubject } from 'rxjs/ReplaySubject' -import { ServerConfig } from '../../../../../shared' -import { About } from '../../../../../shared/models/config/about.model' +import { Inject, Injectable, LOCALE_ID } from '@angular/core' +import { peertubeLocalStorage } from '@app/shared/misc/peertube-local-storage' +import { Observable, of, ReplaySubject } from 'rxjs' +import { getCompleteLocale, ServerConfig } from '../../../../../shared' import { environment } from '../../../environments/environment' +import { VideoConstant, VideoPrivacy } from '../../../../../shared/models/videos' +import { isDefaultLocale, peertubeTranslate } from '../../../../../shared/models/i18n' +import { getDevLocale, isOnDevLocale } from '@app/shared/i18n/i18n-utils' +import { sortBy } from '@app/shared/misc/utils' +import { VideoPlaylistPrivacy } from '@shared/models/videos/playlist/video-playlist-privacy.model' +import { cloneDeep } from 'lodash-es' @Injectable() export class ServerService { + private static BASE_SERVER_URL = environment.apiUrl + '/api/v1/server/' private static BASE_CONFIG_URL = environment.apiUrl + '/api/v1/config/' private static BASE_VIDEO_URL = environment.apiUrl + '/api/v1/videos/' + private static BASE_VIDEO_PLAYLIST_URL = environment.apiUrl + '/api/v1/video-playlists/' + private static BASE_LOCALE_URL = environment.apiUrl + '/client/locales/' private static CONFIG_LOCAL_STORAGE_KEY = 'server-config' + configLoaded = new ReplaySubject(1) videoPrivaciesLoaded = new ReplaySubject(1) + videoPlaylistPrivaciesLoaded = new ReplaySubject(1) videoCategoriesLoaded = new ReplaySubject(1) videoLicencesLoaded = new ReplaySubject(1) videoLanguagesLoaded = new ReplaySubject(1) + localeObservable: Observable private config: ServerConfig = { instance: { - name: 'PeerTube' + name: 'PeerTube', + shortDescription: 'PeerTube, a federated (ActivityPub) video streaming platform ' + + 'using P2P (BitTorrent) directly in the web browser with WebTorrent and Angular.', + defaultClientRoute: '', + isNSFW: false, + defaultNSFWPolicy: 'do_not_list' as 'do_not_list', + customizations: { + javascript: '', + css: '' + } + }, + plugin: { + registered: [] + }, + theme: { + registered: [], + default: 'default' + }, + email: { + enabled: false + }, + contactForm: { + enabled: false }, serverVersion: 'Unknown', signup: { - allowed: false + allowed: false, + allowedForCurrentIP: false, + requiresEmailVerification: false }, transcoding: { - enabledResolutions: [] + enabledResolutions: [], + hls: { + enabled: false + }, + webtorrent: { + enabled: true + } }, avatar: { file: { @@ -42,88 +84,167 @@ export class ServerService { file: { extensions: [] } + }, + videoCaption: { + file: { + size: { max: 0 }, + extensions: [] + } + }, + user: { + videoQuota: -1, + videoQuotaDaily: -1 + }, + import: { + videos: { + http: { + enabled: false + }, + torrent: { + enabled: false + } + } + }, + trending: { + videos: { + intervalDays: 0 + } + }, + autoBlacklist: { + videos: { + ofUsers: { + enabled: false + } + } + }, + tracker: { + enabled: true } } - private videoCategories: Array<{ id: number, label: string }> = [] - private videoLicences: Array<{ id: number, label: string }> = [] - private videoLanguages: Array<{ id: number, label: string }> = [] - private videoPrivacies: Array<{ id: number, label: string }> = [] + private videoCategories: Array> = [] + private videoLicences: Array> = [] + private videoLanguages: Array> = [] + private videoPrivacies: Array> = [] + private videoPlaylistPrivacies: Array> = [] - constructor (private http: HttpClient) { + constructor ( + private http: HttpClient, + @Inject(LOCALE_ID) private localeId: string + ) { + this.loadServerLocale() this.loadConfigLocally() } loadConfig () { this.http.get(ServerService.BASE_CONFIG_URL) - .do(this.saveConfigLocally) - .subscribe(data => this.config = data) + .pipe(tap(this.saveConfigLocally)) + .subscribe(data => { + this.config = data + + this.configLoaded.next(true) + }) } loadVideoCategories () { - return this.loadVideoAttributeEnum('categories', this.videoCategories, this.videoCategoriesLoaded) + return this.loadAttributeEnum(ServerService.BASE_VIDEO_URL, 'categories', this.videoCategories, this.videoCategoriesLoaded, true) } loadVideoLicences () { - return this.loadVideoAttributeEnum('licences', this.videoLicences, this.videoLicencesLoaded) + return this.loadAttributeEnum(ServerService.BASE_VIDEO_URL, 'licences', this.videoLicences, this.videoLicencesLoaded) } loadVideoLanguages () { - return this.loadVideoAttributeEnum('languages', this.videoLanguages, this.videoLanguagesLoaded) + return this.loadAttributeEnum(ServerService.BASE_VIDEO_URL, 'languages', this.videoLanguages, this.videoLanguagesLoaded, true) } loadVideoPrivacies () { - return this.loadVideoAttributeEnum('privacies', this.videoPrivacies, this.videoPrivaciesLoaded) + return this.loadAttributeEnum(ServerService.BASE_VIDEO_URL, 'privacies', this.videoPrivacies, this.videoPrivaciesLoaded) + } + + loadVideoPlaylistPrivacies () { + return this.loadAttributeEnum( + ServerService.BASE_VIDEO_PLAYLIST_URL, + 'privacies', + this.videoPlaylistPrivacies, + this.videoPlaylistPrivaciesLoaded + ) } getConfig () { - return this.config + return cloneDeep(this.config) } getVideoCategories () { - return this.videoCategories + return cloneDeep(this.videoCategories) } getVideoLicences () { - return this.videoLicences + return cloneDeep(this.videoLicences) } getVideoLanguages () { - return this.videoLanguages + return cloneDeep(this.videoLanguages) } getVideoPrivacies () { - return this.videoPrivacies + return cloneDeep(this.videoPrivacies) } - getAbout () { - return this.http.get(ServerService.BASE_CONFIG_URL + '/about') + getVideoPlaylistPrivacies () { + return cloneDeep(this.videoPlaylistPrivacies) } - private loadVideoAttributeEnum ( + private loadAttributeEnum ( + baseUrl: string, attributeName: 'categories' | 'licences' | 'languages' | 'privacies', - hashToPopulate: { id: number, label: string }[], - notifier: ReplaySubject + hashToPopulate: VideoConstant[], + notifier: ReplaySubject, + sort = false ) { - return this.http.get(ServerService.BASE_VIDEO_URL + attributeName) - .subscribe(data => { - Object.keys(data) - .forEach(dataKey => { - hashToPopulate.push({ - id: parseInt(dataKey, 10), - label: data[dataKey] - }) - }) + this.localeObservable + .pipe( + switchMap(translations => { + return this.http.get<{ [id: string]: string }>(baseUrl + attributeName) + .pipe(map(data => ({ data, translations }))) + }) + ) + .subscribe(({ data, translations }) => { + Object.keys(data) + .forEach(dataKey => { + const label = data[ dataKey ] + + hashToPopulate.push({ + id: attributeName === 'languages' ? dataKey : parseInt(dataKey, 10), + label: peertubeTranslate(label, translations) + }) + }) + + if (sort === true) sortBy(hashToPopulate, 'label') + + notifier.next(true) + }) + } + + private loadServerLocale () { + const completeLocale = isOnDevLocale() ? getDevLocale() : getCompleteLocale(this.localeId) + + // Default locale, nothing to translate + if (isDefaultLocale(completeLocale)) { + this.localeObservable = of({}).pipe(shareReplay()) + return + } - notifier.next(true) - }) + this.localeObservable = this.http + .get(ServerService.BASE_LOCALE_URL + completeLocale + '/server.json') + .pipe(shareReplay()) } private saveConfigLocally (config: ServerConfig) { - localStorage.setItem(ServerService.CONFIG_LOCAL_STORAGE_KEY, JSON.stringify(config)) + peertubeLocalStorage.setItem(ServerService.CONFIG_LOCAL_STORAGE_KEY, JSON.stringify(config)) } private loadConfigLocally () { - const configString = localStorage.getItem(ServerService.CONFIG_LOCAL_STORAGE_KEY) + const configString = peertubeLocalStorage.getItem(ServerService.CONFIG_LOCAL_STORAGE_KEY) if (configString) { try {