diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts index 073fabd27..f87041a3f 100644 --- a/server/initializers/constants.ts +++ b/server/initializers/constants.ts @@ -10,13 +10,12 @@ import { RequestEndpoint, RequestVideoEventType, RequestVideoQaduType, - JobState, - VideoResolution + JobState } from '../../shared/models' // --------------------------------------------------------------------------- -const LAST_MIGRATION_VERSION = 70 +const LAST_MIGRATION_VERSION = 75 // --------------------------------------------------------------------------- diff --git a/server/initializers/migrations/0075-video-resolutions.ts b/server/initializers/migrations/0075-video-resolutions.ts new file mode 100644 index 000000000..6bc1e72ab --- /dev/null +++ b/server/initializers/migrations/0075-video-resolutions.ts @@ -0,0 +1,62 @@ +import * as Sequelize from 'sequelize' +import * as Promise from 'bluebird' +import { join } from 'path' + +import { readdirPromise, renamePromise } from '../../helpers/core-utils' +import { CONFIG } from '../../initializers/constants' + +function up (utils: { + transaction: Sequelize.Transaction, + queryInterface: Sequelize.QueryInterface, + sequelize: Sequelize.Sequelize, + db: any +}): Promise { + const torrentDir = CONFIG.STORAGE.TORRENTS_DIR + const videoFileDir = CONFIG.STORAGE.VIDEOS_DIR + + return readdirPromise(torrentDir) + .then(torrentFiles => { + const tasks: Promise[] = [] + for (const torrentFile of torrentFiles) { + const matches = /^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.torrent/.exec(torrentFile) + if (matches === null) { + console.log('Invalid torrent file name %s.', torrentFile) + continue + } + + const newTorrentName = matches[1] + '-original.torrent' + const p = renamePromise(join(torrentDir, torrentFile), join(torrentDir, newTorrentName)) + tasks.push(p) + } + + return Promise.all(tasks) + }) + .then(() => { + return readdirPromise(videoFileDir) + }) + .then(videoFiles => { + const tasks: Promise[] = [] + for (const videoFile of videoFiles) { + const matches = /^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.([a-z0-9]+)/.exec(videoFile) + if (matches === null) { + console.log('Invalid video file name %s.', videoFile) + continue + } + + const newVideoFileName = matches[1] + '-original.' + matches[2] + const p = renamePromise(join(videoFileDir, videoFile), join(videoFileDir, newVideoFileName)) + tasks.push(p) + } + + return Promise.all(tasks).then(() => undefined) + }) +} + +function down (options) { + throw new Error('Not implemented.') +} + +export { + up, + down +} diff --git a/server/models/video/video.ts b/server/models/video/video.ts index 28df91a7b..b4a2b0c95 100644 --- a/server/models/video/video.ts +++ b/server/models/video/video.ts @@ -627,19 +627,13 @@ transcodeOriginalVideofile = function (this: VideoInstance, resolution: VideoRes videoId: this.id }) const videoOutputPath = join(videosDirectory, this.getVideoFilename(newVideoFile)) - const resolutionWidthSizes = { - 1: '240x?', - 2: '360x?', - 3: '480x?', - 4: '720x?', - 5: '1080x?' - } + const resolutionOption = `${resolution}x?` // '720x?' for example return new Promise((res, rej) => { ffmpeg(videoInputPath) .output(videoOutputPath) .videoCodec('libx264') - .size(resolutionWidthSizes[resolution]) + .size(resolutionOption) .outputOption('-threads ' + CONFIG.TRANSCODING.THREADS) .outputOption('-movflags faststart') .on('error', rej) diff --git a/server/tests/api/multiple-pods.ts b/server/tests/api/multiple-pods.ts index 9860935e5..c43793b30 100644 --- a/server/tests/api/multiple-pods.ts +++ b/server/tests/api/multiple-pods.ts @@ -197,22 +197,22 @@ describe('Test multiple pods', function () { expect(originalFile.resolutionLabel).to.equal('original') expect(originalFile.size).to.equal(711327) - const file240p = video.files.find(f => f.resolution === 1) + const file240p = video.files.find(f => f.resolution === 240) expect(file240p).not.to.be.undefined expect(file240p.resolutionLabel).to.equal('240p') expect(file240p.size).to.equal(139953) - const file360p = video.files.find(f => f.resolution === 2) + const file360p = video.files.find(f => f.resolution === 360) expect(file360p).not.to.be.undefined expect(file360p.resolutionLabel).to.equal('360p') expect(file360p.size).to.equal(169926) - const file480p = video.files.find(f => f.resolution === 3) + const file480p = video.files.find(f => f.resolution === 480) expect(file480p).not.to.be.undefined expect(file480p.resolutionLabel).to.equal('480p') expect(file480p.size).to.equal(206758) - const file720p = video.files.find(f => f.resolution === 4) + const file720p = video.files.find(f => f.resolution === 720) expect(file720p).not.to.be.undefined expect(file720p.resolutionLabel).to.equal('720p') expect(file720p.size).to.equal(314913)