import { buildDirectionAndField, createSafeIn } from '@server/models/utils'
import { MUserAccountId, MUserId } from '@server/types/models'
import { VideoInclude, VideoPrivacy, VideoState } from '@shared/models'
-import { AbstractVideosQueryBuilder } from './shared/abstract-videos-query-builder'
+import { AbstractRunQuery } from './shared/abstract-run-query'
/**
*
languageOneOf?: string[]
tagsOneOf?: string[]
tagsAllOf?: string[]
+ privacyOneOf?: VideoPrivacy[]
uuids?: string[]
hasFiles?: boolean
+ hasHLSFiles?: boolean
+ hasWebtorrentFiles?: boolean
accountId?: number
videoChannelId?: number
having?: string
}
-export class VideosIdListQueryBuilder extends AbstractVideosQueryBuilder {
+export class VideosIdListQueryBuilder extends AbstractRunQuery {
protected replacements: any = {}
private attributes: string[]
return this.runQuery().then(rows => rows.length !== 0 ? rows[0].total : 0)
}
- getIdsListQueryAndSort (options: BuildVideosListQueryOptions) {
+ getQuery (options: BuildVideosListQueryOptions) {
this.buildIdsListQuery(options)
return { query: this.query, sort: this.sort, replacements: this.replacements }
this.whereStateAvailable()
}
- // Only list videos with the appropriate priavcy
- if (!(options.include & VideoInclude.HIDDEN_PRIVACY)) {
- this.wherePrivacyAvailable(options.user)
- }
-
if (options.videoPlaylistId) {
this.joinPlaylist(options.videoPlaylistId)
}
this.whereFileExists()
}
+ if (exists(options.hasWebtorrentFiles)) {
+ this.whereWebTorrentFileExists(options.hasWebtorrentFiles)
+ }
+
+ if (exists(options.hasHLSFiles)) {
+ this.whereHLSFileExists(options.hasHLSFiles)
+ }
+
if (options.tagsOneOf) {
this.whereTagsOneOf(options.tagsOneOf)
}
this.whereTagsAllOf(options.tagsAllOf)
}
+ if (options.privacyOneOf) {
+ this.wherePrivacyOneOf(options.privacyOneOf)
+ } else {
+ // Only list videos with the appropriate priavcy
+ this.wherePrivacyAvailable(options.user)
+ }
+
if (options.uuids) {
this.whereUUIDs(options.uuids)
}
' WHERE "videoShare"."videoId" = "video"."id"' +
' )' +
' OR' +
- ' EXISTS (' + // Videos published by accounts we follow
+ ' EXISTS (' + // Videos published by channels or accounts we follow
' SELECT 1 from "actorFollow" ' +
- ' WHERE "actorFollow"."targetActorId" = "account"."actorId" AND "actorFollow"."actorId" = :followerActorId ' +
+ ' WHERE ("actorFollow"."targetActorId" = "account"."actorId" OR "actorFollow"."targetActorId" = "videoChannel"."actorId") ' +
+ ' AND "actorFollow"."actorId" = :followerActorId ' +
' AND "actorFollow"."state" = \'accepted\'' +
' )'
}
private whereFileExists () {
- this.and.push(
- '(' +
- ' EXISTS (SELECT 1 FROM "videoFile" WHERE "videoFile"."videoId" = "video"."id") ' +
- ' OR EXISTS (' +
- ' SELECT 1 FROM "videoStreamingPlaylist" ' +
- ' INNER JOIN "videoFile" ON "videoFile"."videoStreamingPlaylistId" = "videoStreamingPlaylist"."id" ' +
- ' WHERE "videoStreamingPlaylist"."videoId" = "video"."id"' +
- ' )' +
- ')'
- )
+ this.and.push(`(${this.buildWebTorrentFileExistsQuery(true)} OR ${this.buildHLSFileExistsQuery(true)})`)
+ }
+
+ private whereWebTorrentFileExists (exists: boolean) {
+ this.and.push(this.buildWebTorrentFileExistsQuery(exists))
+ }
+
+ private whereHLSFileExists (exists: boolean) {
+ this.and.push(this.buildHLSFileExistsQuery(exists))
+ }
+
+ private buildWebTorrentFileExistsQuery (exists: boolean) {
+ const prefix = exists ? '' : 'NOT '
+
+ return prefix + 'EXISTS (SELECT 1 FROM "videoFile" WHERE "videoFile"."videoId" = "video"."id")'
+ }
+
+ private buildHLSFileExistsQuery (exists: boolean) {
+ const prefix = exists ? '' : 'NOT '
+
+ return prefix + 'EXISTS (' +
+ ' SELECT 1 FROM "videoStreamingPlaylist" ' +
+ ' INNER JOIN "videoFile" ON "videoFile"."videoStreamingPlaylistId" = "videoStreamingPlaylist"."id" ' +
+ ' WHERE "videoStreamingPlaylist"."videoId" = "video"."id"' +
+ ')'
}
private whereTagsOneOf (tagsOneOf: string[]) {
)
}
+ private wherePrivacyOneOf (privacyOneOf: VideoPrivacy[]) {
+ this.and.push('"video"."privacy" IN (:privacyOneOf)')
+ this.replacements.privacyOneOf = privacyOneOf
+ }
+
private whereUUIDs (uuids: string[]) {
this.and.push('"video"."uuid" IN (' + createSafeIn(this.sequelize, uuids) + ')')
}