From 56b13bd193b076d32925f0ad14b755b250b803a8 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Wed, 19 Dec 2018 11:24:34 +0100 Subject: [PATCH] Fix federation of some videos If we don't transcode additional resolutions, and user decided to wait transcoding before publishing the video --- server/initializers/constants.ts | 2 +- .../migrations/0305-fix-unfederated-videos.ts | 52 +++++++++++++++++++ server/lib/job-queue/handlers/video-file.ts | 16 +++--- 3 files changed, 61 insertions(+), 9 deletions(-) create mode 100644 server/initializers/migrations/0305-fix-unfederated-videos.ts diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts index 6e463a1d6..b326a6c7b 100644 --- a/server/initializers/constants.ts +++ b/server/initializers/constants.ts @@ -16,7 +16,7 @@ let config: IConfig = require('config') // --------------------------------------------------------------------------- -const LAST_MIGRATION_VERSION = 300 +const LAST_MIGRATION_VERSION = 305 // --------------------------------------------------------------------------- diff --git a/server/initializers/migrations/0305-fix-unfederated-videos.ts b/server/initializers/migrations/0305-fix-unfederated-videos.ts new file mode 100644 index 000000000..be206601f --- /dev/null +++ b/server/initializers/migrations/0305-fix-unfederated-videos.ts @@ -0,0 +1,52 @@ +import * as Sequelize from 'sequelize' + +async function up (utils: { + transaction: Sequelize.Transaction, + queryInterface: Sequelize.QueryInterface, + sequelize: Sequelize.Sequelize, + db: any +}): Promise { + { + const query = `INSERT INTO "videoShare" (url, "actorId", "videoId", "createdAt", "updatedAt") ` + + `(` + + `SELECT ` + + `video.url || '/announces/' || "videoChannel"."actorId" as url, ` + + `"videoChannel"."actorId" AS "actorId", ` + + `"video"."id" AS "videoId", ` + + `NOW() AS "createdAt", ` + + `NOW() AS "updatedAt" ` + + `FROM video ` + + `INNER JOIN "videoChannel" ON "video"."channelId" = "videoChannel"."id" ` + + `WHERE "video"."remote" = false AND "video"."privacy" != 3 AND "video"."state" = 1` + + `) ` + + `ON CONFLICT DO NOTHING` + + await utils.sequelize.query(query) + } + + { + const query = `INSERT INTO "videoShare" (url, "actorId", "videoId", "createdAt", "updatedAt") ` + + `(` + + `SELECT ` + + `video.url || '/announces/' || (SELECT id FROM actor WHERE "preferredUsername" = 'peertube' ORDER BY id ASC LIMIT 1) as url, ` + + `(SELECT id FROM actor WHERE "preferredUsername" = 'peertube' ORDER BY id ASC LIMIT 1) AS "actorId", ` + + `"video"."id" AS "videoId", ` + + `NOW() AS "createdAt", ` + + `NOW() AS "updatedAt" ` + + `FROM video ` + + `WHERE "video"."remote" = false AND "video"."privacy" != 3 AND "video"."state" = 1` + + `) ` + + `ON CONFLICT DO NOTHING` + + await utils.sequelize.query(query) + } +} + +function down (options) { + throw new Error('Not implemented.') +} + +export { + up, + down +} diff --git a/server/lib/job-queue/handlers/video-file.ts b/server/lib/job-queue/handlers/video-file.ts index ddbf6d1c2..3dca2937f 100644 --- a/server/lib/job-queue/handlers/video-file.ts +++ b/server/lib/job-queue/handlers/video-file.ts @@ -91,15 +91,15 @@ async function onVideoFileTranscoderOrImportSuccess (video: VideoModel) { }) } -async function onVideoFileOptimizerSuccess (video: VideoModel, isNewVideo: boolean) { - if (video === undefined) return undefined +async function onVideoFileOptimizerSuccess (videoArg: VideoModel, isNewVideo: boolean) { + if (videoArg === undefined) return undefined // Outside the transaction (IO on disk) - const { videoFileResolution } = await video.getOriginalFileResolution() + const { videoFileResolution } = await videoArg.getOriginalFileResolution() return sequelizeTypescript.transaction(async t => { // Maybe the video changed in database, refresh it - const videoDatabase = await VideoModel.loadAndPopulateAccountAndServerAndTags(video.uuid, t) + let videoDatabase = await VideoModel.loadAndPopulateAccountAndServerAndTags(videoArg.uuid, t) // Video does not exist anymore if (!videoDatabase) return undefined @@ -128,13 +128,13 @@ async function onVideoFileOptimizerSuccess (video: VideoModel, isNewVideo: boole logger.info('Transcoding jobs created for uuid %s.', videoDatabase.uuid, { resolutionsEnabled }) } else { // No transcoding to do, it's now published - video.state = VideoState.PUBLISHED - video = await video.save({ transaction: t }) + videoDatabase.state = VideoState.PUBLISHED + videoDatabase = await videoDatabase.save({ transaction: t }) - logger.info('No transcoding jobs created for video %s (no resolutions).', video.uuid) + logger.info('No transcoding jobs created for video %s (no resolutions).', videoDatabase.uuid, { privacy: videoDatabase.privacy }) } - return federateVideoIfNeeded(video, isNewVideo, t) + return federateVideoIfNeeded(videoDatabase, isNewVideo, t) }) }