diff --git a/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php b/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php index a283220cd2..55b33ba57e 100644 --- a/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php +++ b/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php @@ -1129,7 +1129,7 @@ class V1Controller extends Controller public function listRecord(Request $request, \record_adapter $record) { $technicalInformation = []; - foreach ($record->get_technical_infos() as $name => $value) { + foreach ($record->get_technical_infos()->getValues() as $name => $value) { $technicalInformation[] = ['name' => $name, 'value' => $value]; } diff --git a/lib/Alchemy/Phrasea/Model/Serializer/CaptionSerializer.php b/lib/Alchemy/Phrasea/Model/Serializer/CaptionSerializer.php index 58928c16ba..ad0d8c43da 100644 --- a/lib/Alchemy/Phrasea/Model/Serializer/CaptionSerializer.php +++ b/lib/Alchemy/Phrasea/Model/Serializer/CaptionSerializer.php @@ -96,7 +96,7 @@ class CaptionSerializer extends AbstractSerializer $doc = $dom_doc->createElement('doc'); - $tc_datas = $caption->get_record()->get_technical_infos(); + $tc_datas = $caption->get_record()->get_technical_infos()->getValues(); foreach ($tc_datas as $key => $data) { $doc->setAttribute($key, $data); diff --git a/lib/Alchemy/Phrasea/Model/Serializer/ESRecordSerializer.php b/lib/Alchemy/Phrasea/Model/Serializer/ESRecordSerializer.php index d6868eef5c..e1c0bf9c72 100644 --- a/lib/Alchemy/Phrasea/Model/Serializer/ESRecordSerializer.php +++ b/lib/Alchemy/Phrasea/Model/Serializer/ESRecordSerializer.php @@ -15,11 +15,9 @@ class ESRecordSerializer extends AbstractSerializer { public function serialize(\record_adapter $record) { - $technicalInformation = $caption = $business = $status = []; + $caption = $business = $status = []; - foreach ($record->get_technical_infos() as $name => $value) { - $technicalInformation[$name] = $value; - } + $technicalInformation = $record->get_technical_infos()->getValues(); foreach ($record->get_caption()->get_fields(null, true) as $field) { $isDate = $field->get_databox_field()->get_type() === \databox_field::TYPE_DATE; diff --git a/lib/classes/Bridge/Api/Dailymotion.php b/lib/classes/Bridge/Api/Dailymotion.php index 2facc8caa7..ad7110f96d 100644 --- a/lib/classes/Bridge/Api/Dailymotion.php +++ b/lib/classes/Bridge/Api/Dailymotion.php @@ -903,7 +903,7 @@ class Bridge_Api_Dailymotion extends Bridge_Api_Abstract implements Bridge_Api_I if ($record->get_duration() > self::AUTH_VIDEO_DURATION) $errors["duration"] = $this->translator->trans("La taille maximale d'une video est de %duration% minutes.", ['%duration%' => self::AUTH_VIDEO_DURATION / 60]); - if ($record->get_technical_infos('size') > self::AUTH_VIDEO_SIZE) + if ($record->get_technical_infos('size')->getValue() > self::AUTH_VIDEO_SIZE) $errors["size"] = $this->translator->trans("Le poids maximum d'un fichier est de %size%", ['%size%' => p4string::format_octets(self::AUTH_VIDEO_SIZE)]); return $errors; diff --git a/lib/classes/Bridge/Api/Flickr.php b/lib/classes/Bridge/Api/Flickr.php index 2d6b38ac3b..54e701a58e 100644 --- a/lib/classes/Bridge/Api/Flickr.php +++ b/lib/classes/Bridge/Api/Flickr.php @@ -807,7 +807,7 @@ class Bridge_Api_Flickr extends Bridge_Api_Abstract implements Bridge_Api_Interf $errors = []; if ( ! $record->get_hd_file() instanceof \SplFileInfo) $errors["file_size"] = $this->translator->trans("Le record n'a pas de fichier physique"); //Record must rely on real file - if ($record->get_technical_infos('size') > self::AUTH_PHOTO_SIZE) + if ($record->get_technical_infos('size')->getValue() > self::AUTH_PHOTO_SIZE) $errors["size"] = $this->translator->trans("Le poids maximum d'un fichier est de %size%", ['%size%' => p4string::format_octets(self::AUTH_VIDEO_SIZE)]); return $errors; diff --git a/lib/classes/Bridge/Api/Youtube.php b/lib/classes/Bridge/Api/Youtube.php index dd06920a7d..238dfcad6b 100644 --- a/lib/classes/Bridge/Api/Youtube.php +++ b/lib/classes/Bridge/Api/Youtube.php @@ -1019,7 +1019,7 @@ class Bridge_Api_Youtube extends Bridge_Api_Abstract implements Bridge_Api_Inter if ($record->get_duration() > self::AUTH_VIDEO_DURATION) $errors["duration_" . $key] = $this->translator->trans("La taille maximale d'une video est de %duration% minutes.", ['%duration%' => self::AUTH_VIDEO_DURATION / 60]); - if ($record->get_technical_infos('size') > self::AUTH_VIDEO_SIZE) + if ($record->get_technical_infos('size')->getValue() > self::AUTH_VIDEO_SIZE) $errors["size_" . $key] = $this->translator->trans("Le poids maximum d'un fichier est de %size%", ['%size%' => p4string::format_octets(self::AUTH_VIDEO_SIZE)]); return $errors; diff --git a/lib/classes/record/adapter.php b/lib/classes/record/adapter.php index e83d5964e2..ba54ad2b32 100644 --- a/lib/classes/record/adapter.php +++ b/lib/classes/record/adapter.php @@ -21,6 +21,12 @@ use Alchemy\Phrasea\Core\Event\Record\RecordMetadataChangedEvent; use Alchemy\Phrasea\Core\Event\Record\RecordOriginalNameChangedEvent; use Alchemy\Phrasea\Core\Event\Record\RecordStatusChangedEvent; use Alchemy\Phrasea\Core\PhraseaTokens; +use Alchemy\Phrasea\Media\ArrayTechnicalDataSet; +use Alchemy\Phrasea\Media\FloatTechnicalData; +use Alchemy\Phrasea\Media\IntegerTechnicalData; +use Alchemy\Phrasea\Media\StringTechnicalData; +use Alchemy\Phrasea\Media\TechnicalData; +use Alchemy\Phrasea\Media\TechnicalDataSet; use Alchemy\Phrasea\Metadata\Tag\TfBasename; use Alchemy\Phrasea\Metadata\Tag\TfFilename; use Alchemy\Phrasea\Model\Entities\User; @@ -62,7 +68,7 @@ class record_adapter implements RecordInterface, cache_cacheableInterface private $creation_date; /** @var string */ private $original_name; - /** @var array */ + /** @var TechnicalDataSet */ private $technical_data; /** @var string */ private $uuid; @@ -314,7 +320,7 @@ class record_adapter implements RecordInterface, cache_cacheableInterface public function get_duration() { if (!$this->duration) { - $this->duration = round($this->get_technical_infos(media_subdef::TC_DATA_DURATION)); + $this->duration = round($this->get_technical_infos(media_subdef::TC_DATA_DURATION)->getValue()); } return $this->duration; @@ -587,40 +593,20 @@ class record_adapter implements RecordInterface, cache_cacheableInterface } /** + * Return a Technical data set or a specific technical data or false when not found * * @param string $data - * @return Array + * @return TechnicalDataSet|TechnicalData|false */ - public function get_technical_infos($data = false) + public function get_technical_infos($data = '') { - if (!$this->technical_data) { - try { - $this->technical_data = $this->get_data_from_cache(self::CACHE_TECHNICAL_DATA); - } catch (\Exception $e) { - $this->technical_data = []; - $connbas = $this->get_databox()->get_connection(); - $sql = 'SELECT name, value FROM technical_datas WHERE record_id = :record_id'; - $stmt = $connbas->prepare($sql); - $stmt->execute([':record_id' => $this->get_record_id()]); - $rs = $stmt->fetchAll(PDO::FETCH_ASSOC); - $stmt->closeCursor(); + if (!$this->technical_data && !$this->mapTechnicalDataFromCache()) { + $this->technical_data = []; + $rs = $this->fetchTechnicalDataFromDb(); - foreach ($rs as $row) { - switch (true) { - case preg_match('/[0-9]?\.[0-9]+/', $row['value']): - $this->technical_data[$row['name']] = (float) $row['value']; - break; - case ctype_digit($row['value']): - $this->technical_data[$row['name']] = (int) $row['value']; - break; - default: - $this->technical_data[$row['name']] = $row['value']; - break; - } - } - $this->set_data_to_cache($this->technical_data, self::CACHE_TECHNICAL_DATA); - unset($e); - } + $this->mapTechnicalDataFromDb($rs); + + $this->set_data_to_cache($this->technical_data, self::CACHE_TECHNICAL_DATA); } if ($data) { @@ -1920,7 +1906,7 @@ class record_adapter implements RecordInterface, cache_cacheableInterface /** {@inheritdoc} */ public function getExif() { - return $this->get_technical_infos(); + return $this->get_technical_infos()->getValues(); } public function getStatusStructure() @@ -2024,4 +2010,56 @@ class record_adapter implements RecordInterface, cache_cacheableInterface return $connection->fetchAssoc($sql, [':record_id' => $this->record_id]); } + + /** + * @return bool + */ + private function mapTechnicalDataFromCache() + { + try { + $technical_data = $this->get_data_from_cache(self::CACHE_TECHNICAL_DATA); + } catch (Exception $e) { + $technical_data = false; + } + + if (!false === $technical_data) { + return false; + } + + $this->technical_data = $technical_data; + + return true; + } + + /** + * @return false|array + */ + private function fetchTechnicalDataFromDb() + { + $sql = 'SELECT name, value FROM technical_datas WHERE record_id = :record_id'; + + return $this->get_databox()->get_connection() + ->fetchAll($sql, ['record_id' => $this->get_record_id()]); + } + + /** + * @param array $rows + */ + private function mapTechnicalDataFromDb(array $rows) + { + $this->technical_data = new ArrayTechnicalDataSet(); + + foreach ($rows as $row) { + switch (true) { + case ctype_digit($row['value']): + $this->technical_data[] = new IntegerTechnicalData($row['name'], $row['value']); + break; + case preg_match('/[0-9]?\.[0-9]+/', $row['value']): + $this->technical_data[] = new FloatTechnicalData($row['name'], $row['value']); + break; + default: + $this->technical_data[] = new StringTechnicalData($row['name'], $row['value']); + } + } + } } diff --git a/templates/web/prod/actions/Tools/index.html.twig b/templates/web/prod/actions/Tools/index.html.twig index 528d1437f3..6bb60dd4b1 100644 --- a/templates/web/prod/actions/Tools/index.html.twig +++ b/templates/web/prod/actions/Tools/index.html.twig @@ -110,8 +110,8 @@ {% set dataW = constant('media_subdef::TC_DATA_WIDTH') %} {% set dataH = constant('media_subdef::TC_DATA_HEIGHT') %} - {% set width = record.get_technical_infos(dataW) %} - {% set height = record.get_technical_infos(dataH) %} + {% set width = record.get_technical_infos(dataW).value %} + {% set height = record.get_technical_infos(dataH).value %} {% if width and height %} {% set ratio = (width / height)|number_format(2, '.') %} diff --git a/tests/classes/record/adapterTest.php b/tests/classes/record/adapterTest.php index 1028900dde..03a0c77605 100644 --- a/tests/classes/record/adapterTest.php +++ b/tests/classes/record/adapterTest.php @@ -243,7 +243,9 @@ class record_adapterTest extends \PhraseanetAuthenticatedTestCase public function testGet_technical_infos() { - $this->assertTrue(is_array(self::$DI['record_1']->get_technical_infos())); + /** @var record_adapter $record_1 */ + $record_1 = self::$DI['record_1']; + $this->assertInstanceOf('array', $record_1->get_technical_infos()->getValues()); } public function testGet_caption()