Browse Source

Rename video full loading

Chocobozzz 1 year ago
parent
commit
4fae2b1f30
31 changed files with 48 additions and 48 deletions
  1. 1 1
      scripts/create-move-video-storage-job.ts
  2. 1 1
      scripts/create-transcoding-job.ts
  3. 1 1
      scripts/migrations/peertube-4.0.ts
  4. 1 1
      scripts/update-host.ts
  5. 1 1
      server/controllers/api/videos/ownership.ts
  6. 2 2
      server/controllers/api/videos/update.ts
  7. 1 1
      server/controllers/api/videos/upload.ts
  8. 1 1
      server/lib/activitypub/process/process-dislike.ts
  9. 1 1
      server/lib/activitypub/process/process-like.ts
  10. 2 2
      server/lib/activitypub/process/process-undo.ts
  11. 1 1
      server/lib/activitypub/send/send-undo.ts
  12. 1 1
      server/lib/activitypub/send/send-update.ts
  13. 1 1
      server/lib/files-cache/videos-caption-cache.ts
  14. 1 1
      server/lib/files-cache/videos-preview-cache.ts
  15. 1 1
      server/lib/files-cache/videos-torrent-cache.ts
  16. 1 1
      server/lib/job-queue/handlers/activitypub-http-fetcher.ts
  17. 1 1
      server/lib/job-queue/handlers/video-file-import.ts
  18. 1 1
      server/lib/job-queue/handlers/video-import.ts
  19. 2 2
      server/lib/job-queue/handlers/video-live-ending.ts
  20. 1 1
      server/lib/job-queue/handlers/video-studio-edition.ts
  21. 2 2
      server/lib/job-queue/handlers/video-transcoding.ts
  22. 2 2
      server/lib/live/live-manager.ts
  23. 1 1
      server/lib/model-loaders/video.ts
  24. 4 4
      server/lib/plugins/plugin-helpers-builder.ts
  25. 1 1
      server/lib/schedulers/update-videos-scheduler.ts
  26. 1 1
      server/lib/schedulers/video-views-buffer-scheduler.ts
  27. 1 1
      server/lib/video-channel.ts
  28. 1 1
      server/lib/video-state.ts
  29. 1 1
      server/middlewares/validators/shared/videos.ts
  30. 9 9
      server/models/video/sql/video/video-model-get-query-builder.ts
  31. 2 2
      server/models/video/video.ts

+ 1 - 1
scripts/create-move-video-storage-job.ts

