Fix video file object storage detection
This commit is contained in:
parent
dc151d3f51
commit
27bf92235f
|
@ -2,7 +2,8 @@ import { DatePipe, NgClass, NgFor, NgIf } from '@angular/common'
|
||||||
import { Component, OnInit, ViewChild } from '@angular/core'
|
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, ServerService } from '@app/core'
|
import { AuthService, ConfirmService, Notifier, RestPagination, RestTable, ServerService } from '@app/core'
|
||||||
import { formatICU, getAbsoluteAPIUrl } from '@app/helpers'
|
import { formatICU } from '@app/helpers'
|
||||||
|
import { VideoCaptionService } from '@app/shared/shared-main/video-caption/video-caption.service'
|
||||||
import { VideoDetails } from '@app/shared/shared-main/video/video-details.model'
|
import { VideoDetails } from '@app/shared/shared-main/video/video-details.model'
|
||||||
import { VideoFileTokenService } from '@app/shared/shared-main/video/video-file-token.service'
|
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'
|
||||||
|
@ -11,7 +12,7 @@ import { VideoBlockComponent } from '@app/shared/shared-moderation/video-block.c
|
||||||
import { VideoBlockService } from '@app/shared/shared-moderation/video-block.service'
|
import { VideoBlockService } from '@app/shared/shared-moderation/video-block.service'
|
||||||
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 { FileStorage, UserRight, VideoFile, VideoPrivacy, VideoState, VideoStreamingPlaylistType } from '@peertube/peertube-models'
|
||||||
import { videoRequiresFileToken } from '@root-helpers/video'
|
import { videoRequiresFileToken } from '@root-helpers/video'
|
||||||
import { SharedModule, SortMeta } from 'primeng/api'
|
import { SharedModule, SortMeta } from 'primeng/api'
|
||||||
import { TableModule, TableRowExpandEvent } from 'primeng/table'
|
import { TableModule, TableRowExpandEvent } from 'primeng/table'
|
||||||
|
@ -30,7 +31,6 @@ import {
|
||||||
VideoActionsDropdownComponent
|
VideoActionsDropdownComponent
|
||||||
} from '../../../shared/shared-video-miniature/video-actions-dropdown.component'
|
} from '../../../shared/shared-video-miniature/video-actions-dropdown.component'
|
||||||
import { VideoAdminService } from './video-admin.service'
|
import { VideoAdminService } from './video-admin.service'
|
||||||
import { VideoCaptionService } from '@app/shared/shared-main/video-caption/video-caption.service'
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'my-video-list',
|
selector: 'my-video-list',
|
||||||
|
@ -230,7 +230,7 @@ export class VideoListComponent extends RestTable <Video> implements OnInit {
|
||||||
|
|
||||||
const files = getAllFiles(video)
|
const files = getAllFiles(video)
|
||||||
|
|
||||||
return files.some(f => !f.fileUrl.startsWith(getAbsoluteAPIUrl()))
|
return files.some(f => f.storage === FileStorage.OBJECT_STORAGE)
|
||||||
}
|
}
|
||||||
|
|
||||||
canRemoveOneFile (video: Video) {
|
canRemoveOneFile (video: Video) {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { FileStorageType } from '../../common/file-storage.enum.js'
|
||||||
import { VideoConstant } from '../video-constant.model.js'
|
import { VideoConstant } from '../video-constant.model.js'
|
||||||
import { VideoFileMetadata } from './video-file-metadata.model.js'
|
import { VideoFileMetadata } from './video-file-metadata.model.js'
|
||||||
|
|
||||||
|
@ -25,4 +26,6 @@ export interface VideoFile {
|
||||||
|
|
||||||
hasAudio: boolean
|
hasAudio: boolean
|
||||||
hasVideo: boolean
|
hasVideo: boolean
|
||||||
|
|
||||||
|
storage: FileStorageType
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
import { getHLS, removeFragmentedMP4Ext, uuidRegex } from '@peertube/peertube-core-utils'
|
import { getHLS, removeFragmentedMP4Ext, uuidRegex } from '@peertube/peertube-core-utils'
|
||||||
import {
|
import {
|
||||||
|
FileStorage,
|
||||||
HttpStatusCode,
|
HttpStatusCode,
|
||||||
VideoDetails,
|
VideoDetails,
|
||||||
VideoPrivacy,
|
VideoPrivacy,
|
||||||
|
@ -235,6 +236,12 @@ export async function completeCheckHlsPlaylist (options: {
|
||||||
expect(Math.max(file.height, file.width)).to.be.greaterThan(resolution)
|
expect(Math.max(file.height, file.width)).to.be.greaterThan(resolution)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (objectStorageBaseUrl) {
|
||||||
|
expect(file.storage).to.equal(FileStorage.OBJECT_STORAGE)
|
||||||
|
} else {
|
||||||
|
expect(file.storage).to.equal(FileStorage.FILE_SYSTEM)
|
||||||
|
}
|
||||||
|
|
||||||
expect(file.magnetUri).to.have.lengthOf.above(2)
|
expect(file.magnetUri).to.have.lengthOf.above(2)
|
||||||
await checkWebTorrentWorks(file.magnetUri)
|
await checkWebTorrentWorks(file.magnetUri)
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
import { uuidRegex } from '@peertube/peertube-core-utils'
|
import { uuidRegex } from '@peertube/peertube-core-utils'
|
||||||
import { ffprobePromise } from '@peertube/peertube-ffmpeg'
|
import { ffprobePromise } from '@peertube/peertube-ffmpeg'
|
||||||
import {
|
import {
|
||||||
|
FileStorage,
|
||||||
HttpStatusCode,
|
HttpStatusCode,
|
||||||
HttpStatusCodeType,
|
HttpStatusCodeType,
|
||||||
VideoCaption,
|
VideoCaption,
|
||||||
|
@ -63,6 +64,12 @@ export async function completeWebVideoFilesCheck (options: {
|
||||||
expect(file.id).to.exist
|
expect(file.id).to.exist
|
||||||
expect(file.magnetUri).to.have.lengthOf.above(2)
|
expect(file.magnetUri).to.have.lengthOf.above(2)
|
||||||
|
|
||||||
|
if (objectStorageBaseUrl) {
|
||||||
|
expect(file.storage).to.equal(FileStorage.OBJECT_STORAGE)
|
||||||
|
} else {
|
||||||
|
expect(file.storage).to.equal(FileStorage.FILE_SYSTEM)
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
const privatePath = requiresAuth
|
const privatePath = requiresAuth
|
||||||
? 'private/'
|
? 'private/'
|
||||||
|
|
|
@ -258,7 +258,9 @@ export function videoFilesModelToFormattedJSON (
|
||||||
metadataUrl: videoFile.metadataUrl ?? getLocalVideoFileMetadataUrl(video, videoFile),
|
metadataUrl: videoFile.metadataUrl ?? getLocalVideoFileMetadataUrl(video, videoFile),
|
||||||
|
|
||||||
hasAudio: videoFile.hasAudio(),
|
hasAudio: videoFile.hasAudio(),
|
||||||
hasVideo: videoFile.hasVideo()
|
hasVideo: videoFile.hasVideo(),
|
||||||
|
|
||||||
|
storage: videoFile.storage
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -8188,6 +8188,15 @@ components:
|
||||||
type: string
|
type: string
|
||||||
format: url
|
format: url
|
||||||
description: URL dereferencing the output of ffprobe on the file
|
description: URL dereferencing the output of ffprobe on the file
|
||||||
|
hasAudio:
|
||||||
|
type: boolean
|
||||||
|
description: "**PeerTube >= 6.2** The file container has an audio stream"
|
||||||
|
hasVideo:
|
||||||
|
type: boolean
|
||||||
|
description: "**PeerTube >= 6.2** The file container has a video stream"
|
||||||
|
storage:
|
||||||
|
$ref: '#/components/schemas/FileStorage'
|
||||||
|
|
||||||
VideoStreamingPlaylists:
|
VideoStreamingPlaylists:
|
||||||
allOf:
|
allOf:
|
||||||
- type: object
|
- type: object
|
||||||
|
@ -11248,6 +11257,16 @@ components:
|
||||||
items:
|
items:
|
||||||
$ref: "#/components/schemas/VideoPassword/properties/password"
|
$ref: "#/components/schemas/VideoPassword/properties/password"
|
||||||
uniqueItems: true
|
uniqueItems: true
|
||||||
|
|
||||||
|
FileStorage:
|
||||||
|
type: integer
|
||||||
|
enum:
|
||||||
|
- 0
|
||||||
|
- 1
|
||||||
|
description: >
|
||||||
|
The file storage type:
|
||||||
|
- `0` File system
|
||||||
|
- `1` Object storage
|
||||||
callbacks:
|
callbacks:
|
||||||
searchIndex:
|
searchIndex:
|
||||||
'https://search.example.org/api/v1/search/videos':
|
'https://search.example.org/api/v1/search/videos':
|
||||||
|
|
Loading…
Reference in New Issue