diff options
| -rw-r--r-- | src/plugins/Input/opus/opusmetadatamodel.cpp | 83 | ||||
| -rw-r--r-- | src/plugins/Input/opus/opusmetadatamodel.h | 3 | ||||
| -rw-r--r-- | src/plugins/Input/vorbis/vorbismetadatamodel.cpp | 92 | ||||
| -rw-r--r-- | src/plugins/Input/vorbis/vorbismetadatamodel.h | 4 |
4 files changed, 114 insertions, 68 deletions
diff --git a/src/plugins/Input/opus/opusmetadatamodel.cpp b/src/plugins/Input/opus/opusmetadatamodel.cpp index c1ab36a5b..cc6bd4dfd 100644 --- a/src/plugins/Input/opus/opusmetadatamodel.cpp +++ b/src/plugins/Input/opus/opusmetadatamodel.cpp @@ -19,6 +19,8 @@ ***************************************************************************/ #include <QtGlobal> +#include <QBuffer> +#include <taglib/flacpicture.h> #include <taglib/tag.h> #include <taglib/fileref.h> #include <taglib/opusfile.h> @@ -27,7 +29,7 @@ #include "opusmetadatamodel.h" OpusMetaDataModel::OpusMetaDataModel(const QString &path, bool readOnly) - : MetaDataModel(readOnly) + : MetaDataModel(readOnly, MetaDataModel::IS_COVER_EDITABLE) { m_path = path; m_stream = new TagLib::FileStream(QStringToFileName(path), readOnly); @@ -66,47 +68,62 @@ QPixmap OpusMetaDataModel::cover() const return QPixmap(); TagLib::Ogg::XiphComment *tag = m_file->tag(); - if(!tag) - return QPixmap(); - TagLib::StringList list = tag->fieldListMap()["METADATA_BLOCK_PICTURE"]; - if(list.isEmpty()) + if(!tag || tag->isEmpty()) return QPixmap(); + + TagLib::List<TagLib::FLAC::Picture *> list = tag->pictureList(); for(uint i = 0; i < list.size(); ++i) { - TagLib::String value = list[i]; - QByteArray block = QByteArray::fromBase64(TStringToQString(value).toLatin1()); - if(block.size() < 32) - continue; - qint64 pos = 0; - if(readPictureBlockField(block, pos) != 3) //picture type, use front cover only - continue; - pos += 4; - int mimeLength = readPictureBlockField(block, pos); //mime type length - pos += 4; - pos += mimeLength; //skip mime type - int descLength = readPictureBlockField(block, pos); //description length - pos += 4; - pos += descLength; //skip description - pos += 4; //width - pos += 4; //height - pos += 4; //color depth - pos += 4; //the number of colors used - int length = readPictureBlockField(block, pos); //picture size - pos += 4; - QPixmap cover; - cover.loadFromData(block.mid(pos, length)); //read binary picture data - return cover; + if(list[i]->type() == TagLib::FLAC::Picture::FrontCover) + { + QPixmap cover; + cover.loadFromData(QByteArray(list[i]->data().data(), list[i]->data().size())); //read binary picture data + return cover; + } } return QPixmap(); } -ulong OpusMetaDataModel::readPictureBlockField(QByteArray data, int offset) const +void OpusMetaDataModel::setCover(const QPixmap &pix) { - return (((uchar)data.data()[offset] & 0xff) << 24) | - (((uchar)data.data()[offset+1] & 0xff) << 16) | - (((uchar)data.data()[offset+2] & 0xff) << 16) | - ((uchar)data.data()[offset+3] & 0xff); + removeCover(); + TagLib::Ogg::XiphComment *tag = m_file->tag(); + if(tag) + { + TagLib::FLAC::Picture *picture = new TagLib::FLAC::Picture(); + picture->setType(TagLib::FLAC::Picture::FrontCover); + + QByteArray data; + QBuffer buffer(&data); + buffer.open(QIODevice::WriteOnly); + pix.save(&buffer, "JPEG"); + picture->setMimeType("image/jpeg"); + picture->setData(TagLib::ByteVector(data.constData(), data.size())); + tag->addPicture(picture); + m_file->save(); + } +} +void OpusMetaDataModel::removeCover() +{ + TagLib::Ogg::XiphComment *tag = m_file->tag(); + if(tag && !tag->isEmpty()) + { + bool save = false; + TagLib::List<TagLib::FLAC::Picture *> list = tag->pictureList(); + for(uint i = 0; i < list.size(); ++i) + { + if(list[i]->type() == TagLib::FLAC::Picture::FrontCover) + { + tag->removePicture(list[i], false); + save = true; + } + } + if(save) + { + m_file->save(); + } + } } VorbisCommentModel::VorbisCommentModel(TagLib::Ogg::Opus::File *file) : TagModel(TagModel::Save) diff --git a/src/plugins/Input/opus/opusmetadatamodel.h b/src/plugins/Input/opus/opusmetadatamodel.h index 15b9306ad..ea96abad0 100644 --- a/src/plugins/Input/opus/opusmetadatamodel.h +++ b/src/plugins/Input/opus/opusmetadatamodel.h @@ -35,9 +35,10 @@ public: QList<MetaDataItem> extraProperties() const; QList<TagModel* > tags() const; QPixmap cover() const; + void setCover(const QPixmap &pix); + void removeCover(); private: - ulong readPictureBlockField(QByteArray data, int offset) const; QString m_path; QList<TagModel* > m_tags; TagLib::Ogg::Opus::File *m_file; diff --git a/src/plugins/Input/vorbis/vorbismetadatamodel.cpp b/src/plugins/Input/vorbis/vorbismetadatamodel.cpp index f56869f30..8c9305beb 100644 --- a/src/plugins/Input/vorbis/vorbismetadatamodel.cpp +++ b/src/plugins/Input/vorbis/vorbismetadatamodel.cpp @@ -19,15 +19,17 @@ ***************************************************************************/ #include <QtGlobal> +#include <QBuffer> #include <taglib/tag.h> #include <taglib/fileref.h> #include <taglib/vorbisfile.h> #include <taglib/xiphcomment.h> #include <taglib/tmap.h> +#include <taglib/flacpicture.h> #include "vorbismetadatamodel.h" VorbisMetaDataModel::VorbisMetaDataModel(const QString &path, bool readOnly) - : MetaDataModel(readOnly) + : MetaDataModel(readOnly, MetaDataModel::IS_COVER_EDITABLE) { m_path = path; m_stream = new TagLib::FileStream(QStringToFileName(path), readOnly); @@ -54,45 +56,71 @@ QPixmap VorbisMetaDataModel::cover() const { if(!m_tag || m_tag->isEmpty()) return QPixmap(); - TagLib::StringList list = m_tag->fieldListMap()["METADATA_BLOCK_PICTURE"]; - if(list.isEmpty()) - return QPixmap(); + + TagLib::List<TagLib::FLAC::Picture *> list = m_tag->pictureList(); for(uint i = 0; i < list.size(); ++i) { - TagLib::String value = list[i]; - QByteArray block = QByteArray::fromBase64(TStringToQString(value).toLatin1()); - if(block.size() < 32) - continue; - qint64 pos = 0; - if(readPictureBlockField(block, pos) != 3) //picture type, use front cover only - continue; - pos += 4; - int mimeLength = readPictureBlockField(block, pos); //mime type length - pos += 4; - pos += mimeLength; //skip mime type - int descLength = readPictureBlockField(block, pos); //description length - pos += 4; - pos += descLength; //skip description - pos += 4; //width - pos += 4; //height - pos += 4; //color depth - pos += 4; //the number of colors used - int length = readPictureBlockField(block, pos); //picture size - pos += 4; - QPixmap cover; - cover.loadFromData(block.mid(pos, length)); //read binary picture data - return cover; + if(list[i]->type() == TagLib::FLAC::Picture::FrontCover) + { + QPixmap cover; + cover.loadFromData(QByteArray(list[i]->data().data(), list[i]->data().size())); //read binary picture data + return cover; + } } + return QPixmap(); } -ulong VorbisMetaDataModel::readPictureBlockField(QByteArray data, int offset) const +void VorbisMetaDataModel::setCover(const QPixmap &pix) { - return (((uchar)data.data()[offset] & 0xff) << 24) | - (((uchar)data.data()[offset+1] & 0xff) << 16) | - (((uchar)data.data()[offset+2] & 0xff) << 16) | - ((uchar)data.data()[offset+3] & 0xff); + removeCover(); + if(m_tag) + { + TagLib::FLAC::Picture *picture = new TagLib::FLAC::Picture(); + picture->setType(TagLib::FLAC::Picture::FrontCover); + + QByteArray data; + QBuffer buffer(&data); + buffer.open(QIODevice::WriteOnly); + pix.save(&buffer, "JPEG"); + picture->setMimeType("image/jpeg"); + picture->setData(TagLib::ByteVector(data.constData(), data.size())); + m_tag->addPicture(picture); + m_file->save(); +#if ((TAGLIB_MAJOR_VERSION == 1) && (TAGLIB_MINOR_VERSION <= 10)) + //taglib bug workarround + delete m_file; + m_file = new TagLib::Ogg::Vorbis::File(QStringToFileName(m_path)); + m_tag = m_file->tag(); +#endif + } +} +void VorbisMetaDataModel::removeCover() +{ + if(m_tag && !m_tag->isEmpty()) + { + bool save = false; + TagLib::List<TagLib::FLAC::Picture *> list = m_tag->pictureList(); + for(uint i = 0; i < list.size(); ++i) + { + if(list[i]->type() == TagLib::FLAC::Picture::FrontCover) + { + m_tag->removePicture(list[i], false); + save = true; + } + } + if(save) + { + m_file->save(); +#if ((TAGLIB_MAJOR_VERSION == 1) && (TAGLIB_MINOR_VERSION <= 10)) + //taglib bug workarround + delete m_file; + m_file = new TagLib::Ogg::Vorbis::File(QStringToFileName(m_path)); + m_tag = m_file->tag(); +#endif + } + } } VorbisCommentModel::VorbisCommentModel(VorbisMetaDataModel *model) : TagModel(TagModel::Save) diff --git a/src/plugins/Input/vorbis/vorbismetadatamodel.h b/src/plugins/Input/vorbis/vorbismetadatamodel.h index fe8d3ea30..a2a6a3a59 100644 --- a/src/plugins/Input/vorbis/vorbismetadatamodel.h +++ b/src/plugins/Input/vorbis/vorbismetadatamodel.h @@ -38,10 +38,10 @@ public: QList<TagModel* > tags() const; QPixmap cover() const; + void setCover(const QPixmap &pix); + void removeCover(); private: - ulong readPictureBlockField(QByteArray data, int offset) const; - QString m_path; TagLib::Ogg::Vorbis::File *m_file; TagLib::Ogg::XiphComment *m_tag; |
