aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2011-02-02 15:24:09 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2011-02-02 15:24:09 +0000
commit1bc607cb66a0a643d953ac06953152cf8815826c (patch)
tree02e8d67d74cbffe4adb7b33517b46b754a6288db /src/plugins/Input
parent83d98a0ef5565a596342eabc21c357fb87eb5695 (diff)
downloadqmmp-1bc607cb66a0a643d953ac06953152cf8815826c.tar.gz
qmmp-1bc607cb66a0a643d953ac06953152cf8815826c.tar.bz2
qmmp-1bc607cb66a0a643d953ac06953152cf8815826c.zip
added possibility to save cue tracks inside playlist files
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@2036 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input')
-rw-r--r--src/plugins/Input/cue/cueparser.cpp51
-rw-r--r--src/plugins/Input/cue/cueparser.h3
-rw-r--r--src/plugins/Input/cue/decodercuefactory.cpp16
-rw-r--r--src/plugins/Input/flac/decoderflacfactory.cpp21
-rw-r--r--src/plugins/Input/gme/decodergmefactory.cpp21
-rw-r--r--src/plugins/Input/wavpack/decoderwavpackfactory.cpp21
6 files changed, 128 insertions, 5 deletions
diff --git a/src/plugins/Input/cue/cueparser.cpp b/src/plugins/Input/cue/cueparser.cpp
index bdf1e68dd..294f1eb41 100644
--- a/src/plugins/Input/cue/cueparser.cpp
+++ b/src/plugins/Input/cue/cueparser.cpp
@@ -20,6 +20,7 @@
#include <QFile>
#include <QDir>
+#include <QDirIterator>
#include <QSettings>
#include <QTextStream>
#include <QTextCodec>
@@ -54,6 +55,7 @@ CUEParser::CUEParser(const QString &url)
QTextCodec *codec = QTextCodec::codecForName(settings.value("encoding","ISO-8859-1").toByteArray ());
if(!codec)
codec = QTextCodec::codecForName("UTF-8");
+ m_dirty = settings.value("dirty_cue", true).toBool();
#ifdef WITH_ENCA
EncaAnalyser analyser = 0;
if(settings.value("use_enca", false).toBool())
@@ -98,7 +100,7 @@ CUEParser::CUEParser(const QString &url)
else
m_infoList.last().setLength(0);
}
- file_path = QFileInfo(fileName).dir().filePath(words[1]);
+ file_path = getDirtyPath(fileName, QFileInfo(fileName).dir().filePath(words[1]));
new_file = true;
}
@@ -258,3 +260,50 @@ qint64 CUEParser::getLength(const QString &str)
return (qint64)list.at(0).toInt()*60000 + list.at(1).toInt()*1000 + list.at(2).toInt()*1000/75;
return 0;
}
+
+QString CUEParser::getDirtyPath(const QString &cue, const QString &path)
+{
+
+ if (Decoder::findByPath(path) || ! m_dirty)
+ return path;
+
+ QStringList candidates;
+ QDirIterator it(QFileInfo(path).dir().path(), QDir::Files);
+ while (it.hasNext())
+ {
+ it.next();
+ QString f = it.filePath();
+ if ((f != cue) && Decoder::findByPath(f))
+ candidates.push_back(f);
+ }
+
+ if (candidates.empty())
+ return path;
+ else if (candidates.count() == 1)
+ return candidates.first();
+
+ int dot = cue.lastIndexOf('.');
+ if (dot != -1)
+ {
+ QRegExp r(QRegExp::escape(cue.left(dot)) + "\\.[^\\.]+$");
+
+ int index = candidates.indexOf(r);
+ int rindex = candidates.lastIndexOf(r);
+
+ if ((index != -1) && (index == rindex))
+ return candidates[index];
+ }
+ dot = path.lastIndexOf('.');
+ if (dot != -1)
+ {
+ QRegExp r(QRegExp::escape(path.left(dot)) + "\\.[^\\.]+$");
+
+ int index = candidates.indexOf(r);
+ int rindex = candidates.lastIndexOf(r);
+
+ if ((index != -1) && (index == rindex))
+ return candidates[index];
+ }
+
+ return path;
+}
diff --git a/src/plugins/Input/cue/cueparser.h b/src/plugins/Input/cue/cueparser.h
index 31b9e4e01..e48dc16aa 100644
--- a/src/plugins/Input/cue/cueparser.h
+++ b/src/plugins/Input/cue/cueparser.h
@@ -51,9 +51,10 @@ private:
QList <FileInfo> m_infoList;
QList <qint64> m_offsets;
QStringList m_files;
+ bool m_dirty;
QStringList splitLine(const QString &line);
qint64 getLength(const QString &str);
-
+ QString getDirtyPath(const QString &cue, const QString &path);
};
#endif
diff --git a/src/plugins/Input/cue/decodercuefactory.cpp b/src/plugins/Input/cue/decodercuefactory.cpp
index 6befcca66..1bdeae7bd 100644
--- a/src/plugins/Input/cue/decodercuefactory.cpp
+++ b/src/plugins/Input/cue/decodercuefactory.cpp
@@ -63,10 +63,20 @@ Decoder *DecoderCUEFactory::create(const QString &path, QIODevice *input)
QList<FileInfo *> DecoderCUEFactory::createPlayList(const QString &fileName, bool useMetaData)
{
Q_UNUSED(useMetaData);
- if(!QFile::exists(fileName))
- return QList<FileInfo *>();
CUEParser parser(fileName);
- return parser.createPlayList();
+ if(fileName.contains("://"))
+ {
+ QList<FileInfo *> list;
+ int track = fileName.section("#", -1).toInt();
+ if (!parser.count() || track <= 0 || track > parser.count())
+ return list;
+ list = parser.createPlayList();
+ FileInfo *info = list.takeAt(track - 1);
+ qDeleteAll(list);
+ return QList<FileInfo *>() << info;
+ }
+ else
+ return parser.createPlayList();
}
MetaDataModel* DecoderCUEFactory::createMetaDataModel(const QString &path, QObject *parent)
diff --git a/src/plugins/Input/flac/decoderflacfactory.cpp b/src/plugins/Input/flac/decoderflacfactory.cpp
index 33e97d1b4..d2797e09b 100644
--- a/src/plugins/Input/flac/decoderflacfactory.cpp
+++ b/src/plugins/Input/flac/decoderflacfactory.cpp
@@ -73,6 +73,27 @@ QList<FileInfo *> DecoderFLACFactory::createPlayList(const QString &fileName, bo
TagLib::FLAC::File *flacFile = 0;
TagLib::Ogg::FLAC::File *oggFlacFile = 0;
+ //extract metadata of one cue track
+ if(fileName.contains("://"))
+ {
+ QString path = QUrl(fileName).path();
+ path.replace(QString(QUrl::toPercentEncoding("#")), "#");
+ path.replace(QString(QUrl::toPercentEncoding("?")), "?");
+ path.replace(QString(QUrl::toPercentEncoding("%")), "%");
+ path.replace(QString(QUrl::toPercentEncoding(":")), ":");
+ int track = fileName.section("#", -1).toInt();
+ list = createPlayList(path, true);
+ if (list.isEmpty() || track <= 0 || track > list.count())
+ {
+ qDeleteAll(list);
+ list.clear();
+ return list;
+ }
+ FileInfo *info = list.takeAt(track - 1);
+ qDeleteAll(list);
+ return QList<FileInfo *>() << info;
+ }
+
if(fileName.endsWith(".flac", Qt::CaseInsensitive))
{
flacFile = new TagLib::FLAC::File(fileName.toLocal8Bit ());
diff --git a/src/plugins/Input/gme/decodergmefactory.cpp b/src/plugins/Input/gme/decodergmefactory.cpp
index e9a9a37ca..83989f6ca 100644
--- a/src/plugins/Input/gme/decodergmefactory.cpp
+++ b/src/plugins/Input/gme/decodergmefactory.cpp
@@ -69,6 +69,27 @@ QList<FileInfo *> DecoderGmeFactory::createPlayList(const QString &fileName, boo
{
QList <FileInfo*> list;
GmeHelper helper;
+ //is it one track?
+ if(fileName.contains("://"))
+ {
+ QString path = QUrl(fileName).path();
+ path.replace(QString(QUrl::toPercentEncoding("#")), "#");
+ path.replace(QString(QUrl::toPercentEncoding("?")), "?");
+ path.replace(QString(QUrl::toPercentEncoding("%")), "%");
+ path.replace(QString(QUrl::toPercentEncoding(":")), ":");
+ int track = fileName.section("#", -1).toInt();
+ list = createPlayList(path, true);
+ if (list.isEmpty() || track <= 0 || track > list.count())
+ {
+ qDeleteAll(list);
+ list.clear();
+ return list;
+ }
+ FileInfo *info = list.takeAt(track - 1);
+ qDeleteAll(list);
+ return QList<FileInfo *>() << info;
+ }
+
Music_Emu *emu = helper.load(fileName);
if(!emu)
{
diff --git a/src/plugins/Input/wavpack/decoderwavpackfactory.cpp b/src/plugins/Input/wavpack/decoderwavpackfactory.cpp
index 45a6bfaed..e8b6acf31 100644
--- a/src/plugins/Input/wavpack/decoderwavpackfactory.cpp
+++ b/src/plugins/Input/wavpack/decoderwavpackfactory.cpp
@@ -64,6 +64,27 @@ QList<FileInfo *> DecoderWavPackFactory::createPlayList(const QString &fileName,
char err[80];
int cue_len=0;
FileInfo *info;
+ //extract metadata of one cue track
+ if(fileName.contains("://"))
+ {
+ QString path = QUrl(fileName).path();
+ path.replace(QString(QUrl::toPercentEncoding("#")), "#");
+ path.replace(QString(QUrl::toPercentEncoding("?")), "?");
+ path.replace(QString(QUrl::toPercentEncoding("%")), "%");
+ path.replace(QString(QUrl::toPercentEncoding(":")), ":");
+ int track = fileName.section("#", -1).toInt();
+ list = createPlayList(path, true);
+ if (list.isEmpty() || track <= 0 || track > list.count())
+ {
+ qDeleteAll(list);
+ list.clear();
+ return list;
+ }
+ FileInfo *info = list.takeAt(track - 1);
+ qDeleteAll(list);
+ return QList<FileInfo *>() << info;
+ }
+
WavpackContext *ctx = WavpackOpenFileInput (fileName.toLocal8Bit(), err, OPEN_WVC | OPEN_TAGS, 0);
if (!ctx)
{