diff options
author | Dennis van der Schagt <dennisschagt@gmail.com> | 2022-05-28 12:35:23 +0200 |
---|---|---|
committer | Dennis van der Schagt <dennisschagt@gmail.com> | 2022-05-28 13:12:13 +0200 |
commit | 114381320ec6915e2bb6a1dbd8b57978523c4ae3 (patch) | |
tree | 1b9cc5c1bff103c952c01363de0597d77e6e4b8b /src | |
parent | c769f32bce9c4ff1610c43a876b8e2022caa8e18 (diff) |
Add option to enqueue enclosure URLs from article list
Diffstat (limited to 'src')
-rw-r--r-- | src/itemlistformaction.cpp | 10 | ||||
-rw-r--r-- | src/itemutils.cpp | 46 | ||||
-rw-r--r-- | src/itemviewformaction.cpp | 38 | ||||
-rw-r--r-- | src/keymap.cpp | 2 |
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", |