diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2021-02-11 17:14:44 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2021-02-11 17:14:44 +0000 |
| commit | fe35d45c894c646c239fe8fd2a03478d3cfb442b (patch) | |
| tree | 0995b059a8e7bf4f1f31c1c0b596988e2df83c52 /src/plugins/Input/ffmpeg/ffmpegmetadatamodel.cpp | |
| parent | 707762b07352f5fa6cf8221ae15e1c5bd738a3d9 (diff) | |
| download | qmmp-fe35d45c894c646c239fe8fd2a03478d3cfb442b.tar.gz qmmp-fe35d45c894c646c239fe8fd2a03478d3cfb442b.tar.bz2 qmmp-fe35d45c894c646c239fe8fd2a03478d3cfb442b.zip | |
ffmpeg: added ape/cue editor
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9724 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input/ffmpeg/ffmpegmetadatamodel.cpp')
| -rw-r--r-- | src/plugins/Input/ffmpeg/ffmpegmetadatamodel.cpp | 199 |
1 files changed, 190 insertions, 9 deletions
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(); +} |
