From facbc1dfb0a9ba82f59a4034b0c7cfcc32a4cf5e Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Wed, 24 Mar 2021 19:40:46 +0000 Subject: mpeg: added librcd support git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9775 90c681e8-e032-0410-971d-27865f9a5e38 --- qmmp.pri | 3 +- src/plugins/Input/mpeg/decodermpegfactory.cpp | 15 ++- src/plugins/Input/mpeg/mpeg.pro | 5 + src/plugins/Input/mpeg/mpegmetadatamodel.cpp | 99 ++++++++++--------- src/plugins/Input/mpeg/mpegmetadatamodel.h | 2 +- src/plugins/Input/mpeg/settingsdialog.cpp | 9 +- src/plugins/Input/mpeg/settingsdialog.ui | 41 ++++---- src/plugins/Input/mpeg/tagextractor.cpp | 134 +++++++++++++++++--------- src/plugins/Input/mpeg/tagextractor.h | 11 ++- 9 files changed, 193 insertions(+), 126 deletions(-) diff --git a/qmmp.pri b/qmmp.pri index c2e264d6c..9fecb5dc0 100644 --- a/qmmp.pri +++ b/qmmp.pri @@ -91,7 +91,8 @@ CONFIG += SLEEPINHIBITOR_PLUGIN #additional features CONFIG += WITH_MPG123 -CONFIG += WITH_MAD +CONFIG += WITH_MAD] +CONFIG += WITH_LIBRCD CONFIG += WITH_ENCA CONFIG += WITH_SKINNED CONFIG += WITH_QSUI 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 #include #include +#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 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 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 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 #include #include +#include "tagextractor.h" #include "mpegmetadatamodel.h" MPEGMetaDataModel::MPEGMetaDataModel(bool using_rusxmms, const QString &path, bool readOnly) : @@ -59,7 +60,7 @@ QList MPEGMetaDataModel::extraProperties() const QList 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 MpegFileTagModel::keys() const { QList 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(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 @@ 0 0 362 - 420 + 449 @@ -272,22 +272,6 @@ Encodings - - - - - 0 - 0 - - - - ID3v1 encoding: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - @@ -337,6 +321,29 @@ + + + + + 0 + 0 + + + + ID3v1 encoding: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + Try to detect encoding + + + 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 #include #include +#include #include - +#ifdef WITH_LIBRCD +#include +#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 TagExtractor::id3v2tag() +QMap 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(); - 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(); 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 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 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 - +#include #include #include #include #include #include - #include class QIODevice; @@ -44,12 +43,14 @@ public: ~TagExtractor(); - const QMap id3v2tag(); + QMap id3v2tag() const; + static void setForceUtf8(bool enabled); + static QTextCodec *detectCharset(const TagLib::Tag *tag); private: QMap m_tag; - QIODevice *m_d; - + QIODevice *m_input; + static bool m_using_rusxmms; }; class ID3v2Tag : public TagLib::ID3v2::Tag -- cgit v1.2.3-13-gbd6f