X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2Fshared%2Fshared-main%2Fvideo%2Fvideo.service.ts;h=1423675068de65ff1633abf291aaab2cd123f3cf;hb=db129781cabca2c66d18cd1dcdfe40f87e9ec030;hp=b7c563dca3552f0d7b2faf3ece514a78662f0a8f;hpb=231ff4af3bdb864d6bc66e487b12275e5f1fb44f;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/app/shared/shared-main/video/video.service.ts b/client/src/app/shared/shared-main/video/video.service.ts index b7c563dca..142367506 100644 --- a/client/src/app/shared/shared-main/video/video.service.ts +++ b/client/src/app/shared/shared-main/video/video.service.ts @@ -3,9 +3,8 @@ import { from, Observable } from 'rxjs' import { catchError, concatMap, map, switchMap, toArray } from 'rxjs/operators' import { HttpClient, HttpParams, HttpRequest } from '@angular/common/http' import { Injectable } from '@angular/core' -import { ComponentPaginationLight, RestExtractor, RestPagination, RestService, ServerService, UserService } from '@app/core' +import { AuthService, ComponentPaginationLight, RestExtractor, RestService, ServerService, UserService } from '@app/core' import { objectToFormData } from '@app/helpers' -import { AdvancedInputFilter } from '@app/shared/shared-forms' import { BooleanBothQuery, FeedFormat, @@ -22,6 +21,7 @@ import { VideoInclude, VideoPrivacy, VideoSortField, + VideoTranscodingCreate, VideoUpdate } from '@shared/models' import { environment } from '../../../../environments/environment' @@ -39,6 +39,7 @@ export type CommonVideoParams = { isLocal?: boolean categoryOneOf?: number[] languageOneOf?: string[] + privacyOneOf?: VideoPrivacy[] isLive?: boolean skipCount?: boolean @@ -54,6 +55,7 @@ export class VideoService { static BASE_SUBSCRIPTION_FEEDS_URL = environment.apiUrl + '/feeds/subscriptions.' constructor ( + private auth: AuthService, private authHttp: HttpClient, private restExtractor: RestExtractor, private restService: RestService, @@ -64,10 +66,6 @@ export class VideoService { return `${VideoService.BASE_VIDEO_URL}/${uuid}/views` } - getUserWatchingVideoUrl (uuid: string) { - return `${VideoService.BASE_VIDEO_URL}/${uuid}/watching` - } - getVideo (options: { videoId: string }): Observable { return this.serverService.getServerLocale() .pipe( @@ -113,10 +111,7 @@ export class VideoService { const data = objectToFormData(body) return this.authHttp.put(`${VideoService.BASE_VIDEO_URL}/${video.id}`, data) - .pipe( - map(this.restExtractor.extractDataBool), - catchError(err => this.restExtractor.handleError(err)) - ) + .pipe(catchError(err => this.restExtractor.handleError(err))) } uploadVideo (video: FormData) { @@ -204,27 +199,6 @@ export class VideoService { ) } - getAdminVideos ( - options: CommonVideoParams & { pagination: RestPagination, search?: string } - ): Observable> { - const { pagination, search } = options - - let params = new HttpParams() - params = this.buildCommonVideosParams({ params, ...options }) - - params = params.set('start', pagination.start.toString()) - .set('count', pagination.count.toString()) - - params = this.buildAdminParamsFromSearch(search, params) - - return this.authHttp - .get>(VideoService.BASE_VIDEO_URL, { params }) - .pipe( - switchMap(res => this.extractVideos(res)), - catchError(err => this.restExtractor.handleError(err)) - ) - } - getVideos (parameters: CommonVideoParams): Observable> { let params = new HttpParams() params = this.buildCommonVideosParams({ params, ...parameters }) @@ -320,6 +294,26 @@ export class VideoService { ) } + removeVideoFiles (videoIds: (number | string)[], type: 'hls' | 'webtorrent') { + return from(videoIds) + .pipe( + concatMap(id => this.authHttp.delete(VideoService.BASE_VIDEO_URL + '/' + id + '/' + type)), + toArray(), + catchError(err => this.restExtractor.handleError(err)) + ) + } + + runTranscoding (videoIds: (number | string)[], type: 'hls' | 'webtorrent') { + const body: VideoTranscodingCreate = { transcodingType: type } + + return from(videoIds) + .pipe( + concatMap(id => this.authHttp.post(VideoService.BASE_VIDEO_URL + '/' + id + '/transcoding', body)), + toArray(), + catchError(err => this.restExtractor.handleError(err)) + ) + } + loadCompleteDescription (descriptionPath: string) { return this.authHttp .get<{ description: string }>(environment.apiUrl + descriptionPath) @@ -405,21 +399,7 @@ export class VideoService { : 'both' } - private setVideoRate (id: number, rateType: UserVideoRateType) { - const url = `${VideoService.BASE_VIDEO_URL}/${id}/rate` - const body: UserVideoRateUpdate = { - rating: rateType - } - - return this.authHttp - .put(url, body) - .pipe( - map(this.restExtractor.extractDataBool), - catchError(err => this.restExtractor.handleError(err)) - ) - } - - private buildCommonVideosParams (options: CommonVideoParams & { params: HttpParams }) { + buildCommonVideosParams (options: CommonVideoParams & { params: HttpParams }) { const { params, videoPagination, @@ -428,6 +408,7 @@ export class VideoService { include, categoryOneOf, languageOneOf, + privacyOneOf, skipCount, nsfwPolicy, isLive, @@ -438,7 +419,7 @@ export class VideoService { ? this.restService.componentToRestPagination(videoPagination) : undefined - let newParams = this.restService.addRestGetParams(params, pagination, sort) + let newParams = this.restService.addRestGetParams(params, pagination, this.buildListSort(sort)) if (skipCount) newParams = newParams.set('skipCount', skipCount + '') @@ -449,64 +430,35 @@ export class VideoService { if (nsfwPolicy) newParams = newParams.set('nsfw', this.nsfwPolicyToParam(nsfwPolicy)) if (languageOneOf) newParams = this.restService.addArrayParams(newParams, 'languageOneOf', languageOneOf) if (categoryOneOf) newParams = this.restService.addArrayParams(newParams, 'categoryOneOf', categoryOneOf) + if (privacyOneOf) newParams = this.restService.addArrayParams(newParams, 'privacyOneOf', privacyOneOf) return newParams } - buildAdminInputFilter (): AdvancedInputFilter[] { - return [ - { - title: $localize`Videos scope`, - children: [ - { - queryParams: { search: 'isLocal:false' }, - label: $localize`Remote videos` - }, - { - queryParams: { search: 'isLocal:true' }, - label: $localize`Local videos` - } - ] - }, + private buildListSort (sortArg: VideoSortField | SortMeta) { + const sort = this.restService.buildSortString(sortArg) - { - title: $localize`Include/Exclude`, - children: [ - { - queryParams: { search: 'excludeMuted' }, - label: $localize`Exclude muted accounts` - } - ] + if (typeof sort === 'string') { + // Silently use the best algorithm for logged in users if they chose the hot algorithm + if ( + this.auth.isLoggedIn() && + (sort === 'hot' || sort === '-hot') + ) { + return sort.replace('hot', 'best') } - ] - } - - private buildAdminParamsFromSearch (search: string, params: HttpParams) { - let include = VideoInclude.BLACKLISTED | - VideoInclude.BLOCKED_OWNER | - VideoInclude.HIDDEN_PRIVACY | - VideoInclude.NOT_PUBLISHED_STATE | - VideoInclude.FILES - - if (!search) return this.restService.addObjectParams(params, { include }) - - const filters = this.restService.parseQueryStringFilter(search, { - isLocal: { - prefix: 'isLocal:', - isBoolean: true - }, - excludeMuted: { - prefix: 'excludeMuted', - handler: () => true - } - }) - if (filters.excludeMuted) { - include &= ~VideoInclude.BLOCKED_OWNER + return sort + } + } - filters.excludeMuted = undefined + private setVideoRate (id: number, rateType: UserVideoRateType) { + const url = `${VideoService.BASE_VIDEO_URL}/${id}/rate` + const body: UserVideoRateUpdate = { + rating: rateType } - return this.restService.addObjectParams(params, { ...filters, include }) + return this.authHttp + .put(url, body) + .pipe(catchError(err => this.restExtractor.handleError(err))) } }