[mythtv] patch - AlbumArt - id3v2 pic frame

Christian Poetzsch cp at BurningDragon.de
Fri May 7 05:36:59 EDT 2004


Hello,
This patch is used to get the album art out of
the id3v2 tag as descripted in http://www.id3.org/develop.html.

It's uses id3lib for id3 part.

First its look in the file for a APIC frame and
if one found its used as art. If no one where found
the behaviour is like before.

Cheers,
Chris
-------------- next part --------------
*** visualize.cpp	2004-01-31 07:35:10.000000000 +0100
--- new/visualize.cpp	2004-05-07 11:05:59.333610000 +0200
***************
*** 23,28 ****
--- 23,29 ----
  #include <iostream>
  using namespace std;
  
+ #include <id3tag.h>
  #include <mythtv/mythcontext.h>
  
  Spectrum::Spectrum()
***************
*** 281,331 ****
          return false;
  
      QString curfile = pParent->decoder()->getFilename();
!     QString curdir = curfile.left(curfile.findRev("/"));
!     QImage art;
!  
!     // If the directory has changed (new album) or the size, reload
!     if ((directory.compare(curdir) != 0) || (cursize != size))
      {
!         // Directory has changed
          directory = curdir;
!         // Get filter
!         QString namefilter = gContext->GetSetting("AlbumArtFilter",
                                                    "*.png;*.jpg;*.jpeg;*.gif");
!         // Get directory contents based on filter
!         QDir folder(curdir, namefilter, QDir::Name | QDir::IgnoreCase, 
!                     QDir::Files | QDir::Hidden);
! 
!         QString fileart = "";
! 
!         if (folder.count())
!             fileart = folder[rand() % folder.count()];
! 
!         curdir.append("/");
!         curdir.append(fileart);
!         art.load(curdir);
          if (art.isNull())
          {
              p->fillRect(0, 0, size.width(), size.height(), back);
              p->setPen(Qt::white);
              p->setFont(gContext->GetMediumFont());
              p->drawText(size.width() / 2 - 200, size.height() / 2 - 10, 400, 20, 
!                         Qt::AlignCenter, QObject::tr("?"));
!             return true;
          }
- 
          QSize artsize = art.scale(size, QImage::ScaleMin).size();
- 
          // Paint the image
          p->fillRect(0, 0, size.width(), size.height(), back);
          p->drawPixmap((size.width() - artsize.width()) / 2,
                        (size.height() - artsize.height()) / 2,
                        art.smoothScale(size, QImage::ScaleMin));
!         // Store our new size
!         cursize = size;
!         return true;
      }
-     art.reset();
      return true;
  }
  
--- 282,375 ----
          return false;
  
      QString curfile = pParent->decoder()->getFilename();
!     // If the size/file has changed do it again
!     if (filename != curfile || cursize != size)
      {
!         QImage art;
! 
!         filename = curfile;
!         
!         // Try to load the picture from id3v2 tag
!         id3_file *id3file = id3_file_open(curfile.local8Bit(), 
!                                           ID3_FILE_MODE_READONLY);
!         if (id3file)
!         {
!             id3_tag *tag = id3_file_tag(id3file);
!             if (tag)
!             {
!                // Search for a picture frame
!                struct id3_frame *frame = id3_tag_findframe(tag, "APIC", 0);
!                if (frame)
!                {
!                     // Some debug
!                     if (0)
!                     {
!                         cout << "ID3 id: " << frame->id << endl;
!                         cout << "ID3 description: " << frame->description << endl;
!                         cout << "ID3 nfields: " << frame->nfields << endl;
!                         cout << "ID3 mimetype: " << id3_field_getlatin1(id3_frame_field(frame, 1)) << endl;
!                     }
!                     // Check if it is a hyperlink
!                     // thats current not supported 
!                     // (Its the case if "-->" is in the mime field)
!                     const char* mime = (const char*)id3_field_getlatin1(id3_frame_field(frame, 1));
!                     if (strcmp(mime, "-->") != 0)
!                     {
!                         id3_length_t len=frame->decoded_length;
!                         // Get the picture data
!                         const id3_byte_t* pictData = id3_field_getbinarydata(id3_frame_field(frame, 4), &len);
!                         // Try to load it
!                         art.loadFromData (pictData, len);
!                     }
!                 }
!             }
!             id3_file_close(id3file);
!         }
!       
!         QString curdir = curfile.left(curfile.findRev("/"));
          directory = curdir;
!  
!         // If there was no id3 picture tag, try to load
!         // some picture in the directory tree
!         if (art.isNull())
!         {
!             // Get filter
!             QString namefilter = gContext->GetSetting("AlbumArtFilter",
                                                    "*.png;*.jpg;*.jpeg;*.gif");
!             // Get directory contents based on filter
!             QDir folder(curdir, namefilter, QDir::Name | QDir::IgnoreCase, 
!                         QDir::Files | QDir::Hidden);
!   
!             QString fileart = "";
! 
!             if (folder.count())
!                 fileart = folder[rand() % folder.count()];
! 
!             curdir.append("/");
!             curdir.append(fileart);
!             art.load(curdir);
!         }
!         // Store our new size
!         cursize = size;
!         // If nothing was found 
!         // paint some usefull art :-)
          if (art.isNull())
          {
              p->fillRect(0, 0, size.width(), size.height(), back);
              p->setPen(Qt::white);
              p->setFont(gContext->GetMediumFont());
              p->drawText(size.width() / 2 - 200, size.height() / 2 - 10, 400, 20, 
!                      Qt::AlignCenter, QObject::tr("?"));
!           return true;
          }
          QSize artsize = art.scale(size, QImage::ScaleMin).size();
          // Paint the image
          p->fillRect(0, 0, size.width(), size.height(), back);
          p->drawPixmap((size.width() - artsize.width()) / 2,
                        (size.height() - artsize.height()) / 2,
                        art.smoothScale(size, QImage::ScaleMin));
!         art.reset();
      }
      return true;
  }
  


More information about the mythtv-dev mailing list