diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/plugins/General/notifier/popupwidget.cpp | 4 | ||||
| -rw-r--r-- | src/plugins/Input/mad/mpegmetadatamodel.cpp | 23 | ||||
| -rw-r--r-- | src/plugins/Input/mad/mpegmetadatamodel.h | 1 | ||||
| -rw-r--r-- | src/qmmp/decoder.cpp | 17 | ||||
| -rw-r--r-- | src/qmmp/decoder.h | 4 | ||||
| -rw-r--r-- | src/qmmp/metadatamanager.cpp | 41 | ||||
| -rw-r--r-- | src/qmmp/metadatamanager.h | 18 | ||||
| -rw-r--r-- | src/qmmp/metadatamodel.cpp | 5 | ||||
| -rw-r--r-- | src/qmmp/metadatamodel.h | 2 |
9 files changed, 86 insertions, 29 deletions
diff --git a/src/plugins/General/notifier/popupwidget.cpp b/src/plugins/General/notifier/popupwidget.cpp index f2136aaf9..8bb493df0 100644 --- a/src/plugins/General/notifier/popupwidget.cpp +++ b/src/plugins/General/notifier/popupwidget.cpp @@ -29,7 +29,7 @@ #include <QApplication> #include <QFont> #include <qmmp/soundcore.h> -#include <qmmp/decoder.h> +#include <qmmp/metadatamanager.h> #include "popupwidget.h" @@ -107,7 +107,7 @@ void PopupWidget::showMetaData() } m_label1->setText(title); - QPixmap pix = Decoder::findCover(core->metaData(Qmmp::URL)); + QPixmap pix = MetaDataManager::instance()->getCover(core->metaData(Qmmp::URL)); if(!pix.isNull()) { m_pixlabel->setFixedSize(m_coverSize,m_coverSize); diff --git a/src/plugins/Input/mad/mpegmetadatamodel.cpp b/src/plugins/Input/mad/mpegmetadatamodel.cpp index cdf54774c..b1ae5a130 100644 --- a/src/plugins/Input/mad/mpegmetadatamodel.cpp +++ b/src/plugins/Input/mad/mpegmetadatamodel.cpp @@ -31,6 +31,7 @@ #include <taglib/mpegheader.h> #include <taglib/mpegproperties.h> #include <taglib/textidentificationframe.h> +#include <taglib/attachedpictureframe.h> #include "mpegmetadatamodel.h" @@ -108,6 +109,28 @@ QList<TagModel* > MPEGMetaDataModel::tags() return m_tags; } +QPixmap MPEGMetaDataModel::cover() +{ + if(!m_file->ID3v2Tag()) + return QPixmap(); + TagLib::ID3v2::FrameList frames = m_file->ID3v2Tag()->frameListMap()["APIC"]; + if(frames.isEmpty()) + return QPixmap(); + + for(TagLib::ID3v2::FrameList::Iterator it = frames.begin(); it != frames.end(); ++it) + { + TagLib::ID3v2::AttachedPictureFrame *frame = static_cast<TagLib::ID3v2::AttachedPictureFrame *>(*it); + if(frame && frame->type() == TagLib::ID3v2::AttachedPictureFrame::FrontCover) + { + QPixmap cover; + cover.loadFromData((const uchar *)frame->picture().data(), + frame->picture().size()); + return cover; + } + } + return QPixmap(); +} + MpegFileTagModel::MpegFileTagModel(TagLib::MPEG::File *file, TagLib::MPEG::File::TagTypes tagType) : TagModel() { diff --git a/src/plugins/Input/mad/mpegmetadatamodel.h b/src/plugins/Input/mad/mpegmetadatamodel.h index 2ed2a86f9..76d93d7f0 100644 --- a/src/plugins/Input/mad/mpegmetadatamodel.h +++ b/src/plugins/Input/mad/mpegmetadatamodel.h @@ -34,6 +34,7 @@ public: ~MPEGMetaDataModel(); QHash<QString, QString> audioProperties(); QList<TagModel* > tags(); + QPixmap cover(); private: QList<TagModel* > m_tags; diff --git a/src/qmmp/decoder.cpp b/src/qmmp/decoder.cpp index dd0235ca8..4d9cad319 100644 --- a/src/qmmp/decoder.cpp +++ b/src/qmmp/decoder.cpp @@ -207,20 +207,3 @@ QList<DecoderFactory*> *Decoder::factories() checkFactories(); return m_factories; } - -QPixmap Decoder::findCover(const QString &path) -{ - QString p = QFileInfo(path).absolutePath(); - QDir dir(p); - dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); - dir.setSorting(QDir::Name); - QStringList filters; - filters << "*.jpg" << "*.png"; - QFileInfoList file_list = dir.entryInfoList(filters); - foreach(QFileInfo i, file_list) - { - if(!i.absoluteFilePath().contains("back", Qt::CaseInsensitive)) - return QPixmap (i.absoluteFilePath()); - } - return QPixmap(); -} diff --git a/src/qmmp/decoder.h b/src/qmmp/decoder.h index af4c2d81b..e5cb647d9 100644 --- a/src/qmmp/decoder.h +++ b/src/qmmp/decoder.h @@ -101,10 +101,6 @@ public: * @param factory Decoder plugin factory. */ static bool isEnabled(DecoderFactory* factory); - /*! - * Returns cover pixmap for file path \b path if cover exists, otherwise returns empty pixmap. - */ - static QPixmap findCover(const QString &path); protected: /*! diff --git a/src/qmmp/metadatamanager.cpp b/src/qmmp/metadatamanager.cpp index 9fed9a193..1c65b817f 100644 --- a/src/qmmp/metadatamanager.cpp +++ b/src/qmmp/metadatamanager.cpp @@ -19,6 +19,8 @@ ***************************************************************************/ #include <QFile> +#include <QDir> +#include <QFileInfo> #include "decoder.h" #include "decoderfactory.h" #include "abstractengine.h" @@ -77,7 +79,7 @@ MetaDataModel* MetaDataManager::createMetaDataModel(const QString &path, QObject } -const QStringList MetaDataManager::filters() const +QStringList MetaDataManager::filters() const { QStringList filters; foreach(DecoderFactory *fact, *m_decoderFactories) @@ -93,7 +95,7 @@ const QStringList MetaDataManager::filters() const return filters; } -const QStringList MetaDataManager::nameFilters() const +QStringList MetaDataManager::nameFilters() const { QStringList filters; foreach(DecoderFactory *fact, *m_decoderFactories) @@ -109,7 +111,7 @@ const QStringList MetaDataManager::nameFilters() const return filters; } -const QStringList MetaDataManager::protocols() const +QStringList MetaDataManager::protocols() const { QStringList p; foreach(InputSourceFactory *f, *m_inputSourceFactories) @@ -141,6 +143,38 @@ bool MetaDataManager::supports(const QString &fileName) const return FALSE; } +QPixmap MetaDataManager::getCover(const QString &fileName) const +{ + QString p = getCoverPath(fileName); + if(!p.isEmpty()) + return QPixmap(p); + MetaDataModel *model = createMetaDataModel(fileName); + if(model) + { + QPixmap pix = model->cover(); + model->deleteLater(); + return pix; + } + return QPixmap(); +} + +QString MetaDataManager::getCoverPath(const QString &fileName) const +{ + QString p = QFileInfo(fileName).absolutePath(); + QDir dir(p); + dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); + dir.setSorting(QDir::Name); + QStringList filters; + filters << "*.jpg" << "*.png"; + QFileInfoList file_list = dir.entryInfoList(filters); + foreach(QFileInfo i, file_list) + { + if(!i.absoluteFilePath().contains("back", Qt::CaseInsensitive)) + return i.absoluteFilePath(); + } + return QString(); +} + MetaDataManager *MetaDataManager::instance() { if(!m_instance) @@ -153,3 +187,4 @@ void MetaDataManager::destroy() if(m_instance) delete m_instance; } + diff --git a/src/qmmp/metadatamanager.h b/src/qmmp/metadatamanager.h index ee0be9912..4bdca20a7 100644 --- a/src/qmmp/metadatamanager.h +++ b/src/qmmp/metadatamanager.h @@ -23,6 +23,7 @@ #include <QList> #include <QStringList> +#include <QPixmap> #include "fileinfo.h" #include "metadatamodel.h" @@ -54,20 +55,31 @@ public: /*! * Returns a list of file name filters with description, i.e. "MPEG Files (*.mp3 *.mpg)" */ - const QStringList filters() const; + QStringList filters() const; /*! * Returns a list of file name filters, i.e. "*.mp3 *.mpg" */ - const QStringList nameFilters() const; + QStringList nameFilters() const; /*! * Returns a list of the suported protocols */ - const QStringList protocols() const; + QStringList protocols() const; /*! * Returns \b true if \b file is supported and exists, otherwise returns \b false */ bool supports(const QString &file) const; /*! + * Returns cover pixmap for the given file \b fileName, + * or returns an empty pixmap if cover is not available. + */ + QPixmap getCover(const QString &fileName) const; + /*! + * Returns cover file path for the given file \b fileName, or returns + * an empty string if cover file is not available. This function does not work + * with embedded covers. + */ + QString getCoverPath(const QString &fileName) const; + /*! * Returns a pointer to the MetaDataManager instance. */ static MetaDataManager* instance(); diff --git a/src/qmmp/metadatamodel.cpp b/src/qmmp/metadatamodel.cpp index 42d8fdd4a..d33ca59d5 100644 --- a/src/qmmp/metadatamodel.cpp +++ b/src/qmmp/metadatamodel.cpp @@ -43,3 +43,8 @@ QList<TagModel* > MetaDataModel::tags() { return QList<TagModel* > (); } + +QPixmap MetaDataModel::cover() +{ + return QPixmap(); +} diff --git a/src/qmmp/metadatamodel.h b/src/qmmp/metadatamodel.h index 09b6d8998..c07375f55 100644 --- a/src/qmmp/metadatamodel.h +++ b/src/qmmp/metadatamodel.h @@ -25,6 +25,7 @@ #include <QList> #include <QString> #include <QObject> +#include <QPixmap> #include "tagmodel.h" class MetaDataModel : public QObject @@ -36,6 +37,7 @@ public: virtual QHash<QString, QString> audioProperties(); virtual QHash<QString, QString> descriptions(); virtual QList<TagModel* > tags(); + virtual QPixmap cover(); }; #endif // METADATAMODEL_H |
