namespace App\Jobs;
+use App\Fluidbook\Packager\Packager;
+use App\Models\FluidbookPublication;
use App\Models\User;
use App\Services\WorkshopV2;
+use Cubist\Util\CommandLine\Rsync;
use Cubist\Util\Files\Files;
use Cubist\Util\PHP;
use Cubist\Util\Str;
public function handle()
{
- if ($this->action === 'install_hosting') {
+ if ($this->action === 'install') {
$url = $this->installHosting($this->entry->getPageData());
$this->sendNotification(__('Collection ":title" (#:nb) installée sur le serveur hosting', ['title' => $this->_title(), 'nb' => $this->_id()]), '', $url);
} else if ($this->action === 'export' && in_array($this->entry->version, ['win_inss_html', 'win_ins_html'])) {
PHP::neverStop();
if ($data->type === 'scorm_multilang') {
$res = $this->compileSCORMMultilang($data, $path);
+ } else if ($data->type === 'export_multilang') {
+ $res = $this->compileMultilang($data, $path);
} elseif ($data->type === 'export') {
$res = $this->compileExport($data, $path);
}
return $res;
}
- protected function _getws2()
- {
- $ws = new WorkshopV2();
- $ws->login($this->user->email, $this->user->api_token);
- return $ws;
- }
-
protected function getCollectionGlobalSettings()
{
$options = [];
return $options;
}
-
/**
* @throws \Exception
*/
protected function compileSCORMMultilang($data, $path)
+ {
+ return $this->compileSCORM($data, $path, true);
+ }
+
+ /**
+ * @throws \Exception
+ */
+ protected function compileMultilang($data, $path, $scorm = false)
{
$ws = $this->_getws2();
$langs = [];
$defaultFlags = ['en' => 'gb', 'sv' => 'se'];
+ $fluidbooks = [];
+
foreach ($data->publications as $publication) {
$fbid = $publication['fluidbook'];
- $metadata = $ws->getMetadata($fbid);
- $langs[$fbid] = $metadata->lang;
- $countries[$fbid] = $metadata->settings->country;
+ $fluidbooks[$fbid] = FluidbookPublication::find($fbid);
+ $langs[$fbid] = $fluidbooks[$fbid]->lang;
+ $countries[$fbid] = $fluidbooks[$fbid]->country;
}
$options = $this->getCollectionGlobalSettings();
- $options['scorm_enable'] = true;
-
- if (count($data->publications) >= 2) {
+ if ($scorm) {
+ $options['scorm_enable'] = true;
+ }
- if ($data->locale_switch) {
- $multilang = [];
- foreach ($langs as $fbid => $lang) {
- if ($countries[$fbid]) {
- $flag = $countries[$fbid];
+ if ($data->locale_switch) {
+ $multilang = [];
+ foreach ($langs as $fbid => $lang) {
+ if ($countries[$fbid]) {
+ $flag = $countries[$fbid];
+ } else {
+ if (strlen($lang) === 5) {
+ $flag = substr($lang, 3, 2);
+ } else if (isset($defaultFlags[$lang])) {
+ $flag = $defaultFlags[$lang];
} else {
- if (strlen($lang) === 5) {
- $flag = substr($lang, 3, 2);
- } else if (isset($defaultFlags[$lang])) {
- $flag = $defaultFlags[$lang];
- } else {
- $flag = $lang;
- }
+ $flag = $lang;
}
- $multilang[] = $lang . ',' . strtolower($flag) . ',../' . $lang . '/index.html';
}
- $options['multilang'] = implode("\n", $multilang);
- $options['multilangDisplay'] = 'lang';
- } else {
- $options['multilang'] = '';
+ $multilang[] = $lang . ',' . strtolower($flag) . ',../' . $lang . '/index.html';
}
+ $options['multilang'] = implode("\n", $multilang);
+ $options['multilangDisplay'] = 'lang';
+ } else {
+ $options['multilang'] = '';
+ }
- foreach ($data->publications as $publication) {
- $fbid = $publication['fluidbook'];
- $lang = $langs[$fbid];
- $dir = $path . '/' . $lang;
- $ws->installBook($fbid, $dir, $options, 'scorm', 3);
- }
+ foreach ($fluidbooks as $fbid => $publication) {
+ $this->package($fbid, $scorm ? 'scorm' : $data->version, $options, $path . '/' . $langs[$fbid]);
+ }
- if (in_array('en', $langs)) {
- $default = 'en';
- } else {
- $default = $langs[0];
- }
+ if (in_array('en', $langs)) {
+ $default = 'en';
+ } else {
+ $default = $langs[0];
+ }
+ if ($scorm) {
$manifestFile = $path . '/imsmanifest.xml';
foreach ($langs as $lang) {
$manifest = $path . '/' . $lang . '/imsmanifest.xml';
$manifestContent = file_get_contents($manifestFile);
$manifestContent = preg_replace('/\<title\>(.*)\<\/title\>/U', '<title>' . htmlspecialchars($this->entry->title) . '</title>', $manifestContent);
file_put_contents($manifestFile, $manifestContent);
-
- $redirectionScript = "<html>
-<head></head>
-<body>
-<script type=\"text/javascript\">
-function guessPreferedLanguage(available, defaultLanguage) {
- if (defaultLanguage == undefined) {
- defaultLanguage = available[0];
- }
-
- var browserLanguages = getLanguagesFromBrowser();
- var res = null;
-
- for (var i = 0; i < browserLanguages.length; i++) {
- var bl = browserLanguages[i];
- if (available.indexOf(bl) >= 0) {
- res = bl;
- break;
}
- }
- if (res == null) {
- return defaultLanguage;
- }
- return res;
-}
-
-function getLanguagesFromBrowser() {
- var res = [];
-
- var navigatorLanguages = navigator.languages || [navigator.language || navigator.userLanguage];
- for(var i in navigatorLanguages){
- var v=navigatorLanguages[i];
- var e = v.split('-');
- if (res.indexOf(e[0]) === -1) {
- res.push(e[0]);
- }
+ file_put_contents($path . '/index.html', self::getRedirectScript($langs, $default));
}
- return res;
-}
-
-var locale=guessPreferedLanguage(" . json_encode(array_values($langs)) . ",'" . $default . "');
-window.location='./' + locale + '/index.html';
-</script>
-</body>
-</html>";
-
- file_put_contents($path . '/index.html', $redirectionScript);
- } else {
- foreach ($data->publications as $publication) {
- $fbid = $publication['fluidbook'];
- $dir = $path;
- $ws->installBook($fbid, $dir, $options, 'scorm', 3);
- break;
- }
- }
- }
-
-
- protected function installHosting($data)
+ protected function package($fbid, $version, $options, $path)
{
- $ws = $this->_getws2();
- $options = $this->getCollectionGlobalSettings();
-
- $updatedPublications = [];
- $jobs = [];
- foreach ($data->publications as $publication) {
- $fbid = $publication['fluidbook'];
- if (isset($publication['dir']) && $publication['dir']) {
- $options['dir'] = $publication['dir'];
- } else {
- $metadata = $ws->getMetadata($fbid);
- $publication['dir'] = $options['dir'] = $metadata->export->install_hosting->online->dir ?? Str::slug($metadata->title);
- }
-
- $job = new FluidbookWS2Download();
- $job->setBookId($fbid);
- $job->setVersion('online');
- $job->setOptions($options);
- $job->setAction('install_hosting');
- $job->setJobName('install_hosting_' . $fbid);
- $u = backpack_user() ?? User::withoutGlobalScopes()->find(5);
- $job->setCredentials([$u->email, $u->api_token]);
- //$job->handle();
- dispatch($job)->onQueue('ws2');
- $jobs['Fluidbook #' . $fbid] = $job;
- $updatedPublications[] = $publication;
- }
- $this->entry->publications = $updatedPublications;
- $this->entry->saveQuietly();
-
- while (!$this->_checkJobs($jobs)) {
- usleep(1000000 * 0.25);
- }
-
- $res = [];
- foreach ($jobs as $label => $job) {
- $res[$label] = $job->getResult();
- }
- return $res;
+ $packager = Packager::package($fbid, $version, false, true, $options);
+ $rsync = new Rsync($packager->getFinalPath(), $path);
+ $rsync->execute();
}
protected function downloadList($data)
}
}
}
+
+
+ public static function getRedirectScript($langs, $default = 'en')
+ {
+ return "<html>
+<head></head>
+<body>
+<script type=\"text/javascript\">
+function guessPreferedLanguage(available, defaultLanguage) {
+ if (defaultLanguage == undefined) {
+ defaultLanguage = available[0];
+ }
+
+ var browserLanguages = getLanguagesFromBrowser();
+ var res = null;
+
+ for (var i = 0; i < browserLanguages.length; i++) {
+ var bl = browserLanguages[i];
+ if (available.indexOf(bl) >= 0) {
+ res = bl;
+ break;
+ }
+ }
+ if (res == null) {
+ return defaultLanguage;
+ }
+
+ return res;
+}
+
+function getLanguagesFromBrowser() {
+ var res = [];
+
+ var navigatorLanguages = navigator.languages || [navigator.language || navigator.userLanguage];
+ for(var i in navigatorLanguages){
+ var v=navigatorLanguages[i];
+ var e = v.split('-');
+ if (res.indexOf(e[0]) === -1) {
+ res.push(e[0]);
+ }
+ }
+
+ return res;
+}
+
+var locale=guessPreferedLanguage(" . json_encode(array_values($langs)) . ",'" . $default . "');
+window.location='./' + locale + '/index.html';
+</script>
+</body>
+</html>";
+ }
}