diff --git a/src/writers/taglibwriter.cpp b/src/writers/taglibwriter.cpp --- a/src/writers/taglibwriter.cpp +++ b/src/writers/taglibwriter.cpp @@ -21,16 +21,26 @@ #include "taglibwriter.h" #include +#include +#include #include -#include -#include - -using namespace KFileMetaData; - -TagLibWriter::TagLibWriter(QObject* parent) - : WriterPlugin(parent) -{ -} +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace { const QStringList supportedMimeTypes = { QStringLiteral("audio/flac"), @@ -47,76 +57,173 @@ QStringLiteral("audio/x-ms-wma"), QStringLiteral("audio/x-musepack"), QStringLiteral("audio/x-opus+ogg"), - QStringLiteral("audio/x-speex"), + QStringLiteral("audio/x-speex+ogg"), QStringLiteral("audio/x-vorbis+ogg"), QStringLiteral("audio/x-wav"), QStringLiteral("audio/x-wavpack"), }; -QStringList TagLibWriter::writeMimetypes() const -{ - return supportedMimeTypes; } -void TagLibWriter::write(const WriteData& data) -{ - const QString fileUrl = data.inputUrl(); - const PropertyMap properties = data.getAllProperties(); - - TagLib::FileRef file(fileUrl.toUtf8().constData(), true); - if (file.isNull()) { - return; - } - - TagLib::Tag* tags = file.tag(); - - TagLib::String title; - TagLib::String artist; - TagLib::String album; - TagLib::String genre; - TagLib::String comment; +using namespace KFileMetaData; - if (properties.contains(Property::Title)) { - title = QStringToTString(properties.value(Property::Title).toString()); - tags->setTitle(title); +void writeGenericProperties(TagLib::PropertyMap &oldProperties, const PropertyMap &newProperties) +{ + if (newProperties.contains(Property::Title)) { + oldProperties.replace("TITLE", QStringToTString(newProperties.value(Property::Title).toString())); } - if (properties.contains(Property::Artist)) { - artist = QStringToTString(properties.value(Property::Artist).toString()); - tags->setArtist(artist); + if (newProperties.contains(Property::Artist)) { + oldProperties.replace("ARTIST", QStringToTString(newProperties.value(Property::Artist).toString())); } - if (properties.contains(Property::Album)) { - album = QStringToTString(properties.value(Property::Album).toString()); - tags->setAlbum(album); + if (newProperties.contains(Property::Album)) { + oldProperties.replace("ALBUM", QStringToTString(newProperties.value(Property::Album).toString())); } - if (properties.contains(Property::TrackNumber)) { - int trackNumber = properties.value(Property::TrackNumber).toInt(); + if (newProperties.contains(Property::TrackNumber)) { + int trackNumber = newProperties.value(Property::TrackNumber).toInt(); //taglib requires uint if (trackNumber >= 0) { - tags->setTrack(trackNumber); + oldProperties.replace("TRACKNUMBER", QStringToTString(newProperties.value(Property::TrackNumber).toString())); } } - if (properties.contains(Property::ReleaseYear)) { - int year = properties.value(Property::ReleaseYear).toInt(); + if (newProperties.contains(Property::ReleaseYear)) { + int year = newProperties.value(Property::ReleaseYear).toInt(); //taglib requires uint if (year >= 0) { - tags->setYear(year); + oldProperties.replace("DATE", QStringToTString(newProperties.value(Property::ReleaseYear).toString())); } } - if (properties.contains(Property::Genre)) { - genre = QStringToTString(properties.value(Property::Genre).toString()); - tags->setGenre(genre); + if (newProperties.contains(Property::Genre)) { + oldProperties.replace("GENRE", QStringToTString(newProperties.value(Property::Genre).toString())); } - if (properties.contains(Property::Comment)) { - comment = QStringToTString(properties.value(Property::Comment).toString()); - tags->setComment(comment); + if (newProperties.contains(Property::Comment)) { + oldProperties.replace("COMMENT", QStringToTString(newProperties.value(Property::Comment).toString())); } +} + +TagLibWriter::TagLibWriter(QObject* parent) + : WriterPlugin(parent) +{ +} +QStringList TagLibWriter::writeMimetypes() const +{ + return supportedMimeTypes; +} + +void TagLibWriter::write(const WriteData& data) +{ + const QString fileUrl = data.inputUrl(); + const PropertyMap properties = data.getAllProperties(); + const QString mimeType = data.inputMimetype(); + + TagLib::FileStream stream(fileUrl.toUtf8().constData(), false); + if (!stream.isOpen()) { + qWarning() << "Unable to open file in write mode: " << fileUrl; + return; + } - file.save(); + if ((mimeType == QLatin1String("audio/mpeg")) || (mimeType == QLatin1String("audio/mpeg3")) + || (mimeType == QLatin1String("audio/x-mpeg"))) { + TagLib::MPEG::File file(&stream, TagLib::ID3v2::FrameFactory::instance(), false); + if (file.isValid()) { + auto savedProperties = file.properties(); + writeGenericProperties(savedProperties, properties); + file.setProperties(savedProperties); + file.save(); + } + } else if (mimeType == QLatin1String("audio/x-aiff")) { + TagLib::RIFF::AIFF::File file(&stream, false); + if (file.isValid()) { + auto savedProperties = file.properties(); + writeGenericProperties(savedProperties, properties); + file.setProperties(savedProperties); + file.save(); + } + } else if ((mimeType == QLatin1String("audio/wav")) || (mimeType == QLatin1String("audio/x-wav"))) { + TagLib::RIFF::WAV::File file(&stream, false); + if (file.isValid()) { + auto savedProperties = file.properties(); + writeGenericProperties(savedProperties, properties); + file.setProperties(savedProperties); + file.save(); + } + } else if (mimeType == QLatin1String("audio/x-musepack")) { + TagLib::MPC::File file(&stream, false); + if (file.isValid()) { + auto savedProperties = file.properties(); + writeGenericProperties(savedProperties, properties); + file.setProperties(savedProperties); + file.save(); + } + } else if (mimeType == QLatin1String("audio/x-ape")) { + TagLib::APE::File file(&stream, false); + if (file.isValid()) { + auto savedProperties = file.properties(); + writeGenericProperties(savedProperties, properties); + file.setProperties(savedProperties); + file.save(); + } + } else if (mimeType == QLatin1String("audio/x-wavpack")) { + TagLib::WavPack::File file(&stream, false); + if (file.isValid()) { + auto savedProperties = file.properties(); + writeGenericProperties(savedProperties, properties); + file.setProperties(savedProperties); + file.save(); + } + } else if (mimeType == QLatin1String("audio/mp4")) { + TagLib::MP4::File file(&stream, false); + if (file.isValid()) { + auto savedProperties = file.properties(); + writeGenericProperties(savedProperties, properties); + file.setProperties(savedProperties); + file.save(); + } + } else if (mimeType == QLatin1String("audio/flac")) { + TagLib::FLAC::File file(&stream, TagLib::ID3v2::FrameFactory::instance(), false); + if (file.isValid()) { + auto savedProperties = file.properties(); + writeGenericProperties(savedProperties, properties); + file.setProperties(savedProperties); + file.save(); + } + } else if (mimeType == QLatin1String("audio/ogg") || mimeType == QLatin1String("audio/x-vorbis+ogg")) { + TagLib::Ogg::Vorbis::File file(&stream, false); + if (file.isValid()) { + auto savedProperties = file.properties(); + writeGenericProperties(savedProperties, properties); + file.setProperties(savedProperties); + file.save(); + } + } else if (mimeType == QLatin1String("audio/opus") || mimeType == QLatin1String("audio/x-opus+ogg")) { + TagLib::Ogg::Opus::File file(&stream, false); + if (file.isValid()) { + auto savedProperties = file.properties(); + writeGenericProperties(savedProperties, properties); + file.setProperties(savedProperties); + file.save(); + } + } else if (mimeType == QLatin1String("audio/speex") || mimeType == QLatin1String("audio/x-speex+ogg")) { + TagLib::Ogg::Speex::File file(&stream, false); + if (file.isValid()) { + auto savedProperties = file.properties(); + writeGenericProperties(savedProperties, properties); + file.setProperties(savedProperties); + file.save(); + } + } else if (mimeType == QLatin1String("audio/x-ms-wma")) { + TagLib::ASF::File file(&stream, false); + if (file.isValid()) { + auto savedProperties = file.properties(); + writeGenericProperties(savedProperties, properties); + file.setProperties(savedProperties); + file.save(); + } + } }