From 93e1258c7cbc0d1235ca6d2a1f7c1875985328b8 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 25 Aug 2017 11:36:23 +0200 Subject: Move video file metadata in their own table Will be used for user video quotas and multiple video resolutions --- server/initializers/migrations/0060-video-file.ts | 34 ++++++++++++++++ .../migrations/0065-video-file-size.ts | 46 ++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 server/initializers/migrations/0060-video-file.ts create mode 100644 server/initializers/migrations/0065-video-file-size.ts (limited to 'server/initializers/migrations') diff --git a/server/initializers/migrations/0060-video-file.ts b/server/initializers/migrations/0060-video-file.ts new file mode 100644 index 000000000..c362cf71a --- /dev/null +++ b/server/initializers/migrations/0060-video-file.ts @@ -0,0 +1,34 @@ +import * as Sequelize from 'sequelize' +import * as Promise from 'bluebird' + +function up (utils: { + transaction: Sequelize.Transaction, + queryInterface: Sequelize.QueryInterface, + sequelize: Sequelize.Sequelize, + db: any +}): Promise { + const q = utils.queryInterface + + const query = 'INSERT INTO "VideoFiles" ("videoId", "resolution", "size", "extname", "infoHash", "createdAt", "updatedAt") ' + + 'SELECT "id" AS "videoId", 0 AS "resolution", 0 AS "size", ' + + '"extname"::"text"::"enum_VideoFiles_extname" as "extname", "infoHash", "createdAt", "updatedAt" ' + + 'FROM "Videos"' + + return utils.db.VideoFile.sync() + .then(() => utils.sequelize.query(query)) + .then(() => { + return q.removeColumn('Videos', 'extname') + }) + .then(() => { + return q.removeColumn('Videos', 'infoHash') + }) +} + +function down (options) { + throw new Error('Not implemented.') +} + +export { + up, + down +} diff --git a/server/initializers/migrations/0065-video-file-size.ts b/server/initializers/migrations/0065-video-file-size.ts new file mode 100644 index 000000000..58f8f3bcc --- /dev/null +++ b/server/initializers/migrations/0065-video-file-size.ts @@ -0,0 +1,46 @@ +import * as Sequelize from 'sequelize' +import * as Promise from 'bluebird' +import { stat } from 'fs' + +import { VideoInstance } from '../../models' + +function up (utils: { + transaction: Sequelize.Transaction, + queryInterface: Sequelize.QueryInterface, + sequelize: Sequelize.Sequelize, + db: any +}): Promise { + return utils.db.Video.listOwnedAndPopulateAuthorAndTags() + .then((videos: VideoInstance[]) => { + const tasks: Promise[] = [] + + videos.forEach(video => { + video.VideoFiles.forEach(videoFile => { + const p = new Promise((res, rej) => { + stat(video.getVideoFilePath(videoFile), (err, stats) => { + if (err) return rej(err) + + videoFile.size = stats.size + videoFile.save().then(res).catch(rej) + }) + }) + + tasks.push(p) + }) + }) + + return tasks + }) + .then((tasks: Promise[]) => { + return Promise.all(tasks) + }) +} + +function down (options) { + throw new Error('Not implemented.') +} + +export { + up, + down +} -- cgit v1.2.3