aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/mpeg
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2021-03-24 19:40:46 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2021-03-24 19:40:46 +0000
commitfacbc1dfb0a9ba82f59a4034b0c7cfcc32a4cf5e (patch)
treeb745239421522f52f64586750900ef42a1518169 /src/plugins/Input/mpeg
parent3feda2eb202d0591f759817086bbee6517397d23 (diff)
downloadqmmp-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/Input/mpeg')
-rw-r--r--src/plugins/Input/mpeg/decodermpegfactory.cpp15
-rw-r--r--src/plugins/Input/mpeg/mpeg.pro5
-rw-r--r--src/plugins/Input/mpeg/mpegmetadatamodel.cpp99
-rw-r--r--src/plugins/Input/mpeg/mpegmetadatamodel.h2
-rw-r--r--src/plugins/Input/mpeg/settingsdialog.cpp9
-rw-r--r--src/plugins/Input/mpeg/settingsdialog.ui41
-rw-r--r--src/plugins/Input/mpeg/tagextractor.cpp134
-rw-r--r--src/plugins/Input/mpeg/tagextractor.h11
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