Use embedded image in id3v2tag as fallback
This commit is contained in:
parent
c42f0f3a00
commit
b884ac69bf
@ -10,9 +10,16 @@
|
|||||||
|
|
||||||
#include <KLocalizedString>
|
#include <KLocalizedString>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <QMimeDatabase>
|
||||||
#include <QNetworkReply>
|
#include <QNetworkReply>
|
||||||
#include <QSqlQuery>
|
#include <QSqlQuery>
|
||||||
|
|
||||||
|
#include <attachedpictureframe.h>
|
||||||
|
#include <id3v2frame.h>
|
||||||
|
#include <id3v2tag.h>
|
||||||
|
#include <mpegfile.h>
|
||||||
|
|
||||||
#include "audiomanager.h"
|
#include "audiomanager.h"
|
||||||
#include "database.h"
|
#include "database.h"
|
||||||
#include "datamanager.h"
|
#include "datamanager.h"
|
||||||
@ -237,6 +244,50 @@ Enclosure::Status Enclosure::status() const
|
|||||||
return m_status;
|
return m_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString Enclosure::cachedEmbeddedImage() const
|
||||||
|
{
|
||||||
|
// if image is already cached, then return the path
|
||||||
|
QString cachedpath = StorageManager::instance().imagePath(path());
|
||||||
|
if (QFileInfo::exists(cachedpath)) {
|
||||||
|
if (QFileInfo(cachedpath).size() != 0) {
|
||||||
|
return QUrl::fromLocalFile(cachedpath).toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_status != Downloaded || path().isEmpty()) {
|
||||||
|
return QStringLiteral("");
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto mime = QMimeDatabase().mimeTypeForFile(path()).name();
|
||||||
|
if (mime != QStringLiteral("audio/mpeg")) {
|
||||||
|
return QStringLiteral("");
|
||||||
|
}
|
||||||
|
|
||||||
|
TagLib::MPEG::File f(path().toLatin1().data());
|
||||||
|
if (!f.hasID3v2Tag()) {
|
||||||
|
return QStringLiteral("");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool imageFound = false;
|
||||||
|
for (const auto &frame : f.ID3v2Tag()->frameListMap()["APIC"]) {
|
||||||
|
auto pictureFrame = dynamic_cast<TagLib::ID3v2::AttachedPictureFrame *>(frame);
|
||||||
|
QByteArray data(pictureFrame->picture().data(), pictureFrame->picture().size());
|
||||||
|
if (!data.isEmpty()) {
|
||||||
|
QFile file(cachedpath);
|
||||||
|
file.open(QIODevice::WriteOnly);
|
||||||
|
file.write(data);
|
||||||
|
file.close();
|
||||||
|
imageFound = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (imageFound) {
|
||||||
|
return cachedpath;
|
||||||
|
} else {
|
||||||
|
return QUrl::fromLocalFile(cachedpath).toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
qint64 Enclosure::playPosition() const
|
qint64 Enclosure::playPosition() const
|
||||||
{
|
{
|
||||||
return m_playposition;
|
return m_playposition;
|
||||||
|
@ -31,6 +31,7 @@ class Enclosure : public QObject
|
|||||||
Q_PROPERTY(double downloadProgress MEMBER m_downloadProgress NOTIFY downloadProgressChanged)
|
Q_PROPERTY(double downloadProgress MEMBER m_downloadProgress NOTIFY downloadProgressChanged)
|
||||||
Q_PROPERTY(QString formattedDownloadSize READ formattedDownloadSize NOTIFY downloadProgressChanged)
|
Q_PROPERTY(QString formattedDownloadSize READ formattedDownloadSize NOTIFY downloadProgressChanged)
|
||||||
Q_PROPERTY(QString path READ path CONSTANT)
|
Q_PROPERTY(QString path READ path CONSTANT)
|
||||||
|
Q_PROPERTY(QString cachedEmbeddedImage READ cachedEmbeddedImage CONSTANT)
|
||||||
Q_PROPERTY(qint64 playPosition READ playPosition WRITE setPlayPosition NOTIFY playPositionChanged)
|
Q_PROPERTY(qint64 playPosition READ playPosition WRITE setPlayPosition NOTIFY playPositionChanged)
|
||||||
Q_PROPERTY(QString formattedLeftDuration READ formattedLeftDuration NOTIFY playPositionChanged)
|
Q_PROPERTY(QString formattedLeftDuration READ formattedLeftDuration NOTIFY playPositionChanged)
|
||||||
Q_PROPERTY(QString formattedPlayPosition READ formattedPlayPosition NOTIFY playPositionChanged)
|
Q_PROPERTY(QString formattedPlayPosition READ formattedPlayPosition NOTIFY playPositionChanged)
|
||||||
@ -58,6 +59,7 @@ public:
|
|||||||
QString path() const;
|
QString path() const;
|
||||||
QString url() const;
|
QString url() const;
|
||||||
Status status() const;
|
Status status() const;
|
||||||
|
QString cachedEmbeddedImage() const;
|
||||||
qint64 playPosition() const;
|
qint64 playPosition() const;
|
||||||
qint64 duration() const;
|
qint64 duration() const;
|
||||||
qint64 size() const;
|
qint64 size() const;
|
||||||
|
@ -249,17 +249,27 @@ QString Entry::image() const
|
|||||||
{
|
{
|
||||||
if (!m_image.isEmpty()) {
|
if (!m_image.isEmpty()) {
|
||||||
return m_image;
|
return m_image;
|
||||||
|
} else if (m_hasenclosure && !m_enclosure->cachedEmbeddedImage().isEmpty()) {
|
||||||
|
// use embedded image if available
|
||||||
|
return m_enclosure->cachedEmbeddedImage();
|
||||||
} else {
|
} else {
|
||||||
|
// else fall back to feed image
|
||||||
return m_feed->image();
|
return m_feed->image();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Entry::cachedImage() const
|
QString Entry::cachedImage() const
|
||||||
{
|
{
|
||||||
// First check for the feed image as fallback
|
// First check for the feed image, fall back if needed
|
||||||
QString image = m_image;
|
QString image = m_image;
|
||||||
if (image.isEmpty()) {
|
if (image.isEmpty()) {
|
||||||
image = m_feed->image();
|
if (m_hasenclosure && !m_enclosure->cachedEmbeddedImage().isEmpty()) {
|
||||||
|
// use embedded image if available
|
||||||
|
return m_enclosure->cachedEmbeddedImage();
|
||||||
|
} else {
|
||||||
|
// else fall back to feed image
|
||||||
|
image = m_feed->image();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Fetcher::instance().image(image);
|
return Fetcher::instance().image(image);
|
||||||
|
@ -390,7 +390,7 @@ QVariantMap MediaPlayer2Player::getMetadataOfCurrentTrack()
|
|||||||
result[QStringLiteral("xesam:artist")] = authors;
|
result[QStringLiteral("xesam:artist")] = authors;
|
||||||
}
|
}
|
||||||
if (!entry->image().isEmpty()) {
|
if (!entry->image().isEmpty()) {
|
||||||
result[QStringLiteral("mpris:artUrl")] = StorageManager::instance().imagePath(entry->image());
|
result[QStringLiteral("mpris:artUrl")] = entry->cachedImage();
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user