1 import { Sequelize, Transaction } from 'sequelize'
2 import { AbstractVideosModelQueryBuilder } from './shared/abstract-videos-model-query-builder'
3 import { VideoFileQueryBuilder } from './shared/video-file-query-builder'
4 import { VideoModelBuilder } from './shared/video-model-builder'
5 import { VideoTables } from './shared/video-tables'
9 * Build a GET SQL query, fetch rows and create the video model
13 export type BuildVideoGetQueryOptions = {
15 transaction?: Transaction
20 export class VideosModelGetQueryBuilder {
21 videoQueryBuilder: VideosModelGetQuerySubBuilder
22 webtorrentFilesQueryBuilder: VideoFileQueryBuilder
23 streamingPlaylistFilesQueryBuilder: VideoFileQueryBuilder
25 private readonly videoModelBuilder: VideoModelBuilder
27 constructor (protected readonly sequelize: Sequelize) {
28 this.videoQueryBuilder = new VideosModelGetQuerySubBuilder(sequelize)
29 this.webtorrentFilesQueryBuilder = new VideoFileQueryBuilder(sequelize)
30 this.streamingPlaylistFilesQueryBuilder = new VideoFileQueryBuilder(sequelize)
32 this.videoModelBuilder = new VideoModelBuilder('get', new VideoTables('get'))
35 async queryVideos (options: BuildVideoGetQueryOptions) {
36 const [ videoRows, webtorrentFilesRows, streamingPlaylistFilesRows ] = await Promise.all([
37 this.videoQueryBuilder.queryVideos(options),
38 this.webtorrentFilesQueryBuilder.queryWebTorrentVideos(options),
39 this.streamingPlaylistFilesQueryBuilder.queryStreamingPlaylistVideos(options)
42 const videos = this.videoModelBuilder.buildVideosFromRows(videoRows, webtorrentFilesRows, streamingPlaylistFilesRows)
44 if (videos.length > 1) {
45 throw new Error('Video results is more than ')
48 if (videos.length === 0) return null
53 export class VideosModelGetQuerySubBuilder extends AbstractVideosModelQueryBuilder {
54 protected attributes: { [key: string]: string }
55 protected joins: string[] = []
57 protected webtorrentFilesQuery: string
58 protected streamingPlaylistFilesQuery: string
60 constructor (protected readonly sequelize: Sequelize) {
64 queryVideos (options: BuildVideoGetQueryOptions) {
65 this.buildMainGetQuery(options)
67 return this.runQuery(options.transaction)
70 private buildMainGetQuery (options: BuildVideoGetQueryOptions) {
75 this.includeChannels()
76 this.includeAccounts()
80 this.includeThumbnails()
82 this.includeBlacklisted()
84 this.includeScheduleUpdate()
89 this.includeUserHistory(options.userId)
92 if (options.forGetAPI === true) {
93 this.includeTrackers()
96 this.whereId(options.id)
98 this.query = this.buildQuery()
101 private buildQuery () {
102 const order = 'ORDER BY "Tags"."name" ASC'
103 const from = `SELECT * FROM "video" ${this.where} LIMIT 1`
105 return `${this.buildSelect()} FROM (${from}) AS "video" ${this.joins.join(' ')} ${order}`