From 7e33524b7532e0392611a824614f6df370ac7a01 Mon Sep 17 00:00:00 2001 From: Marcos CARDINOT Date: Fri, 30 May 2014 14:30:29 +0100 Subject: Improvements in cover art search (TIO::parseCoverArt) - add method to parse cover arts into sound file (extracting embedded covers) This change is useful to handle existing users --- src/library/coverart.cpp | 60 +++++++++++++++++++++++++++++++++++------------- src/library/coverart.h | 9 ++++---- src/trackinfoobject.cpp | 33 +++++++++++++++----------- src/trackinfoobject.h | 6 ++++- 4 files changed, 73 insertions(+), 35 deletions(-) (limited to 'src') diff --git a/src/library/coverart.cpp b/src/library/coverart.cpp index 7eea3c68c6..1d2de1ebd7 100644 --- a/src/library/coverart.cpp +++ b/src/library/coverart.cpp @@ -38,6 +38,22 @@ bool CoverArt::saveFile(QImage cover, QString location) { return false; } +QString CoverArt::saveEmbeddedCover(QImage cover, QString artist, + QString album, QString filename) { + if (cover.isNull()) { + return ""; + } + + QString coverName = getDefaultCoverName(artist, album, filename); + QString location = getDefaultCoverLocation(coverName); + + if (saveFile(cover, location)) { + return location; + } + + return ""; +} + QString CoverArt::searchInDiskCache(QString coverArtName) { // Some image extensions QStringList extList; @@ -81,10 +97,6 @@ QString CoverArt::searchInTrackDirectory(QString directory) { return QString(); } -QString CoverArt::getDefaultCoverLocation(QString coverArtName) { - return getStoragePath() + coverArtName + "." + m_cDefaultImageFormat; -} - QString CoverArt::getDefaultCoverName(QString artist, QString album, QString filename) { @@ -95,34 +107,50 @@ QString CoverArt::getDefaultCoverName(QString artist, } } -QString CoverArt::searchCoverArtFile(TrackInfoObject* pTrack) { - // creates default cover art name +QString CoverArt::getDefaultCoverLocation(QString coverArtName) { + return getStoragePath() + coverArtName + "." + m_cDefaultImageFormat; +} + +QString CoverArt::getDefaultCoverLocation(TrackPointer pTrack) { + QString coverArtName = getDefaultCoverName(pTrack->getArtist(), + pTrack->getAlbum(), + pTrack->getFilename()); + + return getDefaultCoverLocation(coverArtName); +} + +QString CoverArt::searchCoverArtFile(TrackPointer pTrack) { + QString coverArtName = getDefaultCoverName(pTrack->getArtist(), pTrack->getAlbum(), pTrack->getFilename()); // // Step 1: Look for cover art in disk-cache directory. - // (all embedded covers will already be there) // - QString coverArtLocation = searchInDiskCache(coverArtName); + QString coverLocation = searchInDiskCache(coverArtName); + if (!coverLocation.isEmpty()) { + return coverLocation; // FOUND! + } - if (!coverArtLocation.isEmpty()) { - return coverArtLocation; // FOUND! + // + // Step 2: Look for embedded cover art. + // + coverLocation = pTrack->parseCoverArt(); + if (!coverLocation.isEmpty()) { + return coverLocation; // FOUND! } // - // Step 2: Look for cover stored in track diretory. + // Step 3: Look for cover stored in track diretory. // QImage image(searchInTrackDirectory(pTrack->getDirectory())); - // load default location - coverArtLocation = getDefaultCoverLocation(coverArtName); - if (!image.isNull()) { // try to store the image in our disk-cache! - if (saveFile(image, coverArtLocation)) { - return coverArtLocation; // FOUND! + coverLocation = getDefaultCoverLocation(coverArtName); + if (saveFile(image, coverLocation)) { + return coverLocation; // FOUND! } } diff --git a/src/library/coverart.h b/src/library/coverart.h index 2c2380d737..4fbce99d0b 100644 --- a/src/library/coverart.h +++ b/src/library/coverart.h @@ -13,13 +13,14 @@ class CoverArt : public QObject, public Singleton { QString getStoragePath() const; QString getDefaultCoverLocation(QString coverArtName); - QString getDefaultCoverName(QString artist, - QString album, - QString filename); + QString getDefaultCoverLocation(TrackPointer pTrack); + QString getDefaultCoverName(QString artist, QString album, QString filename); bool deleteFile(const QString& location); bool saveFile(QImage cover, QString location); - QString searchCoverArtFile(TrackInfoObject* pTrack); + QString saveEmbeddedCover(QImage cover, QString artist, + QString album, QString filename); + QString searchCoverArtFile(TrackPointer pTrack); protected: CoverArt(); diff --git a/src/trackinfoobject.cpp b/src/trackinfoobject.cpp index 9bdfea1a97..074b4d6edd 100644 --- a/src/trackinfoobject.cpp +++ b/src/trackinfoobject.cpp @@ -202,21 +202,10 @@ void TrackInfoObject::parse() { setKeyText(pProxiedSoundSource->getKey(), mixxx::track::io::key::FILE_METADATA); - // store cover art in disk-cache QImage image = pProxiedSoundSource->getCoverArt(); - if (!image.isNull()) { - CoverArt* pCoverArt = CoverArt::instance(); - - QString coverName = pCoverArt->getDefaultCoverName( - m_sArtist, - m_sAlbum, - m_fileInfo.fileName() - ); - - QString coverLocation = pCoverArt->getDefaultCoverLocation(coverName); - - CoverArt::instance()->saveFile(image, coverLocation); - } + QString coverLocation = CoverArt::instance()->saveEmbeddedCover( + image, getArtist(), getAlbum(), getFilename()); + setCoverArtLocation(coverLocation); setHeaderParsed(true); } else { @@ -229,6 +218,22 @@ void TrackInfoObject::parse() { } } +QString TrackInfoObject::parseCoverArt() { + const QString& canonicalLocation = m_fileInfo.canonicalFilePath(); + SoundSourceProxy proxy(canonicalLocation, m_pSecurityToken); + + Mixxx::SoundSource* pProxiedSoundSource = proxy.getProxiedSoundSource(); + if (pProxiedSoundSource != NULL && proxy.parseHeader() == OK) { + + QImage image = pProxiedSoundSource->getCoverArt(); + QString coverLocation = CoverArt::instance()->saveEmbeddedCover( + image, getArtist(), getAlbum(), getFilename()); + setCoverArtLocation(coverLocation); + return coverLocation; + } + return QString(); +} + void TrackInfoObject::parseArtist() { QMutexLocker lock(&m_qMutex); QString filename = m_fileInfo.fileName(); diff --git a/src/trackinfoobject.h b/src/trackinfoobject.h index 025696438b..9d1f30ee9d 100644 --- a/src/trackinfoobject.h +++ b/src/trackinfoobject.h @@ -62,6 +62,10 @@ class TrackInfoObject : public QObject { // artist and title information from the filename. void parse(); + // this method will parse the information stored in the sound file + // just to extract the embedded cover art + QString parseCoverArt(); + // Returns the duration in seconds int getDuration() const; // Set duration in seconds @@ -148,7 +152,7 @@ class TrackInfoObject : public QObject { QString getInfo() const; // Set Cover Art Location void setCoverArtLocation(const QString &location); - // Get Cover Art + // Get Cover Art Location QString getCoverArtLocation() const; QDateTime getDateAdded() const; -- cgit v1.2.3