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/constants.ts | 14 ++++++- server/initializers/database.ts | 2 + server/initializers/migrations/0060-video-file.ts | 34 ++++++++++++++++ .../migrations/0065-video-file-size.ts | 46 ++++++++++++++++++++++ server/initializers/migrator.ts | 19 +++++---- 5 files changed, 105 insertions(+), 10 deletions(-) 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') diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts index 314a05ab7..50a939083 100644 --- a/server/initializers/constants.ts +++ b/server/initializers/constants.ts @@ -15,7 +15,7 @@ import { // --------------------------------------------------------------------------- -const LAST_MIGRATION_VERSION = 55 +const LAST_MIGRATION_VERSION = 65 // --------------------------------------------------------------------------- @@ -114,7 +114,8 @@ const CONSTRAINTS_FIELDS = { THUMBNAIL_DATA: { min: 0, max: 20000 }, // Bytes VIEWS: { min: 0 }, LIKES: { min: 0 }, - DISLIKES: { min: 0 } + DISLIKES: { min: 0 }, + FILE_SIZE: { min: 10, max: 1024 * 1024 * 1024 * 3 /* 3Go */ } }, VIDEO_EVENTS: { COUNT: { min: 0 } @@ -176,6 +177,14 @@ const VIDEO_LANGUAGES = { 14: 'Italien' } +const VIDEO_FILE_RESOLUTIONS = { + 0: 'original', + 1: '360p', + 2: '480p', + 3: '720p', + 4: '1080p' +} + // --------------------------------------------------------------------------- // Score a pod has when we create it as a friend @@ -362,6 +371,7 @@ export { THUMBNAILS_SIZE, USER_ROLES, VIDEO_CATEGORIES, + VIDEO_FILE_RESOLUTIONS, VIDEO_LANGUAGES, VIDEO_LICENCES, VIDEO_RATE_TYPES diff --git a/server/initializers/database.ts b/server/initializers/database.ts index 9e691bf1d..c0df2b63a 100644 --- a/server/initializers/database.ts +++ b/server/initializers/database.ts @@ -23,6 +23,7 @@ import { UserVideoRateModel, VideoAbuseModel, BlacklistedVideoModel, + VideoFileModel, VideoTagModel, VideoModel } from '../models' @@ -49,6 +50,7 @@ const database: { UserVideoRate?: UserVideoRateModel, User?: UserModel, VideoAbuse?: VideoAbuseModel, + VideoFile?: VideoFileModel, BlacklistedVideo?: BlacklistedVideoModel, VideoTag?: VideoTagModel, Video?: VideoModel 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 +} diff --git a/server/initializers/migrator.ts b/server/initializers/migrator.ts index 71a656c59..7b535aea9 100644 --- a/server/initializers/migrator.ts +++ b/server/initializers/migrator.ts @@ -64,14 +64,16 @@ function getMigrationScripts () { script: string }[] = [] - files.forEach(file => { - // Filename is something like 'version-blabla.js' - const version = file.split('-')[0] - filesToMigrate.push({ - version, - script: file + files + .filter(file => file.endsWith('.js.map') === false) + .forEach(file => { + // Filename is something like 'version-blabla.js' + const version = file.split('-')[0] + filesToMigrate.push({ + version, + script: file + }) }) - }) return filesToMigrate }) @@ -93,7 +95,8 @@ function executeMigration (actualVersion: number, entity: { version: string, scr const options = { transaction: t, queryInterface: db.sequelize.getQueryInterface(), - sequelize: db.sequelize + sequelize: db.sequelize, + db } return migrationScript.up(options) -- cgit v1.2.3