Hi,
just wanted to say that I've written a very basic plugin that can import the keywords in <dc:Subject> in the XMP metadata to Piwigo keywords. It doesn't import any other XMP fields.
I've written it only for myself, and I don't have the time to support and maintain such a plugin, so I just post it here for anyone to use. If anybody wants to turn it into a "real" plugin that can be downloaded at Piwigo, feel free to do so.
I've adapted the code to read the XMP tags from what I found at http://surniaulula.com/2013/04/09/read- … ml-in-php/ , so if you want to make it support more metadata than just the keywords, look there.
To use the plugin as I wrote it, do the following:
1) Create a directory named XMPTags in the plugins/ directory in your Piwigo installation.
2) In that directory, create a file named main.inc.php with the following contents:
<?php /* Plugin Name: XMP Tags Version: 0.1 Description: Add XMP tags in Xmp.dc.subject to Piwigo tags Plugin URI: Author: zottel Author URI: https://zottel.red/channel/zottel */ if (!defined('PHPWG_ROOT_PATH')) { die('Hacking attempt!'); } add_event_handler( 'format_exif_data', 'xmptags_add_xmp_tags' ); function xmptags_add_xmp_tags($exif, $filename) { // we don't provide all exif info, only want to add some if ($exif == null) return null; // code adapted from http://surniaulula.com/2013/04/09/read-adobe-xmp-xml-in-php/ $max_size = 512000; $chunk_size = 65536; $start_tag = '<x:xmpmeta'; $end_tag = '</x:xmpmeta>'; $xmp_raw = null; $chunk = ''; if ($file_fh = fopen( $filename, 'rb' )) { $file_size = filesize( $filename ); while ( ( $file_pos = ftell( $file_fh ) ) < $file_size && $file_pos < $max_size ) { $chunk .= fread( $file_fh, $chunk_size ); if ( ( $end_pos = strpos( $chunk, $end_tag ) ) !== false ) { if ( ( $start_pos = strpos( $chunk, $start_tag ) ) !== false ) { $xmp_raw = substr( $chunk, $start_pos, $end_pos - $start_pos + strlen( $end_tag ) ); } break; // stop reading after finding the xmp data } } fclose( $file_fh ); } if ($xmp_raw != null) { $dcSubject = preg_match("/<dc:subject>\s*<rdf:(?:Bag|Seq)>\s*(.*?)\s*<\/rdf:(?:Bag|Seq)>\s*<\/dc:subject>/is", $xmp_raw, $match) ? $match[1] : null; if ($dcSubject != null) { $exif['xmp_keywords'] = preg_match_all( "/<rdf:li[^>]*>([^>]*)<\/rdf:li>/is", $dcSubject, $match ) ? $match[1] : $dcSubject; if (is_array($exif['xmp_keywords'])) $exif['xmp_keywords'] = implode(',', $exif['xmp_keywords']); } } return $exif; } ?>
3) To actually import the keywords, add the following to your local/config/config.inc.php:
$conf['use_exif_mapping'] = array( 'date_creation' => 'DateTimeOriginal', 'keywords' => 'xmp_keywords' );
As I said, I won't support this. Maybe I happen to visit this forum again, by chance see a help request and have the time to to answer, but generally: Use it as you like; if it doesn't work, find out yourself why. ;-)
Best regards, zottel
@zottel
Great work, many thanks, your plugin works well in piwigo version 13.8.0. I found one little problem, the plugin must be enabled after installing it, in the plugins menu from piwigo.
For darktable users, this is the solution to import tags/keywords form darktable export from the xmp data fields.
#darktable
#xmp
#keywords
#keys
Michael
Offline