Ticket #2942: albumart.patch

File albumart.patch, 13.6 KB (added by myth@…, 13 years ago)

the patch

  • mythplugins/mythmusic/mythmusic/playbackbox.cpp

     
    2323#include "decoder.h"
    2424#include "playbackbox.h"
    2525#include "databasebox.h"
     26#include "metaio.h"
    2627#include "mainvisual.h"
    2728#include "smartplaylist.h"
    2829#include "search.h"
     
    11571158        return;
    11581159   
    11591160    banner_timer->start(8000);
    1160     mainvisual->addInformation("\"" + mdata->Title() + "\"\n" +
     1161    MetaIO *tagger = decoder->doCreateTagger();
     1162    QByteArray img_array(tagger->getAlbumArt(curMeta->Filename()));
     1163    QImage image(img_array);
     1164    mainvisual->addInformation(image, "\"" + mdata->Title() + "\"\n" +
    11611165                               mdata->Artist() + " - " + mdata->Album());
    11621166}
    11631167
     
    11721176void PlaybackBoxMusic::bannerDisable()
    11731177{
    11741178    banner_timer->stop();
    1175     mainvisual->addInformation("");
     1179    mainvisual->clearInformation();
    11761180}
    11771181
    11781182void PlaybackBoxMusic::CycleVisualizer()
  • mythplugins/mythmusic/mythmusic/visualize.cpp

     
    1111
    1212#include <cmath>
    1313#include "mainvisual.h"
     14#include "metaio.h"
    1415#include "visualize.h"
    1516#include "inlines.h"
    1617#include "decoder.h"
     
    1819#include <qpainter.h>
    1920#include <qpixmap.h>
    2021#include <qimage.h>
    21 #include <qdir.h>
    2222#include <qurl.h>
    2323
    2424#include <iostream>
     
    327327        return true;
    328328
    329329    if (filename != pParent->decoder()->getFilename()) {
    330         QString curdir = QUrl(pParent->decoder()->getFilename()).dirPath();
    331         if (directory != curdir)
    332             return true;
     330        return true;
    333331    }
    334332
    335333    return false;
    336334}
    337335
    338 QString AlbumArt::getImageFilename()
     336QByteArray AlbumArt::getImage()
    339337{
    340     QString result;
    341     QString curfile = pParent->decoder()->getFilename();
    342     QString curdir = QUrl(curfile).dirPath();
    343     QString namefilter = gContext->GetSetting("AlbumArtFilter",
    344                                               "*.png;*.jpg;*.jpeg;*.gif;*.bmp");
    345     // Get directory contents based on filter
    346     QDir folder(curdir, namefilter, QDir::Name | QDir::IgnoreCase,
    347                 QDir::Files | QDir::Hidden);
    348    
    349     if (folder.count())
    350         result = folder[rand() % folder.count()];
    351 
    352     result.prepend("/");
    353     result.prepend(curdir);
    354    
     338    QByteArray result;
     339    MetaIO *tagger = pParent->decoder()->doCreateTagger();
     340    if (tagger) {
     341        result = tagger->getAlbumArt(pParent->decoder()->getFilename());
     342        delete tagger;
     343    }
    355344    return result;
    356345}
    357346
     
    363352    // If the directory has changed (new album) or the size, reload
    364353    if (needsUpdate())
    365354    {
    366         QImage art(getImageFilename());
     355        QImage art(getImage());
    367356        if (art.isNull())
    368         {
    369             drawWarning(p, back, size, QObject::tr("?"));
    370             cursize = size;
    371             return true;
    372         }
    373         image = art.smoothScale(size, QImage::ScaleMin);
     357            image.reset();
     358        else
     359            image = art.smoothScale(size, QImage::ScaleMin);
     360
     361        // Store the new filename
     362        filename = pParent->decoder()->getFilename();
    374363    }
    375364
    376365    // Paint the image
    377366    p->fillRect(0, 0, size.width(), size.height(), back);
    378     p->drawPixmap((size.width() - image.width()) / 2,
    379                   (size.height() - image.height()) / 2,
    380                   image);
     367    if (image.isNull())
     368        drawWarning(p, back, size, QObject::tr("?"));
     369    else
     370        p->drawPixmap((size.width() - image.width()) / 2,
     371                      (size.height() - image.height()) / 2,
     372                      image);
    381373   
    382374    // Store our new size
    383375    cursize = size;
  • mythplugins/mythmusic/mythmusic/mainvisual.h

     
    9797    void setFrameRate( int newfps );
    9898    int frameRate() const { return fps; }
    9999
     100    void addInformation(const QImage &img, const QString &);
    100101    void addInformation(const QString &);
     102        void clearInformation();
    101103
    102104    static void registerVisFactory(VisFactory *);
    103105    static VisualBase *createVis(const QString &name,
     
    128130
    129131public:
    130132    InfoWidget(QWidget *parent = 0);
    131     void addInformation(const QString &);
     133    void addInformation(const QString &, const QImage *img = 0);
     134        void clearInformation();
    132135    void paintEvent(QPaintEvent *);
    133136
    134137private:
  • mythplugins/mythmusic/mythmusic/metaio.h

     
    1616   
    1717    virtual bool write(Metadata* mdata, bool exclusive = false) = 0;
    1818    virtual Metadata* read(QString filename) = 0;
     19        virtual QByteArray getAlbumArt(const QString &filename);
    1920
    2021    void readFromFilename(QString filename, QString &artist, QString &album,
    2122                          QString &title, QString &genre, int &tracknum);
  • mythplugins/mythmusic/mythmusic/metaioid3v2.h

     
    2020   
    2121    bool write(Metadata* mdata, bool exclusive = false);
    2222    Metadata* read(QString filename);
     23        QByteArray getAlbumArt(const QString &filename);
    2324   
    2425private:
    2526    int getTrackLength(QString filename);
  • mythplugins/mythmusic/mythmusic/mainvisual.cpp

     
    373373    visfactories->append(vis);
    374374}
    375375
     376void MainVisual::addInformation(const QImage &img, const QString &new_info) {
     377    info_widget->addInformation(new_info, &img);
     378}
     379
    376380void MainVisual::addInformation(const QString &new_info) {
    377381    info_widget->addInformation(new_info);
    378382}
    379383
     384void MainVisual::clearInformation() {
     385    info_widget->clearInformation();
     386}
     387
    380388VisualBase *MainVisual::createVis(const QString &name, MainVisual *parent,
    381389                                  long int winid)
    382390{
     
    426434    hide();
    427435}
    428436
    429 void InfoWidget::addInformation(const QString &new_info) {
     437void InfoWidget::addInformation(const QString &new_info, const QImage *img) {
    430438    if (new_info == info)
    431439        return;
    432440   
     
    440448    info_pixmap = QPixmap(width(), height()/*, pixmap.depth ()*/);
    441449    QPainter p(&info_pixmap);
    442450
    443     int indent = int(info_pixmap.width() * 0.02);
     451    int text_indent = int(info_pixmap.width() * 0.02);
     452    int img_indent = int(info_pixmap.width() * 0.01);
    444453
    445454    p.fillRect(0, 0,
    446455               info_pixmap.width(), info_pixmap.height(),
     
    450459    p.setFont(gContext->GetMediumFont());
    451460
    452461    QFontMetrics fm(p.font());
    453     int width = fm.width(info);
    454     int height = fm.height() * (info.contains("\n") + 1);
    455     int x = indent;
    456     int y = indent;
     462    int text_width = fm.width(info);
     463    int text_height = fm.height() * (info.contains("\n") + 1);
     464    int text_x = text_indent;
     465    int text_y = text_indent;
    457466
     467    if (img && !img->isNull()) {
     468        text_x += info_pixmap.height();
     469        int img_height = info_pixmap.height() - 2 * img_indent;
     470        QRect rect(img_indent, img_indent, img_height, img_height);
     471        p.drawImage(rect, img->smoothScale (rect.size(), QImage::ScaleMin));
     472    }
     473
    458474    QString info_copy = info;
    459     for (int offset = 0; offset < height; offset += fm.height()) {
     475    for (int offset = 0; offset < text_height; offset += fm.height()) {
    460476        QString l = info_copy.left(info_copy.find("\n"));
    461477        p.setPen(Qt::black);
    462         p.drawText(x + 2, y + offset + 2, width, height, Qt::AlignLeft, l);
     478        p.drawText(text_x + 2, text_y + offset + 2, text_width, text_height, Qt::AlignLeft, l);
    463479        p.setPen(Qt::white);
    464         p.drawText(x, y + offset, width, height, Qt::AlignLeft, l);
     480        p.drawText(text_x, text_y + offset, text_width, text_height, Qt::AlignLeft, l);
    465481        info_copy.remove(0, l.length () + 1);
    466482    }
    467483
     
    469485    repaint();
    470486}
    471487
     488void InfoWidget::clearInformation() {
     489    addInformation("", 0);
     490}
     491
    472492void InfoWidget::paintEvent ( QPaintEvent * )
    473493{
    474494    bitBlt(this, 0, 0, &info_pixmap);
  • mythplugins/mythmusic/mythmusic/metaio.cpp

     
    22
    33#include "metaio.h"
    44#include "metadata.h"
     5#include <qdir.h>
     6#include <qurl.h>
    57#include <mythtv/mythcontext.h>
    68
    79//==========================================================================
     
    104106
    105107    return retdata;
    106108}
     109
     110//==========================================================================
     111/*!
     112 * \brief Retrieve the albumart.
     113 *
     114 * The default implementation picks a random image file from the
     115 * directory in which the file is.
     116 *
     117 * \param filename The filename to try and determin metadata for.
     118 * \returns A QByteArray that can be passed to QImage or such.
     119 */
     120QByteArray MetaIO::getAlbumArt(const QString &filename)
     121{
     122    QString curdir = QUrl(filename).dirPath();
     123    QString namefilter = gContext->GetSetting("AlbumArtFilter",
     124                                              "*.png;*.jpg;*.jpeg;*.gif;*.bmp");
     125    // Get directory contents based on filter
     126    QDir folder(curdir, namefilter, QDir::Name | QDir::IgnoreCase,
     127                QDir::Files | QDir::Hidden);
     128   
     129    if (!folder.count())
     130        return QByteArray();
     131   
     132    QString result = folder[rand() % folder.count()];
     133    result.prepend("/");
     134    result.prepend(curdir);
     135   
     136    QFile file(result);
     137    file.open(IO_ReadOnly);
     138    if (!file.isOpen())
     139        return QByteArray();
     140
     141    return file.readAll();
     142}
  • mythplugins/mythmusic/mythmusic/visualize.h

     
    9494    bool process(VisualNode *node = 0);
    9595    bool draw(QPainter *p, const QColor &back = Qt::black);
    9696    bool needsUpdate();
    97     QString getImageFilename();
     97    QByteArray getImage();
    9898
    9999  private:
    100100    QSize size, cursize;
  • mythplugins/mythmusic/mythmusic/metaioid3v2.cpp

     
    1515
    1616#include <mythtv/mythcontext.h>
    1717
     18id3_file *openFile(const QString &filename, id3_file_mode mode) {
     19    id3_file *f = id3_file_open(filename.local8Bit(), mode);
     20    if (!f)
     21        f = id3_file_open(filename.ascii(), mode);
     22    return f;
     23}
     24
    1825//==========================================================================
    1926MetaIOID3v2::MetaIOID3v2(void)
    2027    : MetaIO(".mp3")
     
    4350    if (!mdata)
    4451        return false;
    4552
    46     id3_file* p_input = NULL;
    47    
    48     p_input = id3_file_open(mdata->Filename().local8Bit(), ID3_FILE_MODE_READWRITE);
     53    id3_file* p_input = openFile(mdata->Filename().local8Bit(), ID3_FILE_MODE_READWRITE);
    4954    if (!p_input)
    50         p_input = id3_file_open(mdata->Filename().ascii(), ID3_FILE_MODE_READWRITE);
    51  
    52     if (!p_input)
    5355      return false;
    5456
    5557    // We don't like id3v1 tags... too limiting.
     
    178180    bool compilation = false;
    179181    id3_file *p_input = NULL;
    180182   
    181     p_input = id3_file_open(filename.local8Bit(), ID3_FILE_MODE_READONLY);
    182     if (!p_input)
    183         p_input = id3_file_open(filename.ascii(), ID3_FILE_MODE_READONLY);
    184 
     183    p_input = openFile(filename, ID3_FILE_MODE_READONLY);
    185184    if (p_input)
    186185    {
    187186        id3_tag *tag = id3_file_tag(p_input);
     
    596595
    597596    return true;
    598597}
     598
     599//==========================================================================
     600/*!
     601 * \brief Function to set an individual comment in an ID3v2 Tag
     602 *
     603 * \param pTag Pointer to a id3_file object
     604 * \param pLabel The label of the comment you want
     605 * \param value A reference to the data you want to write
     606 * \param desc An optional description (frame type pLabel must support this)
     607 * \returns Nothing
     608 */
     609QByteArray MetaIOID3v2::getAlbumArt(const QString &filename)
     610{
     611    id3_file *file = openFile(filename, ID3_FILE_MODE_READONLY);
     612    if (!file)
     613        return MetaIO::getAlbumArt(filename);
     614
     615    id3_tag *tag = id3_file_tag(file);
     616    if (!tag) {
     617        id3_file_close(file);
     618        return MetaIO::getAlbumArt(filename);
     619    }
     620
     621    struct id3_frame *p_frame = 0;
     622    for (int i=0; NULL != (p_frame = id3_tag_findframe(tag, "APIC", i)); ++i) {
     623        for (unsigned int f = 0; f < p_frame->nfields; ++f) {
     624            id3_field *field = &(p_frame->fields[f]);
     625            if (field->type == ID3_FIELD_TYPE_BINARYDATA) {
     626                QByteArray data;
     627                data.duplicate((char*)field->binary.data, (size_t)field->binary.length);
     628                id3_file_close(file);
     629                return data;
     630            }
     631        }
     632    }
     633
     634    id3_file_close(file);
     635    return MetaIO::getAlbumArt(filename);
     636}