@@ -70,7 +70,7 @@ async function run () {
   }
 
   for (const id of ids) {
-    const videoFull = await VideoModel.loadAndPopulateAccountAndServerAndTags(id)
+    const videoFull = await VideoModel.loadFull(id)
 
     const files = videoFull.VideoFiles || []
     const hls = videoFull.getHLSPlaylist()

+ 1 - 1
scripts/create-transcoding-job.ts

@@ -43,7 +43,7 @@ async function run () {
     return
   }
 
-  const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(uuid)
+  const video = await VideoModel.loadFull(uuid)
   if (!video) throw new Error('Video not found.')
 
   const dataInput: VideoTranscodingPayload[] = []

+ 1 - 1
scripts/migrations/peertube-4.0.ts

@@ -97,7 +97,7 @@ async function processVideo (videoId: number) {
   // Everything worked, we can save the playlist now
   await playlist.save()
 
-  const allVideo = await VideoModel.loadAndPopulateAccountAndServerAndTags(video.id)
+  const allVideo = await VideoModel.loadFull(video.id)
   await federateVideoIfNeeded(allVideo, false)
 
   console.log(`Successfully moved HLS files of ${video.name}.`)

+ 1 - 1
scripts/update-host.ts

@@ -114,7 +114,7 @@ async function run () {
 
   const ids = await VideoModel.listLocalIds()
   for (const id of ids) {
-    const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(id)
+    const video = await VideoModel.loadFull(id)
 
     console.log('Updating video ' + video.uuid)
 

+ 1 - 1
server/controllers/api/videos/ownership.ts

@@ -105,7 +105,7 @@ function acceptOwnership (req: express.Request, res: express.Response) {
     const channel = res.locals.videoChannel
 
     // We need more attributes for federation
-    const targetVideo = await VideoModel.loadAndPopulateAccountAndServerAndTags(videoChangeOwnership.Video.id, t)
+    const targetVideo = await VideoModel.loadFull(videoChangeOwnership.Video.id, t)
 
     const oldVideoChannel = await VideoChannelModel.loadAndPopulateAccount(targetVideo.channelId, t)
 

+ 2 - 2
server/controllers/api/videos/update.ts

@@ -62,7 +62,7 @@ async function updateVideo (req: express.Request, res: express.Response) {
   try {
     const { videoInstanceUpdated, isNewVideo } = await sequelizeTypescript.transaction(async t => {
       // Refresh video since thumbnails to prevent concurrent updates
-      const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(videoFromReq.id, t)
+      const video = await VideoModel.loadFull(videoFromReq.id, t)
 
       const sequelizeOptions = { transaction: t }
       const oldVideoChannel = video.VideoChannel
@@ -212,5 +212,5 @@ async function updateTorrentsMetadataIfNeeded (video: MVideoFullLight, videoInfo
   }
 
   // Refresh video since files have changed
-  return VideoModel.loadAndPopulateAccountAndServerAndTags(video.id)
+  return VideoModel.loadFull(video.id)
 }

+ 1 - 1
server/controllers/api/videos/upload.ts

@@ -272,7 +272,7 @@ async function createTorrentFederate (video: MVideoFullLight, videoFile: MVideoF
   const job = await JobQueue.Instance.createJobWithPromise({ type: 'manage-video-torrent', payload })
   await job.finished()
 
-  const refreshedVideo = await VideoModel.loadAndPopulateAccountAndServerAndTags(video.id)
+  const refreshedVideo = await VideoModel.loadFull(video.id)
   if (!refreshedVideo) return
 
   // Only federate and notify after the torrent creation

+ 1 - 1
server/lib/activitypub/process/process-dislike.ts

@@ -35,7 +35,7 @@ async function processDislike (activity: ActivityCreate | ActivityDislike, byAct
   if (!onlyVideo.isOwned()) return
 
   return sequelizeTypescript.transaction(async t => {
-    const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(onlyVideo.id, t)
+    const video = await VideoModel.loadFull(onlyVideo.id, t)
 
     const existingRate = await AccountVideoRateModel.loadByAccountAndVideoOrUrl(byAccount.id, video.id, activity.id, t)
     if (existingRate && existingRate.type === 'dislike') return

+ 1 - 1
server/lib/activitypub/process/process-like.ts

@@ -34,7 +34,7 @@ async function processLikeVideo (byActor: MActorSignature, activity: ActivityLik
   if (!onlyVideo.isOwned()) return
 
   return sequelizeTypescript.transaction(async t => {
-    const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(onlyVideo.id, t)
+    const video = await VideoModel.loadFull(onlyVideo.id, t)
 
     const existingRate = await AccountVideoRateModel.loadByAccountAndVideoOrUrl(byAccount.id, video.id, activity.id, t)
     if (existingRate && existingRate.type === 'like') return

+ 2 - 2
server/lib/activitypub/process/process-undo.ts

@@ -63,7 +63,7 @@ async function processUndoLike (byActor: MActorSignature, activity: ActivityUndo
   return sequelizeTypescript.transaction(async t => {
     if (!byActor.Account) throw new Error('Unknown account ' + byActor.url)
 
-    const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(onlyVideo.id, t)
+    const video = await VideoModel.loadFull(onlyVideo.id, t)
     const rate = await AccountVideoRateModel.loadByAccountAndVideoOrUrl(byActor.Account.id, video.id, likeActivity.id, t)
     if (!rate || rate.type !== 'like') throw new Error(`Unknown like by account ${byActor.Account.id} for video ${video.id}.`)
 
@@ -87,7 +87,7 @@ async function processUndoDislike (byActor: MActorSignature, activity: ActivityU
   return sequelizeTypescript.transaction(async t => {
     if (!byActor.Account) throw new Error('Unknown account ' + byActor.url)
 
-    const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(onlyVideo.id, t)
+    const video = await VideoModel.loadFull(onlyVideo.id, t)
     const rate = await AccountVideoRateModel.loadByAccountAndVideoOrUrl(byActor.Account.id, video.id, dislike.id, t)
     if (!rate || rate.type !== 'dislike') throw new Error(`Unknown dislike by account ${byActor.Account.id} for video ${video.id}.`)
 

+ 1 - 1
server/lib/activitypub/send/send-undo.ts

@@ -83,7 +83,7 @@ async function sendUndoCacheFile (byActor: MActor, redundancyModel: MVideoRedund
     return
   }
 
-  const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(associatedVideo.id)
+  const video = await VideoModel.loadFull(associatedVideo.id)
   const createActivity = buildCreateActivity(redundancyModel.url, byActor, redundancyModel.toActivityPubObject())
 
   return sendUndoVideoRelatedActivity({

+ 1 - 1
server/lib/activitypub/send/send-update.ts

@@ -92,7 +92,7 @@ async function sendUpdateCacheFile (byActor: MActorLight, redundancyModel: MVide
     return
   }
 
-  const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(associatedVideo.id)
+  const video = await VideoModel.loadFull(associatedVideo.id)
 
   const activityBuilder = (audience: ActivityAudience) => {
     const redundancyObject = redundancyModel.toActivityPubObject()

+ 1 - 1
server/lib/files-cache/videos-caption-cache.ts

@@ -35,7 +35,7 @@ class VideosCaptionCache extends AbstractVideoStaticFileCache <string> {
     if (videoCaption.isOwned()) throw new Error('Cannot load remote caption of owned video.')
 
     // Used to fetch the path
-    const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(videoCaption.videoId)
+    const video = await VideoModel.loadFull(videoCaption.videoId)
     if (!video) return undefined
 
     const remoteUrl = videoCaption.getFileUrl(video)

+ 1 - 1
server/lib/files-cache/videos-preview-cache.ts

@@ -30,7 +30,7 @@ class VideosPreviewCache extends AbstractVideoStaticFileCache <string> {
 
   // Key is the video UUID
   protected async loadRemoteFile (key: string) {
-    const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(key)
+    const video = await VideoModel.loadFull(key)
     if (!video) return undefined
 
     if (video.isOwned()) throw new Error('Cannot load remote preview of owned video.')

+ 1 - 1
server/lib/files-cache/videos-torrent-cache.ts

@@ -40,7 +40,7 @@ class VideosTorrentCache extends AbstractVideoStaticFileCache <string> {
     if (file.getVideo().isOwned()) throw new Error('Cannot load remote file of owned video.')
 
     // Used to fetch the path
-    const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(file.getVideo().id)
+    const video = await VideoModel.loadFull(file.getVideo().id)
     if (!video) return undefined
 
     const remoteUrl = file.getRemoteTorrentUrl(video)

+ 1 - 1
server/lib/job-queue/handlers/activitypub-http-fetcher.ts

@@ -17,7 +17,7 @@ async function processActivityPubHttpFetcher (job: Job) {
   const payload = job.data as ActivitypubHttpFetcherPayload
 
   let video: MVideoFullLight
-  if (payload.videoId) video = await VideoModel.loadAndPopulateAccountAndServerAndTags(payload.videoId)
+  if (payload.videoId) video = await VideoModel.loadFull(payload.videoId)
 
   const fetcherType: { [ id in FetchType ]: (items: any[]) => Promise<any> } = {
     'activity': items => processActivities(items, { outboxUrl: payload.uri, fromFetch: true }),

+ 1 - 1
server/lib/job-queue/handlers/video-file-import.ts

@@ -18,7 +18,7 @@ async function processVideoFileImport (job: Job) {
   const payload = job.data as VideoFileImportPayload
   logger.info('Processing video file import in job %d.', job.id)
 
-  const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(payload.videoUUID)
+  const video = await VideoModel.loadFull(payload.videoUUID)
   // No video, maybe deleted?
   if (!video) {
     logger.info('Do not process job %d, video does not exist.', job.id)

+ 1 - 1
server/lib/job-queue/handlers/video-import.ts

@@ -219,7 +219,7 @@ async function processFile (downloader: () => Promise<string>, videoImport: MVid
         if (previewModel) await video.addAndSaveThumbnail(previewModel, t)
 
         // Now we can federate the video (reload from database, we need more attributes)
-        const videoForFederation = await VideoModel.loadAndPopulateAccountAndServerAndTags(video.uuid, t)
+        const videoForFederation = await VideoModel.loadFull(video.uuid, t)
         await federateVideoIfNeeded(videoForFederation, true, t)
 
         // Update video import object

+ 2 - 2
server/lib/job-queue/handlers/video-live-ending.ts

@@ -144,7 +144,7 @@ async function replaceLiveByReplay (options: {
   await liveSession.save()
 
   // Remove old HLS playlist video files
-  const videoWithFiles = await VideoModel.loadAndPopulateAccountAndServerAndTags(liveVideo.id)
+  const videoWithFiles = await VideoModel.loadFull(liveVideo.id)
 
   const hlsPlaylist = videoWithFiles.getHLSPlaylist()
   await VideoFileModel.removeHLSFilesOfVideoId(hlsPlaylist.id)
@@ -241,7 +241,7 @@ async function cleanupLiveAndFederate (options: {
   }
 
   try {
-    const fullVideo = await VideoModel.loadAndPopulateAccountAndServerAndTags(video.id)
+    const fullVideo = await VideoModel.loadFull(video.id)
     return federateVideoIfNeeded(fullVideo, false, undefined)
   } catch (err) {
     logger.warn('Cannot federate live after cleanup', { videoId: video.id, err })

+ 1 - 1
server/lib/job-queue/handlers/video-studio-edition.ts

@@ -44,7 +44,7 @@ async function processVideoStudioEdition (job: Job) {
 
   logger.info('Process video studio edition of %s in job %d.', payload.videoUUID, job.id, lTags)
 
-  const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(payload.videoUUID)
+  const video = await VideoModel.loadFull(payload.videoUUID)
 
   // No video, maybe deleted?
   if (!video) {

+ 2 - 2
server/lib/job-queue/handlers/video-transcoding.ts

@@ -42,7 +42,7 @@ async function processVideoTranscoding (job: Job) {
   const payload = job.data as VideoTranscodingPayload
   logger.info('Processing transcoding job %d.', job.id, lTags(payload.videoUUID))
 
-  const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(payload.videoUUID)
+  const video = await VideoModel.loadFull(payload.videoUUID)
   // No video, maybe deleted?
   if (!video) {
     logger.info('Do not process job %d, video does not exist.', job.id, lTags(payload.videoUUID))
@@ -180,7 +180,7 @@ async function onVideoFirstWebTorrentTranscoding (
   const { resolution, isPortraitMode, audioStream } = await videoArg.probeMaxQualityFile()
 
   // Maybe the video changed in database, refresh it
-  const videoDatabase = await VideoModel.loadAndPopulateAccountAndServerAndTags(videoArg.uuid)
+  const videoDatabase = await VideoModel.loadFull(videoArg.uuid)
   // Video does not exist anymore
   if (!videoDatabase) return undefined
 

+ 2 - 2
server/lib/live/live-manager.ts

@@ -351,7 +351,7 @@ class LiveManager {
     const videoId = live.videoId
 
     try {
-      const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(videoId)
+      const video = await VideoModel.loadFull(videoId)
 
       logger.info('Will publish and federate live %s.', video.url, localLTags)
 
@@ -390,7 +390,7 @@ class LiveManager {
     const { videoId, liveSession: liveSessionArg, cleanupNow = false } = options
 
     try {
-      const fullVideo = await VideoModel.loadAndPopulateAccountAndServerAndTags(videoId)
+      const fullVideo = await VideoModel.loadFull(videoId)
       if (!fullVideo) return
 
       const live = await VideoLiveModel.loadByVideoId(fullVideo.id)

+ 1 - 1
server/lib/model-loaders/video.ts

@@ -35,7 +35,7 @@ function loadVideo (
     )
   }
 
-  if (fetchType === 'all') return VideoModel.loadAndPopulateAccountAndServerAndTags(id, undefined, userId)
+  if (fetchType === 'all') return VideoModel.loadFull(id, undefined, userId)
 
   if (fetchType === 'only-immutable-attributes') return VideoModel.loadImmutableAttributes(id)
 

+ 4 - 4
server/lib/plugins/plugin-helpers-builder.ts

@@ -83,7 +83,7 @@ function buildVideosHelpers () {
 
     removeVideo: (id: number) => {
       return sequelizeTypescript.transaction(async t => {
-        const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(id, t)
+        const video = await VideoModel.loadFull(id, t)
 
         await video.destroy({ transaction: t })
       })
@@ -94,7 +94,7 @@ function buildVideosHelpers () {
     },
 
     getFiles: async (id: number | string) => {
-      const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(id)
+      const video = await VideoModel.loadFull(id)
       if (!video) return undefined
 
       const webtorrentVideoFiles = (video.VideoFiles || []).map(f => ({
@@ -178,14 +178,14 @@ function buildModerationHelpers () {
     },
 
     blacklistVideo: async (options: { videoIdOrUUID: number | string, createOptions: VideoBlacklistCreate }) => {
-      const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(options.videoIdOrUUID)
+      const video = await VideoModel.loadFull(options.videoIdOrUUID)
       if (!video) return
 
       await blacklistVideo(video, options.createOptions)
     },
 
     unblacklistVideo: async (options: { videoIdOrUUID: number | string }) => {
-      const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(options.videoIdOrUUID)
+      const video = await VideoModel.loadFull(options.videoIdOrUUID)
       if (!video) return
 
       const videoBlacklist = await VideoBlacklistModel.loadByVideoId(video.id)

+ 1 - 1
server/lib/schedulers/update-videos-scheduler.ts

@@ -30,7 +30,7 @@ export class UpdateVideosScheduler extends AbstractScheduler {
 
     for (const schedule of schedules) {
       await sequelizeTypescript.transaction(async t => {
-        const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(schedule.videoId, t)
+        const video = await VideoModel.loadFull(schedule.videoId, t)
 
         logger.info('Executing scheduled video update on %s.', video.uuid)
 

+ 1 - 1
server/lib/schedulers/video-views-buffer-scheduler.ts

@@ -26,7 +26,7 @@ export class VideoViewsBufferScheduler extends AbstractScheduler {
         const views = await Redis.Instance.getLocalVideoViews(videoId)
         await Redis.Instance.deleteLocalVideoViews(videoId)
 
-        const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(videoId)
+        const video = await VideoModel.loadFull(videoId)
         if (!video) {
           logger.debug('Video %d does not exist anymore, skipping videos view addition.', videoId, lTags())
           continue

+ 1 - 1
server/lib/video-channel.ts

@@ -36,7 +36,7 @@ async function federateAllVideosOfChannel (videoChannel: MChannelId) {
   const videoIds = await VideoModel.getAllIdsFromChannel(videoChannel)
 
   for (const videoId of videoIds) {
-    const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(videoId)
+    const video = await VideoModel.loadFull(videoId)
 
     await federateVideoIfNeeded(video, false)
   }

+ 1 - 1
server/lib/video-state.ts

@@ -43,7 +43,7 @@ function moveToNextState (options: {
 
   return sequelizeTypescript.transaction(async t => {
     // Maybe the video changed in database, refresh it
-    const videoDatabase = await VideoModel.loadAndPopulateAccountAndServerAndTags(video.uuid, t)
+    const videoDatabase = await VideoModel.loadFull(video.uuid, t)
     // Video does not exist anymore
     if (!videoDatabase) return undefined
 

+ 1 - 1
server/middlewares/validators/shared/videos.ts

@@ -144,7 +144,7 @@ async function checkCanSeeAuthVideo (req: Request, res: Response, video: MVideoI
 
   const videoWithRights = (video as MVideoWithRights).VideoChannel?.Account?.userId
     ? video as MVideoWithRights
-    : await VideoModel.loadAndPopulateAccountAndServerAndTags(video.id)
+    : await VideoModel.loadFull(video.id)
 
   const privacy = videoWithRights.privacy
 

+ 9 - 9
server/models/video/sql/video/video-model-get-query-builder.ts

@@ -13,7 +13,7 @@ import { VideoTableAttributes } from './shared/video-table-attributes'
 
 export type GetType =
   'api' |
-  'full-light' |
+  'full' |
   'account-blacklist-files' |
   'all-files' |
   'thumbnails' |
@@ -40,7 +40,7 @@ export class VideoModelGetQueryBuilder {
 
   private readonly videoModelBuilder: VideoModelBuilder
 
-  private static readonly videoFilesInclude = new Set<GetType>([ 'api', 'full-light', 'account-blacklist-files', 'all-files' ])
+  private static readonly videoFilesInclude = new Set<GetType>([ 'api', 'full', 'account-blacklist-files', 'all-files' ])
 
   constructor (protected readonly sequelize: Sequelize) {
     this.videoQueryBuilder = new VideosModelGetQuerySubBuilder(sequelize)
@@ -96,16 +96,16 @@ export class VideosModelGetQuerySubBuilder extends AbstractVideoQueryBuilder {
   protected streamingPlaylistFilesQuery: string
 
   private static readonly trackersInclude = new Set<GetType>([ 'api' ])
-  private static readonly liveInclude = new Set<GetType>([ 'api', 'full-light' ])
-  private static readonly scheduleUpdateInclude = new Set<GetType>([ 'api', 'full-light' ])
-  private static readonly tagsInclude = new Set<GetType>([ 'api', 'full-light' ])
-  private static readonly userHistoryInclude = new Set<GetType>([ 'api', 'full-light' ])
-  private static readonly accountInclude = new Set<GetType>([ 'api', 'full-light', 'account-blacklist-files' ])
+  private static readonly liveInclude = new Set<GetType>([ 'api', 'full' ])
+  private static readonly scheduleUpdateInclude = new Set<GetType>([ 'api', 'full' ])
+  private static readonly tagsInclude = new Set<GetType>([ 'api', 'full' ])
+  private static readonly userHistoryInclude = new Set<GetType>([ 'api', 'full' ])
+  private static readonly accountInclude = new Set<GetType>([ 'api', 'full', 'account-blacklist-files' ])
   private static readonly ownerUserInclude = new Set<GetType>([ 'blacklist-rights' ])
 
   private static readonly blacklistedInclude = new Set<GetType>([
     'api',
-    'full-light',
+    'full',
     'account-blacklist-files',
     'thumbnails-blacklist',
     'blacklist-rights'
@@ -113,7 +113,7 @@ export class VideosModelGetQuerySubBuilder extends AbstractVideoQueryBuilder {
 
   private static readonly thumbnailsInclude = new Set<GetType>([
     'api',
-    'full-light',
+    'full',
     'account-blacklist-files',
     'all-files',
     'thumbnails',

+ 2 - 2
server/models/video/video.ts

@@ -1352,10 +1352,10 @@ export class VideoModel extends Model<Partial<AttributesOnly<VideoModel>>> {
     return queryBuilder.queryVideo({ url, transaction, type: 'account-blacklist-files' })
   }
 
-  static loadAndPopulateAccountAndServerAndTags (id: number | string, t?: Transaction, userId?: number): Promise<MVideoFullLight> {
+  static loadFull (id: number | string, t?: Transaction, userId?: number): Promise<MVideoFullLight> {
     const queryBuilder = new VideoModelGetQueryBuilder(VideoModel.sequelize)
 
-    return queryBuilder.queryVideo({ id, transaction: t, type: 'full-light', userId })
+    return queryBuilder.queryVideo({ id, transaction: t, type: 'full', userId })
   }
 
   static loadForGetAPI (parameters: {