Covers from tags
authorNikolay Tischenko <niktischenko@gmail.com>
Sun, 7 Nov 2010 20:33:12 +0000 (02:33 +0600)
committerNikolay Tischenko <niktischenko@gmail.com>
Sun, 7 Nov 2010 20:33:12 +0000 (02:33 +0600)
src/coverfinder.cpp
src/coverfinder.h
src/playerform.cpp
src/taglib/mpeg/id3v2/frames/attachedpictureframe.cpp

index b906cc1..d52c9d9 100644 (file)
@@ -22,6 +22,9 @@
 #include <QDebug>
 #include <QDir>
 #include <QFileInfo>
+#include <mpegfile.h>
+#include <id3v2tag.h>
+#include <mpeg/id3v2/frames/attachedpictureframe.h>
 
 CoverFinder::CoverFinder(QObject *parent) :
                QObject(parent)
@@ -29,7 +32,7 @@ CoverFinder::CoverFinder(QObject *parent) :
        _defaultCover = QImage(":/images/defaultcover.png");
        SUFFIXES << "png" << "jpg" << "jpeg" << "bmp" << "gif";
        NAMES << "cover" << "folder" << "album";
-       DIRS << "cover" << "folder" << ".cover" << ".folder" << ".mediaartlocal";
+       DIRS << "cover" << "folder" << ".cover" << ".folder";
 }
 
 bool CoverFinder::find(QString path) {
@@ -67,3 +70,24 @@ bool CoverFinder::find(QString path) {
 QImage &CoverFinder::defaultCover() {
        return _defaultCover;
 }
+
+bool CoverFinder::extract(QString file) {
+       QFileInfo info(file);
+       QString suffix = info.suffix().toLower();
+       TagLib::ID3v2::Tag *tag = NULL;
+       if (suffix == "mp3") {
+               TagLib::MPEG::File f(QFile::encodeName(file).data());
+               tag = f.ID3v2Tag();
+               if (f.isValid() && tag != NULL) {
+                       TagLib::ID3v2::FrameList l = tag->frameList("APIC");
+                       if (l.isEmpty())
+                               return false;
+                       TagLib::ID3v2::AttachedPictureFrame *pic = static_cast<TagLib::ID3v2::AttachedPictureFrame *>(l.front());
+                       QImage img;
+                       img.loadFromData((const uchar *) pic->picture().data(), pic->picture().size());
+                       emit found(img);
+                       return true;
+               }
+       }
+       return false;
+}
index 51306c7..14365ac 100644 (file)
@@ -35,6 +35,7 @@ signals:
 
 public slots:
        bool find(QString path);
+       bool extract(QString file);
        QImage &defaultCover();
 
 private:
index 35f9cf2..e819b61 100644 (file)
@@ -239,7 +239,9 @@ void PlayerForm::_display_track(Track track) {
        ui->seekSlider->setMinimum(0);
        ui->seekSlider->setMaximum(track.metadata().length());
        _tick(0, track.metadata().length());
-       _coverfinder->find(QFileInfo(track.source()).absolutePath());
+       if (!_coverfinder->extract(QFileInfo(track.source()).absoluteFilePath())) {
+               _coverfinder->find(QFileInfo(track.source()).absolutePath());
+       }
 }
 
 void PlayerForm::_tick(int done, int all) {
@@ -662,7 +664,8 @@ void PlayerForm::hideCountdown() {
 }
 
 void PlayerForm::_display_cover(QImage image) {
-       _cover->setPixmap(QPixmap::fromImage(image));
+       QPixmap p = QPixmap::fromImage(image);
+       _cover->setPixmap(p);
 }
 
 void PlayerForm::_c_add_to_favorites() {
index cd58360..6c6e2e6 100644 (file)
@@ -133,7 +133,7 @@ void AttachedPictureFrame::parseFields(const ByteVector &data)
 
   d->textEncoding = String::Type(data[0]);
 
-  int pos = 1, poss = 1;
+  int pos = 1;
 
   d->mimeType = readStringField(data, String::Latin1, &pos);
   /* Now we need at least two more bytes available */  
@@ -143,11 +143,8 @@ void AttachedPictureFrame::parseFields(const ByteVector &data)
   }
 
   d->type = (TagLib::ID3v2::AttachedPictureFrame::Type)data[pos++];
-
-  poss = pos;
   d->description = readStringField(data, d->textEncoding, &pos);
-
-  d->data = data.mid(poss);
+  d->data = data.mid(pos);
 }
 
 ByteVector AttachedPictureFrame::renderFields() const