Skip to content

Commit

Permalink
feat: add setting to clear metadata before setting it (fix #3114)
Browse files Browse the repository at this point in the history
  • Loading branch information
Bionus committed Apr 7, 2024
1 parent f28acd0 commit add5c8d
Show file tree
Hide file tree
Showing 7 changed files with 98 additions and 24 deletions.
4 changes: 4 additions & 0 deletions src/gui/src/settings/options-window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ OptionsWindow::OptionsWindow(Profile *profile, ThemeLoader *themeLoader, QWidget
ui->groupMetadataPropsys->setEnabled(false);
#else
ui->lineMetadataPropsysExtensions->setText(settings->value("Save/MetadataPropsysExtensions", "jpg jpeg mp4").toString());
ui->checkMetadataPropsysClear->setChecked(settings->value("Save/MetadataPropsysClear", false).toBool());
const QList<QPair<QString, QString>> metadataPropsys = getMetadataPropsys(settings);
for (const auto &pair : metadataPropsys) {
auto *leKey = new QLineEdit(pair.first, this);
Expand All @@ -226,6 +227,7 @@ OptionsWindow::OptionsWindow(Profile *profile, ThemeLoader *themeLoader, QWidget
watcher->setFuture(future);

ui->lineMetadataExiftoolExtensions->setText(settings->value("Save/MetadataExiftoolExtensions", "jpg jpeg png gif mp4").toString());
ui->checkMetadataExiftoolClear->setChecked(settings->value("Save/MetadataExiftoolClear", false).toBool());
const QList<QPair<QString, QString>> metadataExiftool = getMetadataExiftool(settings);
for (const auto &pair : metadataExiftool) {
auto *leKey = new QLineEdit(pair.first, this);
Expand Down Expand Up @@ -1365,6 +1367,7 @@ void OptionsWindow::save()
settings->setValue("ConvertUgoiraDeleteOriginal", ui->checkConversionUgoiraDelete->isChecked());

settings->setValue("MetadataPropsysExtensions", ui->lineMetadataPropsysExtensions->text());
settings->setValue("MetadataPropsysClear", ui->checkMetadataPropsysClear->isChecked());
settings->beginWriteArray("MetadataPropsys");
for (int i = 0, j = 0; i < m_metadataPropsys.count(); ++i) {
const QString &key = m_metadataPropsys[i].first->text();
Expand All @@ -1379,6 +1382,7 @@ void OptionsWindow::save()
settings->endArray();

settings->setValue("MetadataExiftoolExtensions", ui->lineMetadataExiftoolExtensions->text());
settings->setValue("MetadataExiftoolClear", ui->checkMetadataExiftoolClear->isChecked());
settings->beginWriteArray("MetadataExiftool");
for (int i = 0, j = 0; i < m_metadataExiftool.count(); ++i) {
const QString &key = m_metadataExiftool[i].first->text();
Expand Down
52 changes: 33 additions & 19 deletions src/gui/src/settings/options-window.ui
Original file line number Diff line number Diff line change
Expand Up @@ -1273,8 +1273,15 @@
<string>Windows Property System</string>
</property>
<layout class="QFormLayout" name="formLayout_15">
<item row="1" column="0" colspan="2">
<layout class="QFormLayout" name="layoutMetadataPropsys"/>
<item row="0" column="0">
<widget class="QLabel" name="labelMetadataPropsysExtensions">
<property name="text">
<string>Extensions</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineMetadataPropsysExtensions"/>
</item>
<item row="2" column="0" colspan="2">
<widget class="QPushButton" name="buttonMetadataPropsysAdd">
Expand All @@ -1283,15 +1290,15 @@
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="labelMetadataPropsysExtensions">
<item row="3" column="0" colspan="2">
<widget class="QCheckBox" name="checkMetadataPropsysClear">
<property name="text">
<string>Extensions</string>
<string>Clear existing metadata</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineMetadataPropsysExtensions"/>
<item row="1" column="0" colspan="2">
<layout class="QFormLayout" name="layoutMetadataPropsys"/>
</item>
</layout>
</widget>
Expand All @@ -1302,6 +1309,20 @@
<string>Exiftool</string>
</property>
<layout class="QFormLayout" name="formLayout_23">
<item row="0" column="0">
<widget class="QLabel" name="labelMetadataExiftoolVersionLabel">
<property name="text">
<string>Version</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="labelMetadataExiftoolVersion">
<property name="text">
<string>Loading...</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labelMetadataExiftoolExtensions">
<property name="text">
Expand All @@ -1312,29 +1333,22 @@
<item row="1" column="1">
<widget class="QLineEdit" name="lineMetadataExiftoolExtensions"/>
</item>
<item row="2" column="0" colspan="2">
<layout class="QFormLayout" name="layoutMetadataExiftool"/>
</item>
<item row="3" column="0" colspan="2">
<widget class="QPushButton" name="buttonMetadataExiftoolAdd">
<property name="text">
<string>Add new property</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="labelMetadataExiftoolVersionLabel">
<item row="4" column="0" colspan="2">
<widget class="QCheckBox" name="checkMetadataExiftoolClear">
<property name="text">
<string>Version</string>
<string>Clear existing metadata</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="labelMetadataExiftoolVersion">
<property name="text">
<string>Loading...</string>
</property>
</widget>
<item row="2" column="0" colspan="2">
<layout class="QFormLayout" name="layoutMetadataExiftool"/>
</item>
</layout>
</widget>
Expand Down
5 changes: 4 additions & 1 deletion src/lib/src/external/exiftool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,14 @@ bool Exiftool::start(int msecs)
return ok;
}

bool Exiftool::setMetadata(const QString &file, const QMap<QString, QString> &metadata, int msecs)
bool Exiftool::setMetadata(const QString &file, const QMap<QString, QString> &metadata, bool clear, int msecs)
{
QStringList commands;
commands.append({ "-charset", "filename=utf8" });
commands.append({ "-sep", ";" });
if (clear) {
commands.append("-all=");
}
for (auto it = metadata.constBegin(); it != metadata.constEnd(); ++it) {
commands.append("-" + it.key() + "=" + it.value());
}
Expand Down
2 changes: 1 addition & 1 deletion src/lib/src/external/exiftool.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class Exiftool : public QObject

public slots:
bool start(int msecs = 30000);
bool setMetadata(const QString &file, const QMap<QString, QString> &metadata, int msecs = 30000);
bool setMetadata(const QString &file, const QMap<QString, QString> &metadata, bool clear = false, int msecs = 30000);
bool execute(const QString &file, const QString &command, int msecs = 30000);
bool stop(int msecs = 30000);

Expand Down
5 changes: 4 additions & 1 deletion src/lib/src/models/image.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -839,6 +839,9 @@ QString Image::postSaving(const QString &originalPath, Size size, bool addMd5, b
const QStringList exts = m_settings->value("Save/MetadataPropsysExtensions", "jpg jpeg mp4").toString().split(' ', Qt::SkipEmptyParts);
if (exts.isEmpty() || exts.contains(ext)) {
const auto metadataPropsys = getMetadataPropsys(m_settings);
if (m_settings->value("Save/MetadataPropsysClear", false).toBool()) {
clearAllWindowsProperties(path);
}
for (const auto &pair : metadataPropsys) {
const QStringList values = Filename(pair.second).path(*this, m_profile, "", 0, Filename::Complex);
if (!values.isEmpty()) {
Expand All @@ -861,7 +864,7 @@ QString Image::postSaving(const QString &originalPath, Size size, bool addMd5, b
if (!metadata.isEmpty()) {
Exiftool &exiftool = m_profile->getExiftool();
exiftool.start();
exiftool.setMetadata(path, metadata);
exiftool.setMetadata(path, metadata, m_settings->value("Save/MetadataExiftoolClear", false).toBool());
}
}

Expand Down
53 changes: 51 additions & 2 deletions src/lib/src/windows-file-property.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -162,10 +162,10 @@ bool setWindowsProperty(const QString &filename, const QString &property, const
// Commit does the actual writing back to the file stream.
hr = pps->Commit();
if (FAILED(hr)) {
log(QString("Error %1 committing to the propertystore for `%2`").arg(hr).arg(filename), Logger::Error);
log(QString("Error %1 committing to the propertystore \"%2\" for `%2`").arg(hr).arg(property, filename), Logger::Error);
}
} else {
log(QString("Error %1 setting value to the propertystore for `%2`").arg(hr).arg(filename), Logger::Error);
log(QString("Error %1 setting value to the propertystore \"%2\" for `%3`").arg(hr).arg(property, filename), Logger::Error);
}
}
PropVariantClear(&propvarValue);
Expand All @@ -184,3 +184,52 @@ bool setWindowsProperty(const QString &filename, const QString &property, const

return SUCCEEDED(hr);
}

bool clearAllWindowsProperties(const QString &filename)
{
PCWSTR pszFilename = toWCharT2(filename);
PCWSTR pszValue = toWCharT2(QString());
IPropertyStore* pps = NULL;

HRESULT hr = GetPropertyStore(pszFilename, GPS_READWRITE, &pps);
if (SUCCEEDED(hr)) {
// Retrieve the number of properties stored in the item.
DWORD cProperties = 0;
hr = pps->GetCount(&cProperties);
if (SUCCEEDED(hr)) {
for (DWORD i = 0; i < cProperties; i++) {
// Get the property key at a given index.
PROPERTYKEY key;
hr = pps->GetAt(i, &key);
if (SUCCEEDED(hr)) {
// Build the value
PROPVARIANT propvarValue = {0};
PropVariantInit(&propvarValue);

// Clear the value in the property store of the item.
hr = pps->SetValue(key, propvarValue);
if (SUCCEEDED(hr)) {
i--; // Clearing a value changes the value count and the results of GetCount() and GetAt()
}

PropVariantClear(&propvarValue);
}
}
}

// Commit does the actual writing back to the file stream.
hr = pps->Commit();
if (FAILED(hr)) {
log(QString("Error %1 committing to the propertystore for `%2`").arg(hr).arg(filename), Logger::Error);
}

pps->Release();
} else {
log(QString("Error %1 getting the propertystore for `%2`").arg(hr).arg(filename), Logger::Error);
}

delete pszFilename;
delete pszValue;

return SUCCEEDED(hr);
}
1 change: 1 addition & 0 deletions src/lib/src/windows-file-property.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@ void uninitializeWindowsProperties();
bool getAllWindowsProperties(const QString &filename, QMap<QString, QString> &out);
bool getWindowsProperty(const QString &filename, const QString &property, QString &out);
bool setWindowsProperty(const QString &filename, const QString &property, const QString &value);
bool clearAllWindowsProperties(const QString &filename);

#endif // WINDOWS_FILE_PROPERTY_H

0 comments on commit add5c8d

Please sign in to comment.