mirror of https://github.com/Chocobozzz/PeerTube
Fix downloading private videos in admin
parent
4302802840
commit
79d6e93b03
|
@ -8,7 +8,7 @@
|
||||||
[rowsPerPageOptions]="rowsPerPageOptions" [sortField]="sort.field" [sortOrder]="sort.order" dataKey="id" [resizableColumns]="true"
|
[rowsPerPageOptions]="rowsPerPageOptions" [sortField]="sort.field" [sortOrder]="sort.order" dataKey="id" [resizableColumns]="true"
|
||||||
[(selection)]="selectedRows" [lazy]="true" (onLazyLoad)="loadLazy($event)" [lazyLoadOnInit]="false" [selectionPageOnly]="true"
|
[(selection)]="selectedRows" [lazy]="true" (onLazyLoad)="loadLazy($event)" [lazyLoadOnInit]="false" [selectionPageOnly]="true"
|
||||||
[showCurrentPageReport]="true" [currentPageReportTemplate]="getPaginationTemplate()"
|
[showCurrentPageReport]="true" [currentPageReportTemplate]="getPaginationTemplate()"
|
||||||
[expandedRowKeys]="expandedRows" [ngClass]="{ loading: loading }"
|
[expandedRowKeys]="expandedRows" [ngClass]="{ loading: loading }" (onRowExpand)="onVideoPanelOpened($event)"
|
||||||
>
|
>
|
||||||
<ng-template pTemplate="caption">
|
<ng-template pTemplate="caption">
|
||||||
<div class="caption">
|
<div class="caption">
|
||||||
|
@ -49,7 +49,7 @@
|
||||||
|
|
||||||
<ng-template pTemplate="body" let-expanded="expanded" let-video>
|
<ng-template pTemplate="body" let-expanded="expanded" let-video>
|
||||||
|
|
||||||
<tr [pSelectableRow]="video">
|
<tr [pSelectableRow]="video" (onRowExpand)="onVideoPanelOpened(video)">
|
||||||
<td class="checkbox-cell">
|
<td class="checkbox-cell">
|
||||||
<p-tableCheckbox [value]="video" ariaLabel="Select this row" i18n-ariaLabel></p-tableCheckbox>
|
<p-tableCheckbox [value]="video" ariaLabel="Select this row" i18n-ariaLabel></p-tableCheckbox>
|
||||||
</td>
|
</td>
|
||||||
|
@ -126,7 +126,7 @@
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
{{ video.videoSource.inputFilename }}: {{ video.videoSource.size | bytes: 1 }}
|
<a title="Download this file" i18n-title [href]="getDownloadUrl(video, video.videoSource.fileDownloadUrl)">{{ video.videoSource.inputFilename }}</a>: {{ video.videoSource.size | bytes: 1 }}
|
||||||
|
|
||||||
<button
|
<button
|
||||||
*ngIf="canRemoveOneFile(video)" class="border-0 p-0"
|
*ngIf="canRemoveOneFile(video)" class="border-0 p-0"
|
||||||
|
@ -144,7 +144,7 @@
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li *ngFor="let file of video.files">
|
<li *ngFor="let file of video.files">
|
||||||
<a target="_blank" rel="noopener noreferrer" [href]="file.fileUrl">{{ file.resolution.label }}</a>: {{ file.size | bytes: 1 }}
|
<a title="Download this file" i18n-title [href]="getDownloadUrl(video, file.fileDownloadUrl)">{{ file.resolution.label }}</a>: {{ file.size | bytes: 1 }}
|
||||||
|
|
||||||
<button
|
<button
|
||||||
*ngIf="canRemoveOneFile(video)" class="border-0 p-0"
|
*ngIf="canRemoveOneFile(video)" class="border-0 p-0"
|
||||||
|
@ -162,7 +162,7 @@
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li *ngFor="let file of video.streamingPlaylists[0].files">
|
<li *ngFor="let file of video.streamingPlaylists[0].files">
|
||||||
<a target="_blank" rel="noopener noreferrer" [href]="file.fileUrl">{{ file.resolution.label }}</a>: {{ file.size | bytes: 1 }}
|
<a title="Download this file" i18n-title [href]="getDownloadUrl(video, file.fileDownloadUrl)">{{ file.resolution.label }}</a>: {{ file.size | bytes: 1 }}
|
||||||
|
|
||||||
<button
|
<button
|
||||||
*ngIf="canRemoveOneFile(video)" class="border-0 p-0"
|
*ngIf="canRemoveOneFile(video)" class="border-0 p-0"
|
||||||
|
|
|
@ -3,6 +3,8 @@ import { Component, OnInit, ViewChild } from '@angular/core'
|
||||||
import { ActivatedRoute, Router, RouterLink } from '@angular/router'
|
import { ActivatedRoute, Router, RouterLink } from '@angular/router'
|
||||||
import { AuthService, ConfirmService, Notifier, RestPagination, RestTable } from '@app/core'
|
import { AuthService, ConfirmService, Notifier, RestPagination, RestTable } from '@app/core'
|
||||||
import { formatICU, getAbsoluteAPIUrl } from '@app/helpers'
|
import { formatICU, getAbsoluteAPIUrl } from '@app/helpers'
|
||||||
|
import { VideoDetails } from '@app/shared/shared-main/video/video-details.model'
|
||||||
|
import { VideoFileTokenService } from '@app/shared/shared-main/video/video-file-token.service'
|
||||||
import { Video } from '@app/shared/shared-main/video/video.model'
|
import { Video } from '@app/shared/shared-main/video/video.model'
|
||||||
import { VideoService } from '@app/shared/shared-main/video/video.service'
|
import { VideoService } from '@app/shared/shared-main/video/video.service'
|
||||||
import { VideoBlockComponent } from '@app/shared/shared-moderation/video-block.component'
|
import { VideoBlockComponent } from '@app/shared/shared-moderation/video-block.component'
|
||||||
|
@ -10,8 +12,9 @@ import { VideoBlockService } from '@app/shared/shared-moderation/video-block.ser
|
||||||
import { NgbTooltip } from '@ng-bootstrap/ng-bootstrap'
|
import { NgbTooltip } from '@ng-bootstrap/ng-bootstrap'
|
||||||
import { getAllFiles } from '@peertube/peertube-core-utils'
|
import { getAllFiles } from '@peertube/peertube-core-utils'
|
||||||
import { UserRight, VideoFile, VideoPrivacy, VideoState, VideoStreamingPlaylistType } from '@peertube/peertube-models'
|
import { UserRight, VideoFile, VideoPrivacy, VideoState, VideoStreamingPlaylistType } from '@peertube/peertube-models'
|
||||||
|
import { videoRequiresFileToken } from '@root-helpers/video'
|
||||||
import { SharedModule, SortMeta } from 'primeng/api'
|
import { SharedModule, SortMeta } from 'primeng/api'
|
||||||
import { TableModule } from 'primeng/table'
|
import { TableModule, TableRowExpandEvent } from 'primeng/table'
|
||||||
import { finalize } from 'rxjs/operators'
|
import { finalize } from 'rxjs/operators'
|
||||||
import { AdvancedInputFilter, AdvancedInputFilterComponent } from '../../../shared/shared-forms/advanced-input-filter.component'
|
import { AdvancedInputFilter, AdvancedInputFilterComponent } from '../../../shared/shared-forms/advanced-input-filter.component'
|
||||||
import { GlobalIconComponent } from '../../../shared/shared-icons/global-icon.component'
|
import { GlobalIconComponent } from '../../../shared/shared-icons/global-icon.component'
|
||||||
|
@ -86,6 +89,8 @@ export class VideoListComponent extends RestTable <Video> implements OnInit {
|
||||||
|
|
||||||
loading = true
|
loading = true
|
||||||
|
|
||||||
|
private videoFileTokens: { [ videoId: number ]: string } = {}
|
||||||
|
|
||||||
constructor (
|
constructor (
|
||||||
protected route: ActivatedRoute,
|
protected route: ActivatedRoute,
|
||||||
protected router: Router,
|
protected router: Router,
|
||||||
|
@ -94,7 +99,8 @@ export class VideoListComponent extends RestTable <Video> implements OnInit {
|
||||||
private notifier: Notifier,
|
private notifier: Notifier,
|
||||||
private videoService: VideoService,
|
private videoService: VideoService,
|
||||||
private videoAdminService: VideoAdminService,
|
private videoAdminService: VideoAdminService,
|
||||||
private videoBlockService: VideoBlockService
|
private videoBlockService: VideoBlockService,
|
||||||
|
private videoFileTokenService: VideoFileTokenService
|
||||||
) {
|
) {
|
||||||
super()
|
super()
|
||||||
}
|
}
|
||||||
|
@ -265,6 +271,28 @@ export class VideoListComponent extends RestTable <Video> implements OnInit {
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
onVideoPanelOpened (event: TableRowExpandEvent) {
|
||||||
|
const video = event.data as VideoDetails
|
||||||
|
|
||||||
|
if (!video.videoSource?.filename && !videoRequiresFileToken(video)) return
|
||||||
|
|
||||||
|
this.videoFileTokenService.getVideoFileToken({ videoUUID: video.uuid })
|
||||||
|
.subscribe(({ token }) => {
|
||||||
|
this.videoFileTokens[video.id] = token
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
getDownloadUrl (video: VideoDetails, downloadUrl: string) {
|
||||||
|
const token = this.videoFileTokens[video.id]
|
||||||
|
if (!token) return downloadUrl
|
||||||
|
|
||||||
|
return downloadUrl + `?videoFileToken=${token}`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
protected reloadDataInternal () {
|
protected reloadDataInternal () {
|
||||||
this.loading = true
|
this.loading = true
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue