aboutsummaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/Input/ffmpeg/decoderffmpegfactory.cpp3
-rw-r--r--src/plugins/Input/ffmpeg/ffmpeg.pro4
-rw-r--r--src/plugins/Input/ffmpeg/ffmpegmetadatamodel.cpp199
-rw-r--r--src/plugins/Input/ffmpeg/ffmpegmetadatamodel.h35
4 files changed, 227 insertions, 14 deletions
diff --git a/src/plugins/Input/ffmpeg/decoderffmpegfactory.cpp b/src/plugins/Input/ffmpeg/decoderffmpegfactory.cpp
index bab1b9980..fa617f0ab 100644
--- a/src/plugins/Input/ffmpeg/decoderffmpegfactory.cpp
+++ b/src/plugins/Input/ffmpeg/decoderffmpegfactory.cpp
@@ -323,8 +323,7 @@ QList<TrackInfo *> DecoderFFmpegFactory::createPlayList(const QString &path, Tra
MetaDataModel* DecoderFFmpegFactory::createMetaDataModel(const QString &path, bool readOnly)
{
- Q_UNUSED(readOnly);
- return new FFmpegMetaDataModel(path);
+ return new FFmpegMetaDataModel(path, readOnly);
}
void DecoderFFmpegFactory::showSettings(QWidget *parent)
diff --git a/src/plugins/Input/ffmpeg/ffmpeg.pro b/src/plugins/Input/ffmpeg/ffmpeg.pro
index f656b23f9..38e871c23 100644
--- a/src/plugins/Input/ffmpeg/ffmpeg.pro
+++ b/src/plugins/Input/ffmpeg/ffmpeg.pro
@@ -27,9 +27,9 @@ DEFINES += __STDC_CONSTANT_MACROS
unix {
target.path = $$PLUGIN_DIR/Input
INSTALLS += target
- PKGCONFIG += libavcodec libavformat libavutil
+ PKGCONFIG += libavcodec libavformat libavutil taglib
}
win32 {
- LIBS += -lavcodec.dll -lavformat.dll -lavutil.dll
+ LIBS += -lavcodec.dll -lavformat.dll -lavutil.dll -ltag.dll
}
diff --git a/src/plugins/Input/ffmpeg/ffmpegmetadatamodel.cpp b/src/plugins/Input/ffmpeg/ffmpegmetadatamodel.cpp
index 724c69d33..94827ad03 100644
--- a/src/plugins/Input/ffmpeg/ffmpegmetadatamodel.cpp
+++ b/src/plugins/Input/ffmpeg/ffmpegmetadatamodel.cpp
@@ -19,33 +19,36 @@
***************************************************************************/
#include <QRegularExpression>
+#include <QtDebug>
extern "C" {
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
}
+#include <taglib/apefile.h>
#include <stdint.h>
+#include <qmmp/metadatamanager.h>
#include "ffmpegmetadatamodel.h"
-FFmpegMetaDataModel::FFmpegMetaDataModel(const QString &path) : MetaDataModel(true)
+FFmpegMetaDataModel::FFmpegMetaDataModel(const QString &path, bool readOnly) : MetaDataModel(readOnly)
{
AVFormatContext *in = nullptr;
- QString filePath = path;
+ m_path = path;
if(path.startsWith("ffmpeg://"))
{
- filePath.remove("ffmpeg://");
- filePath.remove(QRegularExpression("#\\d+$"));
+ m_path.remove("ffmpeg://");
+ m_path.remove(QRegularExpression("#\\d+$"));
}
else if(path.startsWith("m4b://"))
{
- filePath.remove("m4b://");
- filePath.remove(QRegularExpression("#\\d+$"));
+ m_path.remove("m4b://");
+ m_path.remove(QRegularExpression("#\\d+$"));
}
#ifdef Q_OS_WIN
- if (avformat_open_input(&in, filePath.toUtf8().constData(), nullptr, nullptr) < 0)
+ if (avformat_open_input(&in, m_path.toUtf8().constData(), nullptr, nullptr) < 0)
#else
- if (avformat_open_input(&in, filePath.toLocal8Bit().constData(), nullptr, nullptr) < 0)
+ if (avformat_open_input(&in, m_path.toLocal8Bit().constData(), nullptr, nullptr) < 0)
#endif
return;
@@ -72,12 +75,190 @@ FFmpegMetaDataModel::FFmpegMetaDataModel(const QString &path) : MetaDataModel(tr
avformat_close_input(&in);
}
+
+ if(!readOnly && m_path.endsWith(".ape", Qt::CaseInsensitive))
+ {
+ m_stream = new TagLib::FileStream(QStringToFileName(m_path), readOnly);
+ m_file = new TagLib::APE::File(m_stream);
+ m_tag = m_file->APETag();
+ m_tags << new ApeTagModel(m_file);
+ setReadOnly(m_file->readOnly());
+ setDialogHints(MetaDataModel::IsCueEditable);
+ }
+ else
+ {
+ setReadOnly(true);
+ }
}
FFmpegMetaDataModel::~FFmpegMetaDataModel()
-{}
+{
+ qDeleteAll(m_tags);
+ m_tags.clear();
+ delete m_file;
+ delete m_stream;
+}
+
+QList<TagModel *> FFmpegMetaDataModel::tags() const
+{
+ return m_tags;
+}
QPixmap FFmpegMetaDataModel::cover() const
{
return m_pixmap;
}
+
+QString FFmpegMetaDataModel::coverPath() const
+{
+ return MetaDataManager::instance()->findCoverFile(m_path);
+}
+
+QString FFmpegMetaDataModel::cue() const
+{
+ if(m_tag && m_tag->itemListMap().contains("CUESHEET"))
+ return TStringToQString(m_tag->itemListMap()["CUESHEET"].toString());
+
+ return QString();
+}
+
+void FFmpegMetaDataModel::setCue(const QString &content)
+{
+ if(!m_tag)
+ m_tag = m_file->APETag(true);
+
+ m_tag->addValue("CUESHEET", QStringToTString(content));
+ m_file->save();
+ m_tag = m_file->APETag();
+}
+
+void FFmpegMetaDataModel::removeCue()
+{
+ if(m_tag)
+ {
+ m_tag->removeItem("CUESHEET");
+ m_file->save();
+ m_tag = m_file->APETag();
+ }
+}
+
+ApeTagModel::ApeTagModel(TagLib::APE::File *file) : m_file(file)
+{}
+
+ApeTagModel::~ApeTagModel()
+{}
+
+QString ApeTagModel::name() const
+{
+ return QLatin1String("APE");
+}
+
+QList<Qmmp::MetaData> ApeTagModel::keys() const
+{
+ QList<Qmmp::MetaData> list = TagModel::keys();
+ list.removeAll(Qmmp::DISCNUMBER);
+ return list;
+}
+
+QString ApeTagModel::value(Qmmp::MetaData key) const
+{
+ TagLib::APE::Tag *tag = m_file->APETag(false);
+ if(!tag)
+ return QString();
+
+ switch(key)
+ {
+ case Qmmp::TITLE:
+ return TStringToQString(tag->title());
+ case Qmmp::ARTIST:
+ return TStringToQString(tag->artist());
+ case Qmmp::ALBUMARTIST:
+ if(!tag->itemListMap()["ALBUM ARTIST"].isEmpty())
+ return TStringToQString(tag->itemListMap()["ALBUM ARTIST"].toString());
+ break;
+ case Qmmp::ALBUM:
+ return TStringToQString(tag->album());
+ case Qmmp::COMMENT:
+ return TStringToQString(tag->comment());
+ case Qmmp::GENRE:
+ return TStringToQString(tag->genre());
+ case Qmmp::COMPOSER:
+ if(!tag->itemListMap()["COMPOSER"].isEmpty())
+ return TStringToQString(tag->itemListMap()["COMPOSER"].toString());
+ break;
+ case Qmmp::YEAR:
+ return QString::number(tag->year());
+ case Qmmp::TRACK:
+ return QString::number(tag->track());
+ default:
+ return QString();
+ }
+
+ return QString();
+}
+
+void ApeTagModel::setValue(Qmmp::MetaData key, const QString &value)
+{
+ TagLib::APE::Tag *tag = m_file->APETag(false);
+ if(!tag)
+ return;
+
+ TagLib::String str = QStringToTString(value);
+
+ switch(key)
+ {
+ case Qmmp::TITLE:
+ tag->setTitle(str);
+ break;
+ case Qmmp::ARTIST:
+ tag->setArtist(str);
+ break;
+ case Qmmp::ALBUMARTIST:
+ tag->addValue("ALBUM ARTIST", str, true);
+ return;
+ case Qmmp::ALBUM:
+ tag->setAlbum(str);
+ break;
+ case Qmmp::COMMENT:
+ tag->setComment(str);
+ break;
+ case Qmmp::COMPOSER:
+ tag->addValue("COMPOSER", str, true);
+ return;
+ case Qmmp::GENRE:
+ tag->setGenre(str);
+ break;
+ case Qmmp::YEAR:
+ tag->setYear(value.toInt());
+ break;
+ case Qmmp::TRACK:
+ tag->setTrack(value.toInt());
+ default:
+ ;
+ }
+}
+
+bool ApeTagModel::exists() const
+{
+ return m_file->hasAPETag();
+}
+
+void ApeTagModel::create()
+{
+ m_file->APETag(true);
+ m_strip = false;
+}
+
+void ApeTagModel::remove()
+{
+ m_strip = true;
+}
+
+void ApeTagModel::save()
+{
+ if(m_strip)
+ m_file->strip();
+
+ m_strip = false;
+ m_file->save();
+}
diff --git a/src/plugins/Input/ffmpeg/ffmpegmetadatamodel.h b/src/plugins/Input/ffmpeg/ffmpegmetadatamodel.h
index 518960401..b198655ed 100644
--- a/src/plugins/Input/ffmpeg/ffmpegmetadatamodel.h
+++ b/src/plugins/Input/ffmpeg/ffmpegmetadatamodel.h
@@ -21,17 +21,50 @@
#ifndef FFMPEGMETADATAMODEL_H
#define FFMPEGMETADATAMODEL_H
+#include <taglib/apefile.h>
+#include <taglib/apetag.h>
+#include <taglib/tfilestream.h>
#include <qmmp/metadatamodel.h>
class FFmpegMetaDataModel : public MetaDataModel
{
public:
- explicit FFmpegMetaDataModel(const QString &path);
+ explicit FFmpegMetaDataModel(const QString &path, bool readOnly);
~FFmpegMetaDataModel();
+ QList<TagModel *> tags() const override;
QPixmap cover() const override;
+ QString coverPath() const override;
+ QString cue() const;
+ void setCue(const QString &content);
+ void removeCue();
private:
QPixmap m_pixmap;
+ QList<TagModel* > m_tags;
+ TagLib::APE::Tag *m_tag;
+ TagLib::APE::File *m_file = nullptr;
+ TagLib::FileStream *m_stream = nullptr;
+ QString m_path;
+};
+
+class ApeTagModel : public TagModel
+{
+public:
+ ApeTagModel(TagLib::APE::File *file);
+ ~ApeTagModel();
+ QString name() const override;
+ QList<Qmmp::MetaData> keys() const override;
+ QString value(Qmmp::MetaData key) const override;
+ void setValue(Qmmp::MetaData key, const QString &value) override;
+ bool exists() const override;
+ void create() override;
+ void remove() override;
+ void save() override;
+
+private:
+ TagLib::APE::File *m_file;
+ bool m_strip = false;
+
};
#endif // FFMPEGMETADATAMODEL_H