From ad6ead026e19f0cd2fae963bfd7eef889254ab42 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 20 Aug 2025 20:43:54 +0530 Subject: [PATCH] Fetch news: Add a sub-menu to the right click menu of the Fetch news button that shows recently downloaded news sources. See #2119557 ([Enhancement] Star news) --- src/calibre/gui2/dialogs/scheduler.py | 32 +++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/calibre/gui2/dialogs/scheduler.py b/src/calibre/gui2/dialogs/scheduler.py index 20b4563426..28c5b2021c 100644 --- a/src/calibre/gui2/dialogs/scheduler.py +++ b/src/calibre/gui2/dialogs/scheduler.py @@ -11,6 +11,7 @@ import textwrap from collections import OrderedDict from contextlib import suppress from datetime import timedelta +from functools import lru_cache, partial from qt.core import ( QAction, @@ -52,6 +53,7 @@ from calibre import force_unicode from calibre.gui2 import config as gconf from calibre.gui2 import error_dialog, gprefs from calibre.gui2.search_box import SearchBox2 +from calibre.utils.config import JSONConfig from calibre.utils.date import utcnow from calibre.utils.localization import canonicalize_lang, get_lang from calibre.utils.network import internet_connected @@ -59,6 +61,11 @@ from calibre.web.feeds.recipes.model import RecipeModel from polyglot.builtins import iteritems +@lru_cache(2) +def sprefs(): + return JSONConfig('recipe-scheduler') + + def convert_day_time_schedule(val): day_of_week, hour, minute = val if day_of_week == -1: @@ -640,6 +647,10 @@ class Scheduler(QObject): QIcon.ic('download-metadata.png'), _('Download all scheduled news sources'), self.download_all_scheduled) + self.recent_menu = m = QMenu(_('Redownload...')) + m.addAction('dummy') + m.aboutToShow.connect(self.populate_recent_menu) + self.news_menu.addMenu(m) self.timer = QTimer(self) self.timer.start(int(self.INTERVAL * 60 * 1000)) @@ -647,6 +658,20 @@ class Scheduler(QObject): self.oldest = gconf['oldest_news'] QTimer.singleShot(5 * 1000, self.oldest_check) + def populate_recent_menu(self): + m: QMenu = self.recent_menu + m.clear() + p = sprefs() + history = p.get('history', ()) + if history: + for arg in reversed(history): + ac = QAction(arg['title'], m) + m.addAction(ac) + ac.triggered.connect(partial(self.download, arg['urn'])) + else: + nrdnac = QAction(_('No recently downloaded news'), m) + m.addAction(nrdnac) + @property def db(self): from calibre.gui2.ui import get_gui @@ -719,6 +744,13 @@ class Scheduler(QObject): def recipe_downloaded(self, arg): self.lock.lock() + p = sprefs() + history = p.get('history', []) + history = [a for a in history if a['urn'] != arg['urn']] + history.append(arg) + if len(history) > (limit := 20): + history = history[len(history)-limit:] + p.set('history', history) try: self.recipe_model.update_last_downloaded(arg['urn']) self.download_queue.remove(arg['urn'])