aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2019-04-27 16:50:58 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2019-04-27 16:50:58 +0000
commit1a72354c0765d2ac473ce052ca507963ce0b007c (patch)
treef98baf14b8b7ab02b078d0721a8861e7a1e925e4 /src
parent6131c57fbb181c31cfd4dff25034dec7f70f340f (diff)
downloadqmmp-1a72354c0765d2ac473ce052ca507963ce0b007c.tar.gz
qmmp-1a72354c0765d2ac473ce052ca507963ce0b007c.tar.bz2
qmmp-1a72354c0765d2ac473ce052ca507963ce0b007c.zip
ignore invalid cue files
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@8797 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
-rw-r--r--src/plugins/Input/cue/cuefile.cpp22
-rw-r--r--src/plugins/Input/cue/decodercuefactory.cpp8
-rw-r--r--src/qmmp/cueparser.cpp52
-rw-r--r--src/qmmp/cueparser.h5
4 files changed, 52 insertions, 35 deletions
diff --git a/src/plugins/Input/cue/cuefile.cpp b/src/plugins/Input/cue/cuefile.cpp
index 69a4622b9..897578860 100644
--- a/src/plugins/Input/cue/cuefile.cpp
+++ b/src/plugins/Input/cue/cuefile.cpp
@@ -79,7 +79,7 @@ CueFile::CueFile(const QString &path) : CueParser()
codec = QTextCodec::codecForName("UTF-8");
settings.endGroup();
//qDebug("CUEParser: using %s encoding", codec->name().constData());
- loadData(data, codec->name());
+ loadData(data, codec);
setUrl("cue", path);
for(const QString &dataFileName : files())
{
@@ -94,6 +94,16 @@ CueFile::CueFile(const QString &path) : CueParser()
pl.clear();
}
}
+
+ for(const QString &path : m_dataFiles.values())
+ {
+ if(!QFile::exists(path))
+ {
+ qDebug("CueFile: unable to find file: %s", qPrintable(path));
+ clear();
+ return;
+ }
+ }
}
CueFile::~CueFile()
@@ -144,16 +154,6 @@ QStringList CueFile::splitLine(const QString &line)
return list;
}
-/*qint64 CueFile::getLength(const QString &str)
-{
- QStringList list = str.split(":");
- if (list.size() == 2)
- return (qint64)list.at(0).toInt()*60000 + list.at(1).toInt()*1000;
- else if (list.size() == 3)
- return (qint64)list.at(0).toInt()*60000 + list.at(1).toInt()*1000 + list.at(2).toInt()*1000/75;
- return 0;
-}*/
-
QString CueFile::getDirtyPath(const QString &cue_path, const QString &path)
{
if((QFile::exists(path) && Decoder::findByFilePath(path)) || !m_dirty)
diff --git a/src/plugins/Input/cue/decodercuefactory.cpp b/src/plugins/Input/cue/decodercuefactory.cpp
index 43bbb7354..386d3e94d 100644
--- a/src/plugins/Input/cue/decodercuefactory.cpp
+++ b/src/plugins/Input/cue/decodercuefactory.cpp
@@ -58,14 +58,8 @@ QList<TrackInfo *> DecoderCUEFactory::createPlayList(const QString &path, TrackI
CueFile parser(path);
if(path.contains("://"))
{
- QList<TrackInfo *> list;
int track = path.section("#", -1).toInt();
- if (!parser.count() || track <= 0 || track > parser.count())
- return list;
- list = parser.createPlayList();
- TrackInfo *info = list.takeAt(track - 1);
- qDeleteAll(list);
- return QList<TrackInfo *>() << info;
+ return parser.createPlayList(track);
}
else
{
diff --git a/src/qmmp/cueparser.cpp b/src/qmmp/cueparser.cpp
index ad065c4a5..937485470 100644
--- a/src/qmmp/cueparser.cpp
+++ b/src/qmmp/cueparser.cpp
@@ -31,29 +31,23 @@ CueParser::CueParser(const QByteArray &data, const QByteArray &codecName)
CueParser::~CueParser()
{
- qDeleteAll(m_tracks);
- m_tracks.clear();
+ clear();
}
void CueParser::loadData(const QByteArray &data, const QByteArray &codecName)
{
- qDeleteAll(m_tracks);
- m_tracks.clear();
- m_files.clear();
+ loadData(data, QTextCodec::codecForName(codecName));
+}
+
+void CueParser::loadData(const QByteArray &data, QTextCodec *codec)
+{
+ clear();
QString artist, album, genre, date, comment, file;
double album_peak = 0.0, album_gain = 0.0;
QTextStream textStream(data);
- if(codecName.isEmpty())
- {
- textStream.setCodec("UTF-8");
- }
- else
- {
- QTextCodec *codec = QTextCodec::codecForName(codecName);
- textStream.setCodec(codec ? codec : QTextCodec::codecForName("UTF-8"));
- }
+ textStream.setCodec(codec ? codec : QTextCodec::codecForName("UTF-8"));
while (!textStream.atEnd())
{
@@ -131,12 +125,24 @@ void CueParser::loadData(const QByteArray &data, const QByteArray &codecName)
QList<TrackInfo *> CueParser::createPlayList() const
{
- QList<TrackInfo*> out;
+ QList<TrackInfo *> out;
for(const CUETrack *track : m_tracks)
out << new TrackInfo(track->info);
return out;
}
+QList<TrackInfo *> CueParser::createPlayList(int track) const
+{
+ QList<TrackInfo *> out;
+ if(track < 1 || track > m_tracks.count())
+ {
+ qWarning("CueParser: invalid track number: %d", track);
+ return out;
+ }
+ out << new TrackInfo(m_tracks.at(track - 1)->info);
+ return out;
+}
+
const QStringList &CueParser::files() const
{
return m_files;
@@ -144,12 +150,12 @@ const QStringList &CueParser::files() const
qint64 CueParser::offset(int track) const
{
- if(track < 0 || track >= m_tracks.count())
+ if(track < 1 || track > m_tracks.count())
{
qWarning("CueParser: invalid track number: %d", track);
return 0;
}
- return m_tracks.at(track)->offset;
+ return m_tracks.at(track - 1)->offset;
}
qint64 CueParser::duration(int track) const
@@ -187,6 +193,11 @@ int CueParser::count() const
return m_tracks.count();
}
+bool CueParser::isEmpty() const
+{
+ return m_tracks.isEmpty();
+}
+
const TrackInfo *CueParser::info(int track) const
{
if(track < 1 || track > m_tracks.count())
@@ -252,6 +263,13 @@ void CueParser::setUrl(const QString &scheme, const QString &path)
m_tracks.at(i)->info.setPath(QString("%1://%2#%3").arg(scheme).arg(path).arg(m_tracks.at(i)->info.value(Qmmp::TRACK)));
}
+void CueParser::clear()
+{
+ qDeleteAll(m_tracks);
+ m_tracks.clear();
+ m_files.clear();
+}
+
QStringList CueParser::splitLine(const QString &line)
{
//qDebug("raw string = %s",qPrintable(line));
diff --git a/src/qmmp/cueparser.h b/src/qmmp/cueparser.h
index 50faa5a87..2606a4468 100644
--- a/src/qmmp/cueparser.h
+++ b/src/qmmp/cueparser.h
@@ -24,6 +24,7 @@
#include <QString>
#include <QList>
#include <QStringList>
+#include <QTextCodec>
#include "trackinfo.h"
#include "qmmp_export.h"
@@ -34,19 +35,23 @@ public:
CueParser(const QByteArray &data, const QByteArray &codecName = QByteArray());
~CueParser();
void loadData(const QByteArray &data, const QByteArray &codecName = QByteArray());
+ void loadData(const QByteArray &data, QTextCodec *codec);
QList<TrackInfo *> createPlayList() const;
+ QList<TrackInfo *> createPlayList(int track) const;
const QStringList &files() const;
qint64 offset(int track) const;
qint64 duration(int track) const;
QString file(int track) const;
QString url(int track) const;
int count() const;
+ bool isEmpty() const;
const TrackInfo *info(int track) const;
void setDuration(const QString &file, qint64 duration);
void setDuration(qint64 duration);
void setProperties(const QString &file, const QMap<Qmmp::TrackProperty, QString> &properties);
void setProperties(const QMap<Qmmp::TrackProperty, QString> &properties);
void setUrl(const QString &scheme, const QString &path);
+ void clear();
private:
struct CUETrack