File indexing completed on 2025-03-09 03:57:01

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2013-11-28
0007  * Description : a command line tool to export ExifTool metadata
0008  *
0009  * SPDX-FileCopyrightText: 2012-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
0010  *
0011  * SPDX-License-Identifier: GPL-2.0-or-later
0012  *
0013  * ============================================================ */
0014 
0015 // Qt includes
0016 
0017 #include <QString>
0018 #include <QStringList>
0019 #include <QTextStream>
0020 #include <QCoreApplication>
0021 #include <QVariant>
0022 #include <QObject>
0023 
0024 // Local includes
0025 
0026 #include "dimg.h"
0027 #include "digikam_debug.h"
0028 #include "dpluginloader.h"
0029 #include "metaengine.h"
0030 #include "exiftoolparser.h"
0031 
0032 using namespace Digikam;
0033 
0034 int main(int argc, char** argv)
0035 {
0036     QCoreApplication app(argc, argv);
0037 
0038     if (argc != 2)
0039     {
0040         qCDebug(DIGIKAM_TESTS_LOG) << "exiftoolexport_cli - CLI tool to export ExifTool metadata from image";
0041         qCDebug(DIGIKAM_TESTS_LOG) << "Usage: <image>";
0042         return -1;
0043     }
0044 
0045     MetaEngine::initializeExiv2();
0046     DPluginLoader::instance()->init();
0047 
0048     // Create ExifTool parser instance.
0049 
0050     ExifToolParser* const parser = new ExifToolParser(qApp);
0051 
0052     // Read metadata from the file. Start ExifToolParser
0053 
0054     if (!parser->loadChunk(QString::fromUtf8(argv[1])))
0055     {
0056         qCWarning(DIGIKAM_TESTS_LOG) << "Metadata chunk cannot be loaded";
0057         return -1;
0058     }
0059 
0060     ExifToolParser::ExifToolData chunk = parser->currentData();
0061 
0062     qCDebug(DIGIKAM_TESTS_LOG) << "Metadata chunk loaded";
0063 
0064     ExifToolParser::ExifToolData::iterator it = chunk.find(QLatin1String("EXV"));
0065 
0066     if (it == chunk.end())
0067     {
0068         qCWarning(DIGIKAM_TESTS_LOG) << "Metadata chunk is empty";
0069         return -1;
0070     }
0071 
0072     QVariantList varLst = it.value();
0073 
0074     MetaEngine meta;
0075 
0076     QByteArray exv = varLst[0].toByteArray();
0077 
0078     if (!exv.isEmpty())
0079     {
0080         qCDebug(DIGIKAM_TESTS_LOG) << "EXV chunk size" << exv.size();
0081         meta.loadFromData(exv);
0082     }
0083 
0084     QFile ef(QLatin1String("output.exv"));
0085 
0086     if (!ef.open(QIODevice::WriteOnly))
0087     {
0088         qCWarning(DIGIKAM_TESTS_LOG) << "Cannot open target EXV file";
0089         return -1;
0090     }
0091 
0092     ef.write(exv);
0093     ef.close();
0094 
0095     DImg file(1, 1, false);
0096     file.setMetadata(meta.data());
0097     file.save(QLatin1String("output.jpg"), DImg::JPEG);
0098 
0099     return 0;
0100 }