diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/plugins/Input/flac/flacmetadatamodel.cpp | 79 | ||||
| -rw-r--r-- | src/plugins/Input/flac/flacmetadatamodel.h | 4 |
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; }; |
