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