Allow to bulk force transcoding

pull/6346/head
Chocobozzz 2024-05-17 10:59:36 +02:00
parent 9784e93dc7
commit 57c94fb51c
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
4 changed files with 21 additions and 20 deletions

View File

@ -351,7 +351,7 @@ export class VideoListComponent extends RestTable <Video> implements OnInit {
}
private runTranscoding (videos: Video[], type: 'hls' | 'web-video') {
this.videoService.runTranscoding({ videoIds: videos.map(v => v.id), type, askForForceTranscodingIfNeeded: false })
this.videoService.runTranscoding({ videos, type, askForForceTranscodingIfNeeded: true })
.subscribe({
next: () => {
this.notifier.success($localize`Transcoding jobs created.`)

View File

@ -270,7 +270,7 @@ export class Video implements VideoServerModel {
}
canRunTranscoding (user: AuthUser) {
return this.canRunForcedTranscoding(user) && this.state.id !== VideoState.TO_TRANSCODE
return this.canRunForcedTranscoding(user)
}
canRunForcedTranscoding (user: AuthUser) {

View File

@ -1,6 +1,3 @@
import { SortMeta } from 'primeng/api'
import { from, Observable, of, throwError } 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 { AuthService, ComponentPaginationLight, ConfirmService, RestExtractor, RestService, ServerService, UserService } from '@app/core'
@ -16,7 +13,6 @@ import {
UserVideoRate,
UserVideoRateType,
UserVideoRateUpdate,
Video as VideoServerModel,
VideoChannel as VideoChannelServerModel,
VideoConstant,
VideoDetails as VideoDetailsServerModel,
@ -24,20 +20,24 @@ import {
VideoIncludeType,
VideoPrivacy,
VideoPrivacyType,
Video as VideoServerModel,
VideoSortField,
VideoSource,
VideoTranscodingCreate,
VideoUpdate
} from '@peertube/peertube-models'
import { SortMeta } from 'primeng/api'
import { from, Observable, of, throwError } from 'rxjs'
import { catchError, concatMap, map, switchMap, toArray } from 'rxjs/operators'
import { environment } from '../../../../environments/environment'
import { Account } from '../account/account.model'
import { AccountService } from '../account/account.service'
import { VideoChannel } from '../video-channel/video-channel.model'
import { VideoChannelService } from '../video-channel/video-channel.service'
import { VideoDetails } from './video-details.model'
import { VideoEdit } from './video-edit.model'
import { VideoPasswordService } from './video-password.service'
import { Video } from './video.model'
import { VideoChannel } from '../video-channel/video-channel.model'
import { VideoChannelService } from '../video-channel/video-channel.service'
export type CommonVideoParams = {
videoPagination?: ComponentPaginationLight
@ -332,27 +332,23 @@ export class VideoService {
}
runTranscoding (options: {
videoIds: (number | string)[]
videos: Video[]
type: 'hls' | 'web-video'
askForForceTranscodingIfNeeded: boolean
forceTranscoding?: boolean
}): Observable<any> {
const { videoIds, type, askForForceTranscodingIfNeeded, forceTranscoding } = options
if (askForForceTranscodingIfNeeded && videoIds.length !== 1) {
throw new Error('Cannot ask to force transcoding on multiple videos')
}
const { videos, type, askForForceTranscodingIfNeeded, forceTranscoding } = options
const body: VideoTranscodingCreate = { transcodingType: type, forceTranscoding }
return from(videoIds)
return from(videos)
.pipe(
concatMap(id => {
return this.authHttp.post(VideoService.BASE_VIDEO_URL + '/' + id + '/transcoding', body)
concatMap(video => {
return this.authHttp.post(VideoService.BASE_VIDEO_URL + '/' + video.uuid + '/transcoding', body)
.pipe(
catchError(err => {
if (askForForceTranscodingIfNeeded && err.error?.code === ServerErrorCode.VIDEO_ALREADY_BEING_TRANSCODED) {
const message = $localize`PeerTube considers this video is already being transcoded.` +
const message = $localize`PeerTube considers video "${video.name}" is already being transcoded.` +
// eslint-disable-next-line max-len
$localize` If you think PeerTube is wrong (video in broken state after a crash etc.), you can force transcoding on this video.` +
` Do you still want to run transcoding?`
@ -362,7 +358,12 @@ export class VideoService {
switchMap(res => {
if (res === false) return throwError(() => err)
return this.runTranscoding({ videoIds, type, askForForceTranscodingIfNeeded: false, forceTranscoding: true })
return this.runTranscoding({
videos: [ video ],
type,
askForForceTranscodingIfNeeded: false,
forceTranscoding: true
})
})
)
}

View File

@ -335,7 +335,7 @@ export class VideoActionsDropdownComponent implements OnChanges {
}
runTranscoding (video: Video, type: 'hls' | 'web-video') {
this.videoService.runTranscoding({ videoIds: [ video.id ], type, askForForceTranscodingIfNeeded: true })
this.videoService.runTranscoding({ videos: [ video ], type, askForForceTranscodingIfNeeded: true })
.subscribe({
next: () => {
this.notifier.success($localize`Transcoding jobs created for "${video.name}".`)