summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDennis van der Schagt <dennisschagt@gmail.com>2022-05-28 12:35:23 +0200
committerDennis van der Schagt <dennisschagt@gmail.com>2022-05-28 13:12:13 +0200
commit114381320ec6915e2bb6a1dbd8b57978523c4ae3 (patch)
tree1b9cc5c1bff103c952c01363de0597d77e6e4b8b /src
parentc769f32bce9c4ff1610c43a876b8e2022caa8e18 (diff)
Add option to enqueue enclosure URLs from article list
Diffstat (limited to 'src')
-rw-r--r--src/itemlistformaction.cpp10
-rw-r--r--src/itemutils.cpp46
-rw-r--r--src/itemviewformaction.cpp38
-rw-r--r--src/keymap.cpp2
4 files changed, 60 insertions, 36 deletions
diff --git a/src/itemlistformaction.cpp b/src/itemlistformaction.cpp
index 8985848c..6d9a5b5c 100644
--- a/src/itemlistformaction.cpp
+++ b/src/itemlistformaction.cpp
@@ -14,6 +14,7 @@
#include "dbexception.h"
#include "fmtstrformatter.h"
#include "formaction.h"
+#include "itemutils.h"
#include "logger.h"
#include "matcherexception.h"
#include "rssfeed.h"
@@ -752,6 +753,15 @@ bool ItemListFormAction::process_operation(Operation op,
}
}
break;
+ case OP_ENQUEUE:
+ if (!visible_items.empty() && itempos < visible_items.size()) {
+ const auto item = visible_items[itempos].first;
+ return EnqueueItemEnclosure(item, feed, *v, *rsscache);
+ } else {
+ v->get_statusline().show_error(_("No item selected"));
+ return false;
+ }
+ break;
default:
ListFormAction::process_operation(op, automatic, args);
break;
diff --git a/src/itemutils.cpp b/src/itemutils.cpp
new file mode 100644
index 00000000..0fc02406
--- /dev/null
+++ b/src/itemutils.cpp
@@ -0,0 +1,46 @@
+#include "itemutils.h"
+
+namespace newsboat {
+
+bool EnqueueItemEnclosure(std::shared_ptr<RssItem> item, std::shared_ptr<RssFeed> feed,
+ View& v, Cache& cache)
+{
+ if (item->enclosure_url().empty()) {
+ v.get_statusline().show_error(_("Item has no enclosures."));
+ return false;
+ } else if (!utils::is_http_url(item->enclosure_url())) {
+ v.get_statusline().show_error(strprintf::fmt(
+ _("Item's enclosure has non-http link: '%s'"), item->enclosure_url()));
+ return false;
+ } else {
+ const EnqueueResult result = v.get_ctrl()->enqueue_url(item, feed);
+ cache.update_rssitem_unread_and_enqueued(item, feed->rssurl());
+ switch (result.status) {
+ case EnqueueStatus::QUEUED_SUCCESSFULLY:
+ v.get_statusline().show_message(
+ strprintf::fmt(_("Added %s to download queue."),
+ item->enclosure_url()));
+ return true;
+ case EnqueueStatus::URL_QUEUED_ALREADY:
+ v.get_statusline().show_message(
+ strprintf::fmt(_("%s is already queued."),
+ item->enclosure_url()));
+ return true; // Not a failure, just an idempotent action
+ case EnqueueStatus::OUTPUT_FILENAME_USED_ALREADY:
+ v.get_statusline().show_error(
+ strprintf::fmt(_("Generated filename (%s) is used already."),
+ result.extra_info));
+ return false;
+ case EnqueueStatus::QUEUE_FILE_OPEN_ERROR:
+ v.get_statusline().show_error(
+ strprintf::fmt(_("Failed to open queue file: %s."), result.extra_info));
+ return false;
+ }
+
+ // Not reachable, all switch cases return a result already,
+ // and compiler will warn if a switch case is missing.
+ return false;
+ }
+}
+
+} // namespace newsboat
diff --git a/src/itemviewformaction.cpp b/src/itemviewformaction.cpp
index f8f6a5e5..7ad64135 100644
--- a/src/itemviewformaction.cpp
+++ b/src/itemviewformaction.cpp
@@ -10,6 +10,7 @@
#include "fmtstrformatter.h"
#include "itemlistformaction.h"
#include "itemrenderer.h"
+#include "itemutils.h"
#include "htmlrenderer.h"
#include "logger.h"
#include "rssfeed.h"
@@ -202,41 +203,8 @@ bool ItemViewFormAction::process_operation(Operation op,
show_source = !show_source;
do_redraw = true;
break;
- case OP_ENQUEUE: {
- if (item->enclosure_url().empty()) {
- v->get_statusline().show_error(_("Item has no enclosures."));
- return false;
- } else if (!utils::is_http_url(item->enclosure_url())) {
- v->get_statusline().show_error(strprintf::fmt(
- _("Item's enclosure has non-http link: '%s'"), item->enclosure_url()));
- return false;
- } else {
- const EnqueueResult result = v->get_ctrl()->enqueue_url(item, feed);
- rsscache->update_rssitem_unread_and_enqueued(item, feed->rssurl());
- switch (result.status) {
- case EnqueueStatus::QUEUED_SUCCESSFULLY:
- v->get_statusline().show_message(
- strprintf::fmt(_("Added %s to download queue."),
- item->enclosure_url()));
- return true;
- case EnqueueStatus::URL_QUEUED_ALREADY:
- v->get_statusline().show_message(
- strprintf::fmt(_("%s is already queued."),
- item->enclosure_url()));
- return true; // Not a failure, just an idempotent action
- case EnqueueStatus::OUTPUT_FILENAME_USED_ALREADY:
- v->get_statusline().show_error(
- strprintf::fmt(_("Generated filename (%s) is used already."),
- result.extra_info));
- return false;
- case EnqueueStatus::QUEUE_FILE_OPEN_ERROR:
- v->get_statusline().show_error(
- strprintf::fmt(_("Failed to open queue file: %s."), result.extra_info));
- return false;
- }
- }
- }
- break;
+ case OP_ENQUEUE:
+ return EnqueueItemEnclosure(item, feed, *v, *rsscache);
case OP_SAVE: {
LOG(Level::INFO, "ItemViewFormAction::process_operation: saving article");
std::string filename;
diff --git a/src/keymap.cpp b/src/keymap.cpp
index d417d63a..6d47457c 100644
--- a/src/keymap.cpp
+++ b/src/keymap.cpp
@@ -202,7 +202,7 @@ static const std::vector<OpDesc> opdescs = {
},
{OP_GOTO_URL, "goto-url", "#", translatable("Goto URL #"), KM_ARTICLE},
{OP_GOTO_TITLE, "goto-title", "", translatable("Goto item with title"), KM_FEEDLIST | KM_ARTICLELIST | KM_SEARCHRESULTSLIST},
- {OP_ENQUEUE, "enqueue", "e", translatable("Add download to queue"), KM_ARTICLE},
+ {OP_ENQUEUE, "enqueue", "e", translatable("Add download to queue"), KM_ARTICLELIST | KM_SEARCHRESULTSLIST | KM_ARTICLE},
{
OP_RELOADURLS,
"reload-urls",