File indexing completed on 2024-04-14 04:44:00

0001 /*
0002    SPDX-FileCopyrightText: 2018 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr>
0003    SPDX-FileCopyrightText: 2019 (c) Alexander Stippich <a.stippich@gmx.net>
0004 
0005    SPDX-License-Identifier: LGPL-3.0-or-later
0006  */
0007 
0008 #include "filewriter.h"
0009 
0010 #include "config-upnp-qt.h"
0011 #include <QMimeDatabase>
0012 
0013 #if KFFileMetaData_FOUND
0014 
0015 #include <KFileMetaData/WriterCollection>
0016 #include <KFileMetaData/Writer>
0017 #include <KFileMetaData/UserMetaData>
0018 #include <KFileMetaData/WriteData>
0019 #include <QHash>
0020 
0021 #endif
0022 
0023 class FileWriterPrivate
0024 {
0025 public:
0026 
0027 #if KFFileMetaData_FOUND
0028     KFileMetaData::WriterCollection mAllWriters;
0029 
0030     const QHash<DataTypes::ColumnsRoles, KFileMetaData::Property::Property> mPropertyTranslation = {
0031         {DataTypes::ColumnsRoles::ArtistRole, KFileMetaData::Property::Artist},
0032         {DataTypes::ColumnsRoles::AlbumArtistRole, KFileMetaData::Property::AlbumArtist},
0033         {DataTypes::ColumnsRoles::GenreRole, KFileMetaData::Property::Genre},
0034         {DataTypes::ColumnsRoles::ComposerRole, KFileMetaData::Property::Composer},
0035         {DataTypes::ColumnsRoles::LyricistRole, KFileMetaData::Property::Lyricist},
0036         {DataTypes::ColumnsRoles::TitleRole, KFileMetaData::Property::Title},
0037         {DataTypes::ColumnsRoles::AlbumRole, KFileMetaData::Property::Album},
0038         {DataTypes::ColumnsRoles::TrackNumberRole, KFileMetaData::Property::TrackNumber},
0039         {DataTypes::ColumnsRoles::DiscNumberRole, KFileMetaData::Property::DiscNumber},
0040         {DataTypes::ColumnsRoles::YearRole, KFileMetaData::Property::ReleaseYear},
0041         {DataTypes::ColumnsRoles::LyricsRole, KFileMetaData::Property::Lyrics},
0042         {DataTypes::ColumnsRoles::CommentRole, KFileMetaData::Property::Comment},
0043         {DataTypes::ColumnsRoles::RatingRole, KFileMetaData::Property::Rating},
0044     };
0045 #endif
0046 
0047     QMimeDatabase mMimeDb;
0048 
0049 };
0050 
0051 FileWriter::FileWriter() : d(std::make_unique<FileWriterPrivate>())
0052 {
0053 }
0054 
0055 FileWriter::~FileWriter() = default;
0056 
0057 bool FileWriter::writeSingleMetaDataToFile(const QUrl &url, const DataTypes::ColumnsRoles role, const QVariant &data)
0058 {
0059 #if KFFileMetaData_FOUND
0060 
0061     if (!url.isLocalFile()) {
0062         return false;
0063     }
0064     const auto &localFileName = url.toLocalFile();
0065     const auto &fileMimeType = d->mMimeDb.mimeTypeForFile(localFileName);
0066     if (!fileMimeType.name().startsWith(QStringLiteral("audio/"))) {
0067         return false;
0068     }
0069 
0070     const auto &mimetype = fileMimeType.name();
0071     const QList<KFileMetaData::Writer*> &writerList = d->mAllWriters.fetchWriters(mimetype);
0072 
0073     if (writerList.isEmpty()) {
0074         return false;
0075     }
0076     KFileMetaData::Writer *writer = writerList.first();
0077     KFileMetaData::WriteData writeData(localFileName, mimetype);
0078     auto translatedKey = d->mPropertyTranslation.find(role);
0079     if (translatedKey != d->mPropertyTranslation.end()) {
0080         writeData.add(translatedKey.value(), data);
0081     }
0082     writer->write(writeData);
0083 
0084 #if !defined Q_OS_ANDROID && !defined Q_OS_WIN
0085     auto fileData = KFileMetaData::UserMetaData(localFileName);
0086 
0087     if (role == DataTypes::RatingRole) {
0088         fileData.setRating(data.toInt());
0089     }
0090 
0091     if (role == DataTypes::CommentRole) {
0092         fileData.setUserComment(data.toString());
0093     }
0094 #endif
0095 
0096     return true;
0097 #else
0098     Q_UNUSED(url)
0099     Q_UNUSED(role)
0100     Q_UNUSED(data)
0101 
0102     return false;
0103 #endif
0104 }
0105 
0106 bool FileWriter::writeAllMetaDataToFile(const QUrl &url, const DataTypes::TrackDataType &data)
0107 {
0108 #if KFFileMetaData_FOUND
0109 
0110     if (!url.isLocalFile()) {
0111         return false;
0112     }
0113     const auto &localFileName = url.toLocalFile();
0114     const auto &fileMimeType = d->mMimeDb.mimeTypeForFile(localFileName);
0115     if (!fileMimeType.name().startsWith(QLatin1String("audio/"))) {
0116         return false;
0117     }
0118 
0119     KFileMetaData::UserMetaData md(localFileName);
0120     md.setUserComment(data.value(DataTypes::ColumnsRoles::CommentRole).toString());
0121     md.setRating(data.value(DataTypes::ColumnsRoles::RatingRole).toInt());
0122 
0123     const auto &mimetype = fileMimeType.name();
0124     const QList<KFileMetaData::Writer*> &writerList = d->mAllWriters.fetchWriters(mimetype);
0125 
0126     if (writerList.isEmpty()) {
0127         return false;
0128     }
0129 
0130     KFileMetaData::Writer *writer = writerList.first();
0131     KFileMetaData::WriteData writeData(localFileName, mimetype);
0132     auto rangeBegin = data.constKeyValueBegin();
0133     while (rangeBegin != data.constKeyValueEnd()) {
0134         auto key = (*rangeBegin).first;
0135         auto translatedKey = d->mPropertyTranslation.find(key);
0136         if (translatedKey != d->mPropertyTranslation.end()) {
0137             writeData.add(translatedKey.value(), (*rangeBegin).second);
0138         }
0139         rangeBegin++;
0140     }
0141     writer->write(writeData);
0142 
0143     return true;
0144 #else
0145     Q_UNUSED(url)
0146     Q_UNUSED(data)
0147 
0148     return false;
0149 #endif
0150 }
0151