From cc9d5ae859b501732f5bee13c5ee74c96054a4cb Mon Sep 17 00:00:00 2001 From: Vincent Vanwaelscappel Date: Thu, 15 Jul 2021 18:48:08 +0200 Subject: [PATCH] wip #4592 @2 --- app/Jobs/GenerateThemePreview.php | 58 +++++++++++++++++++ app/Models/FluidbookTheme.php | 12 +++- .../js/social_screenshot/social_screenshot.js | 26 +++++++++ 3 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 app/Jobs/GenerateThemePreview.php create mode 100644 resources/js/social_screenshot/social_screenshot.js diff --git a/app/Jobs/GenerateThemePreview.php b/app/Jobs/GenerateThemePreview.php new file mode 100644 index 000000000..4c327bff2 --- /dev/null +++ b/app/Jobs/GenerateThemePreview.php @@ -0,0 +1,58 @@ +theme = $theme; + } + + public function uniqueId() + { + return $this->theme->id; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + $dest=storage_path('themes') . '/' . $this->theme->getIdValue() . '.jpg'; + + $cl = new CommandLine('node'); + $cl->setArg(null, resource_path('js/social_screenshot/social_screenshot.js')); + $cl->setArg('width', 1024); + $cl->setArg('height', 768); + $cl->setArg('delay', 2); + $cl->setArg('scale', 1); + $cl->setArg('dest', $dest); + $cl->setArg('url', 'https://workshop.fluidbook.com/viewerh/20098-' . $this->theme->getIdValue() . '_f2e0452eed6dba9878016ce5603fdc54_' . time() . '/?shortLoading=1#/page/2'); + $cl->execute(); + } +} diff --git a/app/Models/FluidbookTheme.php b/app/Models/FluidbookTheme.php index a7e478712..2bfe9f8d6 100644 --- a/app/Models/FluidbookTheme.php +++ b/app/Models/FluidbookTheme.php @@ -5,6 +5,7 @@ namespace App\Models; use App\Fields\User; +use App\Jobs\GenerateThemePreview; use Cubist\Backpack\Magic\Fields\Color; use Cubist\Backpack\Magic\Fields\Files; use Cubist\Backpack\Magic\Models\CubistMagicAbstractModel; @@ -644,6 +645,7 @@ class FluidbookTheme extends CubistMagicAbstractModel } } $ignore = ['id', 'name', 'owner', 'created_at', 'deleted_at', 'updated_at', 'slug']; + $t3dir = '/data1/extranet/www/fluidbook/themes3/'; $data = []; foreach (FluidbookTheme::all() as $theme) { @@ -666,7 +668,7 @@ class FluidbookTheme extends CubistMagicAbstractModel $media = $theme->getMedia($v)->get(0); if (null !== $media) { $v = $media->getAttribute('file_name'); - $dir = '/data1/extranet/www/fluidbook/themes3/' . $theme->id; + $dir = $t3dir . $theme->id; if (!file_exists($dir)) { mkdir($dir, 0777, true); } @@ -688,6 +690,12 @@ class FluidbookTheme extends CubistMagicAbstractModel $settings[$k] = $v; } $data[] = ['theme_id' => $theme->id, 'signature' => 0, 'nom' => $theme->name, 'proprietaire' => $theme->owner, 'icones' => $theme->iconSet, 'date' => strtotime($theme->creation_date), 'parametres' => json_encode($settings)]; + + $dest = $t3dir . '/' . $theme->id . '.jpg'; + if(!file_exists($dest)) { + $preview = storage_path('themes/' . $theme->id . '.jpg'); + `ln -s $preview $dest`; + } } $t = DB::table('extranet_clean.ws3_theme'); $t->truncate(); @@ -779,6 +787,7 @@ class FluidbookTheme extends CubistMagicAbstractModel if (self::$updateWS2ViewOnChange) { $this->updateWS2Table(); } + dispatch(new GenerateThemePreview($this)); } public function postDelete() @@ -860,6 +869,7 @@ class FluidbookTheme extends CubistMagicAbstractModel } } + protected static function _unserialize($str) { $class = 'stdClass'; diff --git a/resources/js/social_screenshot/social_screenshot.js b/resources/js/social_screenshot/social_screenshot.js new file mode 100644 index 000000000..d9e418421 --- /dev/null +++ b/resources/js/social_screenshot/social_screenshot.js @@ -0,0 +1,26 @@ +const puppeteer = require('puppeteer'); +const commandLineArgs = require('command-line-args'); +const optionDefinitions = [ + {name: 'url', type: String}, + {name: 'dest', type: String}, + {name: 'delay', type: Number, defaultOption: 10}, + {name: 'scale', type: Number, defaultOption: 1}, + {name: 'width', type: Number, defaultOption: 1920}, + {name: 'height', type: Number, defaultOption: 1080} +]; + +(async () => { + const options = commandLineArgs(optionDefinitions); + const browser = await puppeteer.launch({headless: true}); + const page = await browser.newPage(); + page.on('console', msg => console.log('PAGE LOG:', msg._text)); + await page.setViewport({ + width: options.width / options.scale, + height: options.height / options.scale, + deviceScaleFactor: options.scale, + }); + await page.goto(options.url); + await new Promise(r => setTimeout(r, 1000 * options.delay)); + await page.screenshot({path: options.dest, type: 'jpeg', quality: 95}); + await browser.close(); +})(); \ No newline at end of file -- 2.39.5