Index: mythplugins/mythmusic/mythmusic/playbackbox.cpp
===================================================================
--- mythplugins/mythmusic/mythmusic/playbackbox.cpp	(revision 12631)
+++ mythplugins/mythmusic/mythmusic/playbackbox.cpp	(working copy)
@@ -23,6 +23,7 @@
 #include "decoder.h"
 #include "playbackbox.h"
 #include "databasebox.h"
+#include "metaio.h"
 #include "mainvisual.h"
 #include "smartplaylist.h"
 #include "search.h"
@@ -1157,8 +1158,17 @@
         return;
     
     banner_timer->start(8000);
-    mainvisual->addInformation("\"" + mdata->Title() + "\"\n" + 
-                               mdata->Artist() + " - " + mdata->Album());
+    MetaIO *tagger = decoder->doCreateTagger();
+    if (tagger) {
+        QByteArray img_array(tagger->getAlbumArt(curMeta->Filename()));
+        QImage image(img_array);
+        mainvisual->addInformation(image, "\"" + mdata->Title() + "\"\n" + 
+                                   mdata->Artist() + " - " + mdata->Album());
+        delete tagger;
+    } else {
+        mainvisual->addInformation(QImage(), "\"" + mdata->Title() + "\"\n" + 
+                                   mdata->Artist() + " - " + mdata->Album());
+    }
 }
 
 void PlaybackBoxMusic::bannerToggle(Metadata *mdata) 
@@ -1172,7 +1182,7 @@
 void PlaybackBoxMusic::bannerDisable()
 {
     banner_timer->stop();
-    mainvisual->addInformation("");
+    mainvisual->clearInformation();
 }
 
 void PlaybackBoxMusic::CycleVisualizer()
Index: mythplugins/mythmusic/mythmusic/visualize.cpp
===================================================================
--- mythplugins/mythmusic/mythmusic/visualize.cpp	(revision 12631)
+++ mythplugins/mythmusic/mythmusic/visualize.cpp	(working copy)
@@ -11,6 +11,7 @@
 
 #include <cmath>
 #include "mainvisual.h"
+#include "metaio.h"
 #include "visualize.h"
 #include "inlines.h"
 #include "decoder.h"
@@ -18,7 +19,6 @@
 #include <qpainter.h>
 #include <qpixmap.h>
 #include <qimage.h>
-#include <qdir.h>
 #include <qurl.h>
 
 #include <iostream>
@@ -327,31 +327,20 @@
         return true;
 
     if (filename != pParent->decoder()->getFilename()) {
-        QString curdir = QUrl(pParent->decoder()->getFilename()).dirPath();
-        if (directory != curdir)
-            return true;
+        return true;
     }
 
     return false;
 }
 
-QString AlbumArt::getImageFilename() 
+QByteArray AlbumArt::getImage() 
 {
-    QString result;
-    QString curfile = pParent->decoder()->getFilename();
-    QString curdir = QUrl(curfile).dirPath();
-    QString namefilter = gContext->GetSetting("AlbumArtFilter",
-                                              "*.png;*.jpg;*.jpeg;*.gif;*.bmp");
-    // Get directory contents based on filter
-    QDir folder(curdir, namefilter, QDir::Name | QDir::IgnoreCase, 
-                QDir::Files | QDir::Hidden);
-    
-    if (folder.count())
-        result = folder[rand() % folder.count()];
-
-    result.prepend("/");
-    result.prepend(curdir);
-    
+    QByteArray result;
+    MetaIO *tagger = pParent->decoder()->doCreateTagger();
+    if (tagger) {
+        result = tagger->getAlbumArt(pParent->decoder()->getFilename());
+        delete tagger;
+    }
     return result;
 }
 
