/*! * \brief Read the albumart image from the file * * \param filename The filename for which we want to find the length. * \param type The type of image we want - front/back etc * \returns A pointer to a QImage owned by the caller or NULL if not found. */ QImage* MetaIOID3::getAlbumArt(QString filename, ImageType type) { QImage *picture = new QImage(); AttachedPictureFrame::Type apicType = AttachedPictureFrame::FrontCover; switch (type) { case IT_UNKNOWN : apicType = AttachedPictureFrame::Other; break; case IT_FRONTCOVER : apicType = AttachedPictureFrame::FrontCover; break; case IT_BACKCOVER : apicType = AttachedPictureFrame::BackCover; break; case IT_CD : apicType = AttachedPictureFrame::Media; break; case IT_INLAY : apicType = AttachedPictureFrame::LeafletPage; break; default: return picture; } QByteArray fname = filename.toLocal8Bit(); TagLib::MPEG::File *mpegfile = new TagLib::MPEG::File(fname.constData()); if (mpegfile) { if (mpegfile->isOpen() && !mpegfile->ID3v2Tag()->frameListMap()["APIC"].isEmpty()) { TagLib::ID3v2::FrameList apicframes = mpegfile->ID3v2Tag()->frameListMap()["APIC"]; for(TagLib::ID3v2::FrameList::Iterator it = apicframes.begin(); it != apicframes.end(); ++it) { AttachedPictureFrame *frame = static_cast<AttachedPictureFrame *>(*it); if (frame && frame->type() == apicType) { picture->loadFromData((const uchar *)frame->picture().data(), frame->picture().size()); return picture; } } } delete mpegfile; } delete picture; return NULL; }
/*! * \brief Read the albumart image from the file * * \param filename The filename for which we want to find the albumart. * \param type The type of image we want - front/back etc * \returns A pointer to a QImage owned by the caller or nullptr if not found. */ QImage* MetaIOID3::getAlbumArt(const QString &filename, ImageType type) { QImage *picture = new QImage(); AttachedPictureFrame::Type apicType = AttachedPictureFrame::FrontCover; switch (type) { case IT_UNKNOWN : apicType = AttachedPictureFrame::Other; break; case IT_FRONTCOVER : apicType = AttachedPictureFrame::FrontCover; break; case IT_BACKCOVER : apicType = AttachedPictureFrame::BackCover; break; case IT_CD : apicType = AttachedPictureFrame::Media; break; case IT_INLAY : apicType = AttachedPictureFrame::LeafletPage; break; case IT_ARTIST : apicType = AttachedPictureFrame::Artist; break; default: return picture; } if (OpenFile(filename)) { TagLib::ID3v2::Tag *tag = GetID3v2Tag(); if (tag && !tag->frameListMap()["APIC"].isEmpty()) { TagLib::ID3v2::FrameList apicframes = tag->frameListMap()["APIC"]; for(TagLib::ID3v2::FrameList::Iterator it = apicframes.begin(); it != apicframes.end(); ++it) { AttachedPictureFrame *frame = static_cast<AttachedPictureFrame *>(*it); if (frame && frame->type() == apicType) { picture->loadFromData((const uchar *)frame->picture().data(), frame->picture().size()); return picture; } } } } delete picture; return nullptr; }
/*! * \brief Find an APIC tag by type and optionally description * * \param tag Pointer to TagLib::ID3v2::Tag object * \param type Type of picture to search for * \param description Description of picture to search for (optional) * \returns Pointer to frame */ AttachedPictureFrame* MetaIOID3::findAPIC(TagLib::ID3v2::Tag *tag, const AttachedPictureFrame::Type &type, const String &description) { TagLib::ID3v2::FrameList l = tag->frameList("APIC"); for(TagLib::ID3v2::FrameList::Iterator it = l.begin(); it != l.end(); ++it) { AttachedPictureFrame *f = static_cast<AttachedPictureFrame *>(*it); if (f && f->type() == type && (description.isNull() || f->description() == description)) return f; } return nullptr; }
/*! * \brief Read the albumart images from the file * * \param tag The ID3v2 tag object in which to look for Album Art * \returns A QList containing a list of AlbumArtImage's * with the type and description of the APIC tag. */ AlbumArtList MetaIOID3::readAlbumArt(TagLib::ID3v2::Tag *tag) { AlbumArtList artlist; if (!tag->frameListMap()["APIC"].isEmpty()) { TagLib::ID3v2::FrameList apicframes = tag->frameListMap()["APIC"]; for(TagLib::ID3v2::FrameList::Iterator it = apicframes.begin(); it != apicframes.end(); ++it) { AttachedPictureFrame *frame = static_cast<AttachedPictureFrame *>(*it); // Assume a valid image would have at least // 100 bytes of data (1x1 indexed gif is 35 bytes) if (frame->picture().size() < 100) { LOG(VB_GENERAL, LOG_NOTICE, "Music Scanner - Discarding APIC frame " "with size less than 100 bytes"); continue; } AlbumArtImage *art = new AlbumArtImage(); if (frame->description().isEmpty()) art->m_description.clear(); else art->m_description = TStringToQString(frame->description()); art->m_embedded = true; art->m_hostname = gCoreContext->GetHostName(); QString ext = getExtFromMimeType( TStringToQString(frame->mimeType()).toLower()); switch (frame->type()) { case AttachedPictureFrame::FrontCover : art->m_imageType = IT_FRONTCOVER; art->m_filename = QString("front") + ext; break; case AttachedPictureFrame::BackCover : art->m_imageType = IT_BACKCOVER; art->m_filename = QString("back") + ext; break; case AttachedPictureFrame::Media : art->m_imageType = IT_CD; art->m_filename = QString("cd") + ext; break; case AttachedPictureFrame::LeafletPage : art->m_imageType = IT_INLAY; art->m_filename = QString("inlay") + ext; break; case AttachedPictureFrame::Artist : art->m_imageType = IT_ARTIST; art->m_filename = QString("artist") + ext; break; case AttachedPictureFrame::Other : art->m_imageType = IT_UNKNOWN; art->m_filename = QString("unknown") + ext; break; default: LOG(VB_GENERAL, LOG_ERR, "Music Scanner - APIC tag found " "with unsupported type"); delete art; continue; } artlist.append(art); } } return artlist; }