mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2025-12-19 23:17:21 -06:00
@@ -33,6 +33,7 @@
|
||||
#include <QJsonObject>
|
||||
#include <QVariant>
|
||||
|
||||
#include "base/global.h"
|
||||
#include "rss_feed.h"
|
||||
|
||||
using namespace RSS;
|
||||
@@ -50,14 +51,14 @@ namespace
|
||||
}
|
||||
}
|
||||
|
||||
const QString Article::KeyId(QStringLiteral("id"));
|
||||
const QString Article::KeyDate(QStringLiteral("date"));
|
||||
const QString Article::KeyTitle(QStringLiteral("title"));
|
||||
const QString Article::KeyAuthor(QStringLiteral("author"));
|
||||
const QString Article::KeyDescription(QStringLiteral("description"));
|
||||
const QString Article::KeyTorrentURL(QStringLiteral("torrentURL"));
|
||||
const QString Article::KeyLink(QStringLiteral("link"));
|
||||
const QString Article::KeyIsRead(QStringLiteral("isRead"));
|
||||
const QString Article::KeyId = u"id"_qs;
|
||||
const QString Article::KeyDate = u"date"_qs;
|
||||
const QString Article::KeyTitle = u"title"_qs;
|
||||
const QString Article::KeyAuthor = u"author"_qs;
|
||||
const QString Article::KeyDescription = u"description"_qs;
|
||||
const QString Article::KeyTorrentURL = u"torrentURL"_qs;
|
||||
const QString Article::KeyLink = u"link"_qs;
|
||||
const QString Article::KeyIsRead = u"isRead"_qs;
|
||||
|
||||
Article::Article(Feed *feed, const QVariantHash &varHash)
|
||||
: QObject(feed)
|
||||
|
||||
@@ -58,8 +58,8 @@ struct ProcessingJob
|
||||
QVariantHash articleData;
|
||||
};
|
||||
|
||||
const QString CONF_FOLDER_NAME {QStringLiteral("rss")};
|
||||
const QString RULES_FILE_NAME {QStringLiteral("download_rules.json")};
|
||||
const QString CONF_FOLDER_NAME = u"rss"_qs;
|
||||
const QString RULES_FILE_NAME = u"download_rules.json"_qs;
|
||||
|
||||
namespace
|
||||
{
|
||||
@@ -441,8 +441,8 @@ void AutoDownloader::loadRules(const QByteArray &data)
|
||||
|
||||
void AutoDownloader::loadRulesLegacy()
|
||||
{
|
||||
const SettingsPtr settings = Profile::instance()->applicationSettings(QStringLiteral("qBittorrent-rss"));
|
||||
const QVariantHash rules = settings->value(QStringLiteral("download_rules")).toHash();
|
||||
const SettingsPtr settings = Profile::instance()->applicationSettings(u"qBittorrent-rss"_qs);
|
||||
const QVariantHash rules = settings->value(u"download_rules"_qs).toHash();
|
||||
for (const QVariant &ruleVar : rules)
|
||||
{
|
||||
const auto rule = AutoDownloadRule::fromLegacyDict(ruleVar.toHash());
|
||||
|
||||
@@ -101,22 +101,22 @@ namespace
|
||||
}
|
||||
}
|
||||
|
||||
const QString Str_Name(QStringLiteral("name"));
|
||||
const QString Str_Enabled(QStringLiteral("enabled"));
|
||||
const QString Str_UseRegex(QStringLiteral("useRegex"));
|
||||
const QString Str_MustContain(QStringLiteral("mustContain"));
|
||||
const QString Str_MustNotContain(QStringLiteral("mustNotContain"));
|
||||
const QString Str_EpisodeFilter(QStringLiteral("episodeFilter"));
|
||||
const QString Str_AffectedFeeds(QStringLiteral("affectedFeeds"));
|
||||
const QString Str_SavePath(QStringLiteral("savePath"));
|
||||
const QString Str_AssignedCategory(QStringLiteral("assignedCategory"));
|
||||
const QString Str_LastMatch(QStringLiteral("lastMatch"));
|
||||
const QString Str_IgnoreDays(QStringLiteral("ignoreDays"));
|
||||
const QString Str_AddPaused(QStringLiteral("addPaused"));
|
||||
const QString Str_CreateSubfolder(QStringLiteral("createSubfolder"));
|
||||
const QString Str_ContentLayout(QStringLiteral("torrentContentLayout"));
|
||||
const QString Str_SmartFilter(QStringLiteral("smartFilter"));
|
||||
const QString Str_PreviouslyMatched(QStringLiteral("previouslyMatchedEpisodes"));
|
||||
const QString Str_Name = u"name"_qs;
|
||||
const QString Str_Enabled = u"enabled"_qs;
|
||||
const QString Str_UseRegex = u"useRegex"_qs;
|
||||
const QString Str_MustContain = u"mustContain"_qs;
|
||||
const QString Str_MustNotContain = u"mustNotContain"_qs;
|
||||
const QString Str_EpisodeFilter = u"episodeFilter"_qs;
|
||||
const QString Str_AffectedFeeds = u"affectedFeeds"_qs;
|
||||
const QString Str_SavePath = u"savePath"_qs;
|
||||
const QString Str_AssignedCategory = u"assignedCategory"_qs;
|
||||
const QString Str_LastMatch = u"lastMatch"_qs;
|
||||
const QString Str_IgnoreDays = u"ignoreDays"_qs;
|
||||
const QString Str_AddPaused = u"addPaused"_qs;
|
||||
const QString Str_CreateSubfolder = u"createSubfolder"_qs;
|
||||
const QString Str_ContentLayout = u"torrentContentLayout"_qs;
|
||||
const QString Str_SmartFilter = u"smartFilter"_qs;
|
||||
const QString Str_PreviouslyMatched = u"previouslyMatchedEpisodes"_qs;
|
||||
|
||||
namespace RSS
|
||||
{
|
||||
@@ -346,7 +346,7 @@ bool AutoDownloadRule::matchesEpisodeFilterExpression(const QString &articleTitl
|
||||
}
|
||||
else
|
||||
{ // Single number
|
||||
const QString expStr {QString::fromLatin1("\\b(?:s0?%1[ -_\\.]?e0?%2|%1x0?%2)(?:\\D|\\b)").arg(season, episode)};
|
||||
const QString expStr {u"\\b(?:s0?%1[ -_\\.]?e0?%2|%1x0?%2)(?:\\D|\\b)"_qs.arg(season, episode)};
|
||||
if (cachedRegex(expStr).match(articleTitle).hasMatch())
|
||||
return true;
|
||||
}
|
||||
@@ -391,8 +391,8 @@ bool AutoDownloadRule::matchesSmartEpisodeFilter(const QString &articleTitle) co
|
||||
// so we don't download those
|
||||
if (isRepack && isProper)
|
||||
{
|
||||
m_dataPtr->lastComputedEpisodes.append(episodeStr + QLatin1String("-REPACK"));
|
||||
m_dataPtr->lastComputedEpisodes.append(episodeStr + QLatin1String("-PROPER"));
|
||||
m_dataPtr->lastComputedEpisodes.append(episodeStr + u"-REPACK");
|
||||
m_dataPtr->lastComputedEpisodes.append(episodeStr + u"-PROPER");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -51,13 +51,13 @@
|
||||
#include "rss_parser.h"
|
||||
#include "rss_session.h"
|
||||
|
||||
const QString KEY_UID(QStringLiteral("uid"));
|
||||
const QString KEY_URL(QStringLiteral("url"));
|
||||
const QString KEY_TITLE(QStringLiteral("title"));
|
||||
const QString KEY_LASTBUILDDATE(QStringLiteral("lastBuildDate"));
|
||||
const QString KEY_ISLOADING(QStringLiteral("isLoading"));
|
||||
const QString KEY_HASERROR(QStringLiteral("hasError"));
|
||||
const QString KEY_ARTICLES(QStringLiteral("articles"));
|
||||
const QString KEY_UID = u"uid"_qs;
|
||||
const QString KEY_URL = u"url"_qs;
|
||||
const QString KEY_TITLE = u"title"_qs;
|
||||
const QString KEY_LASTBUILDDATE = u"lastBuildDate"_qs;
|
||||
const QString KEY_ISLOADING = u"isLoading"_qs;
|
||||
const QString KEY_HASERROR = u"hasError"_qs;
|
||||
const QString KEY_ARTICLES = u"articles"_qs;
|
||||
|
||||
using namespace RSS;
|
||||
|
||||
@@ -68,16 +68,16 @@ Feed::Feed(const QUuid &uid, const QString &url, const QString &path, Session *s
|
||||
, m_url(url)
|
||||
{
|
||||
const auto uidHex = QString::fromLatin1(m_uid.toRfc4122().toHex());
|
||||
m_dataFileName = Path(uidHex + QLatin1String(".json"));
|
||||
m_dataFileName = Path(uidHex + u".json");
|
||||
|
||||
// Move to new file naming scheme (since v4.1.2)
|
||||
const QString legacyFilename = Utils::Fs::toValidFileName(m_url, QLatin1String("_")) + QLatin1String(".json");
|
||||
const QString legacyFilename = Utils::Fs::toValidFileName(m_url, u"_"_qs) + u".json";
|
||||
const Path storageDir = m_session->dataFileStorage()->storageDir();
|
||||
const Path dataFilePath = storageDir / m_dataFileName;
|
||||
if (!dataFilePath.exists())
|
||||
Utils::Fs::renameFile((storageDir / Path(legacyFilename)), dataFilePath);
|
||||
|
||||
m_iconPath = storageDir / Path(uidHex + QLatin1String(".ico"));
|
||||
m_iconPath = storageDir / Path(uidHex + u".ico");
|
||||
|
||||
m_parser = new Private::Parser(m_lastBuildDate);
|
||||
m_parser->moveToThread(m_session->workingThread());
|
||||
@@ -323,16 +323,16 @@ void Feed::loadArticles(const QByteArray &data)
|
||||
|
||||
void Feed::loadArticlesLegacy()
|
||||
{
|
||||
const SettingsPtr qBTRSSFeeds = Profile::instance()->applicationSettings(QStringLiteral("qBittorrent-rss-feeds"));
|
||||
const SettingsPtr qBTRSSFeeds = Profile::instance()->applicationSettings(u"qBittorrent-rss-feeds"_qs);
|
||||
const QVariantHash allOldItems = qBTRSSFeeds->value(u"old_items"_qs).toHash();
|
||||
|
||||
for (const QVariant &var : asConst(allOldItems.value(m_url).toList()))
|
||||
{
|
||||
auto hash = var.toHash();
|
||||
// update legacy keys
|
||||
hash[Article::KeyLink] = hash.take(QLatin1String("news_link"));
|
||||
hash[Article::KeyTorrentURL] = hash.take(QLatin1String("torrent_url"));
|
||||
hash[Article::KeyIsRead] = hash.take(QLatin1String("read"));
|
||||
hash[Article::KeyLink] = hash.take(u"news_link"_qs);
|
||||
hash[Article::KeyTorrentURL] = hash.take(u"torrent_url"_qs);
|
||||
hash[Article::KeyIsRead] = hash.take(u"read"_qs);
|
||||
try
|
||||
{
|
||||
auto article = new Article(this, hash);
|
||||
@@ -425,7 +425,7 @@ void Feed::downloadIcon()
|
||||
// Download the RSS Feed icon
|
||||
// XXX: This works for most sites but it is not perfect
|
||||
const QUrl url(m_url);
|
||||
const auto iconUrl = QString::fromLatin1("%1://%2/favicon.ico").arg(url.scheme(), url.host());
|
||||
const auto iconUrl = u"%1://%2/favicon.ico"_qs.arg(url.scheme(), url.host());
|
||||
Net::DownloadManager::instance()->download(
|
||||
Net::DownloadRequest(iconUrl).saveToFile(true).destFileName(m_iconPath)
|
||||
, this, &Feed::handleIconDownloadFinished);
|
||||
|
||||
@@ -399,8 +399,8 @@ namespace
|
||||
{
|
||||
// Check that if date has '-' separators, both separators are '-'.
|
||||
parts = rxMatch.capturedTexts();
|
||||
const bool h1 = (parts[3] == QLatin1String("-"));
|
||||
const bool h2 = (parts[5] == QLatin1String("-"));
|
||||
const bool h1 = (parts[3] == u"-");
|
||||
const bool h2 = (parts[5] == u"-");
|
||||
if (h1 != h2)
|
||||
return QDateTime::currentDateTime();
|
||||
}
|
||||
@@ -476,7 +476,7 @@ namespace
|
||||
if (!ok[0] || !ok[1] || offsetMin > 59)
|
||||
return {};
|
||||
offset += offsetMin * 60;
|
||||
negOffset = (parts[1] == QLatin1String("-"));
|
||||
negOffset = (parts[1] == u"-");
|
||||
if (negOffset)
|
||||
offset = -offset;
|
||||
}
|
||||
@@ -564,12 +564,12 @@ void Parser::parse_impl(const QByteArray &feedData)
|
||||
|
||||
while (xml.readNextStartElement())
|
||||
{
|
||||
if (xml.name() == QLatin1String("rss"))
|
||||
if (xml.name() == u"rss")
|
||||
{
|
||||
// Find channels
|
||||
while (xml.readNextStartElement())
|
||||
{
|
||||
if (xml.name() == QLatin1String("channel"))
|
||||
if (xml.name() == u"channel")
|
||||
{
|
||||
parseRSSChannel(xml);
|
||||
foundChannel = true;
|
||||
@@ -581,7 +581,7 @@ void Parser::parse_impl(const QByteArray &feedData)
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (xml.name() == QLatin1String("feed"))
|
||||
if (xml.name() == u"feed")
|
||||
{ // Atom feed
|
||||
parseAtomChannel(xml);
|
||||
foundChannel = true;
|
||||
@@ -618,43 +618,43 @@ void Parser::parseRssArticle(QXmlStreamReader &xml)
|
||||
xml.readNext();
|
||||
const QString name(xml.name().toString());
|
||||
|
||||
if (xml.isEndElement() && (name == QLatin1String("item")))
|
||||
if (xml.isEndElement() && (name == u"item"))
|
||||
break;
|
||||
|
||||
if (xml.isStartElement())
|
||||
{
|
||||
if (name == QLatin1String("title"))
|
||||
if (name == u"title")
|
||||
{
|
||||
article[Article::KeyTitle] = xml.readElementText().trimmed();
|
||||
}
|
||||
else if (name == QLatin1String("enclosure"))
|
||||
else if (name == u"enclosure")
|
||||
{
|
||||
if (xml.attributes().value(u"type"_qs) == QLatin1String("application/x-bittorrent"))
|
||||
article[Article::KeyTorrentURL] = xml.attributes().value(QLatin1String("url")).toString();
|
||||
if (xml.attributes().value(u"type"_qs) == u"application/x-bittorrent")
|
||||
article[Article::KeyTorrentURL] = xml.attributes().value(u"url"_qs).toString();
|
||||
else if (xml.attributes().value(u"type"_qs).isEmpty())
|
||||
altTorrentUrl = xml.attributes().value(QLatin1String("url")).toString();
|
||||
altTorrentUrl = xml.attributes().value(u"url"_qs).toString();
|
||||
}
|
||||
else if (name == QLatin1String("link"))
|
||||
else if (name == u"link")
|
||||
{
|
||||
const QString text {xml.readElementText().trimmed()};
|
||||
if (text.startsWith(QLatin1String("magnet:"), Qt::CaseInsensitive))
|
||||
if (text.startsWith(u"magnet:", Qt::CaseInsensitive))
|
||||
article[Article::KeyTorrentURL] = text; // magnet link instead of a news URL
|
||||
else
|
||||
article[Article::KeyLink] = text;
|
||||
}
|
||||
else if (name == QLatin1String("description"))
|
||||
else if (name == u"description")
|
||||
{
|
||||
article[Article::KeyDescription] = xml.readElementText(QXmlStreamReader::IncludeChildElements);
|
||||
}
|
||||
else if (name == QLatin1String("pubDate"))
|
||||
else if (name == u"pubDate")
|
||||
{
|
||||
article[Article::KeyDate] = parseDate(xml.readElementText().trimmed());
|
||||
}
|
||||
else if (name == QLatin1String("author"))
|
||||
else if (name == u"author")
|
||||
{
|
||||
article[Article::KeyAuthor] = xml.readElementText().trimmed();
|
||||
}
|
||||
else if (name == QLatin1String("guid"))
|
||||
else if (name == u"guid")
|
||||
{
|
||||
article[Article::KeyId] = xml.readElementText().trimmed();
|
||||
}
|
||||
@@ -679,11 +679,11 @@ void Parser::parseRSSChannel(QXmlStreamReader &xml)
|
||||
|
||||
if (xml.isStartElement())
|
||||
{
|
||||
if (xml.name() == QLatin1String("title"))
|
||||
if (xml.name() == u"title")
|
||||
{
|
||||
m_result.title = xml.readElementText();
|
||||
}
|
||||
else if (xml.name() == QLatin1String("lastBuildDate"))
|
||||
else if (xml.name() == u"lastBuildDate")
|
||||
{
|
||||
const QString lastBuildDate = xml.readElementText();
|
||||
if (!lastBuildDate.isEmpty())
|
||||
@@ -696,7 +696,7 @@ void Parser::parseRSSChannel(QXmlStreamReader &xml)
|
||||
m_result.lastBuildDate = lastBuildDate;
|
||||
}
|
||||
}
|
||||
else if (xml.name() == QLatin1String("item"))
|
||||
else if (xml.name() == u"item")
|
||||
{
|
||||
parseRssArticle(xml);
|
||||
}
|
||||
@@ -714,22 +714,22 @@ void Parser::parseAtomArticle(QXmlStreamReader &xml)
|
||||
xml.readNext();
|
||||
const QString name(xml.name().toString());
|
||||
|
||||
if (xml.isEndElement() && (name == QLatin1String("entry")))
|
||||
if (xml.isEndElement() && (name == u"entry"))
|
||||
break;
|
||||
|
||||
if (xml.isStartElement())
|
||||
{
|
||||
if (name == QLatin1String("title"))
|
||||
if (name == u"title")
|
||||
{
|
||||
article[Article::KeyTitle] = xml.readElementText().trimmed();
|
||||
}
|
||||
else if (name == QLatin1String("link"))
|
||||
else if (name == u"link")
|
||||
{
|
||||
const QString link = (xml.attributes().isEmpty()
|
||||
? xml.readElementText().trimmed()
|
||||
: xml.attributes().value(QLatin1String("href")).toString());
|
||||
: xml.attributes().value(u"href"_qs).toString());
|
||||
|
||||
if (link.startsWith(QLatin1String("magnet:"), Qt::CaseInsensitive))
|
||||
if (link.startsWith(u"magnet:", Qt::CaseInsensitive))
|
||||
article[Article::KeyTorrentURL] = link; // magnet link instead of a news URL
|
||||
else
|
||||
// Atom feeds can have relative links, work around this and
|
||||
@@ -738,7 +738,7 @@ void Parser::parseAtomArticle(QXmlStreamReader &xml)
|
||||
article[Article::KeyLink] = (m_baseUrl.isEmpty() ? link : m_baseUrl + link);
|
||||
|
||||
}
|
||||
else if ((name == QLatin1String("summary")) || (name == QLatin1String("content")))
|
||||
else if ((name == u"summary") || (name == u"content"))
|
||||
{
|
||||
if (doubleContent)
|
||||
{ // Duplicate content -> ignore
|
||||
@@ -755,23 +755,23 @@ void Parser::parseAtomArticle(QXmlStreamReader &xml)
|
||||
doubleContent = true;
|
||||
}
|
||||
}
|
||||
else if (name == QLatin1String("updated"))
|
||||
else if (name == u"updated")
|
||||
{
|
||||
// ATOM uses standard compliant date, don't do fancy stuff
|
||||
const QDateTime articleDate = QDateTime::fromString(xml.readElementText().trimmed(), Qt::ISODate);
|
||||
article[Article::KeyDate] = (articleDate.isValid() ? articleDate : QDateTime::currentDateTime());
|
||||
}
|
||||
else if (name == QLatin1String("author"))
|
||||
else if (name == u"author")
|
||||
{
|
||||
while (xml.readNextStartElement())
|
||||
{
|
||||
if (xml.name() == QLatin1String("name"))
|
||||
if (xml.name() == u"name")
|
||||
article[Article::KeyAuthor] = xml.readElementText().trimmed();
|
||||
else
|
||||
xml.skipCurrentElement();
|
||||
}
|
||||
}
|
||||
else if (name == QLatin1String("id"))
|
||||
else if (name == u"id")
|
||||
{
|
||||
article[Article::KeyId] = xml.readElementText().trimmed();
|
||||
}
|
||||
@@ -795,11 +795,11 @@ void Parser::parseAtomChannel(QXmlStreamReader &xml)
|
||||
|
||||
if (xml.isStartElement())
|
||||
{
|
||||
if (xml.name() == QLatin1String("title"))
|
||||
if (xml.name() == u"title")
|
||||
{
|
||||
m_result.title = xml.readElementText();
|
||||
}
|
||||
else if (xml.name() == QLatin1String("updated"))
|
||||
else if (xml.name() == u"updated")
|
||||
{
|
||||
const QString lastBuildDate = xml.readElementText();
|
||||
if (!lastBuildDate.isEmpty())
|
||||
@@ -812,7 +812,7 @@ void Parser::parseAtomChannel(QXmlStreamReader &xml)
|
||||
m_result.lastBuildDate = lastBuildDate;
|
||||
}
|
||||
}
|
||||
else if (xml.name() == QLatin1String("entry"))
|
||||
else if (xml.name() == u"entry")
|
||||
{
|
||||
parseAtomArticle(xml);
|
||||
}
|
||||
|
||||
@@ -49,9 +49,9 @@
|
||||
#include "rss_item.h"
|
||||
|
||||
const int MsecsPerMin = 60000;
|
||||
const QString CONF_FOLDER_NAME(QStringLiteral("rss"));
|
||||
const QString DATA_FOLDER_NAME(QStringLiteral("rss/articles"));
|
||||
const QString FEEDS_FILE_NAME(QStringLiteral("feeds.json"));
|
||||
const QString CONF_FOLDER_NAME = u"rss"_qs;
|
||||
const QString DATA_FOLDER_NAME = u"rss/articles"_qs;
|
||||
const QString FEEDS_FILE_NAME = u"feeds.json"_qs;
|
||||
|
||||
using namespace RSS;
|
||||
|
||||
@@ -326,7 +326,7 @@ void Session::loadFolder(const QJsonObject &jsonObj, Folder *folder)
|
||||
else
|
||||
{
|
||||
LogMsg(tr("Couldn't load RSS item. Item: \"%1\". Invalid data format.")
|
||||
.arg(QString::fromLatin1("%1\\%2").arg(folder->path(), key)), Log::WARNING);
|
||||
.arg(u"%1\\%2"_qs.arg(folder->path(), key)), Log::WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -347,7 +347,7 @@ void Session::loadLegacy()
|
||||
uint i = 0;
|
||||
for (QString legacyPath : legacyFeedPaths)
|
||||
{
|
||||
if (Item::PathSeparator == QString(legacyPath[0]))
|
||||
if (Item::PathSeparator == legacyPath[0])
|
||||
legacyPath.remove(0, 1);
|
||||
const QString parentFolderPath = Item::parentPath(legacyPath);
|
||||
const QString feedUrl = Item::relativeName(legacyPath);
|
||||
|
||||
Reference in New Issue
Block a user