Add 'Refresh all' button to podcast toolbar
All checks were successful
Build and push Docker image / build (push) Successful in 13s
Test / test (push) Successful in 15s

Shows live progress counter (↻ 3/42) while fetching feeds sequentially,
then reloads the current view when done.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Marwin Schulz 2026-03-20 09:18:38 +01:00
parent 74bebe6451
commit 4f413c673e
2 changed files with 22 additions and 0 deletions

View file

@ -1939,6 +1939,27 @@ async function refreshOpenFeed(btn) {
if (btn) { btn.disabled = false; btn.textContent = '↻ Refresh'; } if (btn) { btn.disabled = false; btn.textContent = '↻ Refresh'; }
} }
async function refreshAllFeedsBtn(btn) {
if (btn) { btn.disabled = true; btn.textContent = '↻ 0/' + podcastFeeds.length; }
let done = 0;
for (const feed of podcastFeeds) {
try {
await fetch('/podcasts/feeds/refresh/', {
method: 'POST',
headers: {'Content-Type': 'application/json', 'X-CSRFToken': getCsrfToken()},
body: JSON.stringify({feed_id: feed.id}),
});
} catch (e) {}
done++;
if (btn) btn.textContent = `${done}/${podcastFeeds.length}`;
}
await loadFeedList();
if (podcastCurrentView === 'feeds') renderFeedList();
if (podcastCurrentView === 'inbox') loadAndRenderInbox();
if (podcastCurrentView === 'episodes' && podcastCurrentFeedId) openFeed(podcastCurrentFeedId);
if (btn) { btn.disabled = false; btn.textContent = '↻ All'; }
}
async function refreshAllFeeds() { async function refreshAllFeeds() {
if (!IS_AUTHENTICATED || !podcastFeeds.length) return; if (!IS_AUTHENTICATED || !podcastFeeds.length) return;
for (const feed of podcastFeeds) { for (const feed of podcastFeeds) {

View file

@ -231,6 +231,7 @@
<button class="btn btn-sm" onclick="showPodcastView('inbox')">Inbox</button> <button class="btn btn-sm" onclick="showPodcastView('inbox')">Inbox</button>
<button class="btn btn-sm" onclick="showPodcastView('queue')">Queue</button> <button class="btn btn-sm" onclick="showPodcastView('queue')">Queue</button>
<button class="btn btn-sm" onclick="podcastSearchOpen()">+ Search</button> <button class="btn btn-sm" onclick="podcastSearchOpen()">+ Search</button>
<button class="btn btn-sm" id="refresh-all-btn" onclick="refreshAllFeedsBtn(this)" title="Refresh all feeds">↻ All</button>
<label class="btn btn-sm" for="opml-file-input">Import OPML</label> <label class="btn btn-sm" for="opml-file-input">Import OPML</label>
<input type="file" id="opml-file-input" accept=".opml,.xml" style="display:none;" onchange="importOPML(this)"> <input type="file" id="opml-file-input" accept=".opml,.xml" style="display:none;" onchange="importOPML(this)">
<span id="opml-status" class="muted"></span> <span id="opml-status" class="muted"></span>