diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2019-11-20 20:49:07 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2019-11-20 20:49:07 +0000 |
| commit | e0d060ae41c3b6cffa934566cb4a419d2d9186ee (patch) | |
| tree | 5fce28aaf8b69a080c74cba4104609fb12129f92 /src | |
| parent | ed349221040319a9933b82c693a134a8144eb5da (diff) | |
| download | qmmp-e0d060ae41c3b6cffa934566cb4a419d2d9186ee.tar.gz qmmp-e0d060ae41c3b6cffa934566cb4a419d2d9186ee.tar.bz2 qmmp-e0d060ae41c3b6cffa934566cb4a419d2d9186ee.zip | |
added URL checking by regexp
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9109 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
| -rw-r--r-- | src/qmmp/inputsource.cpp | 15 | ||||
| -rw-r--r-- | src/qmmp/inputsource.h | 1 | ||||
| -rw-r--r-- | src/qmmp/metadatamanager.cpp | 25 | ||||
| -rw-r--r-- | src/qmmp/metadatamanager.h | 5 | ||||
| -rw-r--r-- | src/qmmpui/addurldialog.cpp | 5 | ||||
| -rw-r--r-- | src/qmmpui/fileloader.cpp | 30 | ||||
| -rw-r--r-- | src/qmmpui/playlisttask.cpp | 4 |
7 files changed, 64 insertions, 21 deletions
diff --git a/src/qmmp/inputsource.cpp b/src/qmmp/inputsource.cpp index c1dd59e16..16190dbea 100644 --- a/src/qmmp/inputsource.cpp +++ b/src/qmmp/inputsource.cpp @@ -172,6 +172,21 @@ QStringList InputSource::protocols() return protocolsList; } +QList<QRegularExpression> InputSource::regExps() +{ + loadPlugins(); + QList<QRegularExpression> regExpList; + + for(QmmpPluginCache *item : qAsConst(*m_cache)) + { + if(m_disabledNames.contains(item->shortName())) + continue; + if(item->inputSourceFactory()) + regExpList << item->inputSourceFactory()->properties().regExps; + } + return regExpList; +} + InputSourceFactory *InputSource::findByUrl(const QString &url) { for(QmmpPluginCache *item : qAsConst(*m_cache)) diff --git a/src/qmmp/inputsource.h b/src/qmmp/inputsource.h index 04885b8c7..4fbff6e45 100644 --- a/src/qmmp/inputsource.h +++ b/src/qmmp/inputsource.h @@ -135,6 +135,7 @@ public: * Returns a list of supported protocols. */ static QStringList protocols(); + static QList<QRegularExpression> regExps(); static InputSourceFactory *findByUrl(const QString &url); /*! * Sets whether the input plugin is enabled. diff --git a/src/qmmp/metadatamanager.cpp b/src/qmmp/metadatamanager.cpp index ea7184b99..36e7ec1a1 100644 --- a/src/qmmp/metadatamanager.cpp +++ b/src/qmmp/metadatamanager.cpp @@ -175,6 +175,11 @@ QStringList MetaDataManager::protocols() const return p; } +QList<QRegularExpression> MetaDataManager::regExps() const +{ + return InputSource::regExps(); +} + bool MetaDataManager::supports(const QString &fileName) const { DecoderFactory *fact = nullptr; @@ -308,6 +313,26 @@ void MetaDataManager::prepareForAnotherThread() protocols(); //this hack should load all required plugins } +bool MetaDataManager::hasMatch(const QList<QRegularExpression> ®Exps, const QString &path) +{ + for(const QRegularExpression &re : qAsConst(regExps)) + { + if(re.match(path).hasMatch()) + return true; + } + return false; +} + +bool MetaDataManager::hasMatch(const QList<QRegExp> ®Exps, const QString &path) +{ + for(const QRegExp &re : qAsConst(regExps)) + { + if(re.exactMatch(path)) + return true; + } + return false; +} + MetaDataManager *MetaDataManager::instance() { if(!m_instance) diff --git a/src/qmmp/metadatamanager.h b/src/qmmp/metadatamanager.h index fdce4ab1d..eafbb7c63 100644 --- a/src/qmmp/metadatamanager.h +++ b/src/qmmp/metadatamanager.h @@ -26,6 +26,7 @@ #include <QPixmap> #include <QDir> #include <QMutex> +#include <QRegularExpression> #include "trackinfo.h" #include "metadatamodel.h" @@ -69,6 +70,7 @@ public: * Returns a list of the suported protocols */ QStringList protocols() const; + QList<QRegularExpression> regExps() const; /*! * Returns \b true if \b file is supported and exists, otherwise returns \b false */ @@ -102,6 +104,9 @@ public: * Prepares object for usage by another thread to avoid warnings about parent from the different thread */ void prepareForAnotherThread(); + + static bool hasMatch(const QList<QRegularExpression> ®Exps, const QString &path); + static bool hasMatch(const QList<QRegExp> &re, const QString &path); /*! * Returns a pointer to the MetaDataManager instance. */ diff --git a/src/qmmpui/addurldialog.cpp b/src/qmmpui/addurldialog.cpp index 91f12cf17..81ae1bf80 100644 --- a/src/qmmpui/addurldialog.cpp +++ b/src/qmmpui/addurldialog.cpp @@ -48,8 +48,11 @@ AddUrlDialog::AddUrlDialog(QWidget *parent) : QDialog(parent) if(QmmpUiSettings::instance()->useClipboard()) { QUrl url(QApplication::clipboard()->text().trimmed()); - if(url.isValid() && MetaDataManager::instance()->protocols().contains(url.scheme())) + if(url.isValid() && (MetaDataManager::instance()->protocols().contains(url.scheme()) || + MetaDataManager::hasMatch(MetaDataManager::instance()->regExps(), url.toString()))) + { urlComboBox->setEditText(QApplication::clipboard()->text().trimmed()); + } } } diff --git a/src/qmmpui/fileloader.cpp b/src/qmmpui/fileloader.cpp index a03bb18c7..ecd92dc19 100644 --- a/src/qmmpui/fileloader.cpp +++ b/src/qmmpui/fileloader.cpp @@ -127,6 +127,7 @@ void FileLoader::insertPlayList(const QString &path, PlayListItem *before) else { QStringList protocols = MetaDataManager::instance()->protocols(); + QList<QRegularExpression> regExps = MetaDataManager::instance()->regExps(); QList<QRegExp> filters; for(const QString &pattern : MetaDataManager::instance()->nameFilters()) filters << QRegExp(pattern, Qt::CaseInsensitive, QRegExp::Wildcard); @@ -135,8 +136,11 @@ void FileLoader::insertPlayList(const QString &path, PlayListItem *before) QList<PlayListTrack *>::iterator it = tracks.begin(); while(it != tracks.end()) { - if((*it)->path().contains("://") && !protocols.contains((*it)->path().section("://", 0, 0))) + if((*it)->path().contains("://") && + !protocols.contains((*it)->path().section("://", 0, 0)) && + !MetaDataManager::hasMatch(regExps, (*it)->path())) { + delete (*it); it = tracks.erase(it); } @@ -145,26 +149,14 @@ void FileLoader::insertPlayList(const QString &path, PlayListItem *before) delete (*it); it = tracks.erase(it); } + else if(!MetaDataManager::hasMatch(filters, (*it)->path())) + { + delete (*it); + it = tracks.erase(it); + } else { - bool found = false; - for(const QRegExp &filter : qAsConst(filters)) - { - if(filter.exactMatch((*it)->path())) - { - found = true; - break; - } - } - if(!found) - { - delete (*it); - it = tracks.erase(it); - } - else - { - ++it; - } + ++it; } } if(!m_finished && !tracks.isEmpty()) diff --git a/src/qmmpui/playlisttask.cpp b/src/qmmpui/playlisttask.cpp index d326536f6..37b543b85 100644 --- a/src/qmmpui/playlisttask.cpp +++ b/src/qmmpui/playlisttask.cpp @@ -405,6 +405,8 @@ void PlayListTask::run() { TrackField *f = nullptr; MetaDataManager *mm = MetaDataManager::instance(); + QStringList protocols = mm->protocols(); + QList<QRegularExpression> regExps = mm->regExps(); bool ok = false; //find invalid files for(int i = 0; i < m_fields.count(); ++i) @@ -412,7 +414,7 @@ void PlayListTask::run() f = m_fields.at(i); if(f->value.contains("://")) - ok = mm->protocols().contains(f->value.section("://",0,0)); //url + ok = protocols.contains(f->value.section("://",0,0)) || MetaDataManager::hasMatch(regExps, f->value) ; //url else ok = mm->supports(f->value); //local file |
