Browse Source

Merge pull request #6181 from magao/issue6170

RSS episode filter improvements. Closes #800, #2749, #3876, #6170.
adaptive-webui-19844
sledgehammer999 8 years ago committed by GitHub
parent
commit
3b3de81cb7
  1. 47
      src/base/rss/rssdownloadrule.cpp
  2. 6
      src/gui/rss/automatedrssdownloader.cpp

47
src/base/rss/rssdownloadrule.cpp

@ -31,6 +31,8 @@
#include <QRegExp> #include <QRegExp>
#include <QDebug> #include <QDebug>
#include <QDir> #include <QDir>
#include <QStringRef>
#include <QVector>
#include "base/preferences.h" #include "base/preferences.h"
#include "base/utils/fs.h" #include "base/utils/fs.h"
@ -151,25 +153,38 @@ bool DownloadRule::matches(const QString &articleTitle) const
QString s = f.cap(1); QString s = f.cap(1);
QStringList eps = f.cap(2).split(";"); QStringList eps = f.cap(2).split(";");
QString expStr; int sOurs = s.toInt();
expStr += "s0?" + s + "[ -_\\.]?" + "e0?";
foreach (const QString &ep, eps) { foreach (const QString &epStr, eps) {
if (ep.isEmpty()) if (epStr.isEmpty())
continue; continue;
QStringRef ep( &epStr);
// We need to trim leading zeroes, but if it's all zeros then we want episode zero.
while (ep.size() > 1 && ep.startsWith("0"))
ep = ep.right(ep.size() - 1);
if (ep.indexOf('-') != -1) { // Range detected if (ep.indexOf('-') != -1) { // Range detected
QString partialPattern = "s0?" + s + "[ -_\\.]?" + "e(0?\\d{1,4})"; QString partialPattern1 = "\\bs0?(\\d{1,4})[ -_\\.]?e(0?\\d{1,4})(?:\\D|\\b)";
QRegExp reg(partialPattern, Qt::CaseInsensitive); QString partialPattern2 = "\\b(\\d{1,4})x(0?\\d{1,4})(?:\\D|\\b)";
QRegExp reg(partialPattern1, Qt::CaseInsensitive);
if (ep.endsWith('-')) { // Infinite range if (ep.endsWith('-')) { // Infinite range
int epOurs = ep.left(ep.size() - 1).toInt(); int epOurs = ep.left(ep.size() - 1).toInt();
// Extract partial match from article and compare as digits // Extract partial match from article and compare as digits
pos = reg.indexIn(articleTitle); pos = reg.indexIn(articleTitle);
if (pos == -1) {
reg = QRegExp(partialPattern2, Qt::CaseInsensitive);
pos = reg.indexIn(articleTitle);
}
if (pos != -1) { if (pos != -1) {
int epTheirs = reg.cap(1).toInt(); int sTheirs = reg.cap(1).toInt();
if (epTheirs >= epOurs) { int epTheirs = reg.cap(2).toInt();
if (((sTheirs == sOurs) && (epTheirs >= epOurs)) || (sTheirs > sOurs)) {
qDebug() << "Matched episode:" << ep; qDebug() << "Matched episode:" << ep;
qDebug() << "Matched article:" << articleTitle; qDebug() << "Matched article:" << articleTitle;
return true; return true;
@ -177,7 +192,7 @@ bool DownloadRule::matches(const QString &articleTitle) const
} }
} }
else { // Normal range else { // Normal range
QStringList range = ep.split('-'); QVector<QStringRef> range = ep.split('-');
Q_ASSERT(range.size() == 2); Q_ASSERT(range.size() == 2);
if (range.first().toInt() > range.last().toInt()) if (range.first().toInt() > range.last().toInt())
continue; // Ignore this subrule completely continue; // Ignore this subrule completely
@ -187,9 +202,16 @@ bool DownloadRule::matches(const QString &articleTitle) const
// Extract partial match from article and compare as digits // Extract partial match from article and compare as digits
pos = reg.indexIn(articleTitle); pos = reg.indexIn(articleTitle);
if (pos == -1) {
reg = QRegExp(partialPattern2, Qt::CaseInsensitive);
pos = reg.indexIn(articleTitle);
}
if (pos != -1) { if (pos != -1) {
int epTheirs = reg.cap(1).toInt(); int sTheirs = reg.cap(1).toInt();
if ((epOursFirst <= epTheirs) && (epOursLast >= epTheirs)) { int epTheirs = reg.cap(2).toInt();
if ((sTheirs == sOurs) && ((epOursFirst <= epTheirs) && (epOursLast >= epTheirs))) {
qDebug() << "Matched episode:" << ep; qDebug() << "Matched episode:" << ep;
qDebug() << "Matched article:" << articleTitle; qDebug() << "Matched article:" << articleTitle;
return true; return true;
@ -198,7 +220,8 @@ bool DownloadRule::matches(const QString &articleTitle) const
} }
} }
else { // Single number else { // Single number
QRegExp reg(expStr + ep + "\\D", Qt::CaseInsensitive); QString expStr("\\b(?:s0?" + s + "[ -_\\.]?" + "e0?" + ep + "|" + s + "x" + "0?" + ep + ")(?:\\D|\\b)");
QRegExp reg(expStr, Qt::CaseInsensitive);
if (reg.indexIn(articleTitle) != -1) { if (reg.indexIn(articleTitle) != -1) {
qDebug() << "Matched episode:" << ep; qDebug() << "Matched episode:" << ep;
qDebug() << "Matched article:" << articleTitle; qDebug() << "Matched article:" << articleTitle;

6
src/gui/rss/automatedrssdownloader.cpp

@ -71,17 +71,17 @@ AutomatedRssDownloader::AutomatedRssDownloader(const QWeakPointer<Rss::Manager>
Q_ASSERT(ok); Q_ASSERT(ok);
m_ruleList = manager.toStrongRef()->downloadRules(); m_ruleList = manager.toStrongRef()->downloadRules();
m_editableRuleList = new Rss::DownloadRuleList; // Read rule list from disk m_editableRuleList = new Rss::DownloadRuleList; // Read rule list from disk
m_episodeRegex = new QRegExp("^(^[1-9]{1,1}\\d{0,3}x([1-9]{1,1}\\d{0,3}(-([1-9]{1,1}\\d{0,3})?)?;){1,}){1,1}", m_episodeRegex = new QRegExp("^(^\\d{1,4}x(\\d{1,4}(-(\\d{1,4})?)?;){1,}){1,1}",
Qt::CaseInsensitive); Qt::CaseInsensitive);
QString tip = "<p>" + tr("Matches articles based on episode filter.") + "</p><p><b>" + tr("Example: ") QString tip = "<p>" + tr("Matches articles based on episode filter.") + "</p><p><b>" + tr("Example: ")
+ "1x2;8-15;5;30-;</b>" + tr(" will match 2, 5, 8 through 15, 30 and onward episodes of season one", "example X will match") + "</p>"; + "1x2;8-15;5;30-;</b>" + tr(" will match 2, 5, 8 through 15, 30 and onward episodes of season one", "example X will match") + "</p>";
tip += "<p>" + tr("Episode filter rules: ") + "</p><ul><li>" + tr("Season number is a mandatory non-zero value") + "</li>" tip += "<p>" + tr("Episode filter rules: ") + "</p><ul><li>" + tr("Season number is a mandatory non-zero value") + "</li>"
+ "<li>" + tr("Episode number is a mandatory non-zero value") + "</li>" + "<li>" + tr("Episode number is a mandatory positive value") + "</li>"
+ "<li>" + tr("Filter must end with semicolon") + "</li>" + "<li>" + tr("Filter must end with semicolon") + "</li>"
+ "<li>" + tr("Three range types for episodes are supported: ") + "</li>" + "<li><ul>" + "<li>" + tr("Three range types for episodes are supported: ") + "</li>" + "<li><ul>"
"<li>" + tr("Single number: <b>1x25;</b> matches episode 25 of season one") + "</li>" "<li>" + tr("Single number: <b>1x25;</b> matches episode 25 of season one") + "</li>"
+ "<li>" + tr("Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one") + "</li>" + "<li>" + tr("Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one") + "</li>"
+ "<li>" + tr("Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one") + "</li>" + "</ul></li></ul>"; + "<li>" + tr("Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons") + "</li>" + "</ul></li></ul>";
ui->lineEFilter->setToolTip(tip); ui->lineEFilter->setToolTip(tip);
initCategoryCombobox(); initCategoryCombobox();
loadFeedList(); loadFeedList();

Loading…
Cancel
Save