Refresh Cycle
Last updated
This page explains the full order of one update check: trigger, new-article detection, background full-text extraction, and digest generation.
Triggers
| Source | Call | Status bar |
|---|---|---|
| Launch | Run() → getList(false) |
Loading... |
Ctrl+R |
getList(true) |
Checking... |
| Auto check | 5-minute ticker → getList(true) |
Refreshing... → Checking... |
The auto check starts as soon as New() creates the ticker and has no off switch; stopRefresh() stops the ticker when the program exits.
Check Steps
getList() runs these steps in a background goroutine:
| Step | Action |
|---|---|
| 1 | If the list is empty, show articles from the last 72 hours via database.Get(72) first |
| 2 | Collector.GetNews() fetches every active feed and returns articles within 72 hours |
| 3 | Look up each article with GetFromURL(): not found counts as new; found reuses the stored publish time |
| 4 | Sort newest first and update News List |
| 5 | When there are new articles, run loadContent() in another goroutine |
Step 3 reuses the stored time because an RSS item without a parseable pubDate falls back to the current time, which would drift on every check.
Background Full-Text Extraction
loadContent() handles each article from this fetch:
| Condition | Action |
|---|---|
| Full text already stored | Skip |
| Extraction succeeds | Store the article and full text, update progress, wait 500ms before the next one |
| Extraction fails | Store the article with empty full text, log it, and move on immediately |
Articles with empty full text are retried on the next check. When every article is processed, the LLM Digest runs.
Extraction on Preview
Moving through News List triggers showPreview() for a single article:
| Condition | Display |
|---|---|
| Full text already stored | Show the full text directly |
| No stored full text, live extraction succeeds | Show the full text and store it in the background |
| Live extraction fails | Show the RSS description |