+import { Observable, of, Subject } from 'rxjs'
import { first, map, share, shareReplay, switchMap, tap } from 'rxjs/operators'
import { HttpClient } from '@angular/common/http'
import { Inject, Injectable, LOCALE_ID } from '@angular/core'
-import { peertubeLocalStorage } from '@app/shared/misc/peertube-web-storage'
-import { Observable, of, Subject } from 'rxjs'
-import { getCompleteLocale, ServerConfig } from '../../../../../shared'
+import { getDevLocale, isOnDevLocale, sortBy } from '@app/helpers'
+import { peertubeLocalStorage } from '@root-helpers/peertube-web-storage'
+import { getCompleteLocale, isDefaultLocale, peertubeTranslate } from '@shared/core-utils/i18n'
+import { SearchTargetType, ServerConfig, ServerStats, VideoConstant } from '@shared/models'
import { environment } from '../../../environments/environment'
-import { VideoConstant } 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'
@Injectable()
export class ServerService {
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 BASE_STATS_URL = environment.apiUrl + '/api/v1/server/stats'
+
private static CONFIG_LOCAL_STORAGE_KEY = 'server-config'
- configReloaded = new Subject<void>()
+ configReloaded = new Subject<ServerConfig>()
private localeObservable: Observable<any>
private videoLicensesObservable: Observable<VideoConstant<number>[]>
}
},
plugin: {
- registered: []
+ registered: [],
+ registeredExternalAuths: [],
+ registeredIdAndPassAuths: []
},
theme: {
registered: [],
enabled: true
}
},
+ live: {
+ enabled: false,
+ transcoding: {
+ enabled: false,
+ enabledResolutions: []
+ }
+ },
avatar: {
file: {
size: { max: 0 },
},
tracker: {
enabled: true
+ },
+ followings: {
+ instance: {
+ autoFollowIndex: {
+ indexUrl: 'https://instances.joinpeertube.org'
+ }
+ }
+ },
+ broadcastMessage: {
+ enabled: false,
+ message: '',
+ level: 'info',
+ dismissable: false
+ },
+ search: {
+ remoteUri: {
+ users: true,
+ anonymous: false
+ },
+ searchIndex: {
+ enabled: false,
+ url: '',
+ disableLocalSearch: false,
+ isDefaultSearch: false
+ }
}
}
resetConfig () {
this.configLoaded = false
this.configReset = true
+
+ // Notify config update
+ this.getConfig().subscribe(() => {
+ // empty, to fire a reset config event
+ })
}
getConfig () {
if (!this.configObservable) {
this.configObservable = this.http.get<ServerConfig>(ServerService.BASE_CONFIG_URL)
.pipe(
- tap(this.saveConfigLocally),
- tap(() => this.configLoaded = true),
- tap(() => {
+ tap(config => this.saveConfigLocally(config)),
+ tap(config => {
+ this.config = config
+ this.configLoaded = true
+ }),
+ tap(config => {
if (this.configReset) {
- this.configReloaded.next()
+ this.configReloaded.next(config)
this.configReset = false
}
}),
return this.localeObservable.pipe(first())
}
+ getServerStats () {
+ return this.http.get<ServerStats>(ServerService.BASE_STATS_URL)
+ }
+
+ getDefaultSearchTarget (): Promise<SearchTargetType> {
+ return this.getConfig().pipe(
+ map(config => {
+ const searchIndexConfig = config.search.searchIndex
+
+ if (searchIndexConfig.enabled && (searchIndexConfig.isDefaultSearch || searchIndexConfig.disableLocalSearch)) {
+ return 'search-index'
+ }
+
+ return 'local'
+ })
+ ).toPromise()
+ }
+
private loadAttributeEnum <T extends string | number> (
baseUrl: string,
attributeName: 'categories' | 'licences' | 'languages' | 'privacies',
.pipe(map(data => ({ data, translations })))
}),
map(({ data, translations }) => {
- const hashToPopulate: VideoConstant<T>[] = []
-
- Object.keys(data)
- .forEach(dataKey => {
- const label = data[ dataKey ]
-
- hashToPopulate.push({
- id: (attributeName === 'languages' ? dataKey : parseInt(dataKey, 10)) as T,
- label: peertubeTranslate(label, translations)
- })
- })
+ const hashToPopulate: VideoConstant<T>[] = Object.keys(data)
+ .map(dataKey => {
+ const label = data[ dataKey ]
+
+ const id = attributeName === 'languages'
+ ? dataKey as T
+ : parseInt(dataKey, 10) as T
+
+ return {
+ id,
+ label: peertubeTranslate(label, translations)
+ }
+ })
if (sort === true) sortBy(hashToPopulate, 'label')