From: Vincent Vanwaelscappel Date: Thu, 28 Sep 2023 08:05:01 +0000 (+0200) Subject: wip #6170 @0.75 X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=c5230e0d5c79c9e323bfc6a1b4531ced334b9b28;p=fluidbook-toolbox.git wip #6170 @0.75 --- diff --git a/app/Console/Commands/QuizThemePreview.php b/app/Console/Commands/QuizThemePreview.php new file mode 100644 index 000000000..ea9d2ca35 --- /dev/null +++ b/app/Console/Commands/QuizThemePreview.php @@ -0,0 +1,34 @@ +argument('id'); + /** @var Builder $q */ + $q = QuizTheme::withoutGlobalScopes()->where('created_ok', '1')->orderBy('id', 'desc'); + if (null !== $themeId) { + $themeIds = ArrayUtil::parseRange($themeId); + $q->whereIn('id', $themeIds); + } + $themes = $q->get(); + $this->progressBar = $this->output->createProgressBar(count($themes)); + $this->progressBar->start(); + + foreach ($themes as $theme) { + dispatch_sync(new GenerateQuizThemePreview($theme)); + $this->progressBar->advance(); + } + } +} diff --git a/app/Http/Controllers/Admin/Operations/Quiz/PreviewOperation.php b/app/Http/Controllers/Admin/Operations/Quiz/PreviewOperation.php index 4d42a4fc1..7d2348b4b 100644 --- a/app/Http/Controllers/Admin/Operations/Quiz/PreviewOperation.php +++ b/app/Http/Controllers/Admin/Operations/Quiz/PreviewOperation.php @@ -32,7 +32,6 @@ trait PreviewOperation ->where('hash', '[0-9a-f]{32}') ->where('path', '.*') ->whereNumber('time') - ->whereAlpha('version') ->withoutMiddleware([CheckIfAdmin::class]) ->name('quiz_preview_with_time'); } diff --git a/app/Jobs/GenerateQuizThemePreview.php b/app/Jobs/GenerateQuizThemePreview.php new file mode 100644 index 000000000..ef40c18b6 --- /dev/null +++ b/app/Jobs/GenerateQuizThemePreview.php @@ -0,0 +1,59 @@ +theme = $theme; + } + + public function uniqueId() + { + return $this->theme->id; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + $cl = new CommandLine('node'); + $cl->setArg(null, resource_path('quiztheme/theme_preview/theme_preview.js')); + $cl->setArg('width', 1200); + $cl->setArg('height', 680); + $cl->setArg('delay', 2); + $cl->setArg('scale', 1); + $cl->setArg('intro', self::getPreviewPath($this->theme->getIdValue(), 'intro')); + $cl->setArg('standard', self::getPreviewPath($this->theme->getIdValue(), 'standard')); + $cl->setArg('draganddrop', self::getPreviewPath($this->theme->getIdValue(), 'draganddrop')); + $cl->setArg('outro', self::getPreviewPath($this->theme->getIdValue(), 'outro')); + $url = $this->theme->getPreviewURL(['shortLoading' => 1, 'transition' => 1, 'puppeteer' => 1]); + $cl->setArg('url', $url); + $cl->execute(); + $cl->debug(); + } + + public static function getPreviewPath($themeId, $variant = '') + { + return Files::mkdir(storage_path('quizthemes') . '/' . $themeId) . $variant . '.jpg'; + } +} diff --git a/app/Models/QuizTheme.php b/app/Models/QuizTheme.php index ba3cd72ed..0a1e932d0 100644 --- a/app/Models/QuizTheme.php +++ b/app/Models/QuizTheme.php @@ -41,7 +41,7 @@ class QuizTheme extends ToolboxModel $this->addField('hash', Hidden::class); $this->addField('name', 'Text', __('Nom'), ['column' => true]); - //$this->addField('preview', 'NoValue', __('Preview'), ['column_escape' => false, 'column' => true, 'column_type' => 'model_function', 'column_function_name' => 'getPreviewImage', 'column_limit' => -1]); + $this->addField('preview', 'NoValue', __('Preview'), ['column_escape' => false, 'column' => true, 'column_type' => 'model_function', 'column_function_name' => 'getPreviewImage', 'column_limit' => -1]); $this->setSettingsFields(); } @@ -255,4 +255,23 @@ class QuizTheme extends ToolboxModel unlink($tmp); return $blur; } + + public function getPreviewURL($params = [], $page = 2) + { + return self::getThemePreviewURL($this->getIdValue(), $params, $page); + } + + public static function getThemePreviewURL($id, $params = []) + { + $defaultParams = ['id' => '1061-' . $id, 'hash' => 'a549a6f6da4fba85cd47e2871e0153a8', 'time' => time(), 'path' => 'index.html', 'force' => 0, 'shortLoading' => 1, 'puppeteer' => 0]; + return route('quiz_preview_with_time', array_merge($defaultParams, $params)); + } + + + public function getPreviewImage() + { + return clean(''); + } + + } diff --git a/resources/quiztheme/theme_preview/theme_preview.js b/resources/quiztheme/theme_preview/theme_preview.js new file mode 100644 index 000000000..fd540133d --- /dev/null +++ b/resources/quiztheme/theme_preview/theme_preview.js @@ -0,0 +1,61 @@ +const puppeteer = require('puppeteer'); +const commandLineArgs = require('command-line-args'); +const optionDefinitions = [ + {name: 'url', type: String}, + {name: 'intro', type: String}, + {name: 'standard', type: String}, + {name: 'draganddrop', type: String}, + {name: 'outro', type: String}, + {name: 'delay', type: Number, defaultOption: 10}, + {name: 'scale', type: Number, defaultOption: 1}, + {name: 'width', type: Number, defaultOption: 1200}, + {name: 'height', type: Number, defaultOption: 680}, + {name: 'page', type: Number, defaultOption: 2} +]; + +(async () => { + const {installMouseHelper} = require('./install-mouse-helper'); + const options = commandLineArgs(optionDefinitions); + const browser = await puppeteer.launch({ + headless: 'new', + args: [ + "--disable-setuid-sandbox", + "--no-sandbox", + ], + executablePath: 'google-chrome-stable', + }); + + const page = await browser.newPage(); + page.on('console', async (msg) => { + const msgArgs = msg.args(); + for (let i = 0; i < msgArgs.length; ++i) { + console.log(await msgArgs[i].jsonValue()); + } + }); + await page.setViewport({ + width: options.width / options.scale, height: options.height / options.scale, deviceScaleFactor: options.scale, + }); + + // Intro screen + await page.goto(options.url, {waitUntil: 'networkidle2'}); + await page.screenshot({path: options.intro, type: 'jpeg', quality: 95}); + + // Question 1 + await page.evaluate(() => window.quiz.screens.showScreen('q-0')); + await new Promise(r => setTimeout(r, 1000 * (options.delay + 3))); + await page.screenshot({path: options.standard, type: 'jpeg', quality: 95}); + await page.evaluate(() => window.quiz.score.setAnswer(0, [0])); + + // Question 2 + await page.evaluate(() => window.quiz.screens.showScreen('q-1')); + await new Promise(r => setTimeout(r, 1000 * (options.delay + 3))); + await page.screenshot({path: options.draganddrop, type: 'jpeg', quality: 95}); + await page.evaluate(() => window.quiz.score.setAnswer(1, [1, 1, 2, 1, 2])); + + // Outro + await page.evaluate(() => window.quiz.screens.showScreen('outro')); + await new Promise(r => setTimeout(r, 1000 * (options.delay + 3))); + await page.screenshot({path: options.outro, type: 'jpeg', quality: 95}); + + await browser.close(); +})();