From ac2afef5d0d78f68215d4cefd64965ce214e9a12 Mon Sep 17 00:00:00 2001 From: Axel Krysztofiak Date: Tue, 16 Jun 2020 22:04:30 +0200 Subject: [PATCH 1/4] Beim Update sollte auch sichergestellt sein, dass alle Spalten angelegt werden / sind --- update.php | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 update.php diff --git a/update.php b/update.php new file mode 100644 index 0000000..477b625 --- /dev/null +++ b/update.php @@ -0,0 +1,3 @@ + Date: Sun, 12 Jul 2020 20:14:04 +0200 Subject: [PATCH 2/4] 2.0 vorbereiten. - rex_mediapool_exif in den Namespace legen - use-Klauseln reparieren - Funktionsdoku rex_mediapool_exif --- README.md | 6 +- boot.php | 10 +- lib/Cli/Read.php | 10 +- lib/Exception/InvalidFormatExcption.php | 5 +- lib/Exception/NotFoundException.php | 9 +- lib/Exif.php | 4 +- lib/ExifData.php | 6 +- lib/Format/Camera.php | 2 +- lib/Format/FormatInterface.php | 1 + lib/Format/Geo.php | 16 +-- ...x_mediapool_exif.php => MediapoolExif.php} | 106 ++++++++++++++++-- package.yml | 2 +- 12 files changed, 135 insertions(+), 42 deletions(-) rename lib/{rex_mediapool_exif.php => MediapoolExif.php} (75%) diff --git a/README.md b/README.md index 107b500..83262c8 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,9 @@ Namens einzufügen, sofern beim Upload keine Kategorie definiert wurde. ![Screenshot](https://raw.githubusercontent.com/FriendsOfREDAXO/mediapool_exif/master/assets/screenshot.png) -## Beta-Features (Version 1.1) +## Beta-Features (Version 2.0) + +Da nun doch zu viele Änderungen vorgenommen wurden, ist nun eine Major-Version von nöten. Daher keine 1.1 sondern 2.0. Es werden alle EXIF-Daten in der Spalte ```rex_media.exif``` gespeichert, so dass man leichten Zugriff erhält. @@ -203,7 +205,7 @@ select exif, exif->"$.ExposureTime" exposure, exif->"$.ISOSpeedRatings" iso from rex_media; --- where exif->"$.Make" = 'Apple' +-- where exif->"$.Make" = 'Apple' ``` Äquivalent in MariaDB: diff --git a/boot.php b/boot.php index f55bd83..53fd082 100644 --- a/boot.php +++ b/boot.php @@ -1,8 +1,10 @@ getOption('all'); $updateSilent = $input->getOption('silent'); - $mode = \FriendsOfRedaxo\addon\MediapoolExif\Exif::GETMEDIA_MODE_NULL_ONLY; + $mode = Exif::GETMEDIA_MODE_NULL_ONLY; if ($updateAll) { if ($updateSilent || $io->confirm('You are going to update all files. Are you sure?', false)) { - $mode = \FriendsOfRedaxo\addon\MediapoolExif\Exif::GETMEDIA_MODE_ALL; + $mode = Exif::GETMEDIA_MODE_ALL; } } - $files = \FriendsOfRedaxo\addon\MediapoolExif\Exif::getMediaToRead($mode); + $files = Exif::getMediaToRead($mode); $numEntries = count($files); $io->writeln($numEntries.' entries to read'); @@ -64,7 +66,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $counter++; $io->writeln('Process file '.$counter.' of '.$numEntries.': '.$file['filename']); - \rex_mediapool_exif::readExifFromFile($file['filename']); + MediapoolExif::readExifFromFile($file['filename']); } $io->success('done'); diff --git a/lib/Exception/InvalidFormatExcption.php b/lib/Exception/InvalidFormatExcption.php index 96fdd90..e346aba 100644 --- a/lib/Exception/InvalidFormatExcption.php +++ b/lib/Exception/InvalidFormatExcption.php @@ -9,6 +9,7 @@ namespace FriendsOfRedaxo\addon\MediapoolExif\Exception; use Exception; +use Throwable; /** * Description of InvalidFormatExcption @@ -30,9 +31,9 @@ class InvalidFormatExcption * @param string $format * @param string $message * @param int $code - * @param \Throwable $previous + * @param Throwable $previous */ - public function __construct(string $format, string $message = "", int $code = 0, \Throwable $previous = NULL) + public function __construct(string $format, string $message = "", int $code = 0, Throwable $previous = NULL) { $this->format = $format; if ($message === '') { diff --git a/lib/Exception/NotFoundException.php b/lib/Exception/NotFoundException.php index efea29a..c7eb1f8 100644 --- a/lib/Exception/NotFoundException.php +++ b/lib/Exception/NotFoundException.php @@ -8,13 +8,16 @@ */ namespace FriendsOfRedaxo\addon\MediapoolExif\Exception; +use Exception; +use Throwable; + /** * Description of NotFoundException * * @author akrys */ class NotFoundException - extends \Exception + extends Exception { /** * @@ -28,9 +31,9 @@ class NotFoundException * @param string $index * @param string $message * @param int $code - * @param \Throwable $previous + * @param Throwable $previous */ - public function __construct(string $index, string $message = "", int $code = 0, \Throwable $previous = NULL) + public function __construct(string $index, string $message = "", int $code = 0, Throwable $previous = NULL) { $this->index = $index; parent::__construct($message, $code, $previous); diff --git a/lib/Exif.php b/lib/Exif.php index e99a2b2..b06f1f0 100644 --- a/lib/Exif.php +++ b/lib/Exif.php @@ -8,7 +8,7 @@ */ namespace FriendsOfRedaxo\addon\MediapoolExif; -use rex_media; +use FriendsOfRedaxo\addon\MediapoolExif\ExifData; /** * Description of Exif @@ -45,7 +45,7 @@ public static function get(rex_media $media, $mode = self::MODE_THROW_EXCEPTION) */ public static function getMediaToRead($mode = self::GETMEDIA_MODE_NULL_ONLY): array { - $rexSQL = \rex_sql::factory(); + $rexSQL = rex_sql::factory(); switch ($mode) { case self::GETMEDIA_MODE_ALL: diff --git a/lib/ExifData.php b/lib/ExifData.php index 5c5f259..f83a2b3 100644 --- a/lib/ExifData.php +++ b/lib/ExifData.php @@ -9,8 +9,8 @@ namespace FriendsOfRedaxo\addon\MediapoolExif; use FriendsOfRedaxo\addon\MediapoolExif\Exception\NotFoundException; +use FriendsOfRedaxo\addon\MediapoolExif\Exif; use FriendsOfRedaxo\addon\MediapoolExif\Format\FormatInterface; -use rex_media; /** * Description of ExifData @@ -106,7 +106,7 @@ public function format(string $type, string $format = null) { try { return FormatInterface::get($this->exif, $type, $format)->format(); - } catch (\Exception $e) { + } catch (Exception $e) { return $this->handleExcption($e); } } @@ -120,7 +120,7 @@ public function format(string $type, string $format = null) * @return mixed * @throws NotFoundException */ - private function handleExcption(\Exception $exception) + private function handleExcption(Exception $exception) { $return = ''; diff --git a/lib/Format/Camera.php b/lib/Format/Camera.php index 4594545..2205421 100644 --- a/lib/Format/Camera.php +++ b/lib/Format/Camera.php @@ -8,12 +8,12 @@ */ namespace FriendsOfRedaxo\addon\MediapoolExif\Format; -use Exception; use FriendsOfRedaxo\addon\MediapoolExif\Exception\InvalidFormatExcption; use FriendsOfRedaxo\addon\MediapoolExif\Format\Camera\Aperture; use FriendsOfRedaxo\addon\MediapoolExif\Format\Camera\Exposure; use FriendsOfRedaxo\addon\MediapoolExif\Format\Camera\Iso; use FriendsOfRedaxo\addon\MediapoolExif\Format\Camera\Length; +use FriendsOfRedaxo\addon\MediapoolExif\Format\FormatInterface; /** * Description of Camera diff --git a/lib/Format/FormatInterface.php b/lib/Format/FormatInterface.php index 33c0527..98290e6 100644 --- a/lib/Format/FormatInterface.php +++ b/lib/Format/FormatInterface.php @@ -9,6 +9,7 @@ namespace FriendsOfRedaxo\addon\MediapoolExif\Format; use FriendsOfRedaxo\addon\MediapoolExif\Exception\InvalidFormatExcption; +use FriendsOfRedaxo\addon\MediapoolExif\Format\FormatInterface; /** * Description of FormatBase diff --git a/lib/Format/Geo.php b/lib/Format/Geo.php index 6cc4c6e..b5f5a3a 100644 --- a/lib/Format/Geo.php +++ b/lib/Format/Geo.php @@ -1,18 +1,14 @@ data['GPSLatitudeRef']) || !isset($this->data['GPSLongitude']) || !isset($this->data['GPSLongitudeRef'])) { - throw new \Exception('GPS not found'); + throw new Exception('GPS not found'); } $GPSLatitude = $this->data['GPSLatitude']; diff --git a/lib/rex_mediapool_exif.php b/lib/MediapoolExif.php similarity index 75% rename from lib/rex_mediapool_exif.php rename to lib/MediapoolExif.php index 3c6f193..15e27e6 100644 --- a/lib/rex_mediapool_exif.php +++ b/lib/MediapoolExif.php @@ -1,9 +1,26 @@ ['Artist', 'AuthorByLine', 'CaptionWriter'], 'copyright' => ['Copyright', 'Artist', 'AuthorByLine', 'CaptionWriter'], @@ -17,6 +34,10 @@ class rex_mediapool_exif 'gps_long' => 'GPSCoordinatesLong', ]; + /** + * Upload processing + * @param rex_extension_point $ep + */ public static function processUploadedMedia(rex_extension_point $ep) { if ($data = static::getDataByFilename($ep->getParam('filename'))) { @@ -25,6 +46,8 @@ public static function processUploadedMedia(rex_extension_point $ep) $sql->setQuery($qry); if ($result = $sql->getArray()) { $result = $result[0]; + + $update = []; // check for category?! @@ -71,6 +94,8 @@ public static function processUploadedMedia(rex_extension_point $ep) $ep->setParam('msg', $ep->getParam('msg').'
'.rex_i18n::msg('exif_data_updated').' '.$names); rex_media_cache::delete($ep->getParam('filename')); + } else { + rex_logger::factory()->alert('SQL-Error ['.$sql->getErrno().'] '.$sql->getError()); } unset($qry); } @@ -81,7 +106,12 @@ public static function processUploadedMedia(rex_extension_point $ep) unset($data); } - public static function getDataByFilename($filename) + /** + * Daten au der Datei holen + * @param string $filename + * @return array|null + */ + public static function getDataByFilename(string $filename) { if ($media = rex_media::get($filename)) { if ($media->fileExists()) { @@ -92,7 +122,13 @@ public static function getDataByFilename($filename) return null; } - public static function getData(rex_media $media, $key = null) + /** + * Daten aus der Datei verarbeiten + * @param rex_media $media + * @param string $key + * @return array + */ + public static function getData(rex_media $media, string $key = null): array { $DATA = array_replace(static::getExifData($media), static::getIptcData($media)); $return = []; @@ -119,6 +155,9 @@ public static function getData(rex_media $media, $key = null) } $return['exif'] = json_encode($DATA); + if (!$return['exif']) { + \rex_logger::factory()->alert((string) json_last_error()); + } unset($DATA, $field, $lookin); if (empty($return['title'])) { @@ -149,16 +188,36 @@ public static function getData(rex_media $media, $key = null) return $return; } - protected static function isExifFile(rex_media $media) + /** + * Dateityp-Prüfung. + * Beantwortet die Frage, ob die Datei Datei EXIF-Daten enthalten kann + * @param rex_media $media + * @return bool + */ + protected static function isExifFile(rex_media $media): bool { - return preg_match('/(\/|\.|^)?(jpe?g|tiff?|wave?)$/i', $media->getType()); + return preg_match('/(\/|\.|^)?(jpe?g|tiff?|wave?)$/i', $media->getType()) > 0; } - protected static function getExifData(rex_media $media) + /** + * EXIF-Daten aus dem rex_media-Objekt holen. + * @param rex_media $media + * @return array + */ + protected static function getExifData(rex_media $media): array { if (static::isExifFile($media)) { $path = rex_path::media($media->getFileName()); $exif = exif_read_data($path, 'ANY_TAG'); + + // Bugfix json_encode error 5 + // 5 = JSON_ERROR_UTF8 => alles als UTF8 markieren. + foreach ($exif as $key => $value) { + if (is_string($value)) { + $exif[$key] = mb_convert_encoding($value, 'UTF-8'); + } + } + if ($exif) { try { $coordinates = FormatInterface::get($exif, 'Geo')->format(); @@ -174,7 +233,11 @@ protected static function getExifData(rex_media $media) return []; } - protected static function getIptcDefinitions() + /** + * Liste der IPTC-Defintionen + * @return array + */ + protected static function getIptcDefinitions(): array { return [ '2#005' => 'DocumentTitle', @@ -199,6 +262,11 @@ protected static function getIptcDefinitions() ]; } + /** + * IPTC-Daten holen + * @param rex_media $media + * @return type + */ protected static function getIptcData(rex_media $media) { $return = []; @@ -224,6 +292,11 @@ protected static function getIptcData(rex_media $media) return $return; } + /** + * Seitenleiste für die Medienpool-Detailseite generieren + * @param rex_extension_point $ep + * @return string + */ public static function mediapoolDetailOutput(rex_extension_point $ep): string { $subject = $ep->getSubject(); @@ -244,6 +317,11 @@ public static function mediapoolDetailOutput(rex_extension_point $ep): string return $subject; } + /** + * Einzelzeile der Medienpool-Detail-Ausgabe verarbeiten. + * @param array $exif + * @return string + */ protected static function mediapoolDetailOutputLine(array $exif): string { $lines = []; @@ -269,13 +347,21 @@ protected static function mediapoolDetailOutputLine(array $exif): string return $return; } - public function readExifFromFile($filename): void + /** + * EXIF-Daten außerhalb des Upload-Prozesses ermitteln. + * + * Die Funktion wird z.B. im Cron verwendet. + * + * @param string $filename + * @return void + */ + public function readExifFromFile(string $filename): void { $subject = null; $params = [ 'filename' => $filename, ]; $ep = new rex_extension_point('dummy', $subject, $params, false); - rex_mediapool_exif::processUploadedMedia($ep); + MediapoolExif::processUploadedMedia($ep); } } diff --git a/package.yml b/package.yml index 7766f49..a774fb8 100644 --- a/package.yml +++ b/package.yml @@ -1,5 +1,5 @@ package: mediapool_exif -version: '1.1.0-beta' +version: '2.0-beta' author: 'FriendsOfREDAXO' supportpage: https://github.com/FriendsOfREDAXO/mediapool_exif From f80d3343b5b5b3ba88609df16fed86cffbef2167 Mon Sep 17 00:00:00 2001 From: Axel Krysztofiak Date: Sun, 9 Aug 2020 11:32:42 +0200 Subject: [PATCH 3/4] Readme v2.0 --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 83262c8..65baf02 100644 --- a/README.md +++ b/README.md @@ -25,11 +25,9 @@ Namens einzufügen, sofern beim Upload keine Kategorie definiert wurde. ![Screenshot](https://raw.githubusercontent.com/FriendsOfREDAXO/mediapool_exif/master/assets/screenshot.png) -## Beta-Features (Version 2.0) +## Speicherung der Rohdaten -Da nun doch zu viele Änderungen vorgenommen wurden, ist nun eine Major-Version von nöten. Daher keine 1.1 sondern 2.0. - -Es werden alle EXIF-Daten in der Spalte ```rex_media.exif``` gespeichert, so dass man leichten Zugriff erhält. +Ab Version 2.0 werden alle EXIF-Daten in der Spalte ```rex_media.exif``` gespeichert, so dass man leichten Zugriff erhält. Im Prinzip sind die Daten über folgenden Code erreichbar: @@ -82,7 +80,7 @@ if(!$vendor) { } ``` -Das hier ist nicht das Standard-Vorgehen, da es u.U. schwierig werden kann, wenn man die Unterscheidung zwischen ```false``` und ```false``` machen muss. In speziellen Fällen kann man es noch mit ```null``` (```\FriendsOfRedaxo\addon\MediapoolExif\Exif::MODE_RETURN_NULL```) statt ```false```(```\FriendsOfRedaxo\addon\MediapoolExif\Exif::MODE_RETURN_FALSE```) zu versuchen. +Das hier ist nicht das Standard-Vorgehen, da es u.U. schwierig werden kann, wenn man die Unterscheidung zwischen ```false``` und ```false``` machen muss. In speziellen Fällen kann man es mit ```null``` (```\FriendsOfRedaxo\addon\MediapoolExif\Exif::MODE_RETURN_NULL```) statt ```false```(```\FriendsOfRedaxo\addon\MediapoolExif\Exif::MODE_RETURN_FALSE```) versuchen. Am Besten aber, man bleibt einfach bei Exceptions. Es ist und bleibt das Eindeutigste. ### Formatierung From bdd8c1162735a0610252903478b83bfffaa2a890 Mon Sep 17 00:00:00 2001 From: Axel Krysztofiak Date: Sun, 9 Aug 2020 11:34:46 +0200 Subject: [PATCH 4/4] =?UTF-8?q?Versions=C3=A4nderung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.yml b/package.yml index a774fb8..2fe3c9d 100644 --- a/package.yml +++ b/package.yml @@ -1,5 +1,5 @@ package: mediapool_exif -version: '2.0-beta' +version: '2.0' author: 'FriendsOfREDAXO' supportpage: https://github.com/FriendsOfREDAXO/mediapool_exif