Ticket #2942: albumart.patch

File albumart.patch, 13.6 KB (added by myth@…, 5 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}