diff options
Diffstat (limited to 'server/models/video/video-file.ts')
-rw-r--r-- | server/models/video/video-file.ts | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/server/models/video/video-file.ts b/server/models/video/video-file.ts index 22cf63804..797a85a4e 100644 --- a/server/models/video/video-file.ts +++ b/server/models/video/video-file.ts | |||
@@ -1,7 +1,7 @@ | |||
1 | import { remove } from 'fs-extra' | 1 | import { remove } from 'fs-extra' |
2 | import * as memoizee from 'memoizee' | 2 | import * as memoizee from 'memoizee' |
3 | import { join } from 'path' | 3 | import { join } from 'path' |
4 | import { FindOptions, Op, QueryTypes, Transaction } from 'sequelize' | 4 | import { FindOptions, Op, Transaction } from 'sequelize' |
5 | import { | 5 | import { |
6 | AllowNull, | 6 | AllowNull, |
7 | BelongsTo, | 7 | BelongsTo, |
@@ -21,6 +21,7 @@ import { | |||
21 | import { Where } from 'sequelize/types/lib/utils' | 21 | import { Where } from 'sequelize/types/lib/utils' |
22 | import validator from 'validator' | 22 | import validator from 'validator' |
23 | import { buildRemoteVideoBaseUrl } from '@server/helpers/activitypub' | 23 | import { buildRemoteVideoBaseUrl } from '@server/helpers/activitypub' |
24 | import { doesExist } from '@server/helpers/database-utils' | ||
24 | import { logger } from '@server/helpers/logger' | 25 | import { logger } from '@server/helpers/logger' |
25 | import { extractVideo } from '@server/helpers/video' | 26 | import { extractVideo } from '@server/helpers/video' |
26 | import { getTorrentFilePath } from '@server/lib/video-paths' | 27 | import { getTorrentFilePath } from '@server/lib/video-paths' |
@@ -250,14 +251,8 @@ export class VideoFileModel extends Model<Partial<AttributesOnly<VideoFileModel> | |||
250 | 251 | ||
251 | static doesInfohashExist (infoHash: string) { | 252 | static doesInfohashExist (infoHash: string) { |
252 | const query = 'SELECT 1 FROM "videoFile" WHERE "infoHash" = $infoHash LIMIT 1' | 253 | const query = 'SELECT 1 FROM "videoFile" WHERE "infoHash" = $infoHash LIMIT 1' |
253 | const options = { | ||
254 | type: QueryTypes.SELECT as QueryTypes.SELECT, | ||
255 | bind: { infoHash }, | ||
256 | raw: true | ||
257 | } | ||
258 | 254 | ||
259 | return VideoModel.sequelize.query(query, options) | 255 | return doesExist(query, { infoHash }) |
260 | .then(results => results.length === 1) | ||
261 | } | 256 | } |
262 | 257 | ||
263 | static async doesVideoExistForVideoFile (id: number, videoIdOrUUID: number | string) { | 258 | static async doesVideoExistForVideoFile (id: number, videoIdOrUUID: number | string) { |
@@ -266,6 +261,33 @@ export class VideoFileModel extends Model<Partial<AttributesOnly<VideoFileModel> | |||
266 | return !!videoFile | 261 | return !!videoFile |
267 | } | 262 | } |
268 | 263 | ||
264 | static async doesOwnedTorrentFileExist (filename: string) { | ||
265 | const query = 'SELECT 1 FROM "videoFile" ' + | ||
266 | 'LEFT JOIN "video" "webtorrent" ON "webtorrent"."id" = "videoFile"."videoId" AND "webtorrent"."remote" IS FALSE ' + | ||
267 | 'LEFT JOIN "videoStreamingPlaylist" ON "videoStreamingPlaylist"."id" = "videoFile"."videoStreamingPlaylistId" ' + | ||
268 | 'LEFT JOIN "video" "hlsVideo" ON "hlsVideo"."id" = "videoStreamingPlaylist"."videoId" AND "hlsVideo"."remote" IS FALSE ' + | ||
269 | 'WHERE "torrentFilename" = $filename AND ("hlsVideo"."id" IS NOT NULL OR "webtorrent"."id" IS NOT NULL) LIMIT 1' | ||
270 | |||
271 | return doesExist(query, { filename }) | ||
272 | } | ||
273 | |||
274 | static async doesOwnedWebTorrentVideoFileExist (filename: string) { | ||
275 | const query = 'SELECT 1 FROM "videoFile" INNER JOIN "video" ON "video"."id" = "videoFile"."videoId" AND "video"."remote" IS FALSE ' + | ||
276 | 'WHERE "filename" = $filename LIMIT 1' | ||
277 | |||
278 | return doesExist(query, { filename }) | ||
279 | } | ||
280 | |||
281 | static loadByFilename (filename: string) { | ||
282 | const query = { | ||
283 | where: { | ||
284 | filename | ||
285 | } | ||
286 | } | ||
287 | |||
288 | return VideoFileModel.findOne(query) | ||
289 | } | ||
290 | |||
269 | static loadWithVideoOrPlaylistByTorrentFilename (filename: string) { | 291 | static loadWithVideoOrPlaylistByTorrentFilename (filename: string) { |
270 | const query = { | 292 | const query = { |
271 | where: { | 293 | where: { |
@@ -443,10 +465,9 @@ export class VideoFileModel extends Model<Partial<AttributesOnly<VideoFileModel> | |||
443 | } | 465 | } |
444 | 466 | ||
445 | getFileDownloadUrl (video: MVideoWithHost) { | 467 | getFileDownloadUrl (video: MVideoWithHost) { |
446 | const basePath = this.isHLS() | 468 | const path = this.isHLS() |
447 | ? STATIC_DOWNLOAD_PATHS.HLS_VIDEOS | 469 | ? join(STATIC_DOWNLOAD_PATHS.HLS_VIDEOS, `${video.uuid}-${this.resolution}-fragmented${this.extname}`) |
448 | : STATIC_DOWNLOAD_PATHS.VIDEOS | 470 | : join(STATIC_DOWNLOAD_PATHS.VIDEOS, `${video.uuid}-${this.resolution}${this.extname}`) |
449 | const path = join(basePath, this.filename) | ||
450 | 471 | ||
451 | if (video.isOwned()) return WEBSERVER.URL + path | 472 | if (video.isOwned()) return WEBSERVER.URL + path |
452 | 473 | ||