aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/mpeg/mpegmetadatamodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/Input/mpeg/mpegmetadatamodel.cpp')
-rw-r--r--src/plugins/Input/mpeg/mpegmetadatamodel.cpp99
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);
}