From 5a65580169dda8114589b367e825f8ab6a23ff33 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 24 Jun 2012 10:27:32 +0300 Subject: [PATCH] Add support for RSS feeds using magnet links (Closes #1016379) --- src/mainwindow.cpp | 11 +++++++++ src/mainwindow.h | 1 + src/qtlibtorrent/qbtsession.cpp | 7 +++++- src/qtlibtorrent/qbtsession.h | 4 +++- src/rss/rss_imp.cpp | 41 ++++++++++++++++++++------------- src/rss/rssfeed.cpp | 5 +++- 6 files changed, 50 insertions(+), 19 deletions(-) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 823f74ced..dcc5d4a2f 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -145,6 +145,7 @@ MainWindow::MainWindow(QWidget *parent, const QStringList& torrentCmdLine) : QMa connect(QBtSession::instance(), SIGNAL(finishedTorrent(QTorrentHandle)), this, SLOT(finishedTorrent(QTorrentHandle))); connect(QBtSession::instance(), SIGNAL(trackerAuthenticationRequired(QTorrentHandle)), this, SLOT(trackerAuthenticationRequired(QTorrentHandle))); connect(QBtSession::instance(), SIGNAL(newDownloadedTorrent(QString, QString)), this, SLOT(processDownloadedFiles(QString, QString))); + connect(QBtSession::instance(), SIGNAL(newMagnetLink(QString)), this, SLOT(processNewMagnetLink(QString))); connect(QBtSession::instance(), SIGNAL(downloadFromUrlFailure(QString, QString)), this, SLOT(handleDownloadFromUrlFailure(QString, QString))); connect(QBtSession::instance(), SIGNAL(alternativeSpeedsModeChanged(bool)), this, SLOT(updateAltSpeedsBtn(bool))); connect(QBtSession::instance(), SIGNAL(recursiveTorrentDownloadPossible(QTorrentHandle)), this, SLOT(askRecursiveTorrentDownloadConfirmation(QTorrentHandle))); @@ -979,6 +980,16 @@ void MainWindow::processDownloadedFiles(QString path, QString url) { QBtSession::instance()->addTorrent(path, false, url); } +void MainWindow::processNewMagnetLink(const QString& link) +{ + QIniSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + const bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool(); + if (useTorrentAdditionDialog) + AddNewTorrentDialog::showMagnet(link); + else + QBtSession::instance()->addMagnetUri(link); +} + void MainWindow::optionsSaved() { loadPreferences(); } diff --git a/src/mainwindow.h b/src/mainwindow.h index 97d8516e8..8a813fe45 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -129,6 +129,7 @@ protected slots: void addTorrent(QString path); void addUnauthenticatedTracker(const QPair &tracker); void processDownloadedFiles(QString path, QString url); + void processNewMagnetLink(const QString& link); void finishedTorrent(const QTorrentHandle& h) const; void askRecursiveTorrentDownloadConfirmation(const QTorrentHandle &h); // Options slots diff --git a/src/qtlibtorrent/qbtsession.cpp b/src/qtlibtorrent/qbtsession.cpp index abc987ba2..540af4a06 100644 --- a/src/qtlibtorrent/qbtsession.cpp +++ b/src/qtlibtorrent/qbtsession.cpp @@ -2642,7 +2642,12 @@ void QBtSession::downloadFromURLList(const QStringList& urls) { } } -void QBtSession::addMagnetSkipAddDlg(QString uri) { +void QBtSession::addMagnetInteractive(const QString& uri) +{ + emit newMagnetLink(uri); +} + +void QBtSession::addMagnetSkipAddDlg(const QString& uri) { addMagnetUri(uri, false); } diff --git a/src/qtlibtorrent/qbtsession.h b/src/qtlibtorrent/qbtsession.h index 07ae8b0be..e3fe33b2d 100644 --- a/src/qtlibtorrent/qbtsession.h +++ b/src/qtlibtorrent/qbtsession.h @@ -161,7 +161,8 @@ public slots: #endif void addPeerBanMessage(QString msg, bool from_ipfilter); void processDownloadedFile(QString, QString); - void addMagnetSkipAddDlg(QString uri); + void addMagnetSkipAddDlg(const QString& uri); + void addMagnetInteractive(const QString& uri); void downloadFromURLList(const QStringList& urls); void configureSession(); void banIP(QString ip); @@ -202,6 +203,7 @@ signals: void trackerError(const QString &hash, QString time, QString msg); void trackerAuthenticationRequired(const QTorrentHandle& h); void newDownloadedTorrent(QString path, QString url); + void newMagnetLink(const QString& link); void updateFileSize(const QString &hash); void downloadFromUrlFailure(QString url, QString reason); void torrentFinishedChecking(const QTorrentHandle& h); diff --git a/src/rss/rss_imp.cpp b/src/rss/rss_imp.cpp index d31cf6e36..8c1907895 100644 --- a/src/rss/rss_imp.cpp +++ b/src/rss/rss_imp.cpp @@ -326,23 +326,32 @@ void RSSImp::downloadTorrent() { foreach (const QListWidgetItem* item, selected_items) { RssArticlePtr article = m_feedList->getRSSItemFromUrl(item->data(Article::FeedUrlRole).toString()) ->getItem(item->data(Article::IdRole).toString()); - // Load possible cookies - QList cookies; - QString feed_url = m_feedList->getItemID(m_feedList->selectedItems().first()); - QString feed_hostname = QUrl::fromEncoded(feed_url.toUtf8()).host(); - const QList raw_cookies = RssSettings().getHostNameCookies(feed_hostname); - foreach (const QByteArray& raw_cookie, raw_cookies) { - QList cookie_parts = raw_cookie.split('='); - if (cookie_parts.size() == 2) { - qDebug("Loading cookie: %s = %s", cookie_parts.first().constData(), cookie_parts.last().constData()); - cookies << QNetworkCookie(cookie_parts.first(), cookie_parts.last()); + + QString torrentLink; + if (article->hasAttachment()) + torrentLink = article->torrentUrl(); + else + torrentLink = article->link(); + + // Check if it is a magnet link + if (torrentLink.startsWith("magnet:", Qt::CaseInsensitive)) + QBtSession::instance()->addMagnetInteractive(torrentLink); + else { + // Load possible cookies + QList cookies; + QString feed_url = m_feedList->getItemID(m_feedList->selectedItems().first()); + QString feed_hostname = QUrl::fromEncoded(feed_url.toUtf8()).host(); + const QList raw_cookies = RssSettings().getHostNameCookies(feed_hostname); + foreach (const QByteArray& raw_cookie, raw_cookies) { + QList cookie_parts = raw_cookie.split('='); + if (cookie_parts.size() == 2) { + qDebug("Loading cookie: %s = %s", cookie_parts.first().constData(), cookie_parts.last().constData()); + cookies << QNetworkCookie(cookie_parts.first(), cookie_parts.last()); + } } - } - qDebug("Loaded %d cookies for RSS item\n", cookies.size()); - if (article->hasAttachment()) { - QBtSession::instance()->downloadFromUrl(article->torrentUrl(), cookies); - } else { - QBtSession::instance()->downloadFromUrl(article->link(), cookies); + qDebug("Loaded %d cookies for RSS item\n", cookies.size()); + + QBtSession::instance()->downloadFromUrl(torrentLink, cookies); } } } diff --git a/src/rss/rssfeed.cpp b/src/rss/rssfeed.cpp index 44e893461..b615f791a 100644 --- a/src/rss/rssfeed.cpp +++ b/src/rss/rssfeed.cpp @@ -295,7 +295,10 @@ void RssFeed::downloadMatchingArticleTorrents() { // Download the torrent QString torrent_url = article->hasAttachment() ? article->torrentUrl() : article->link(); QBtSession::instance()->addConsoleMessage(tr("Automatically downloading %1 torrent from %2 RSS feed...").arg(article->title()).arg(displayName())); - QBtSession::instance()->downloadUrlAndSkipDialog(torrent_url, matching_rule->savePath(), matching_rule->label()); + if (torrent_url.startsWith("magnet:", Qt::CaseInsensitive)) + QBtSession::instance()->addMagnetSkipAddDlg(torrent_url); + else + QBtSession::instance()->downloadUrlAndSkipDialog(torrent_url, matching_rule->savePath(), matching_rule->label()); } } }