aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2018-09-23 20:01:10 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2018-09-23 20:01:10 +0000
commit0391cde3e5db9ee481950202203bf596a4d7f4a7 (patch)
tree03e2e29f433f19878b4eb2a774896eeb371b63ea /src/plugins/Input
parenta7dfabe423c9fcfc2da38ec4ad78fe2f178fc027 (diff)
downloadqmmp-0391cde3e5db9ee481950202203bf596a4d7f4a7.tar.gz
qmmp-0391cde3e5db9ee481950202203bf596a4d7f4a7.tar.bz2
qmmp-0391cde3e5db9ee481950202203bf596a4d7f4a7.zip
feature to set cover for flac files
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@8358 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input')
-rw-r--r--src/plugins/Input/flac/flacmetadatamodel.cpp79
-rw-r--r--src/plugins/Input/flac/flacmetadatamodel.h4
2 files changed, 64 insertions, 19 deletions
diff --git a/src/plugins/Input/flac/flacmetadatamodel.cpp b/src/plugins/Input/flac/flacmetadatamodel.cpp
index 35ea80836..622e8a661 100644
--- a/src/plugins/Input/flac/flacmetadatamodel.cpp
+++ b/src/plugins/Input/flac/flacmetadatamodel.cpp
@@ -19,18 +19,21 @@
***************************************************************************/
#include <QPixmap>
+#include <QBuffer>
#include <taglib/tag.h>
#include <taglib/fileref.h>
#include <taglib/tmap.h>
#include <taglib/id3v2framefactory.h>
-#include <FLAC/all.h>
+#include <taglib/flacpicture.h>
#include <qmmp/metadatamanager.h>
#include "flacmetadatamodel.h"
-FLACMetaDataModel::FLACMetaDataModel(const QString &path, bool readOnly) : MetaDataModel(true)
+FLACMetaDataModel::FLACMetaDataModel(const QString &path, bool readOnly)
+ : MetaDataModel(true, MetaDataModel::IS_COVER_EDITABLE)
{
m_file = 0;
m_stream = 0;
+ m_tag = 0;
if(path.startsWith("flac://"))
{
@@ -42,27 +45,25 @@ FLACMetaDataModel::FLACMetaDataModel(const QString &path, bool readOnly) : MetaD
else
m_path = path;
- TagLib::Ogg::XiphComment *tag = 0;
-
if(m_path.endsWith(".flac", Qt::CaseInsensitive))
{
m_stream = new TagLib::FileStream(QStringToFileName(m_path), readOnly);
TagLib::FLAC::File *f = new TagLib::FLAC::File(m_stream, TagLib::ID3v2::FrameFactory::instance());
- tag = f->xiphComment();
+ m_tag = f->xiphComment();
m_file = f;
}
else if(m_path.endsWith(".oga", Qt::CaseInsensitive))
{
m_stream = new TagLib::FileStream(QStringToFileName(m_path), readOnly);
TagLib::Ogg::FLAC::File *f = new TagLib::Ogg::FLAC::File(m_stream);
- tag = f->tag();
+ m_tag = f->tag();
m_file = f;
}
if(m_file && m_file->isValid() && !path.startsWith("flac://"))
{
setReadOnly(readOnly);
- m_tags << new VorbisCommentModel(tag, m_file);
+ m_tags << new VorbisCommentModel(m_tag, m_file);
}
}
@@ -86,20 +87,20 @@ QList<TagModel* > FLACMetaDataModel::tags() const
QPixmap FLACMetaDataModel::cover() const
{
- //embedded cover
- QPixmap cover;
- FLAC__StreamMetadata *metadata;
- FLAC__metadata_get_picture (qPrintable(m_path),
- &metadata,
- FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER,
- 0,0, -1,-1,-1,-1);
- if(metadata)
+ if(!m_tag || m_tag->isEmpty())
+ return QPixmap();
+
+ TagLib::List<TagLib::FLAC::Picture *> list = m_tag->pictureList();
+ for(uint i = 0; i < list.size(); ++i)
{
- FLAC__StreamMetadata_Picture *pict = &metadata->data.picture;
- cover.loadFromData(QByteArray((char *)pict->data, (int) pict->data_length));
- FLAC__metadata_object_delete(metadata);
+ 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 cover;
+ return QPixmap();
}
QString FLACMetaDataModel::coverPath() const
@@ -107,6 +108,46 @@ QString FLACMetaDataModel::coverPath() const
return MetaDataManager::instance()->findCoverFile(m_path);
}
+void FLACMetaDataModel::setCover(const QPixmap &pix)
+{
+ removeCover();
+ if(m_tag && !m_tag->isEmpty())
+ {
+ 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();
+ }
+}
+
+void FLACMetaDataModel::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();
+ }
+ }
+}
+
VorbisCommentModel::VorbisCommentModel(TagLib::Ogg::XiphComment *tag, TagLib::File *file) : TagModel(TagModel::Save)
{
m_file = file;
diff --git a/src/plugins/Input/flac/flacmetadatamodel.h b/src/plugins/Input/flac/flacmetadatamodel.h
index 3eee80986..a9d47cf8b 100644
--- a/src/plugins/Input/flac/flacmetadatamodel.h
+++ b/src/plugins/Input/flac/flacmetadatamodel.h
@@ -35,10 +35,14 @@ public:
QList<TagModel* > tags() const;
QPixmap cover() const;
QString coverPath() const;
+ void setCover(const QPixmap &pix);
+ void removeCover();
+
private:
QString m_path;
QList<TagModel* > m_tags;
+ TagLib::Ogg::XiphComment *m_tag;
TagLib::File *m_file;
TagLib::FileStream *m_stream;
};