From 599665c2cf83fa924eb5ca0e71a176aaa714ce33 Mon Sep 17 00:00:00 2001 From: plegall Date: Thu, 20 Apr 2006 21:12:45 +0000 Subject: bug 339 fixed: crash on metadata synchronization when duplicate keywords. improvement: tools/metadata.php is nearer of what metadata synchronization uses (concerning keywords) git-svn-id: http://piwigo.org/svn/branches/branch-1_6@1222 68402e56-0260-453c-a942-63ccdbb3a9ee --- admin/include/functions_metadata.php | 10 +++++++++ tools/metadata.php | 41 ++++++++++++++++++++++++++++++------ 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/admin/include/functions_metadata.php b/admin/include/functions_metadata.php index 1df03ba43..f468ab7e3 100644 --- a/admin/include/functions_metadata.php +++ b/admin/include/functions_metadata.php @@ -53,6 +53,16 @@ function get_sync_iptc_data($file) // official keywords separator is the comma $iptc['keywords'] = preg_replace('/[.;]/', ',', $iptc['keywords']); $iptc['keywords'] = preg_replace('/^,+|,+$/', '', $iptc['keywords']); + + $iptc['keywords'] = implode( + ',', + array_unique( + explode( + ',', + $iptc['keywords'] + ) + ) + ); } return $iptc; diff --git a/tools/metadata.php b/tools/metadata.php index 011240135..1ef307f3f 100644 --- a/tools/metadata.php +++ b/tools/metadata.php @@ -28,6 +28,25 @@ $filename = 'sample.jpg'; echo 'Informations are read from '.$filename.'


'; +/** + * return a cleaned IPTC value + * + * @param string value + * @return string + */ +function clean_iptc_value($value) +{ + // strip leading zeros (weird Kodak Scanner software) + while ( isset($value[0]) and $value[0] == chr(0)) + { + $value = substr($value, 1); + } + // remove binary nulls + $value = str_replace(chr(0x00), ' ', $value); + + return $value; +} + $iptc_result = array(); $imginfo = array(); getimagesize($filename, $imginfo); @@ -38,17 +57,25 @@ if (isset($imginfo['APP13'])) { foreach (array_keys($iptc) as $iptc_key) { - if (isset($iptc[$iptc_key][0]) and $value = $iptc[$iptc_key][0]) + if (isset($iptc[$iptc_key][0])) { - // strip leading zeros (weird Kodak Scanner software) - while ($value[0] == chr(0)) + if ($iptc_key == '2#025') + { + $value = implode( + ',', + array_map( + 'clean_iptc_value', + $iptc[$iptc_key] + ) + ); + } + else { - $value = substr($value, 1); + $value = clean_iptc_value($iptc[$iptc_key][0]); } - // remove binary nulls - $value = str_replace(chr(0x00), ' ', $value); + + $iptc_result[$iptc_key] = $value; } - $iptc_result[$iptc_key] = $value; } } -- cgit v1.2.3