diff options
| author | Zephyrrus <[email protected]> | 2020-07-19 22:35:59 +0300 |
|---|---|---|
| committer | Zephyrrus <[email protected]> | 2020-07-19 22:35:59 +0300 |
| commit | 645b62b81dc46b2e2bdea0fbe30c36c4e0ff4a48 (patch) | |
| tree | 4c454e816b699ead53d225afadfb528649d126f7 /src/api/databaseMigration.js | |
| parent | feat: Start working on a new album/tags/image info modal (diff) | |
| parent | Update setup script (diff) | |
| download | host.fuwn.me-645b62b81dc46b2e2bdea0fbe30c36c4e0ff4a48.tar.xz host.fuwn.me-645b62b81dc46b2e2bdea0fbe30c36c4e0ff4a48.zip | |
Merge branch 'dev' into dev-zephy
Diffstat (limited to 'src/api/databaseMigration.js')
| -rw-r--r-- | src/api/databaseMigration.js | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/api/databaseMigration.js b/src/api/databaseMigration.js index d95605d..4bd45b7 100644 --- a/src/api/databaseMigration.js +++ b/src/api/databaseMigration.js @@ -3,6 +3,13 @@ /* eslint-disable no-console */ const nodePath = require('path'); const moment = require('moment'); +const jetpack = require('fs-jetpack'); +const { path } = require('fs-jetpack'); +const sharp = require('sharp'); +const ffmpeg = require('fluent-ffmpeg'); + +const imageExtensions = ['.jpg', '.jpeg', '.bmp', '.gif', '.png', '.webp']; +const videoExtensions = ['.webm', '.mp4', '.wmv', '.avi', '.mov']; const oldDb = require('knex')({ client: 'sqlite3', @@ -45,6 +52,10 @@ const start = async () => { console.log('Starting migration, this may take a few minutes...'); // Because I half assed it console.log('Please do NOT kill the process. Wait for it to finish.'); + await jetpack.removeAsync(nodePath.join(__dirname, '..', '..', 'uploads', 'thumbs')); + await jetpack.dirAsync(nodePath.join(__dirname, '..', '..', 'uploads', 'thumbs', 'square')); + console.log('Finished deleting old thumbnails to create new ones'); + const users = await oldDb.table('users').where('username', '<>', 'root'); for (const user of users) { const now = moment.utc().toDate(); @@ -116,6 +127,13 @@ const start = async () => { albumId: file.albumid, fileId: file.id, }); + + const filename = file.name; + if (!jetpack.exists(nodePath.join(__dirname, '..', '..', 'uploads', filename))) continue; + const ext = nodePath.extname(filename).toLowerCase(); + const output = `${filename.slice(0, -ext.length)}.webp`; + if (imageExtensions.includes(ext)) await generateThumbnailForImage(filename, output); + if (videoExtensions.includes(ext)) generateThumbnailForVideo(filename); } await newDb.batchInsert('files', filesToInsert, 20); await newDb.batchInsert('albumsFiles', albumsFilesToInsert, 20); @@ -125,4 +143,45 @@ const start = async () => { process.exit(0); }; +const generateThumbnailForImage = async (filename, output) => { + try { + const file = await jetpack.readAsync(nodePath.join(__dirname, '..', '..', 'uploads', filename), 'buffer'); + await sharp(file) + .resize(64, 64) + .toFormat('webp') + .toFile(nodePath.join(__dirname, '..', '..', 'uploads', 'thumbs', 'square', output)); + await sharp(file) + .resize(225, null) + .toFormat('webp') + .toFile(nodePath.join(__dirname, '..', '..', 'uploads', 'thumbs', output)); + console.log('finished', filename); + } catch (error) { + console.log('error', filename); + } +}; + +const generateThumbnailForVideo = filename => { + try { + ffmpeg(nodePath.join(__dirname, '..', '..', 'uploads', filename)) + .thumbnail({ + timestamps: [0], + filename: '%b.png', + folder: nodePath.join(__dirname, '..', '..', 'uploads', 'thumbs', 'square'), + size: '64x64' + }) + .on('error', error => console.error(error.message)); + ffmpeg(nodePath.join(__dirname, '..', '..', 'uploads', filename)) + .thumbnail({ + timestamps: [0], + filename: '%b.png', + folder: nodePath.join(__dirname, '..', '..', 'uploads', 'thumbs'), + size: '150x?' + }) + .on('error', error => console.error(error.message)); + console.log('finished', filename); + } catch (error) { + console.log('error', filename); + } +}; + start(); |