X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2Fshared%2Fshared-video-miniature%2Fvideo-actions-dropdown.component.ts;h=ed6a4afc0f90c3980c0531f2fe223c91a33e38ef;hb=2b0d17ccf46cfdba4103b7287f0dadf289ad4faf;hp=eff56b40e49802f788998812033e9ea7a1f4dda5;hpb=3cfa817672657df18260ece5b354efa0f3b6e317;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/app/shared/shared-video-miniature/video-actions-dropdown.component.ts b/client/src/app/shared/shared-video-miniature/video-actions-dropdown.component.ts index eff56b40e..ed6a4afc0 100644 --- a/client/src/app/shared/shared-video-miniature/video-actions-dropdown.component.ts +++ b/client/src/app/shared/shared-video-miniature/video-actions-dropdown.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, Input, OnChanges, Output, ViewChild } from '@angular/core' -import { AuthService, ConfirmService, Notifier, ScreenService } from '@app/core' +import { AuthService, ConfirmService, Notifier, ScreenService, ServerService } from '@app/core' import { BlocklistService, VideoBlockComponent, VideoBlockService, VideoReportComponent } from '@app/shared/shared-moderation' import { NgbDropdown } from '@ng-bootstrap/ng-bootstrap' import { VideoCaption } from '@shared/models' @@ -27,6 +27,10 @@ export type VideoActionsDisplayType = { duplicate?: boolean mute?: boolean liveInfo?: boolean + removeFiles?: boolean + transcoding?: boolean + studio?: boolean + stats?: boolean } @Component({ @@ -55,9 +59,14 @@ export class VideoActionsDropdownComponent implements OnChanges { report: true, duplicate: true, mute: true, - liveInfo: false + liveInfo: false, + removeFiles: false, + transcoding: false, + studio: true, + stats: true } @Input() placement = 'left' + @Input() moreActions: DropdownAction<{ video: Video }>[][] = [] @Input() label: string @@ -65,10 +74,12 @@ export class VideoActionsDropdownComponent implements OnChanges { @Input() buttonSize: DropdownButtonSize = 'normal' @Input() buttonDirection: DropdownDirection = 'vertical' + @Output() videoFilesRemoved = new EventEmitter() @Output() videoRemoved = new EventEmitter() @Output() videoUnblocked = new EventEmitter() @Output() videoBlocked = new EventEmitter() @Output() videoAccountMuted = new EventEmitter() + @Output() transcodingCreated = new EventEmitter() @Output() modalOpened = new EventEmitter() videoActions: DropdownAction<{ video: Video }>[][] = [] @@ -83,7 +94,8 @@ export class VideoActionsDropdownComponent implements OnChanges { private videoBlocklistService: VideoBlockService, private screenService: ScreenService, private videoService: VideoService, - private redundancyService: RedundancyService + private redundancyService: RedundancyService, + private serverService: ServerService ) { } get user () { @@ -143,6 +155,14 @@ export class VideoActionsDropdownComponent implements OnChanges { return this.video.isUpdatableBy(this.user) } + isVideoEditable () { + return this.video.isEditableBy(this.user, this.serverService.getHTMLConfig().videoStudio.enabled) + } + + isVideoStatsAvailable () { + return this.video.canSeeStats(this.user) + } + isVideoRemovable () { return this.video.isRemovableBy(this.user) } @@ -174,6 +194,14 @@ export class VideoActionsDropdownComponent implements OnChanges { return this.video.account.id !== this.user.account.id } + canRemoveVideoFiles () { + return this.video.canRemoveFiles(this.user) + } + + canRunTranscoding () { + return this.video.canRunTranscoding(this.user) + } + /* Action handlers */ async unblockVideo () { @@ -245,6 +273,35 @@ export class VideoActionsDropdownComponent implements OnChanges { }) } + async removeVideoFiles (video: Video, type: 'hls' | 'webtorrent') { + const confirmMessage = $localize`Do you really want to remove "${this.video.name}" files?` + + const res = await this.confirmService.confirm(confirmMessage, $localize`Remove "${this.video.name}" files`) + if (res === false) return + + this.videoService.removeVideoFiles([ video.id ], type) + .subscribe({ + next: () => { + this.notifier.success($localize`Removed files of ${video.name}.`) + this.videoFilesRemoved.emit() + }, + + error: err => this.notifier.error(err.message) + }) + } + + runTranscoding (video: Video, type: 'hls' | 'webtorrent') { + this.videoService.runTranscoding([ video.id ], type) + .subscribe({ + next: () => { + this.notifier.success($localize`Transcoding jobs created for ${video.name}.`) + this.transcodingCreated.emit() + }, + + error: err => this.notifier.error(err.message) + }) + } + onVideoBlocked () { this.videoBlocked.emit() } @@ -286,6 +343,18 @@ export class VideoActionsDropdownComponent implements OnChanges { iconName: 'edit', isDisplayed: () => this.authService.isLoggedIn() && this.displayOptions.update && this.isVideoUpdatable() }, + { + label: $localize`Studio`, + linkBuilder: ({ video }) => [ '/studio/edit', video.uuid ], + iconName: 'film', + isDisplayed: () => this.authService.isLoggedIn() && this.displayOptions.studio && this.isVideoEditable() + }, + { + label: $localize`Stats`, + linkBuilder: ({ video }) => [ '/stats/videos', video.uuid ], + iconName: 'stats', + isDisplayed: () => this.authService.isLoggedIn() && this.displayOptions.stats && this.isVideoStatsAvailable() + }, { label: $localize`Block`, handler: () => this.showBlockModal(), @@ -317,6 +386,32 @@ export class VideoActionsDropdownComponent implements OnChanges { iconName: 'flag' } ], + [ + { + label: $localize`Run HLS transcoding`, + handler: ({ video }) => this.runTranscoding(video, 'hls'), + isDisplayed: () => this.displayOptions.transcoding && this.canRunTranscoding(), + iconName: 'cog' + }, + { + label: $localize`Run WebTorrent transcoding`, + handler: ({ video }) => this.runTranscoding(video, 'webtorrent'), + isDisplayed: () => this.displayOptions.transcoding && this.canRunTranscoding(), + iconName: 'cog' + }, + { + label: $localize`Delete HLS files`, + handler: ({ video }) => this.removeVideoFiles(video, 'hls'), + isDisplayed: () => this.displayOptions.removeFiles && this.canRemoveVideoFiles(), + iconName: 'delete' + }, + { + label: $localize`Delete WebTorrent files`, + handler: ({ video }) => this.removeVideoFiles(video, 'webtorrent'), + isDisplayed: () => this.displayOptions.removeFiles && this.canRemoveVideoFiles(), + iconName: 'delete' + } + ], [ // actions regarding the account/its server { label: $localize`Mute account`, @@ -326,5 +421,7 @@ export class VideoActionsDropdownComponent implements OnChanges { } ] ] + + this.videoActions = this.videoActions.concat(this.moreActions) } }