diff --git a/client/src/app/+admin/overview/videos/video-list.component.html b/client/src/app/+admin/overview/videos/video-list.component.html
index 6250c00fb..eedf6f3dc 100644
--- a/client/src/app/+admin/overview/videos/video-list.component.html
+++ b/client/src/app/+admin/overview/videos/video-list.component.html
@@ -37,6 +37,7 @@
|
Video |
Info |
+ Files |
Published |
@@ -63,8 +64,8 @@
-
- {{ video.privacy.label }}
+ |
+ {{ video.privacy.label }}
NSFW
@@ -76,6 +77,13 @@
Blocked
|
+
+ HLS
+ WebTorrent
+
+ {{ getFilesSize(video) | bytes: 1 }}
+ |
+
{{ video.publishedAt | date: 'short' }}
|
@@ -85,8 +93,30 @@
-
-
+ |
+
+
+ WebTorrent:
+
+
+ -
+ {{ file.resolution.label }}: {{ file.size | bytes: 1 }}
+
+
+
+
+
+ HLS:
+
+
+ -
+ {{ file.resolution.label }}: {{ file.size | bytes: 1 }}
+
+
+
+
+
+
|
diff --git a/client/src/app/+admin/overview/videos/video-list.component.scss b/client/src/app/+admin/overview/videos/video-list.component.scss
index 250a917e4..158c161af 100644
--- a/client/src/app/+admin/overview/videos/video-list.component.scss
+++ b/client/src/app/+admin/overview/videos/video-list.component.scss
@@ -3,6 +3,7 @@
my-embed {
display: block;
max-width: 500px;
+ width: 50%;
}
.badge {
@@ -10,3 +11,7 @@ my-embed {
margin-right: 5px;
}
+
+.video-info > div {
+ display: flex;
+}
diff --git a/client/src/app/+admin/overview/videos/video-list.component.ts b/client/src/app/+admin/overview/videos/video-list.component.ts
index dd9225e6a..6885abfc7 100644
--- a/client/src/app/+admin/overview/videos/video-list.component.ts
+++ b/client/src/app/+admin/overview/videos/video-list.component.ts
@@ -3,7 +3,7 @@ import { Component, OnInit } from '@angular/core'
import { ActivatedRoute, Router } from '@angular/router'
import { AuthService, ConfirmService, Notifier, RestPagination, RestTable } from '@app/core'
import { DropdownAction, Video, VideoService } from '@app/shared/shared-main'
-import { UserRight, VideoPrivacy, VideoState } from '@shared/models'
+import { UserRight, VideoPrivacy, VideoState, VideoStreamingPlaylistType } from '@shared/models'
import { AdvancedInputFilter } from '@app/shared/shared-forms'
import { VideoActionsDisplayType } from '@app/shared/shared-video-miniature'
@@ -114,6 +114,24 @@ export class VideoListComponent extends RestTable implements OnInit {
return video.blacklisted
}
+ isHLS (video: Video) {
+ return video.streamingPlaylists.some(p => p.type === VideoStreamingPlaylistType.HLS)
+ }
+
+ isWebTorrent (video: Video) {
+ return video.files.length !== 0
+ }
+
+ getFilesSize (video: Video) {
+ let files = video.files
+
+ if (this.isHLS(video)) {
+ files = files.concat(video.streamingPlaylists[0].files)
+ }
+
+ return files.reduce((p, f) => p += f.size, 0)
+ }
+
protected reloadData () {
this.selectedVideos = []
diff --git a/client/src/app/shared/shared-main/video/video-details.model.ts b/client/src/app/shared/shared-main/video/video-details.model.ts
index f060d1dc9..45c053507 100644
--- a/client/src/app/shared/shared-main/video/video-details.model.ts
+++ b/client/src/app/shared/shared-main/video/video-details.model.ts
@@ -15,7 +15,6 @@ export class VideoDetails extends Video implements VideoDetailsServerModel {
support: string
channel: VideoChannel
tags: string[]
- files: VideoFile[]
account: Account
commentsEnabled: boolean
downloadEnabled: boolean
@@ -28,13 +27,13 @@ export class VideoDetails extends Video implements VideoDetailsServerModel {
trackerUrls: string[]
+ files: VideoFile[]
streamingPlaylists: VideoStreamingPlaylist[]
constructor (hash: VideoDetailsServerModel, translations = {}) {
super(hash, translations)
this.descriptionPath = hash.descriptionPath
- this.files = hash.files
this.channel = new VideoChannel(hash.channel)
this.account = new Account(hash.account)
this.tags = hash.tags
@@ -43,7 +42,6 @@ export class VideoDetails extends Video implements VideoDetailsServerModel {
this.downloadEnabled = hash.downloadEnabled
this.trackerUrls = hash.trackerUrls
- this.streamingPlaylists = hash.streamingPlaylists
this.buildLikeAndDislikePercents()
}
diff --git a/client/src/app/shared/shared-main/video/video.model.ts b/client/src/app/shared/shared-main/video/video.model.ts
index 699eac7f1..b11316471 100644
--- a/client/src/app/shared/shared-main/video/video.model.ts
+++ b/client/src/app/shared/shared-main/video/video.model.ts
@@ -10,9 +10,11 @@ import {
UserRight,
Video as VideoServerModel,
VideoConstant,
+ VideoFile,
VideoPrivacy,
VideoScheduleUpdate,
- VideoState
+ VideoState,
+ VideoStreamingPlaylist
} from '@shared/models'
export class Video implements VideoServerModel {
@@ -96,6 +98,9 @@ export class Video implements VideoServerModel {
pluginData?: any
+ streamingPlaylists?: VideoStreamingPlaylist[]
+ files?: VideoFile[]
+
static buildWatchUrl (video: Partial>) {
return buildVideoWatchPath({ shortUUID: video.shortUUID || video.uuid })
}
@@ -172,6 +177,9 @@ export class Video implements VideoServerModel {
this.blockedOwner = hash.blockedOwner
this.blockedServer = hash.blockedServer
+ this.streamingPlaylists = hash.streamingPlaylists
+ this.files = hash.files
+
this.userHistory = hash.userHistory
this.originInstanceHost = this.account.host
diff --git a/client/src/app/shared/shared-main/video/video.service.ts b/client/src/app/shared/shared-main/video/video.service.ts
index 0a3a51b0c..5db9a8704 100644
--- a/client/src/app/shared/shared-main/video/video.service.ts
+++ b/client/src/app/shared/shared-main/video/video.service.ts
@@ -208,7 +208,11 @@ export class VideoService {
): Observable> {
const { pagination, search } = parameters
- const include = VideoInclude.BLACKLISTED | VideoInclude.BLOCKED_OWNER | VideoInclude.HIDDEN_PRIVACY | VideoInclude.NOT_PUBLISHED_STATE
+ const include = VideoInclude.BLACKLISTED |
+ VideoInclude.BLOCKED_OWNER |
+ VideoInclude.HIDDEN_PRIVACY |
+ VideoInclude.NOT_PUBLISHED_STATE |
+ VideoInclude.FILES
let params = new HttpParams()
params = this.buildCommonVideosParams({ params, include, ...parameters })
diff --git a/server/controllers/api/accounts.ts b/server/controllers/api/accounts.ts
index 44edffe38..46d89bafa 100644
--- a/server/controllers/api/accounts.ts
+++ b/server/controllers/api/accounts.ts
@@ -189,7 +189,6 @@ async function listAccountVideos (req: express.Request, res: express.Response) {
displayOnlyForFollower,
nsfw: buildNSFWFilter(res, query.nsfw),
- withFiles: false,
accountId: account.id,
user: res.locals.oauth ? res.locals.oauth.token.User : undefined,
countVideos
diff --git a/server/controllers/api/overviews.ts b/server/controllers/api/overviews.ts
index 68626a508..34585e557 100644
--- a/server/controllers/api/overviews.ts
+++ b/server/controllers/api/overviews.ts
@@ -122,7 +122,6 @@ async function getVideos (
},
nsfw: buildNSFWFilter(res),
user: res.locals.oauth ? res.locals.oauth.token.User : undefined,
- withFiles: false,
countVideos: false,
...where
diff --git a/server/controllers/api/users/my-subscriptions.ts b/server/controllers/api/users/my-subscriptions.ts
index d96378180..6799ca8c5 100644
--- a/server/controllers/api/users/my-subscriptions.ts
+++ b/server/controllers/api/users/my-subscriptions.ts
@@ -181,7 +181,6 @@ async function getUserSubscriptionVideos (req: express.Request, res: express.Res
orLocalVideos: false
},
nsfw: buildNSFWFilter(res, query.nsfw),
- withFiles: false,
user,
countVideos
})
diff --git a/server/controllers/api/video-channel.ts b/server/controllers/api/video-channel.ts
index f9c1a405d..d1a1e6473 100644
--- a/server/controllers/api/video-channel.ts
+++ b/server/controllers/api/video-channel.ts
@@ -347,7 +347,6 @@ async function listVideoChannelVideos (req: express.Request, res: express.Respon
displayOnlyForFollower,
nsfw: buildNSFWFilter(res, query.nsfw),
- withFiles: false,
videoChannelId: videoChannelInstance.id,
user: res.locals.oauth ? res.locals.oauth.token.User : undefined,
countVideos
diff --git a/server/controllers/api/videos/index.ts b/server/controllers/api/videos/index.ts
index 821ed7ff3..821161c64 100644
--- a/server/controllers/api/videos/index.ts
+++ b/server/controllers/api/videos/index.ts
@@ -225,7 +225,6 @@ async function listVideos (req: express.Request, res: express.Response) {
orLocalVideos: true
},
nsfw: buildNSFWFilter(res, query.nsfw),
- withFiles: false,
user: res.locals.oauth ? res.locals.oauth.token.User : undefined,
countVideos
}, 'filter:api.videos.list.params')
diff --git a/server/controllers/bots.ts b/server/controllers/bots.ts
index 9f03de7e8..2a8d6863a 100644
--- a/server/controllers/bots.ts
+++ b/server/controllers/bots.ts
@@ -76,7 +76,6 @@ async function getSitemapLocalVideoUrls () {
},
isLocal: true,
nsfw: buildNSFWFilter(),
- withFiles: false,
countVideos: false
})
diff --git a/server/controllers/feeds.ts b/server/controllers/feeds.ts
index 1f6aebac3..29502a154 100644
--- a/server/controllers/feeds.ts
+++ b/server/controllers/feeds.ts
@@ -2,6 +2,7 @@ import express from 'express'
import Feed from 'pfeed'
import { getServerActor } from '@server/models/application/application'
import { getCategoryLabel } from '@server/models/video/formatter/video-format-utils'
+import { VideoInclude } from '@shared/models'
import { buildNSFWFilter } from '../helpers/express-utils'
import { CONFIG } from '../initializers/config'
import { FEEDS, PREVIEWS_SIZE, ROUTE_CACHE_LIFETIME, WEBSERVER } from '../initializers/constants'
@@ -171,8 +172,8 @@ async function generateVideoFeed (req: express.Request, res: express.Response) {
},
nsfw,
isLocal: req.query.isLocal,
- include: req.query.include,
- withFiles: true,
+ include: req.query.include | VideoInclude.FILES,
+ hasFiles: true,
countVideos: false,
...options
})
@@ -204,9 +205,10 @@ async function generateVideoFeedForSubscriptions (req: express.Request, res: exp
nsfw,
isLocal: req.query.isLocal,
- include: req.query.include,
- withFiles: true,
+ hasFiles: true,
+ include: req.query.include | VideoInclude.FILES,
+
countVideos: false,
displayOnlyForFollower: {
diff --git a/server/models/account/account.ts b/server/models/account/account.ts
index 056ec6857..71a9b8ccb 100644
--- a/server/models/account/account.ts
+++ b/server/models/account/account.ts
@@ -99,7 +99,7 @@ export type SummaryOptions = {
queryInclude.push({
attributes: [ 'id' ],
model: AccountBlocklistModel.unscoped(),
- as: 'BlockedAccounts',
+ as: 'BlockedBy',
required: false,
where: {
accountId: {
diff --git a/server/models/user/user-video-history.ts b/server/models/user/user-video-history.ts
index d633cc9d5..1aefdf02b 100644
--- a/server/models/user/user-video-history.ts
+++ b/server/models/user/user-video-history.ts
@@ -70,7 +70,6 @@ export class UserVideoHistoryModel extends Model>
const tags = video.Tags ? video.Tags.map(t => t.name) : []
- const streamingPlaylists = streamingPlaylistsModelToFormattedJSON(video, video.VideoStreamingPlaylists)
-
- const detailsJson = {
+ const detailsJSON = {
support: video.support,
descriptionPath: video.getDescriptionAPIPath(),
channel: video.VideoChannel.toFormattedJSON(),
@@ -179,20 +185,14 @@ function videoModelToFormattedDetailsJSON (video: MVideoFormattableDetails): Vid
label: getStateLabel(video.state)
},
- trackerUrls: video.getTrackerUrls(),
-
- files: [],
- streamingPlaylists
+ trackerUrls: video.getTrackerUrls()
}
- // Format and sort video files
- detailsJson.files = videoFilesModelToFormattedJSON(video, video.VideoFiles)
-
- return Object.assign(formattedJson, detailsJson)
+ return Object.assign(videoJSON, detailsJSON)
}
function streamingPlaylistsModelToFormattedJSON (
- video: MVideoFormattableDetails,
+ video: MVideoFormattable,
playlists: MStreamingPlaylistRedundanciesOpt[]
): VideoStreamingPlaylist[] {
if (isArray(playlists) === false) return []
@@ -223,7 +223,7 @@ function sortByResolutionDesc (fileA: MVideoFile, fileB: MVideoFile) {
}
function videoFilesModelToFormattedJSON (
- video: MVideoFormattableDetails,
+ video: MVideoFormattable,
videoFiles: MVideoFileRedundanciesOpt[],
includeMagnet = true
): VideoFile[] {
diff --git a/server/models/video/sql/video-model-get-query-builder.ts b/server/models/video/sql/video-model-get-query-builder.ts
index d18ddae67..2f34d5602 100644
--- a/server/models/video/sql/video-model-get-query-builder.ts
+++ b/server/models/video/sql/video-model-get-query-builder.ts
@@ -32,7 +32,7 @@ export type BuildVideoGetQueryOptions = {
logging?: boolean
}
-export class VideosModelGetQueryBuilder {
+export class VideoModelGetQueryBuilder {
videoQueryBuilder: VideosModelGetQuerySubBuilder
webtorrentFilesQueryBuilder: VideoFileQueryBuilder
streamingPlaylistFilesQueryBuilder: VideoFileQueryBuilder
@@ -53,11 +53,11 @@ export class VideosModelGetQueryBuilder {
const [ videoRows, webtorrentFilesRows, streamingPlaylistFilesRows ] = await Promise.all([
this.videoQueryBuilder.queryVideos(options),
- VideosModelGetQueryBuilder.videoFilesInclude.has(options.type)
+ VideoModelGetQueryBuilder.videoFilesInclude.has(options.type)
? this.webtorrentFilesQueryBuilder.queryWebTorrentVideos(options)
: Promise.resolve(undefined),
- VideosModelGetQueryBuilder.videoFilesInclude.has(options.type)
+ VideoModelGetQueryBuilder.videoFilesInclude.has(options.type)
? this.streamingPlaylistFilesQueryBuilder.queryStreamingPlaylistVideos(options)
: Promise.resolve(undefined)
])
diff --git a/server/models/video/sql/videos-id-list-query-builder.ts b/server/models/video/sql/videos-id-list-query-builder.ts
index 3eb547e75..4d6e0ea4b 100644
--- a/server/models/video/sql/videos-id-list-query-builder.ts
+++ b/server/models/video/sql/videos-id-list-query-builder.ts
@@ -43,7 +43,7 @@ export type BuildVideosListQueryOptions = {
uuids?: string[]
- withFiles?: boolean
+ hasFiles?: boolean
accountId?: number
videoChannelId?: number
@@ -165,7 +165,7 @@ export class VideosIdListQueryBuilder extends AbstractVideosQueryBuilder {
this.whereFollowerActorId(options.displayOnlyForFollower)
}
- if (options.withFiles === true) {
+ if (options.hasFiles === true) {
this.whereFileExists()
}
diff --git a/server/models/video/sql/videos-model-list-query-builder.ts b/server/models/video/sql/videos-model-list-query-builder.ts
index ef92bd2b0..cd721f055 100644
--- a/server/models/video/sql/videos-model-list-query-builder.ts
+++ b/server/models/video/sql/videos-model-list-query-builder.ts
@@ -52,7 +52,7 @@ export class VideosModelListQueryBuilder extends AbstractVideosModelQueryBuilder
this.includeAccounts()
this.includeThumbnails()
- if (options.withFiles) {
+ if (options.include & VideoInclude.FILES) {
this.includeWebtorrentFiles()
this.includeStreamingPlaylistFiles()
}
diff --git a/server/models/video/video.ts b/server/models/video/video.ts
index 26be34329..f9618c102 100644
--- a/server/models/video/video.ts
+++ b/server/models/video/video.ts
@@ -105,7 +105,7 @@ import {
videoModelToFormattedJSON
} from './formatter/video-format-utils'
import { ScheduleVideoUpdateModel } from './schedule-video-update'
-import { VideosModelGetQueryBuilder } from './sql/video-model-get-query-builder'
+import { VideoModelGetQueryBuilder } from './sql/video-model-get-query-builder'
import { BuildVideosListQueryOptions, DisplayOnlyForFollowerOptions, VideosIdListQueryBuilder } from './sql/videos-id-list-query-builder'
import { VideosModelListQueryBuilder } from './sql/videos-model-list-query-builder'
import { TagModel } from './tag'
@@ -1029,7 +1029,7 @@ export class VideoModel extends Model>> {
isLocal?: boolean
include?: VideoInclude
- withFiles: boolean
+ hasFiles?: boolean // default false
categoryOneOf?: number[]
licenceOneOf?: number[]
@@ -1053,7 +1053,7 @@ export class VideoModel extends Model>> {
search?: string
}) {
- if (options.include && !options.user.hasRight(UserRight.SEE_ALL_VIDEOS)) {
+ if (VideoModel.isPrivateInclude(options.include) && !options.user.hasRight(UserRight.SEE_ALL_VIDEOS)) {
throw new Error('Try to filter all-local but no user has not the see all videos right')
}
@@ -1082,7 +1082,7 @@ export class VideoModel extends Model>> {
'isLocal',
'include',
'displayOnlyForFollower',
- 'withFiles',
+ 'hasFiles',
'accountId',
'videoChannelId',
'videoPlaylistId',
@@ -1229,13 +1229,13 @@ export class VideoModel extends Model>> {
}
static load (id: number | string, transaction?: Transaction): Promise {
- const queryBuilder = new VideosModelGetQueryBuilder(VideoModel.sequelize)
+ const queryBuilder = new VideoModelGetQueryBuilder(VideoModel.sequelize)
return queryBuilder.queryVideo({ id, transaction, type: 'thumbnails' })
}
static loadWithBlacklist (id: number | string, transaction?: Transaction): Promise {
- const queryBuilder = new VideosModelGetQueryBuilder(VideoModel.sequelize)
+ const queryBuilder = new VideoModelGetQueryBuilder(VideoModel.sequelize)
return queryBuilder.queryVideo({ id, transaction, type: 'thumbnails-blacklist' })
}
@@ -1279,31 +1279,31 @@ export class VideoModel extends Model>> {
}
static loadOnlyId (id: number | string, transaction?: Transaction): Promise {
- const queryBuilder = new VideosModelGetQueryBuilder(VideoModel.sequelize)
+ const queryBuilder = new VideoModelGetQueryBuilder(VideoModel.sequelize)
return queryBuilder.queryVideo({ id, transaction, type: 'id' })
}
static loadWithFiles (id: number | string, transaction?: Transaction, logging?: boolean): Promise {
- const queryBuilder = new VideosModelGetQueryBuilder(VideoModel.sequelize)
+ const queryBuilder = new VideoModelGetQueryBuilder(VideoModel.sequelize)
return queryBuilder.queryVideo({ id, transaction, type: 'all-files', logging })
}
static loadByUrl (url: string, transaction?: Transaction): Promise {
- const queryBuilder = new VideosModelGetQueryBuilder(VideoModel.sequelize)
+ const queryBuilder = new VideoModelGetQueryBuilder(VideoModel.sequelize)
return queryBuilder.queryVideo({ url, transaction, type: 'thumbnails' })
}
static loadByUrlAndPopulateAccount (url: string, transaction?: Transaction): Promise {
- const queryBuilder = new VideosModelGetQueryBuilder(VideoModel.sequelize)
+ const queryBuilder = new VideoModelGetQueryBuilder(VideoModel.sequelize)
return queryBuilder.queryVideo({ url, transaction, type: 'account-blacklist-files' })
}
static loadAndPopulateAccountAndServerAndTags (id: number | string, t?: Transaction, userId?: number): Promise {
- const queryBuilder = new VideosModelGetQueryBuilder(VideoModel.sequelize)
+ const queryBuilder = new VideoModelGetQueryBuilder(VideoModel.sequelize)
return queryBuilder.queryVideo({ id, transaction: t, type: 'full-light', userId })
}
@@ -1314,7 +1314,7 @@ export class VideoModel extends Model>> {
userId?: number
}): Promise {
const { id, transaction, userId } = parameters
- const queryBuilder = new VideosModelGetQueryBuilder(VideoModel.sequelize)
+ const queryBuilder = new VideoModelGetQueryBuilder(VideoModel.sequelize)
return queryBuilder.queryVideo({ id, transaction, type: 'api', userId })
}
@@ -1345,8 +1345,7 @@ export class VideoModel extends Model>> {
displayOnlyForFollower: {
actorId: serverActor.id,
orLocalVideos: true
- },
- withFiles: false
+ }
})
return {
@@ -1490,6 +1489,13 @@ export class VideoModel extends Model>> {
}
}
+ private static isPrivateInclude (include: VideoInclude) {
+ return include & VideoInclude.BLACKLISTED ||
+ include & VideoInclude.BLOCKED_OWNER ||
+ include & VideoInclude.HIDDEN_PRIVACY ||
+ include & VideoInclude.NOT_PUBLISHED_STATE
+ }
+
isBlacklisted () {
return !!this.VideoBlacklist
}
diff --git a/server/tests/api/videos/videos-common-filters.ts b/server/tests/api/videos/videos-common-filters.ts
index eb2d2ab50..03c5c3b3f 100644
--- a/server/tests/api/videos/videos-common-filters.ts
+++ b/server/tests/api/videos/videos-common-filters.ts
@@ -13,7 +13,7 @@ import {
setDefaultVideoChannel,
waitJobs
} from '@shared/extra-utils'
-import { HttpStatusCode, UserRole, Video, VideoInclude, VideoPrivacy } from '@shared/models'
+import { HttpStatusCode, UserRole, Video, VideoDetails, VideoInclude, VideoPrivacy } from '@shared/models'
describe('Test videos filter', function () {
let servers: PeerTubeServer[]
@@ -365,6 +365,32 @@ describe('Test videos filter', function () {
await servers[0].blocklist.removeFromServerBlocklist({ server: servers[1].host })
})
+ it('Should include video files', async function () {
+ for (const path of paths) {
+ {
+ const videos = await listVideos({ server: servers[0], path })
+
+ for (const video of videos) {
+ const videoWithFiles = video as VideoDetails
+
+ expect(videoWithFiles.files).to.not.exist
+ expect(videoWithFiles.streamingPlaylists).to.not.exist
+ }
+ }
+
+ {
+ const videos = await listVideos({ server: servers[0], path, include: VideoInclude.FILES })
+
+ for (const video of videos) {
+ const videoWithFiles = video as VideoDetails
+
+ expect(videoWithFiles.files).to.exist
+ expect(videoWithFiles.files).to.have.length.at.least(1)
+ }
+ }
+ }
+ })
+
it('Should filter by tags and category', async function () {
await servers[0].videos.upload({ attributes: { name: 'tag filter', tags: [ 'tag1', 'tag2' ] } })
await servers[0].videos.upload({ attributes: { name: 'tag filter with category', tags: [ 'tag3' ], category: 4 } })
diff --git a/server/types/models/account/account.ts b/server/types/models/account/account.ts
index abe0de27b..71f6c79aa 100644
--- a/server/types/models/account/account.ts
+++ b/server/types/models/account/account.ts
@@ -23,7 +23,7 @@ type Use = PickWith
export type MAccount =
Omit
+ 'VideoComments' | 'BlockedBy'>
// ############################################################################
@@ -84,7 +84,7 @@ export type MAccountSummary =
export type MAccountSummaryBlocks =
MAccountSummary &
- Use<'BlockedByAccounts', MAccountBlocklistId[]>
+ Use<'BlockedBy', MAccountBlocklistId[]>
export type MAccountAPI =
MAccount &
diff --git a/server/types/models/server/server.ts b/server/types/models/server/server.ts
index f8b053e3b..876186fc0 100644
--- a/server/types/models/server/server.ts
+++ b/server/types/models/server/server.ts
@@ -15,7 +15,7 @@ export type MServerRedundancyAllowed = Pick
export type MServerHostBlocks =
MServerHost &
- Use<'BlockedByAccounts', MAccountBlocklistId[]>
+ Use<'BlockedBy', MAccountBlocklistId[]>
// ############################################################################
diff --git a/server/types/models/video/video.ts b/server/types/models/video/video.ts
index 16ddaf740..9a6b27888 100644
--- a/server/types/models/video/video.ts
+++ b/server/types/models/video/video.ts
@@ -210,7 +210,9 @@ export type MVideoFormattable =
PickWithOpt &
Use<'VideoChannel', MChannelAccountSummaryFormattable> &
PickWithOpt> &
- PickWithOpt>
+ PickWithOpt> &
+ PickWithOpt &
+ PickWithOpt
export type MVideoFormattableDetails =
MVideoFormattable &
diff --git a/shared/models/videos/video-include.enum.ts b/shared/models/videos/video-include.enum.ts
index fa720b348..72fa8cd30 100644
--- a/shared/models/videos/video-include.enum.ts
+++ b/shared/models/videos/video-include.enum.ts
@@ -3,5 +3,6 @@ export const enum VideoInclude {
NOT_PUBLISHED_STATE = 1 << 0,
HIDDEN_PRIVACY = 1 << 1,
BLACKLISTED = 1 << 2,
- BLOCKED_OWNER = 1 << 3
+ BLOCKED_OWNER = 1 << 3,
+ FILES = 1 << 4
}
diff --git a/shared/models/videos/video.model.ts b/shared/models/videos/video.model.ts
index dadde38af..26cb595e7 100644
--- a/shared/models/videos/video.model.ts
+++ b/shared/models/videos/video.model.ts
@@ -62,6 +62,9 @@ export interface Video {
blockedOwner?: boolean
blockedServer?: boolean
+
+ files?: VideoFile[]
+ streamingPlaylists?: VideoStreamingPlaylist[]
}
export interface VideoDetails extends Video {
@@ -70,7 +73,6 @@ export interface VideoDetails extends Video {
channel: VideoChannel
account: Account
tags: string[]
- files: VideoFile[]
commentsEnabled: boolean
downloadEnabled: boolean
@@ -80,5 +82,6 @@ export interface VideoDetails extends Video {
trackerUrls: string[]
+ files: VideoFile[]
streamingPlaylists: VideoStreamingPlaylist[]
}