diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/plugins/Input/ffmpeg/decoderffmpegfactory.cpp | 3 | ||||
| -rw-r--r-- | src/plugins/Input/ffmpeg/ffmpeg.pro | 4 | ||||
| -rw-r--r-- | src/plugins/Input/ffmpeg/ffmpegmetadatamodel.cpp | 199 | ||||
| -rw-r--r-- | src/plugins/Input/ffmpeg/ffmpegmetadatamodel.h | 35 | ||||
| -rw-r--r-- | src/qmmp/tagmodel.h | 2 |
5 files changed, 228 insertions, 15 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 diff --git a/src/qmmp/tagmodel.h b/src/qmmp/tagmodel.h index d88ff2f7a..270d487f9 100644 --- a/src/qmmp/tagmodel.h +++ b/src/qmmp/tagmodel.h @@ -97,7 +97,7 @@ public: ModelCaps caps() const; private: - ModelCaps m_f; + ModelCaps m_f = DefaultCaps; }; Q_DECLARE_OPERATORS_FOR_FLAGS(TagModel::ModelCaps) |
