aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/vorbis/vorbismetadatamodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/Input/vorbis/vorbismetadatamodel.cpp')
-rw-r--r--src/plugins/Input/vorbis/vorbismetadatamodel.cpp92
1 files changed, 60 insertions, 32 deletions
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)