aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/Input/opus/opusmetadatamodel.cpp83
-rw-r--r--src/plugins/Input/opus/opusmetadatamodel.h3
-rw-r--r--src/plugins/Input/vorbis/vorbismetadatamodel.cpp92
-rw-r--r--src/plugins/Input/vorbis/vorbismetadatamodel.h4
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;