PHRAS-1719 Add presets selection on subdef admin page

This commit is contained in:
Xavier Rousset
2017-12-12 18:20:16 +01:00
parent 8117d1ebc0
commit 1683191d19
9 changed files with 1229 additions and 483 deletions

View File

@@ -12,8 +12,14 @@ namespace Alchemy\Phrasea\Controller\Admin;
use Alchemy\Phrasea\Controller\Controller;
use Alchemy\Phrasea\Databox\SubdefGroup;
use Alchemy\Phrasea\Media\Subdef\Subdef;
use Alchemy\Phrasea\Media\Type\Type;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Alchemy\Phrasea\Media\Subdef\Image;
use Alchemy\Phrasea\Media\Subdef\Video;
use Alchemy\Phrasea\Media\Subdef\Audio;
use Alchemy\Phrasea\Media\Subdef\Gif;
class SubdefsController extends Controller
{
@@ -23,10 +29,14 @@ class SubdefsController extends Controller
*/
function indexAction($sbas_id) {
$databox = $this->findDataboxById((int) $sbas_id);
$config = $this->getConfiguration();
$subviews_mapping = $this->getSubviewsMapping();
return $this->render('admin/subdefs.html.twig', [
'databox' => $databox,
'subdefs' => $databox->get_subdef_structure(),
'config' => $config,
'subviews_mapping' => $subviews_mapping
]);
}
@@ -43,7 +53,7 @@ class SubdefsController extends Controller
$databox = $this->findDataboxById((int) $sbas_id);
$add_subdef = ['class' => null, 'name' => null, 'group' => null];
$add_subdef = ['class' => null, 'name' => null, 'group' => null, 'mediaType' => null, 'presets' => null];
foreach ($add_subdef as $k => $v) {
if (!isset($toadd_subdef[$k]) || trim($toadd_subdef[$k]) === '') {
unset($add_subdef[$k]);
@@ -58,7 +68,7 @@ class SubdefsController extends Controller
$name = $delete_subef[1];
$subdefs = $databox->get_subdef_structure();
$subdefs->delete_subdef($group, $name);
} elseif (count($add_subdef) === 3) {
} elseif (count($add_subdef) === 5) {
$subdefs = $databox->get_subdef_structure();
$group = $add_subdef['group'];
@@ -66,11 +76,84 @@ class SubdefsController extends Controller
$unicode = $this->app['unicode'];
$name = $unicode->remove_nonazAZ09($add_subdef['name'], false);
$class = $add_subdef['class'];
$preset = $add_subdef['presets'];
$mediatype = $add_subdef['mediaType'];
$subdefs->add_subdef($group, $name, $class, $mediatype, $preset);
if ($preset !== "Choose") {
$options = [];
$config = $this->getConfiguration();
//On applique directement les valeurs du preset à la sous def
switch($mediatype) {
case Subdef::TYPE_IMAGE :
$options["path"] = "";
$options["meta"] = true;
$options["mediatype"] = $mediatype;
$options[Image::OPTION_SIZE] = $config["image"]["definitions"][$preset][Image::OPTION_SIZE];
$options["dpi"] = $config["image"]["definitions"][$preset][Image::OPTION_RESOLUTION];
$options[Image::OPTION_STRIP] = $config["image"]["definitions"][$preset][Image::OPTION_STRIP];
$options[Image::OPTION_FLATTEN] = $config["image"]["definitions"][$preset][Image::OPTION_FLATTEN];
$options[Image::OPTION_QUALITY] = $config["image"]["definitions"][$preset][Image::OPTION_QUALITY];
$options[Image::OPTION_ICODEC] = $config["image"]["definitions"][$preset][Image::OPTION_ICODEC];
foreach($config["image"]["definitions"][$preset][Subdef::OPTION_DEVICE] as $devices) {
$options[Subdef::OPTION_DEVICE][] = $devices;
}
break;
case Subdef::TYPE_VIDEO :
$options["path"] = "";
$options["meta"] = true;
$options["mediatype"] = $mediatype;
$options[Video::OPTION_AUDIOBITRATE] = $config["video"]["definitions"][$preset][Video::OPTION_AUDIOBITRATE];
$options[Video::OPTION_AUDIOSAMPLERATE] = $config["video"]["definitions"][$preset][Video::OPTION_AUDIOSAMPLERATE];
$options[Video::OPTION_BITRATE] = $config["video"]["definitions"][$preset][Video::OPTION_BITRATE];
$options[Video::OPTION_GOPSIZE] = $config["video"]["definitions"][$preset][Video::OPTION_GOPSIZE];
$options[Video::OPTION_SIZE] = $config["video"]["definitions"][$preset][Video::OPTION_SIZE];
$options[Video::OPTION_FRAMERATE] = $config["video"]["definitions"][$preset][Video::OPTION_FRAMERATE];
$options[Video::OPTION_VCODEC] = $config["video"]["definitions"][$preset][Video::OPTION_VCODEC];
$options[Video::OPTION_ACODEC] = $config["video"]["definitions"][$preset][Video::OPTION_ACODEC];
foreach($config["video"]["definitions"][$preset][Subdef::OPTION_DEVICE] as $devices) {
$options[Subdef::OPTION_DEVICE][] = $devices;
}
break;
case Subdef::TYPE_FLEXPAPER :
$options["path"] = "";
$options["meta"] = true;
$options["mediatype"] = $mediatype;
foreach($config["document"]["definitions"][$preset]["devices"] as $devices) {
$options["devices"][] = $devices;
}
break;
case Subdef::TYPE_ANIMATION :
$options["path"] = "";
$options["meta"] = true;
$options["mediatype"] = $mediatype;
$options[Gif::OPTION_SIZE] = $config["gif"]["definitions"][$preset][Gif::OPTION_SIZE];
$options[Gif::OPTION_DELAY] = $config["gif"]["definitions"][$preset][Gif::OPTION_DELAY];
foreach($config["gif"]["definitions"][$preset][Subdef::OPTION_DEVICE] as $devices) {
$options[Subdef::OPTION_DEVICE][] = $devices;
}
break;
case Subdef::TYPE_AUDIO :
$options["path"] = "";
$options["meta"] = true;
$options["mediatype"] = $mediatype;
$options[Audio::OPTION_AUDIOBITRATE] = $config["audio"]["definitions"][$preset][Audio::OPTION_AUDIOBITRATE];
$options[Audio::OPTION_AUDIOSAMPLERATE] = $config["audio"]["definitions"][$preset][Audio::OPTION_AUDIOSAMPLERATE];
$options[Audio::OPTION_ACODEC] = $config["audio"]["definitions"][$preset][Audio::OPTION_ACODEC];
foreach($config["audio"]["definitions"][$preset][Subdef::OPTION_DEVICE] as $devices) {
$options[Subdef::OPTION_DEVICE][] = $devices;
}
break;
}
$subdefs->set_subdef($group, $name, $class, false, $options, [], $preset);
}
$subdefs->add_subdef($group, $name, $class);
} else {
$subdefs = $databox->get_subdef_structure();
$this->updateSubdefGroups($subdefs, $request);
foreach ($Parmsubdefs as $post_sub) {
@@ -81,6 +164,7 @@ class SubdefsController extends Controller
$group = $post_sub_ex[0];
$name = $post_sub_ex[1];
$preset = $request->request->get($post_sub . '_presets');
$class = $request->request->get($post_sub . '_class');
$downloadable = $request->request->get($post_sub . '_downloadable');
$orderable = $request->request->get($post_sub . '_orderable');
@@ -96,7 +180,6 @@ class SubdefsController extends Controller
$options[$def] = $parm_loc;
}
$mediatype = $request->request->get($post_sub . '_mediatype');
$media = $request->request->get($post_sub . '_' . $mediatype, []);
@@ -110,8 +193,7 @@ class SubdefsController extends Controller
}
$labels = $request->request->get($post_sub . '_label', []);
$subdefs->set_subdef($group, $name, $class, $downloadable, $options, $labels, $orderable);
$subdefs->set_subdef($group, $name, $class, $downloadable, $options, $labels, $preset, $orderable);
}
}
@@ -120,36 +202,389 @@ class SubdefsController extends Controller
]);
}
/**
* @return array
*/
protected function getSubviewsMapping()
{
$mapping = array(
Type::TYPE_IMAGE => array(Subdef::TYPE_IMAGE),
Type::TYPE_VIDEO => array(Subdef::TYPE_IMAGE, Subdef::TYPE_VIDEO, Subdef::TYPE_ANIMATION),
Type::TYPE_AUDIO => array(Subdef::TYPE_IMAGE, Subdef::TYPE_AUDIO),
Type::TYPE_DOCUMENT => array(Subdef::TYPE_IMAGE, Subdef::TYPE_FLEXPAPER),
Type::TYPE_FLASH => array(Subdef::TYPE_IMAGE)
);
return $mapping;
}
/**
* Update Databox subdefsStructure DOM according to defined groups.
*
* @param \databox_subdefsStructure $subdefs
* @param Request $request
*/
private function updateSubdefGroups(\databox_subdefsStructure $subdefs, Request $request)
protected function updateSubdefGroups(\databox_subdefsStructure $subdefs, Request $request)
{
$subdefsGroups = $request->request->get('subdefsgroups', []);
$changedGroups = [];
/** @var SubdefGroup $subdefsGroup */
foreach ($subdefs as $groupName => $subdefsGroup) {
$documentOrderable = isset($subdefsGroups[$groupName]['document_orderable'])
? \p4field::isyes($subdefsGroups[$groupName]['document_orderable'])
: false;
if ($subdefsGroup->isDocumentOrderable() !== $documentOrderable) {
if ($documentOrderable) {
$subdefsGroup->allowDocumentOrdering();
} else {
$subdefsGroup->disallowDocumentOrdering();
}
$changedGroups[] = $subdefsGroup;
}
}
if ($changedGroups) {
$subdefs->updateSubdefGroups($changedGroups);
}
}
/**
* @return array
*/
protected function getConfiguration()
{
$config = array(
Subdef::TYPE_IMAGE => array(
"definitions" => array(
"JPG" => null,
"160px JPG" => array(
Image::OPTION_SIZE => "160",
Image::OPTION_RESOLUTION => "75",
Image::OPTION_STRIP => "yes",
Image::OPTION_FLATTEN => "yes",
Image::OPTION_QUALITY => "75",
Image::OPTION_ICODEC => "jpeg",
Subdef::OPTION_DEVICE => ["all"]
),
"320 px JPG (thumbnail Phraseanet)" => array(
Image::OPTION_SIZE => "320",
Image::OPTION_RESOLUTION => "75",
Image::OPTION_STRIP => "yes",
Image::OPTION_FLATTEN => "yes",
Image::OPTION_QUALITY => "75",
Image::OPTION_ICODEC => "jpeg",
Subdef::OPTION_DEVICE => ["all"]
),
"640px JPG" => array(
Image::OPTION_SIZE => "640",
Image::OPTION_RESOLUTION => "75",
Image::OPTION_STRIP => "yes",
Image::OPTION_FLATTEN => "yes",
Image::OPTION_QUALITY => "75",
Image::OPTION_ICODEC => "jpeg",
Subdef::OPTION_DEVICE => ["all"]
),
"1280px JPG (preview Phraseanet)" => array(
Image::OPTION_SIZE => "1280",
Image::OPTION_RESOLUTION => "75",
Image::OPTION_STRIP => "yes",
Image::OPTION_FLATTEN => "yes",
Image::OPTION_QUALITY => "75",
Image::OPTION_ICODEC => "jpeg",
Subdef::OPTION_DEVICE => ["all"]
),
"2560px JPG" => array(
Image::OPTION_SIZE => "2560",
Image::OPTION_RESOLUTION => "75",
Image::OPTION_STRIP => "yes",
Image::OPTION_FLATTEN => "yes",
Image::OPTION_QUALITY => "75",
Image::OPTION_ICODEC => "jpeg",
Subdef::OPTION_DEVICE => ["all"]
),
"PNG" => null,
"160px PNG 8 bits" => array(
Image::OPTION_SIZE => "160",
Image::OPTION_RESOLUTION => "75",
Image::OPTION_STRIP => "yes",
Image::OPTION_FLATTEN => "yes",
Image::OPTION_QUALITY => "75",
Image::OPTION_ICODEC => "png",
Subdef::OPTION_DEVICE => ["all"]
),
"320px PNG 8 bits" => array(
Image::OPTION_SIZE => "320",
Image::OPTION_RESOLUTION => "75",
Image::OPTION_STRIP => "yes",
Image::OPTION_FLATTEN => "yes",
Image::OPTION_QUALITY => "75",
Image::OPTION_ICODEC => "png",
Subdef::OPTION_DEVICE => ["all"]
),
"640px PNG 8 bits" => array(
Image::OPTION_SIZE => "640",
Image::OPTION_RESOLUTION => "75",
Image::OPTION_STRIP => "yes",
Image::OPTION_FLATTEN => "yes",
Image::OPTION_QUALITY => "75",
Image::OPTION_ICODEC => "png",
Subdef::OPTION_DEVICE => ["all"]
),
"1280px PNG 8 bits" => array(
Image::OPTION_SIZE => "1280",
Image::OPTION_RESOLUTION => "75",
Image::OPTION_STRIP => "yes",
Image::OPTION_FLATTEN => "yes",
Image::OPTION_QUALITY => "75",
Image::OPTION_ICODEC => "png",
Subdef::OPTION_DEVICE => ["all"]
),
"2560px PNG 8 bits" => array(
Image::OPTION_SIZE => "2560",
Image::OPTION_RESOLUTION => "75",
Image::OPTION_STRIP => "yes",
Image::OPTION_FLATTEN => "yes",
Image::OPTION_QUALITY => "75",
Image::OPTION_ICODEC => "png",
Subdef::OPTION_DEVICE => ["all"]
),
"TIFF" => null,
"1280 TIFF" => array(
Image::OPTION_SIZE => "1280",
Image::OPTION_RESOLUTION => "75",
Image::OPTION_STRIP => "yes",
Image::OPTION_FLATTEN => "yes",
Image::OPTION_QUALITY => "75",
Image::OPTION_ICODEC => "tiff",
Subdef::OPTION_DEVICE => ["all"]
),
"2560px TIFF" => array(
Image::OPTION_SIZE => "2560",
Image::OPTION_RESOLUTION => "75",
Image::OPTION_STRIP => "yes",
Image::OPTION_FLATTEN => "yes",
Image::OPTION_QUALITY => "75",
Image::OPTION_ICODEC => "tiff",
Subdef::OPTION_DEVICE => ["all"]
),
),
"form" => array(
Image::OPTION_SIZE => "slide",
Image::OPTION_RESOLUTION => "slide",
Image::OPTION_STRIP => "radio",
Image::OPTION_FLATTEN => "radio",
Image::OPTION_QUALITY => "slide",
Image::OPTION_ICODEC => "select",
Subdef::OPTION_DEVICE => "checkbox",
),
),
Subdef::TYPE_VIDEO => array(
"definitions" => array(
"video codec H264" => null,
"144P H264 128 kbps ACC 128kbps" => array(
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "128",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "256",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libx264",
Video::OPTION_ACODEC => "libfaac",
Subdef::OPTION_DEVICE => ["all"]
),
"240P H264 256 kbps ACC 128kbps" => array(
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "256",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "426",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libx264",
Video::OPTION_ACODEC => "libfaac",
Subdef::OPTION_DEVICE => ["all"]
),
"360P H264 576 kbps ACC 128kbps" => array(
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "576",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "480",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libtheora",
Video::OPTION_ACODEC => "libfaac",
Subdef::OPTION_DEVICE => ["all"]
),
"480P H264 750 kbps ACC 128kbps" => array(
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "750",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "854",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libx264",
Video::OPTION_ACODEC => "libfaac",
Subdef::OPTION_DEVICE => ["all"]
),
"720P H264 1492 kbps ACC 128kbps" => array(
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "1492",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "1280",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libx264",
Video::OPTION_ACODEC => "libfaac",
Subdef::OPTION_DEVICE => ["all"]
),
"1080P H264 2420 kbps ACC 128kbps" => array(
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "2420",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "1920",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libx264",
Video::OPTION_ACODEC => "libfaac",
Subdef::OPTION_DEVICE => ["all"]
),
"video codec libvpx" => null,
"144P webm 128 kbps ACC 128kbps" => array(
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "128",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "256",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libvpx",
Video::OPTION_ACODEC => "libfaac",
Subdef::OPTION_DEVICE => ["all"]
),
"240P webm 256 kbps ACC 128kbps" => array(
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "256",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "426",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libvpx",
Video::OPTION_ACODEC => "libfaac",
Subdef::OPTION_DEVICE => ["all"]
),
"360P webm 576 kbps ACC 128kbps" => array(
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "576",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "480",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libvpx",
Video::OPTION_ACODEC => "libfaac",
Subdef::OPTION_DEVICE => ["all"]
),
"480P webm 750 kbps ACC 128kbps" => array(
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "750",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "854",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libvpx",
Video::OPTION_ACODEC => "libfaac",
Subdef::OPTION_DEVICE => ["all"]
),
"720P webm 1492 kbps ACC 128kbps" => array(
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "1492",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "1280",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libvpx",
Video::OPTION_ACODEC => "libfaac",
Subdef::OPTION_DEVICE => ["all"]
),
"1080P webm 2420 kbps ACC 128kbps" => array(
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "2420",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "1920",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libvpx",
Video::OPTION_ACODEC => "libfaac",
Subdef::OPTION_DEVICE => ["all"]
),
),
"form" => array(
Video::OPTION_AUDIOBITRATE => "slide",
Video::OPTION_AUDIOSAMPLERATE => "select",
Video::OPTION_BITRATE => "slide",
Video::OPTION_GOPSIZE => "slide",
Video::OPTION_SIZE => "slide",
Video::OPTION_FRAMERATE => "slide",
Video::OPTION_VCODEC => "select",
Video::OPTION_ACODEC => "select",
Subdef::OPTION_DEVICE => "checkbox",
),
),
Subdef::TYPE_ANIMATION => array(
"definitions" => array(
"256 px fast 200 ms" => array(
Gif::OPTION_SIZE => "256",
Gif::OPTION_DELAY => "200",
Subdef::OPTION_DEVICE => ["all"]
),
"256 px very fast 120 ms" => array(
Gif::OPTION_SIZE => "256",
Gif::OPTION_DELAY => "120",
Subdef::OPTION_DEVICE => ["all"]
),
"320 px fast 200 ms" => array(
Gif::OPTION_SIZE => "320",
Gif::OPTION_DELAY => "200",
Subdef::OPTION_DEVICE => ["all"]
),
),
"form" => array(
Gif::OPTION_SIZE => "slide",
Gif::OPTION_DELAY => "slide",
Subdef::OPTION_DEVICE => "checkbox",
),
),
Subdef::TYPE_AUDIO => array(
"definitions" => array(
"Low AAC 96 kbit/s" => array(
Audio::OPTION_AUDIOBITRATE => "100",
Audio::OPTION_AUDIOSAMPLERATE => "8000",
Audio::OPTION_ACODEC => "libmp3lame",
Subdef::OPTION_DEVICE => ["all"]
),
"Normal AAC 128 kbit/s" => array(
Audio::OPTION_AUDIOBITRATE => "180",
Audio::OPTION_AUDIOSAMPLERATE => "44100",
Audio::OPTION_ACODEC => "libmp3lame",
Subdef::OPTION_DEVICE => ["all"]
),
"High AAC 320 kbit/s" => array(
Audio::OPTION_AUDIOBITRATE => "230",
Audio::OPTION_AUDIOSAMPLERATE => "50000",
Audio::OPTION_ACODEC => "libmp3lame",
Subdef::OPTION_DEVICE => ["all"]
),
),
"form" => array(
Audio::OPTION_AUDIOBITRATE => "slide",
Audio::OPTION_AUDIOSAMPLERATE => "select",
Audio::OPTION_ACODEC => "select",
Subdef::OPTION_DEVICE => "checkbox",
),
),
Subdef::TYPE_FLEXPAPER => array(
"definitions" => array(
),
"form" => array(),
),
);
return $config;
}
}

