metadata: filter out unwanted tags when syncing with xmp sidecars

(cherry picked from commit 239f3f59b931efb15482134fffd5f6065616e574)
This commit is contained in:
Alberto Griggio 2021-01-12 00:21:58 -08:00 committed by Lawrence Lee
parent d16bc6f6ea
commit 3d209e687d
No known key found for this signature in database
GPG Key ID: 048FF2B76A63895F
2 changed files with 10 additions and 6 deletions

View File

@ -130,7 +130,7 @@ void Exiv2Metadata::load() const
} }
if (merge_xmp_) { if (merge_xmp_) {
do_merge_xmp(image_.get()); do_merge_xmp(image_.get(), false);
} }
} }
} }
@ -190,15 +190,19 @@ void Exiv2Metadata::setIptc(const rtengine::procparams::IPTCPairs &iptc)
*iptc_ = iptc; *iptc_ = iptc;
} }
void Exiv2Metadata::do_merge_xmp(Exiv2::Image *dst) const void Exiv2Metadata::do_merge_xmp(Exiv2::Image *dst, bool keep_all) const
{ {
try { try {
auto xmp = getXmpSidecar(src_); auto xmp = getXmpSidecar(src_);
Exiv2::ExifData exif; Exiv2::ExifData exif;
Exiv2::IptcData iptc; Exiv2::IptcData iptc;
Exiv2::copyXmpToIptc(xmp, iptc); Exiv2::copyXmpToIptc(xmp, iptc);
Exiv2::copyXmpToExif(xmp, exif); Exiv2::moveXmpToExif(xmp, exif);
if (!keep_all) {
remove_unwanted(exif);
}
for (auto &datum : exif) { for (auto &datum : exif) {
dst->exifData()[datum.key()] = datum; dst->exifData()[datum.key()] = datum;
} }
@ -224,7 +228,7 @@ void Exiv2Metadata::saveToImage(const Glib::ustring &path, bool preserve_all_tag
dst->setIptcData(image_->iptcData()); dst->setIptcData(image_->iptcData());
dst->setXmpData(image_->xmpData()); dst->setXmpData(image_->xmpData());
if (merge_xmp_) { if (merge_xmp_) {
do_merge_xmp(dst.get()); do_merge_xmp(dst.get(), preserve_all_tags);
} }
auto srcexif = image_->exifData(); auto srcexif = image_->exifData();
if (!preserve_all_tags) { if (!preserve_all_tags) {
@ -258,7 +262,7 @@ void Exiv2Metadata::saveToImage(const Glib::ustring &path, bool preserve_all_tag
!dst->xmpData().empty()) { !dst->xmpData().empty()) {
dst->xmpData().clear(); dst->xmpData().clear();
if (!xmp_tried && merge_xmp_) { if (!xmp_tried && merge_xmp_) {
do_merge_xmp(dst.get()); do_merge_xmp(dst.get(), preserve_all_tags);
xmp_tried = true; xmp_tried = true;
} }
} else if (msg.find("IPTC") != std::string::npos && } else if (msg.find("IPTC") != std::string::npos &&

View File

@ -67,7 +67,7 @@ public:
static void cleanup(); static void cleanup();
private: private:
void do_merge_xmp(Exiv2::Image* dst) const; void do_merge_xmp(Exiv2::Image* dst, bool keep_all) const;
void import_exif_pairs(Exiv2::ExifData& out) const; void import_exif_pairs(Exiv2::ExifData& out) const;
void import_iptc_pairs(Exiv2::IptcData& out) const; void import_iptc_pairs(Exiv2::IptcData& out) const;
void remove_unwanted(Exiv2::ExifData& dst) const; void remove_unwanted(Exiv2::ExifData& dst) const;