aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2019-11-20 20:49:07 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2019-11-20 20:49:07 +0000
commite0d060ae41c3b6cffa934566cb4a419d2d9186ee (patch)
tree5fce28aaf8b69a080c74cba4104609fb12129f92 /src
parented349221040319a9933b82c693a134a8144eb5da (diff)
downloadqmmp-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.cpp15
-rw-r--r--src/qmmp/inputsource.h1
-rw-r--r--src/qmmp/metadatamanager.cpp25
-rw-r--r--src/qmmp/metadatamanager.h5
-rw-r--r--src/qmmpui/addurldialog.cpp5
-rw-r--r--src/qmmpui/fileloader.cpp30
-rw-r--r--src/qmmpui/playlisttask.cpp4
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> &regExps, const QString &path)
+{
+ for(const QRegularExpression &re : qAsConst(regExps))
+ {
+ if(re.match(path).hasMatch())
+ return true;
+ }
+ return false;
+}
+
+bool MetaDataManager::hasMatch(const QList<QRegExp> &regExps, 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> &regExps, 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