diff options
Diffstat (limited to 'src/plugins/Input/mpeg/mpegmetadatamodel.cpp')
| -rw-r--r-- | src/plugins/Input/mpeg/mpegmetadatamodel.cpp | 99 |
1 files changed, 52 insertions, 47 deletions
diff --git a/src/plugins/Input/mpeg/mpegmetadatamodel.cpp b/src/plugins/Input/mpeg/mpegmetadatamodel.cpp index 3d4ef6dfa..bbe937e19 100644 --- a/src/plugins/Input/mpeg/mpegmetadatamodel.cpp +++ b/src/plugins/Input/mpeg/mpegmetadatamodel.cpp @@ -1,11 +1,11 @@ /*************************************************************************** - * Copyright (C) 2009-2021 by Ilya Kotov * + * Copyright(C) 2009-2021 by Ilya Kotov * * forkotov02@ya.ru * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * + * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * @@ -34,6 +34,7 @@ #include <taglib/textidentificationframe.h> #include <taglib/attachedpictureframe.h> #include <taglib/id3v2framefactory.h> +#include "tagextractor.h" #include "mpegmetadatamodel.h" MPEGMetaDataModel::MPEGMetaDataModel(bool using_rusxmms, const QString &path, bool readOnly) : @@ -59,7 +60,7 @@ QList<MetaDataItem> MPEGMetaDataModel::extraProperties() const QList<MetaDataItem> ep; TagLib::MPEG::Properties *ap = m_file->audioProperties(); - switch (ap->channelMode()) + switch(ap->channelMode()) { case TagLib::MPEG::Header::Stereo: ep << MetaDataItem(tr("Mode"), "Stereo"); @@ -145,37 +146,41 @@ void MPEGMetaDataModel::removeCover() } } -MpegFileTagModel::MpegFileTagModel(bool using_rusxmms, TagLib::MPEG::File *file, TagLib::MPEG::File::TagTypes tagType) +MpegFileTagModel::MpegFileTagModel(bool using_rusxmms, TagLib::MPEG::File *file, TagLib::MPEG::File::TagTypes type) : TagModel(), m_using_rusxmms(using_rusxmms), m_file(file), - m_tagType(tagType) + m_type(type) { QSettings settings(Qmmp::configFile(), QSettings::IniFormat); settings.beginGroup("MPEG"); - if (m_tagType == TagLib::MPEG::File::ID3v1) + if(m_type == TagLib::MPEG::File::ID3v1) { m_tag = m_file->ID3v1Tag(); - m_codec = QTextCodec::codecForName(settings.value("ID3v1_encoding", "ISO-8859-1").toByteArray ()); - if (!m_codec) - QTextCodec::codecForName ("ISO-8859-1"); + if(!(m_codec = QTextCodec::codecForName(settings.value("ID3v1_encoding", "ISO-8859-1").toByteArray()))) + m_codec = QTextCodec::codecForName("ISO-8859-1"); } - else if (m_tagType == TagLib::MPEG::File::ID3v2) + else if(m_type == TagLib::MPEG::File::ID3v2) { m_tag = m_file->ID3v2Tag(); - m_codec = QTextCodec::codecForName(settings.value("ID3v2_encoding", "UTF-8").toByteArray ()); - if (!m_codec) - QTextCodec::codecForName ("UTF-8"); + if(!(m_codec = QTextCodec::codecForName(settings.value("ID3v2_encoding", "UTF-8").toByteArray()))) + m_codec = QTextCodec::codecForName("UTF-8"); } else { m_tag = m_file->APETag(); - m_codec = QTextCodec::codecForName ("UTF-8"); + m_codec = QTextCodec::codecForName("UTF-8"); } - if(m_using_rusxmms) + if(m_using_rusxmms || !m_codec || m_codec->name().startsWith("UTF")) + m_codec = QTextCodec::codecForName("UTF-8"); + + if(!m_using_rusxmms && (m_type == TagLib::MPEG::File::ID3v1 || m_type == TagLib::MPEG::File::ID3v2) && + settings.value("detect_encoding", false).toBool()) { - m_codec = QTextCodec::codecForName ("UTF-8"); + QTextCodec *detectedCodec = TagExtractor::detectCharset(m_tag); + m_codec = detectedCodec ? detectedCodec : m_codec; } + settings.endGroup(); } @@ -184,9 +189,9 @@ MpegFileTagModel::~MpegFileTagModel() QString MpegFileTagModel::name() const { - if (m_tagType == TagLib::MPEG::File::ID3v1) + if(m_type == TagLib::MPEG::File::ID3v1) return "ID3v1"; - else if (m_tagType == TagLib::MPEG::File::ID3v2) + else if(m_type == TagLib::MPEG::File::ID3v2) return "ID3v2"; return "APE"; } @@ -194,9 +199,9 @@ QString MpegFileTagModel::name() const QList<Qmmp::MetaData> MpegFileTagModel::keys() const { QList<Qmmp::MetaData> list = TagModel::keys(); - if (m_tagType == TagLib::MPEG::File::ID3v2) + if(m_type == TagLib::MPEG::File::ID3v2) return list; - else if(m_tagType == TagLib::MPEG::File::APE) + else if(m_type == TagLib::MPEG::File::APE) { list.removeAll(Qmmp::DISCNUMBER); return list; @@ -211,11 +216,11 @@ QString MpegFileTagModel::value(Qmmp::MetaData key) const { QTextCodec *codec = m_codec; - if (m_tag) + if(m_tag) { bool utf = codec->name().contains("UTF"); - if (utf) - codec = QTextCodec::codecForName ("UTF-8"); + if(utf) + codec = QTextCodec::codecForName("UTF-8"); TagLib::String str; switch((int) key) @@ -227,12 +232,12 @@ QString MpegFileTagModel::value(Qmmp::MetaData key) const str = m_tag->artist(); break; case Qmmp::ALBUMARTIST: - if(m_tagType == TagLib::MPEG::File::ID3v2 && + if(m_type == TagLib::MPEG::File::ID3v2 && !m_file->ID3v2Tag()->frameListMap()["TPE2"].isEmpty()) { str = m_file->ID3v2Tag()->frameListMap()["TPE2"].front()->toString(); } - else if(m_tagType == TagLib::MPEG::File::APE && + else if(m_type == TagLib::MPEG::File::APE && !m_file->APETag()->itemListMap()["ALBUM ARTIST"].isEmpty()) { str = m_file->APETag()->itemListMap()["ALBUM ARTIST"].toString(); @@ -248,12 +253,12 @@ QString MpegFileTagModel::value(Qmmp::MetaData key) const str = m_tag->genre(); break; case Qmmp::COMPOSER: - if(m_tagType == TagLib::MPEG::File::ID3v2 && + if(m_type == TagLib::MPEG::File::ID3v2 && !m_file->ID3v2Tag()->frameListMap()["TCOM"].isEmpty()) { str = m_file->ID3v2Tag()->frameListMap()["TCOM"].front()->toString(); } - else if(m_tagType == TagLib::MPEG::File::APE && + else if(m_type == TagLib::MPEG::File::APE && !m_file->APETag()->itemListMap()["COMPOSER"].isEmpty()) { str = m_file->APETag()->itemListMap()["COMPOSER"].toString(); @@ -264,7 +269,7 @@ QString MpegFileTagModel::value(Qmmp::MetaData key) const case Qmmp::TRACK: return QString::number(m_tag->track()); case Qmmp::DISCNUMBER: - if(m_tagType == TagLib::MPEG::File::ID3v2 + if(m_type == TagLib::MPEG::File::ID3v2 && !m_file->ID3v2Tag()->frameListMap()["TPOS"].isEmpty()) str = m_file->ID3v2Tag()->frameListMap()["TPOS"].front()->toString(); } @@ -279,7 +284,7 @@ void MpegFileTagModel::setValue(Qmmp::MetaData key, const QString &value) return; TagLib::String::Type type = TagLib::String::Latin1; - if (m_tagType == TagLib::MPEG::File::ID3v1) + if(m_type == TagLib::MPEG::File::ID3v1) { if(m_codec->name().contains("UTF") && !m_using_rusxmms) //utf is unsupported return; @@ -287,16 +292,16 @@ void MpegFileTagModel::setValue(Qmmp::MetaData key, const QString &value) if(m_using_rusxmms) type = TagLib::String::UTF8; } - else if (m_tagType == TagLib::MPEG::File::ID3v2) + else if(m_type == TagLib::MPEG::File::ID3v2) { - if (m_codec->name().contains("UTF")) + if(m_codec->name().contains("UTF")) { type = TagLib::String::UTF8; - if (m_codec->name().contains("UTF-16")) + if(m_codec->name().contains("UTF-16")) type = TagLib::String::UTF16; - else if (m_codec->name().contains("UTF-16LE")) + else if(m_codec->name().contains("UTF-16LE")) type = TagLib::String::UTF16LE; - else if (m_codec->name().contains("UTF-16BE")) + else if(m_codec->name().contains("UTF-16BE")) type = TagLib::String::UTF16BE; @@ -315,12 +320,12 @@ void MpegFileTagModel::setValue(Qmmp::MetaData key, const QString &value) TagLib::ByteVector id3v2_key; if(key == Qmmp::ALBUMARTIST) id3v2_key = "TPE2"; //album artist - else if (key == Qmmp::COMPOSER) + else if(key == Qmmp::COMPOSER) id3v2_key = "TCOM"; //composer - else if (key == Qmmp::DISCNUMBER) + else if(key == Qmmp::DISCNUMBER) id3v2_key = "TPOS"; //disc number - if (!id3v2_key.isEmpty()) + if(!id3v2_key.isEmpty()) { TagLib::String composer = TagLib::String(m_codec->fromUnicode(value).constData(), type); TagLib::ID3v2::Tag *id3v2_tag = dynamic_cast<TagLib::ID3v2::Tag *>(m_tag); @@ -338,14 +343,14 @@ void MpegFileTagModel::setValue(Qmmp::MetaData key, const QString &value) return; } } - else if(m_tagType == TagLib::MPEG::File::APE) + else if(m_type == TagLib::MPEG::File::APE) { type = TagLib::String::UTF8; } TagLib::String str = TagLib::String(m_codec->fromUnicode(value).constData(), type); - if(m_tagType == TagLib::MPEG::File::APE) + if(m_type == TagLib::MPEG::File::APE) { if(key == Qmmp::COMPOSER) { @@ -386,18 +391,18 @@ void MpegFileTagModel::setValue(Qmmp::MetaData key, const QString &value) bool MpegFileTagModel::exists() const { - return (m_tag != nullptr); + return(m_tag != nullptr); } void MpegFileTagModel::create() { - if (m_tag) + if(m_tag) return; - if (m_tagType == TagLib::MPEG::File::ID3v1) + if(m_type == TagLib::MPEG::File::ID3v1) m_tag = m_file->ID3v1Tag(true); - else if (m_tagType == TagLib::MPEG::File::ID3v2) + else if(m_type == TagLib::MPEG::File::ID3v2) m_tag = m_file->ID3v2Tag(true); - else if (m_tagType == TagLib::MPEG::File::APE) + else if(m_type == TagLib::MPEG::File::APE) m_tag = m_file->APETag(true); } @@ -409,11 +414,11 @@ void MpegFileTagModel::remove() void MpegFileTagModel::save() { if(m_tag) -#if ((TAGLIB_MAJOR_VERSION == 1) && (TAGLIB_MINOR_VERSION <= 11)) +#if((TAGLIB_MAJOR_VERSION == 1) &&(TAGLIB_MINOR_VERSION <= 11)) m_file->save(m_tagType, false); #else - m_file->save(m_tagType, TagLib::File::StripNone, TagLib::ID3v2::Version::v4, TagLib::File::DoNotDuplicate); + m_file->save(m_type, TagLib::File::StripNone, TagLib::ID3v2::Version::v4, TagLib::File::DoNotDuplicate); #endif else - m_file->strip(m_tagType); + m_file->strip(m_type); } |
