diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2011-02-02 15:24:09 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2011-02-02 15:24:09 +0000 |
| commit | 1bc607cb66a0a643d953ac06953152cf8815826c (patch) | |
| tree | 02e8d67d74cbffe4adb7b33517b46b754a6288db /src/plugins/Input | |
| parent | 83d98a0ef5565a596342eabc21c357fb87eb5695 (diff) | |
| download | qmmp-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.cpp | 51 | ||||
| -rw-r--r-- | src/plugins/Input/cue/cueparser.h | 3 | ||||
| -rw-r--r-- | src/plugins/Input/cue/decodercuefactory.cpp | 16 | ||||
| -rw-r--r-- | src/plugins/Input/flac/decoderflacfactory.cpp | 21 | ||||
| -rw-r--r-- | src/plugins/Input/gme/decodergmefactory.cpp | 21 | ||||
| -rw-r--r-- | src/plugins/Input/wavpack/decoderwavpackfactory.cpp | 21 |
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) { |
