import { SortMeta } from 'primeng/api'
-import { from, Observable } from 'rxjs'
+import { from, Observable, of } 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,
VideoInclude,
VideoPrivacy,
VideoSortField,
+ VideoTranscodingCreate,
VideoUpdate
} from '@shared/models'
+import { VideoSource } from '@shared/models/videos/video-source'
import { environment } from '../../../../environments/environment'
import { Account } from '../account/account.model'
import { AccountService } from '../account/account.service'
isLocal?: boolean
categoryOneOf?: number[]
languageOneOf?: string[]
+ privacyOneOf?: VideoPrivacy[]
isLive?: boolean
skipCount?: boolean
static BASE_SUBSCRIPTION_FEEDS_URL = environment.apiUrl + '/feeds/subscriptions.'
constructor (
+ private auth: AuthService,
private authHttp: HttpClient,
private restExtractor: RestExtractor,
private restService: RestService,
return `${VideoService.BASE_VIDEO_URL}/${uuid}/views`
}
- getUserWatchingVideoUrl (uuid: string) {
- return `${VideoService.BASE_VIDEO_URL}/${uuid}/watching`
- }
-
getVideo (options: { videoId: string }): Observable<VideoDetails> {
return this.serverService.getServerLocale()
.pipe(
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) {
)
}
- getAdminVideos (
- options: CommonVideoParams & { pagination: RestPagination, search?: string }
- ): Observable<ResultList<Video>> {
- 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<ResultList<Video>>(VideoService.BASE_VIDEO_URL, { params })
- .pipe(
- switchMap(res => this.extractVideos(res)),
- catchError(err => this.restExtractor.handleError(err))
- )
- }
-
getVideos (parameters: CommonVideoParams): Observable<ResultList<Video>> {
let params = new HttpParams()
params = this.buildCommonVideosParams({ params, ...parameters })
)
}
+ 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)
)
}
- setVideoLike (id: number) {
+ getSource (videoId: number) {
+ return this.authHttp
+ .get<{ source: VideoSource }>(VideoService.BASE_VIDEO_URL + '/' + videoId + '/source')
+ .pipe(
+ catchError(err => {
+ if (err.status === 404) {
+ return of(undefined)
+ }
+
+ this.restExtractor.handleError(err)
+ })
+ )
+ }
+
+ setVideoLike (id: string) {
return this.setVideoRate(id, 'like')
}
- setVideoDislike (id: number) {
+ setVideoDislike (id: string) {
return this.setVideoRate(id, 'dislike')
}
- unsetVideoLike (id: number) {
+ unsetVideoLike (id: string) {
return this.setVideoRate(id, 'none')
}
- getUserVideoRating (id: number) {
+ getUserVideoRating (id: string) {
const url = UserService.BASE_USERS_URL + 'me/videos/' + id + '/rating'
return this.authHttp.get<UserVideoRate>(url)
: '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,
include,
categoryOneOf,
languageOneOf,
+ privacyOneOf,
skipCount,
nsfwPolicy,
isLive,
? 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 + '')
- if (isLocal) newParams = newParams.set('isLocal', isLocal)
- if (include) newParams = newParams.set('include', include)
- if (isLive) newParams = newParams.set('isLive', isLive)
- if (nsfw) newParams = newParams.set('nsfw', nsfw)
- 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 (isLocal !== undefined) newParams = newParams.set('isLocal', isLocal)
+ if (include !== undefined) newParams = newParams.set('include', include)
+ if (isLive !== undefined) newParams = newParams.set('isLive', isLive)
+ if (nsfw !== undefined) newParams = newParams.set('nsfw', nsfw)
+ if (nsfwPolicy !== undefined) newParams = newParams.set('nsfw', this.nsfwPolicyToParam(nsfwPolicy))
+ if (languageOneOf !== undefined) newParams = this.restService.addArrayParams(newParams, 'languageOneOf', languageOneOf)
+ if (categoryOneOf !== undefined) newParams = this.restService.addArrayParams(newParams, 'categoryOneOf', categoryOneOf)
+ if (privacyOneOf !== undefined) 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`
- }
- ]
- },
-
- {
- title: $localize`Include/Exclude`,
- children: [
- {
- queryParams: { search: 'excludeMuted' },
- label: $localize`Exclude muted accounts`
- }
- ]
- }
- ]
- }
-
- private buildAdminParamsFromSearch (search: string, params: HttpParams) {
- let include = VideoInclude.BLACKLISTED |
- VideoInclude.BLOCKED_OWNER |
- VideoInclude.HIDDEN_PRIVACY |
- VideoInclude.NOT_PUBLISHED_STATE |
- VideoInclude.FILES
+ private buildListSort (sortArg: VideoSortField | SortMeta) {
+ const sort = this.restService.buildSortString(sortArg)
- 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 (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')
}
- })
- if (filters.excludeMuted) {
- include &= ~VideoInclude.BLOCKED_OWNER
+ return sort
+ }
+ }
- filters.excludeMuted = undefined
+ private setVideoRate (id: string, 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)))
}
}