@@ -363,21 +352,24 @@
     // If the directory has changed (new album) or the size, reload
     if (needsUpdate())
     {
-        QImage art(getImageFilename());
+        QImage art(getImage());
         if (art.isNull())
-        {
-            drawWarning(p, back, size, QObject::tr("?"));
-            cursize = size;
-            return true;
-        }
-        image = art.smoothScale(size, QImage::ScaleMin);
+            image.reset();
+        else
+            image = art.smoothScale(size, QImage::ScaleMin);
+
+        // Store the new filename
+        filename = pParent->decoder()->getFilename();
     }
 
     // Paint the image
     p->fillRect(0, 0, size.width(), size.height(), back);
-    p->drawPixmap((size.width() - image.width()) / 2,
-                  (size.height() - image.height()) / 2,
-                  image);
+    if (image.isNull())
+        drawWarning(p, back, size, QObject::tr("?"));
+    else
+        p->drawPixmap((size.width() - image.width()) / 2,
+                      (size.height() - image.height()) / 2,
+                      image);
     
     // Store our new size
     cursize = size;
Index: mythplugins/mythmusic/mythmusic/mainvisual.h
===================================================================
--- mythplugins/mythmusic/mythmusic/mainvisual.h	(revision 12631)
+++ mythplugins/mythmusic/mythmusic/mainvisual.h	(working copy)
@@ -97,7 +97,9 @@
     void setFrameRate( int newfps );
     int frameRate() const { return fps; }
 
+    void addInformation(const QImage &img, const QString &);
     void addInformation(const QString &);
+	void clearInformation();
 
     static void registerVisFactory(VisFactory *);
     static VisualBase *createVis(const QString &name,
@@ -128,7 +130,8 @@
 
 public:
     InfoWidget(QWidget *parent = 0);
-    void addInformation(const QString &);
+    void addInformation(const QString &, const QImage *img = 0);
+	void clearInformation();
     void paintEvent(QPaintEvent *);
 
 private:
Index: mythplugins/mythmusic/mythmusic/metaio.h
===================================================================
--- mythplugins/mythmusic/mythmusic/metaio.h	(revision 12631)
+++ mythplugins/mythmusic/mythmusic/metaio.h	(working copy)
@@ -16,6 +16,7 @@
     
     virtual bool write(Metadata* mdata, bool exclusive = false) = 0;
     virtual Metadata* read(QString filename) = 0;
+	virtual QByteArray getAlbumArt(const QString &filename);
 
     void readFromFilename(QString filename, QString &artist, QString &album, 
                           QString &title, QString &genre, int &tracknum);
Index: mythplugins/mythmusic/mythmusic/metaioid3v2.h
===================================================================
--- mythplugins/mythmusic/mythmusic/metaioid3v2.h	(revision 12631)
+++ mythplugins/mythmusic/mythmusic/metaioid3v2.h	(working copy)
@@ -20,6 +20,7 @@
     
     bool write(Metadata* mdata, bool exclusive = false);
     Metadata* read(QString filename);
+	QByteArray getAlbumArt(const QString &filename);
     
 private:
     int getTrackLength(QString filename);
Index: mythplugins/mythmusic/mythmusic/mainvisual.cpp
===================================================================
--- mythplugins/mythmusic/mythmusic/mainvisual.cpp	(revision 12631)
+++ mythplugins/mythmusic/mythmusic/mainvisual.cpp	(working copy)
@@ -373,10 +373,18 @@
     visfactories->append(vis);
 }
 
+void MainVisual::addInformation(const QImage &img, const QString &new_info) {
+    info_widget->addInformation(new_info, &img);
+}
+
 void MainVisual::addInformation(const QString &new_info) {
     info_widget->addInformation(new_info);
 }
 
+void MainVisual::clearInformation() {
+    info_widget->clearInformation();
+}
+
 VisualBase *MainVisual::createVis(const QString &name, MainVisual *parent,
                                   long int winid)
 {
@@ -426,7 +434,7 @@
     hide();
 }
 