View File

@@ -0,0 +1,46 @@
<?php
namespace Alchemy\Phrasea\Databox\Subdef;
class SubdefPreset
{
/**
* @var string
*/
private $mediaType;
/**
* @var string
*/
private $label;
/**
* @var array
*/
private $definitions;
/**
* @param string $mediaType
* @param array $definitions
*/
public function __construct($mediaType, array $definitions)
{
foreach ($definitions as $definition) {
if (! $definition instanceof Subdef) {
}
}
$this->mediaType = (string) $mediaType;
$this->definitions = $definitions;
}
/**
* @return string
*/
public function getMediaType()
{
return $this->label;
}
/**
* @return array
*/
public function getDefinitions()
{
return $this->definitions;
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace Alchemy\Phrasea\Databox\Subdef;
class SubdefPresetProvider
{
private $presets = [];
/**
* @param string $type Type of media for which to get presets
* @return SubdefPreset[]
*/
public function getPresets($type)
{
if (! isset($this->presets[$type])) {
throw new \InvalidArgumentException('Invalid type');
}
return $this->presets[$type];
}
}

View File

@@ -15,6 +15,8 @@ use MediaAlchemyst\Specification\SpecificationInterface;
interface Subdef
{
const OPTION_DEVICE = 'devices';
const TYPE_IMAGE = 'image';
const TYPE_ANIMATION = 'gif';
const TYPE_VIDEO = 'video';

View File

@@ -7,40 +7,18 @@
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
use Alchemy\Phrasea\Media\Subdef\Image;
use Alchemy\Phrasea\Media\Subdef\Audio;
use Alchemy\Phrasea\Media\Subdef\Video;
use Alchemy\Phrasea\Media\Subdef\FlexPaper;
use Alchemy\Phrasea\Media\Subdef\Gif;
use Alchemy\Phrasea\Media\Subdef\Image;
use Alchemy\Phrasea\Media\Subdef\Unknown;
use Alchemy\Phrasea\Media\Subdef\Subdef as SubdefSpecs;
use Alchemy\Phrasea\Media\Subdef\Video;
use Alchemy\Phrasea\Media\Type\Type as SubdefType;
use MediaAlchemyst\Specification\SpecificationInterface;
use Symfony\Component\Translation\TranslatorInterface;
class databox_subdef
{
const CLASS_THUMBNAIL = 'thumbnail';
const CLASS_PREVIEW = 'preview';
const CLASS_DOCUMENT = 'document';
const DEVICE_ALL = 'all';
const DEVICE_HANDHELD = 'handheld';
const DEVICE_PRINT = 'print';
const DEVICE_PROJECTION = 'projection';
const DEVICE_SCREEN = 'screen';
const DEVICE_TV = 'tv';
protected static $mediaTypeToSubdefTypes = [
SubdefType::TYPE_AUDIO => [SubdefSpecs::TYPE_IMAGE, SubdefSpecs::TYPE_AUDIO],
SubdefType::TYPE_DOCUMENT => [SubdefSpecs::TYPE_IMAGE, SubdefSpecs::TYPE_FLEXPAPER],
SubdefType::TYPE_FLASH => [SubdefSpecs::TYPE_IMAGE],
SubdefType::TYPE_IMAGE => [SubdefSpecs::TYPE_IMAGE],
SubdefType::TYPE_VIDEO => [SubdefSpecs::TYPE_IMAGE, SubdefSpecs::TYPE_VIDEO, SubdefSpecs::TYPE_ANIMATION],
SubdefType::TYPE_UNKNOWN => [SubdefSpecs::TYPE_IMAGE]
];
/**
* The class type of the subdef
* Is null or one of the CLASS_* constants
@@ -51,52 +29,61 @@ class databox_subdef
protected $devices = [];
protected $name;
protected $path;
protected $preset;
protected $subdef_group;
protected $labels = [];
protected $downloadable;
protected $translator;
/**
* @var bool
*/
private $requiresMetadataUpdate;
protected $downloadable;
protected $translator;
protected static $mediaTypeToSubdefTypes = [
SubdefType::TYPE_AUDIO => [SubdefSpecs::TYPE_IMAGE, SubdefSpecs::TYPE_AUDIO],
SubdefType::TYPE_DOCUMENT => [SubdefSpecs::TYPE_IMAGE, SubdefSpecs::TYPE_FLEXPAPER],
SubdefType::TYPE_FLASH => [SubdefSpecs::TYPE_IMAGE],
SubdefType::TYPE_IMAGE => [SubdefSpecs::TYPE_IMAGE],
SubdefType::TYPE_VIDEO => [SubdefSpecs::TYPE_IMAGE, SubdefSpecs::TYPE_VIDEO, SubdefSpecs::TYPE_ANIMATION],
SubdefType::TYPE_UNKNOWN => [SubdefSpecs::TYPE_IMAGE],
];
const CLASS_THUMBNAIL = 'thumbnail';
const CLASS_PREVIEW = 'preview';
const CLASS_DOCUMENT = 'document';
const DEVICE_ALL = 'all';
const DEVICE_HANDHELD = 'handheld';
const DEVICE_PRINT = 'print';
const DEVICE_PROJECTION = 'projection';
const DEVICE_SCREEN = 'screen';
const DEVICE_TV = 'tv';
/**
* @var bool
*/
private $orderable;
/**
*
* @param SubdefType $type
* @param SimpleXMLElement $sd
* @param TranslatorInterface $translator
*
* @return databox_subdef
*/
public function __construct(SubdefType $type, SimpleXMLElement $sd, TranslatorInterface $translator)
{
$this->subdef_group = $type;
$this->class = (string) $sd->attributes()->class;
$this->class = (string)$sd->attributes()->class;
$this->translator = $translator;
foreach ($sd->devices as $device) {
$this->devices[] = (string) $device;
$this->devices[] = (string)$device;
}
$this->name = strtolower($sd->attributes()->name);
$this->downloadable = p4field::isyes($sd->attributes()->downloadable);
$this->orderable = isset($sd->attributes()->orderable) ? p4field::isyes($sd->attributes()->orderable) : true;
$this->path = trim($sd->path) !== '' ? p4string::addEndSlash(trim($sd->path)) : '';
$this->requiresMetadataUpdate = p4field::isyes((string) $sd->meta);
$this->preset = $sd->attributes()->presets;
$this->requiresMetadataUpdate = p4field::isyes((string)$sd->meta);
foreach ($sd->label as $label) {
$lang = trim((string) $label->attributes()->lang);
$lang = trim((string)$label->attributes()->lang);
if ($lang) {
$this->labels[$lang] = (string) $label;
$this->labels[$lang] = (string)$label;
}
}
switch ((string) $sd->mediatype) {
switch ((string)$sd->mediatype) {
default:
case SubdefSpecs::TYPE_IMAGE:
$this->subdef_type = $this->buildImageSubdef($sd);
@@ -118,7 +105,6 @@ class databox_subdef
break;
}
}
/**
* Build Image Subdef object depending the SimpleXMLElement
*
@@ -128,7 +114,6 @@ class databox_subdef
protected function buildImageSubdef(SimpleXMLElement $sd)
{
$image = new Image($this->translator);
if ($sd->icodec) {
$image->setOptionValue(Image::OPTION_ICODEC, (string) $sd->icodec);
}
@@ -147,10 +132,8 @@ class databox_subdef
if ($sd->flatten) {
$image->setOptionValue(Image::OPTION_FLATTEN, p4field::isyes($sd->flatten));
}
return $image;
}
/**
* Build Audio Subdef object depending the SimpleXMLElement
*
@@ -160,7 +143,6 @@ class databox_subdef
protected function buildAudioSubdef(SimpleXMLElement $sd)
{
$audio = new Audio($this->translator);
if ($sd->acodec) {
$audio->setOptionValue(Audio::OPTION_ACODEC, (string) $sd->acodec);
}
@@ -170,10 +152,8 @@ class databox_subdef
if ($sd->audiosamplerate) {
$audio->setOptionValue(Audio::OPTION_AUDIOSAMPLERATE, (int) $sd->audiosamplerate);
}
return $audio;
}
/**
* Build Video Subdef object depending the SimpleXMLElement
*
@@ -183,7 +163,6 @@ class databox_subdef
protected function buildVideoSubdef(SimpleXMLElement $sd)
{
$video = new Video($this->translator);
if ($sd->size) {
$video->setOptionValue(Video::OPTION_SIZE, (int) $sd->size);
}
@@ -208,10 +187,8 @@ class databox_subdef
if ($sd->GOPsize) {
$video->setOptionValue(Video::OPTION_GOPSIZE, (int) $sd->GOPsize);
}
return $video;
}
/**
* Build GIF Subdef object depending the SimpleXMLElement
*
@@ -221,17 +198,14 @@ class databox_subdef
protected function buildGifSubdef(SimpleXMLElement $sd)
{
$gif = new Gif($this->translator);
if ($sd->size) {
$gif->setOptionValue(Gif::OPTION_SIZE, (int) $sd->size);
}
if ($sd->delay) {
$gif->setOptionValue(Gif::OPTION_DELAY, (int) $sd->delay);
}
return $gif;
}
/**
* Build Flexpaper Subdef object depending the SimpleXMLElement
*
@@ -242,8 +216,8 @@ class databox_subdef
{
return new FlexPaper($this->translator);
}
/**
*
* @return string
*/
public function get_class()
@@ -252,6 +226,16 @@ class databox_subdef
}
/**
*
* @return string
*/
public function get_preset()
{
return $this->preset;
}
/**
*
* @return string
*/
public function get_path()
@@ -262,7 +246,7 @@ class databox_subdef
/**
* The devices matching this subdefinition
*
* @return array
* @return Array
*/
public function getDevices()
{
@@ -272,7 +256,7 @@ class databox_subdef
/**
* The current SubdefType the subdef converts documents
*
* @return \Alchemy\Phrasea\Media\Subdef\Subdef
* @return Alchemy\Phrasea\Media\Subdef\Subdef
*/
public function getSubdefType()
{
@@ -292,7 +276,7 @@ class databox_subdef
/**
* An associative label ; keys are i18n languages
*
* @return array
* @return Array
*/
public function get_labels()
{
@@ -306,36 +290,19 @@ class databox_subdef
} elseif (isset($this->labels[$code])) {
return $this->labels[$code];
}
return null;
}
/**
* The name of the subdef
* boolean
*
* @return string
* @return type
*/
public function get_name()
{
return $this->name;
}
/**
* @return bool
*/
public function isDownloadable()
public function is_downloadable()
{
return $this->downloadable;
}
/**
* @return bool
*/
public function isOrderable()
{
return $this->orderable;
}
/**
* Get an array of Alchemy\Phrasea\Media\Subdef\Subdef available for the current Media Type
*
@@ -344,7 +311,6 @@ class databox_subdef
public function getAvailableSubdefTypes()
{
$subdefTypes = [];
$availableDevices = [
self::DEVICE_ALL,
self::DEVICE_HANDHELD,
@@ -353,11 +319,8 @@ class databox_subdef
self::DEVICE_SCREEN,
self::DEVICE_TV,
];
if (isset(self::$mediaTypeToSubdefTypes[$this->subdef_group->getType()])) {
foreach (self::$mediaTypeToSubdefTypes[$this->subdef_group->getType()] as $subdefType) {
if ($subdefType == $this->subdef_type->getType()) {
$mediatype_obj = $this->subdef_type;
} else {
@@ -385,13 +348,11 @@ class databox_subdef
break;
}
}
$mediatype_obj->registerOption(new \Alchemy\Phrasea\Media\Subdef\OptionType\Multi($this->translator->trans('Target Device'), 'devices', $availableDevices, $this->devices));
$mediatype_obj->registerOption(new \Alchemy\Phrasea\Media\Subdef\OptionType\Multi($this->translator->trans('Target Device'),
'devices', $availableDevices, $this->devices));
$subdefTypes[] = $mediatype_obj;
}
}
return $subdefTypes;
}
@@ -405,6 +366,16 @@ class databox_subdef
return $this->requiresMetadataUpdate;
}
/**
* The name of the subdef
*
* @return string
*/
public function get_name()
{
return $this->name;
}
/**
* Get the MediaAlchemyst specs for the current subdef
*
@@ -424,4 +395,4 @@ class databox_subdef
{
return $this->subdef_type->getOptions();
}
}
}

View File

@@ -9,8 +9,8 @@
*/
use Alchemy\Phrasea\Databox\SubdefGroup;
use Alchemy\Phrasea\Media\MediaTypeFactory;
use Assert\Assertion;
use Alchemy\Phrasea\Media\MediaTypeFactory;
use Symfony\Component\Translation\TranslatorInterface;
class databox_subdefsStructure implements IteratorAggregate, Countable
@@ -185,15 +185,19 @@ class databox_subdefsStructure implements IteratorAggregate, Countable
* @param string $groupname
* @param string $name
* @param string $class
* @param string $mediatype
* @param string $preset
* @return databox_subdefsStructure
*/
public function add_subdef($groupname, $name, $class)
public function add_subdef($groupname, $name, $class, $mediatype, $preset)
{
$dom_struct = $this->databox->get_dom_structure();
$subdef = $dom_struct->createElement('subdef');
$subdef->setAttribute('class', $class);
$subdef->setAttribute('name', mb_strtolower($name));
$subdef->setAttribute('presets', $preset);
$subdef->setAttribute('mediaType', $mediatype);
$dom_xp = $this->databox->get_xpath_structure();
$query = '//record/subdefs/subdefgroup[@name="' . $groupname . '"]';
@@ -234,19 +238,18 @@ class databox_subdefsStructure implements IteratorAggregate, Countable
}
}
}
/**
* @param string $group
* @param string $name
* @param string $class
* @param string $preset
* @param boolean $downloadable
* @param array $options
* @param array $labels
* @param bool $orderable
* @return databox_subdefsStructure
* @throws Exception
*/
public function set_subdef($group, $name, $class, $downloadable, $options, $labels, $orderable = true)
public function set_subdef($group, $name, $class, $downloadable, $options, $labels, $preset = "Custom")
{
$dom_struct = $this->databox->get_dom_structure();
@@ -254,7 +257,7 @@ class databox_subdefsStructure implements IteratorAggregate, Countable
$subdef->setAttribute('class', $class);
$subdef->setAttribute('name', mb_strtolower($name));
$subdef->setAttribute('downloadable', ($downloadable ? 'true' : 'false'));
$subdef->setAttribute('orderable', ($orderable ? 'true' : 'false'));
$subdef->setAttribute('presets', $preset);
foreach ($labels as $code => $label) {
$child = $dom_struct->createElement('label');