diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2021-03-24 19:40:46 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2021-03-24 19:40:46 +0000 |
| commit | facbc1dfb0a9ba82f59a4034b0c7cfcc32a4cf5e (patch) | |
| tree | b745239421522f52f64586750900ef42a1518169 /src/plugins | |
| parent | 3feda2eb202d0591f759817086bbee6517397d23 (diff) | |
| download | qmmp-facbc1dfb0a9ba82f59a4034b0c7cfcc32a4cf5e.tar.gz qmmp-facbc1dfb0a9ba82f59a4034b0c7cfcc32a4cf5e.tar.bz2 qmmp-facbc1dfb0a9ba82f59a4034b0c7cfcc32a4cf5e.zip | |
mpeg: added librcd support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9775 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins')
| -rw-r--r-- | src/plugins/Input/mpeg/decodermpegfactory.cpp | 15 | ||||
| -rw-r--r-- | src/plugins/Input/mpeg/mpeg.pro | 5 | ||||
| -rw-r--r-- | src/plugins/Input/mpeg/mpegmetadatamodel.cpp | 99 | ||||
| -rw-r--r-- | src/plugins/Input/mpeg/mpegmetadatamodel.h | 2 | ||||
| -rw-r--r-- | src/plugins/Input/mpeg/settingsdialog.cpp | 9 | ||||
| -rw-r--r-- | src/plugins/Input/mpeg/settingsdialog.ui | 41 | ||||
| -rw-r--r-- | src/plugins/Input/mpeg/tagextractor.cpp | 134 | ||||
| -rw-r--r-- | src/plugins/Input/mpeg/tagextractor.h | 11 |
8 files changed, 191 insertions, 125 deletions
diff --git a/src/plugins/Input/mpeg/decodermpegfactory.cpp b/src/plugins/Input/mpeg/decodermpegfactory.cpp index 3021b6e4f..5cde2dce4 100644 --- a/src/plugins/Input/mpeg/decodermpegfactory.cpp +++ b/src/plugins/Input/mpeg/decodermpegfactory.cpp @@ -36,6 +36,7 @@ #include <taglib/id3v2header.h> #include <taglib/textidentificationframe.h> #include <taglib/id3v2framefactory.h> +#include "tagextractor.h" #include "mpegmetadatamodel.h" #include "settingsdialog.h" #ifdef WITH_MAD @@ -46,7 +47,6 @@ #endif #include "decodermpegfactory.h" - #define CSTR_TO_QSTR(str,utf) codec->toUnicode(str.toCString(utf)).trimmed() // DecoderMPEGFactory @@ -56,12 +56,13 @@ DecoderMPEGFactory::DecoderMPEGFactory() //detecting rusxmms patch m_using_rusxmms = false; char str[] = { char(0xF2), char(0xE5), char(0xF1), char(0xF2), '\0'}; - QTextCodec *codec = QTextCodec::codecForName ("windows-1251"); + QTextCodec *codec = QTextCodec::codecForName("windows-1251"); TagLib::String tstr(str); if(codec->toUnicode(str) == QString::fromUtf8(tstr.toCString(true))) { qDebug("DecoderMADFactory: found taglib with rusxmms patch"); m_using_rusxmms = true; + TagExtractor::setForceUtf8(m_using_rusxmms); } } @@ -245,7 +246,7 @@ QList<TrackInfo *> DecoderMPEGFactory::createPlayList(const QString &path, Track tag = fileRef.ID3v1Tag(); break; case SettingsDialog::ID3v2: - codecName = settings.value("ID3v2_encoding","UTF-8").toByteArray (); + codecName = settings.value("ID3v2_encoding","UTF-8").toByteArray(); tag = fileRef.ID3v2Tag(); break; case SettingsDialog::APE: @@ -266,7 +267,15 @@ QList<TrackInfo *> DecoderMPEGFactory::createPlayList(const QString &path, Track if (tag && codec && !tag->isEmpty()) { + if((tag == fileRef.ID3v1Tag() || tag == fileRef.ID3v2Tag()) && !m_using_rusxmms && + settings.value("detect_encoding", false).toBool()) + { + QTextCodec *detectedCodec = TagExtractor::detectCharset(tag); + codec = detectedCodec ? detectedCodec : codec; + } + bool utf = codec->name().contains("UTF"); + QMap<Qmmp::MetaData, QString> tags = { { Qmmp::ARTIST, CSTR_TO_QSTR(tag->artist(), utf) }, { Qmmp::ALBUM, CSTR_TO_QSTR(tag->album(), utf) }, diff --git a/src/plugins/Input/mpeg/mpeg.pro b/src/plugins/Input/mpeg/mpeg.pro index 8583016ca..645c0c0fe 100644 --- a/src/plugins/Input/mpeg/mpeg.pro +++ b/src/plugins/Input/mpeg/mpeg.pro @@ -24,6 +24,11 @@ contains(CONFIG, WITH_MPG123){ DEFINES += WITH_MPG123 } +contains(CONFIG, WITH_LIBRCD){ + LIBS += -lrcd + DEFINES += WITH_LIBRCD +} + FORMS += settingsdialog.ui RESOURCES = translations/translations.qrc 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); } diff --git a/src/plugins/Input/mpeg/mpegmetadatamodel.h b/src/plugins/Input/mpeg/mpegmetadatamodel.h index e50831a8f..946ffe01a 100644 --- a/src/plugins/Input/mpeg/mpegmetadatamodel.h +++ b/src/plugins/Input/mpeg/mpegmetadatamodel.h @@ -64,7 +64,7 @@ private: QTextCodec *m_codec; TagLib::MPEG::File *m_file; TagLib::Tag *m_tag; - TagLib::MPEG::File::TagTypes m_tagType; + TagLib::MPEG::File::TagTypes m_type; }; #endif // MPEGMETADATAMODEL_H diff --git a/src/plugins/Input/mpeg/settingsdialog.cpp b/src/plugins/Input/mpeg/settingsdialog.cpp index c05cf96ac..61ac0d5c6 100644 --- a/src/plugins/Input/mpeg/settingsdialog.cpp +++ b/src/plugins/Input/mpeg/settingsdialog.cpp @@ -51,17 +51,16 @@ SettingsDialog::SettingsDialog(bool using_rusxmms, QWidget *parent) m_ui.decoderGroupBox->setEnabled(false); #endif - int pos = m_ui.id3v1EncComboBox->findText - (settings.value("ID3v1_encoding","ISO-8859-1").toString()); + int pos = m_ui.id3v1EncComboBox->findText(settings.value("ID3v1_encoding","ISO-8859-1").toString()); m_ui.id3v1EncComboBox->setCurrentIndex(pos); - pos = m_ui.id3v2EncComboBox->findText - (settings.value("ID3v2_encoding","UTF-8").toString()); + pos = m_ui.id3v2EncComboBox->findText(settings.value("ID3v2_encoding","UTF-8").toString()); m_ui.id3v2EncComboBox->setCurrentIndex(pos); m_ui.firstTagComboBox->setCurrentIndex(settings.value("tag_1", ID3v2).toInt()); m_ui.secondTagComboBox->setCurrentIndex(settings.value("tag_2", APE).toInt()); m_ui.thirdTagComboBox->setCurrentIndex(settings.value("tag_3", ID3v1).toInt()); m_ui.mergeTagsCheckBox->setChecked(settings.value("merge_tags", false).toBool()); + m_ui.detectEncodingCheckBox->setChecked(settings.value("detect_encoding", false).toBool()); settings.endGroup(); @@ -69,10 +68,10 @@ SettingsDialog::SettingsDialog(bool using_rusxmms, QWidget *parent) { m_ui.id3v1EncComboBox->setEnabled(false); m_ui.id3v2EncComboBox->setEnabled(false); + m_ui.detectEncodingCheckBox->setEnabled(false); } } - SettingsDialog::~SettingsDialog() {} diff --git a/src/plugins/Input/mpeg/settingsdialog.ui b/src/plugins/Input/mpeg/settingsdialog.ui index d2a6653f7..f121653ef 100644 --- a/src/plugins/Input/mpeg/settingsdialog.ui +++ b/src/plugins/Input/mpeg/settingsdialog.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>362</width> - <height>420</height> + <height>449</height> </rect> </property> <property name="windowTitle"> @@ -272,22 +272,6 @@ <string>Encodings</string> </property> <layout class="QGridLayout" name="gridLayout_3"> - <item row="0" column="0"> - <widget class="QLabel" name="label_17_2_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>ID3v1 encoding:</string> - </property> - <property name="alignment"> - <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> - </property> - </widget> - </item> <item row="0" column="1"> <widget class="QComboBox" name="id3v1EncComboBox"> <property name="sizePolicy"> @@ -337,6 +321,29 @@ </property> </spacer> </item> + <item row="0" column="0"> + <widget class="QLabel" name="label_17_2_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>ID3v1 encoding:</string> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="2" column="0" colspan="3"> + <widget class="QCheckBox" name="detectEncodingCheckBox"> + <property name="text"> + <string>Try to detect encoding</string> + </property> + </widget> + </item> </layout> </widget> </item> diff --git a/src/plugins/Input/mpeg/tagextractor.cpp b/src/plugins/Input/mpeg/tagextractor.cpp index 15dabd7ef..22669eb8f 100644 --- a/src/plugins/Input/mpeg/tagextractor.cpp +++ b/src/plugins/Input/mpeg/tagextractor.cpp @@ -25,76 +25,116 @@ #include <QTextCodec> #include <QSettings> #include <QDir> +#include <QSet> #include <stdlib.h> - +#ifdef WITH_LIBRCD +#include <librcd.h> +#endif #include "tagextractor.h" -TagExtractor::TagExtractor(QIODevice *d) : m_d(d) +#define CSTR_TO_QSTR(str,utf) codec->toUnicode(str.toCString(utf)).trimmed() + +bool TagExtractor::m_using_rusxmms = false; + +TagExtractor::TagExtractor(QIODevice *d) : m_input(d) {} TagExtractor::~TagExtractor() -{ -} +{} -const QMap<Qmmp::MetaData, QString> TagExtractor::id3v2tag() +QMap<Qmmp::MetaData, QString> TagExtractor::id3v2tag() const { - QByteArray array = m_d->peek(2048); + QByteArray array = m_input->peek(2048); int offset = array.indexOf("ID3"); if (offset < 0) - return m_tag; - ID3v2Tag taglib_tag(&array, offset); - if (taglib_tag.isEmpty()) - return m_tag; + return QMap<Qmmp::MetaData, QString>(); - TagLib::String album = taglib_tag.album(); - TagLib::String artist = taglib_tag.artist(); - TagLib::String comment = taglib_tag.comment(); - TagLib::String genre = taglib_tag.genre(); - TagLib::String title = taglib_tag.title(); + ID3v2Tag tag(&array, offset); + if (tag.isEmpty()) + return QMap<Qmmp::MetaData, QString>(); QSettings settings(Qmmp::configFile(), QSettings::IniFormat); settings.beginGroup("MPEG"); - QByteArray name = settings.value("ID3v2_encoding","UTF-8").toByteArray (); - bool utf = false; + QByteArray codecName = settings.value("ID3v2_encoding","UTF-8").toByteArray (); QTextCodec *codec = nullptr; - if (name.contains("UTF")) + + if(m_using_rusxmms || codecName.contains("UTF")) + codec = QTextCodec::codecForName("UTF-8"); + else if(!codecName.isEmpty()) + codec = QTextCodec::codecForName(codecName); + + if (!codec) + codec = QTextCodec::codecForName("UTF-8"); + +#ifdef WITH_LIBRCD + if(!m_using_rusxmms && settings.value("detect_encoding", false).toBool()) { - codec = QTextCodec::codecForName ("UTF-8"); - utf = true; + QTextCodec *detectedCodec = detectCharset(&tag); + codec = detectedCodec ? detectedCodec : codec; } - else - codec = QTextCodec::codecForName(name); +#endif settings.endGroup(); - if (!codec) - codec = QTextCodec::codecForName ("UTF-8"); - - m_tag.insert(Qmmp::ALBUM, - codec->toUnicode(album.toCString(utf)).trimmed()); - m_tag.insert(Qmmp::ARTIST, - codec->toUnicode(artist.toCString(utf)).trimmed()); - m_tag.insert(Qmmp::COMMENT, - codec->toUnicode(comment.toCString(utf)).trimmed()); - m_tag.insert(Qmmp::GENRE, - codec->toUnicode(genre.toCString(utf)).trimmed()); - m_tag.insert(Qmmp::TITLE, - codec->toUnicode(title.toCString(utf)).trimmed()); - m_tag.insert(Qmmp::YEAR, - QString::number(taglib_tag.year())); - m_tag.insert(Qmmp::TRACK, - QString::number(taglib_tag.track())); - - if(!taglib_tag.frameListMap()["TCOM"].isEmpty()) + bool utf = codec->name().contains("UTF"); + + QMap<Qmmp::MetaData, QString> tags = { + { Qmmp::ARTIST, CSTR_TO_QSTR(tag.artist(), utf) }, + { Qmmp::ALBUM, CSTR_TO_QSTR(tag.album(), utf) }, + { Qmmp::COMMENT, CSTR_TO_QSTR(tag.comment(), utf) }, + { Qmmp::GENRE, CSTR_TO_QSTR(tag.genre(), utf) }, + { Qmmp::TITLE, CSTR_TO_QSTR(tag.title(), utf) }, + { Qmmp::YEAR, QString::number(tag.year()) }, + { Qmmp::TRACK, QString::number(tag.track()) }, + }; + + if(!tag.frameListMap()["TCOM"].isEmpty()) { - TagLib::String composer = taglib_tag.frameListMap()["TCOM"].front()->toString(); - m_tag.insert(Qmmp::COMPOSER, codec->toUnicode(composer.toCString(utf)).trimmed()); + TagLib::String composer = tag.frameListMap()["TCOM"].front()->toString(); + tags.insert(Qmmp::COMPOSER, codec->toUnicode(composer.toCString(utf)).trimmed()); } - if(!taglib_tag.frameListMap()["TPOS"].isEmpty()) + if(!tag.frameListMap()["TPOS"].isEmpty()) { - TagLib::String disc = taglib_tag.frameListMap()["TPOS"].front()->toString(); - m_tag.insert(Qmmp::DISCNUMBER, QString(disc.toCString()).trimmed()); + TagLib::String disc = tag.frameListMap()["TPOS"].front()->toString(); + tags.insert(Qmmp::DISCNUMBER, QString(disc.toCString()).trimmed()); + } + return tags; +} + +void TagExtractor::setForceUtf8(bool enabled) +{ + m_using_rusxmms = enabled; +} + +QTextCodec *TagExtractor::detectCharset(const TagLib::Tag *tag) +{ + if(tag->title().isLatin1() && tag->album().isLatin1() && + tag->artist().isLatin1() && tag->comment().isLatin1()) + { +#ifdef WITH_LIBRCD + QTextCodec *codec = nullptr; + QSet<int> charsets; + charsets << rcdGetRussianCharset(tag->title().toCString(), 0); + charsets << rcdGetRussianCharset(tag->artist().toCString(), 0); + charsets << rcdGetRussianCharset(tag->album().toCString(), 0); + charsets << rcdGetRussianCharset(tag->comment().toCString(), 0); + + if(charsets.contains(RUSSIAN_CHARSET_WIN)) + codec = QTextCodec::codecForName("WINDOWS-1251"); + else if(charsets.contains(RUSSIAN_CHARSET_ALT)) + codec = QTextCodec::codecForName("IBM866"); + else if(charsets.contains(RUSSIAN_CHARSET_KOI)) + codec = QTextCodec::codecForName("KOI8-R"); + else if(charsets.contains(RUSSIAN_CHARSET_UTF8)) + codec = QTextCodec::codecForName("UTF-8"); + else if(charsets.contains(RUSSIAN_CHARSET_LATIN)) + codec = QTextCodec::codecForName("ISO-8859-1"); + + return codec; +#else + return nullptr; +#endif } - return m_tag; + return QTextCodec::codecForName("UTF-8"); } ID3v2Tag::ID3v2Tag(QByteArray *array, long offset) : TagLib::ID3v2::Tag(), diff --git a/src/plugins/Input/mpeg/tagextractor.h b/src/plugins/Input/mpeg/tagextractor.h index 691b9e859..3f7bfb85e 100644 --- a/src/plugins/Input/mpeg/tagextractor.h +++ b/src/plugins/Input/mpeg/tagextractor.h @@ -21,13 +21,12 @@ #define TAGEXTRACTOR_H #include <QMap> - +#include <QTextCodec> #include <taglib/tag.h> #include <taglib/fileref.h> #include <taglib/id3v1tag.h> #include <taglib/id3v2tag.h> #include <taglib/id3v2header.h> - #include <qmmp/qmmp.h> class QIODevice; @@ -44,12 +43,14 @@ public: ~TagExtractor(); - const QMap<Qmmp::MetaData, QString> id3v2tag(); + QMap<Qmmp::MetaData, QString> id3v2tag() const; + static void setForceUtf8(bool enabled); + static QTextCodec *detectCharset(const TagLib::Tag *tag); private: QMap<Qmmp::MetaData, QString> m_tag; - QIODevice *m_d; - + QIODevice *m_input; + static bool m_using_rusxmms; }; class ID3v2Tag : public TagLib::ID3v2::Tag |