-void InfoWidget::addInformation(const QString &new_info) {
+void InfoWidget::addInformation(const QString &new_info, const QImage *img) {
     if (new_info == info)
         return;
     
@@ -440,7 +448,8 @@
     info_pixmap = QPixmap(width(), height()/*, pixmap.depth ()*/);
     QPainter p(&info_pixmap);
 
-    int indent = int(info_pixmap.width() * 0.02);
+    int text_indent = int(info_pixmap.width() * 0.02);
+    int img_indent = int(info_pixmap.width() * 0.01);
 
     p.fillRect(0, 0,
                info_pixmap.width(), info_pixmap.height(),
@@ -450,18 +459,25 @@
     p.setFont(gContext->GetMediumFont());
 
     QFontMetrics fm(p.font());
-    int width = fm.width(info);
-    int height = fm.height() * (info.contains("\n") + 1);
-    int x = indent;
-    int y = indent;
+    int text_width = fm.width(info);
+    int text_height = fm.height() * (info.contains("\n") + 1);
+    int text_x = text_indent;
+    int text_y = text_indent;
 
+    if (img && !img->isNull()) {
+        text_x += info_pixmap.height();
+        int img_height = info_pixmap.height() - 2 * img_indent;
+        QRect rect(img_indent, img_indent, img_height, img_height);
+        p.drawImage(rect, img->smoothScale (rect.size(), QImage::ScaleMin));
+    }
+
     QString info_copy = info;
-    for (int offset = 0; offset < height; offset += fm.height()) {
+    for (int offset = 0; offset < text_height; offset += fm.height()) {
         QString l = info_copy.left(info_copy.find("\n"));
         p.setPen(Qt::black);
-        p.drawText(x + 2, y + offset + 2, width, height, Qt::AlignLeft, l);
+        p.drawText(text_x + 2, text_y + offset + 2, text_width, text_height, Qt::AlignLeft, l);
         p.setPen(Qt::white);
-        p.drawText(x, y + offset, width, height, Qt::AlignLeft, l);
+        p.drawText(text_x, text_y + offset, text_width, text_height, Qt::AlignLeft, l);
         info_copy.remove(0, l.length () + 1);
     }
 
@@ -469,6 +485,10 @@
     repaint();
 }
 
+void InfoWidget::clearInformation() {
+    addInformation("", 0);
+}
+
 void InfoWidget::paintEvent ( QPaintEvent * ) 
 {
     bitBlt(this, 0, 0, &info_pixmap); 
Index: mythplugins/mythmusic/mythmusic/metaio.cpp
===================================================================
--- mythplugins/mythmusic/mythmusic/metaio.cpp	(revision 12631)
+++ mythplugins/mythmusic/mythmusic/metaio.cpp	(working copy)
@@ -2,6 +2,8 @@
 
 #include "metaio.h"
 #include "metadata.h"
+#include <qdir.h>
+#include <qurl.h>
 #include <mythtv/mythcontext.h>
 
 //==========================================================================
@@ -104,3 +106,37 @@
 
     return retdata;
 }
+
+//==========================================================================
+/*!
+ * \brief Retrieve the albumart.
+ *
+ * The default implementation picks a random image file from the
+ * directory in which the file is.
+ *
+ * \param filename The filename to try and determin metadata for.
+ * \returns A QByteArray that can be passed to QImage or such.
+ */
+QByteArray MetaIO::getAlbumArt(const QString &filename)
+{
+    QString curdir = QUrl(filename).dirPath();
+    QString namefilter = gContext->GetSetting("AlbumArtFilter",
+                                              "*.png;*.jpg;*.jpeg;*.gif;*.bmp");
+    // Get directory contents based on filter
+    QDir folder(curdir, namefilter, QDir::Name | QDir::IgnoreCase, 
+                QDir::Files | QDir::Hidden);
+    
+    if (!folder.count())
+        return QByteArray();
+    
+    QString result = folder[rand() % folder.count()];
+    result.prepend("/");
+    result.prepend(curdir);
+    
+    QFile file(result);
+    file.open(IO_ReadOnly);
+    if (!file.isOpen())
+        return QByteArray();
+
+    return file.readAll();
+}
Index: mythplugins/mythmusic/mythmusic/visualize.h
===================================================================
--- mythplugins/mythmusic/mythmusic/visualize.h	(revision 12631)
+++ mythplugins/mythmusic/mythmusic/visualize.h	(working copy)
@@ -94,7 +94,7 @@
     bool process(VisualNode *node = 0);
     bool draw(QPainter *p, const QColor &back = Qt::black);
     bool needsUpdate();
-    QString getImageFilename();
+    QByteArray getImage();
 
   private:
     QSize size, cursize;
Index: mythplugins/mythmusic/mythmusic/metaioid3v2.cpp
===================================================================
--- mythplugins/mythmusic/mythmusic/metaioid3v2.cpp	(revision 12631)
+++ mythplugins/mythmusic/mythmusic/metaioid3v2.cpp	(working copy)
@@ -15,6 +15,13 @@
 
 #include <mythtv/mythcontext.h>
 
+id3_file *openFile(const QString &filename, id3_file_mode mode) {
+    id3_file *f = id3_file_open(filename.local8Bit(), mode);
+    if (!f)
+        f = id3_file_open(filename.ascii(), mode);
+    return f;
+}
+
 //==========================================================================
 MetaIOID3v2::MetaIOID3v2(void)
     : MetaIO(".mp3")
@@ -43,13 +50,8 @@
     if (!mdata)
         return false;
 
-    id3_file* p_input = NULL;
-    
-    p_input = id3_file_open(mdata->Filename().local8Bit(), ID3_FILE_MODE_READWRITE);
+    id3_file* p_input = openFile(mdata->Filename().local8Bit(), ID3_FILE_MODE_READWRITE);
     if (!p_input)
-        p_input = id3_file_open(mdata->Filename().ascii(), ID3_FILE_MODE_READWRITE);
-  
-    if (!p_input)
       return false;
 
     // We don't like id3v1 tags... too limiting.
@@ -178,10 +180,7 @@
     bool compilation = false;
     id3_file *p_input = NULL;
     
-    p_input = id3_file_open(filename.local8Bit(), ID3_FILE_MODE_READONLY);
-    if (!p_input)
-        p_input = id3_file_open(filename.ascii(), ID3_FILE_MODE_READONLY);
-
+    p_input = openFile(filename, ID3_FILE_MODE_READONLY);
     if (p_input)
     {
         id3_tag *tag = id3_file_tag(p_input);
@@ -596,3 +595,42 @@
 
     return true;
 }
+
+//==========================================================================
+/*!
+ * \brief Function to set an individual comment in an ID3v2 Tag
+ *
+ * \param pTag Pointer to a id3_file object
+ * \param pLabel The label of the comment you want
+ * \param value A reference to the data you want to write
+ * \param desc An optional description (frame type pLabel must support this)
+ * \returns Nothing
+ */
+QByteArray MetaIOID3v2::getAlbumArt(const QString &filename)
+{
+    id3_file *file = openFile(filename, ID3_FILE_MODE_READONLY);
+    if (!file)
+        return MetaIO::getAlbumArt(filename);
+
+    id3_tag *tag = id3_file_tag(file);
+    if (!tag) {
+        id3_file_close(file);
+        return MetaIO::getAlbumArt(filename);
+    }
+
+    struct id3_frame *p_frame = 0;
+    for (int i=0; NULL != (p_frame = id3_tag_findframe(tag, "APIC", i)); ++i) {
+        for (unsigned int f = 0; f < p_frame->nfields; ++f) {
+            id3_field *field = &(p_frame->fields[f]);
+            if (field->type == ID3_FIELD_TYPE_BINARYDATA) {
+                QByteArray data;
+                data.duplicate((char*)field->binary.data, (size_t)field->binary.length);
+                id3_file_close(file);
+                return data;
+            }
+        }
+    }
+
+    id3_file_close(file);
+    return MetaIO::getAlbumArt(filename);
+}
