mirror of
https://github.com/Glitchy-Sheep/boosty-downloader.git
synced 2026-10-14 21:33:23 +00:00
[PR #179] [MERGED] [downloader] Blog overview in check, download --dry-run and run statistics #179
Labels
No labels
api-drift
bug
ci
documentation
enhancement
enhancement
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Glitchy-Sheep/boosty-downloader#179
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📋 Pull Request Information
Original PR: https://github.com/Glitchy-Sheep/boosty-downloader/pull/179
Author: @Glitchy-Sheep
Created: 9/13/2026
Status: ✅ Merged
Merged: 9/13/2026
Merged by: @Glitchy-Sheep
Base:
main← Head:feat/blog-overview📝 Commits (2)
b0d7107feat: Add check overview and download --dry-runb7c44eefeat: Print run statistics at the end of a download📊 Changes
42 files changed (+2059 additions, -120 deletions)
View changed files
📝
CHANGELOG.md(+6 -0)📝
README.md(+3 -1)➕
boosty_downloader/application/blog_overview.py(+166 -0)📝
boosty_downloader/application/di/download_context.py(+4 -1)➕
boosty_downloader/application/download_plan.py(+150 -0)📝
boosty_downloader/application/filtering.py(+39 -0)📝
boosty_downloader/application/mappers/audio.py(+1 -0)📝
boosty_downloader/application/mappers/file.py(+1 -0)📝
boosty_downloader/application/mappers/image.py(+1 -0)➕
boosty_downloader/application/run_statistics.py(+33 -0)📝
boosty_downloader/application/use_cases/check_total_posts.py(+23 -70)📝
boosty_downloader/application/use_cases/download_all_posts.py(+4 -1)📝
boosty_downloader/application/use_cases/download_single_post.py(+57 -19)➕
boosty_downloader/application/use_cases/listing_walk.py(+73 -0)➕
boosty_downloader/application/use_cases/plan_download.py(+77 -0)➕
boosty_downloader/cli/blog_overview_rendering.py(+115 -0)📝
boosty_downloader/cli/cli_options.py(+10 -0)📝
boosty_downloader/cli/commands/check.py(+14 -4)📝
boosty_downloader/cli/commands/download.py(+68 -7)➕
boosty_downloader/cli/download_plan_rendering.py(+54 -0)...and 22 more files
📄 Description
📝 Summary
Three things the tool now tells you that it kept to itself before: what a blog holds (
check), what a download run would fetch before you start it (download --dry-run), and what a run actually did once it ends (a statistics block).🔧 What changes
checkprints an overview instead of three numbers: posts grouped by how they unlock (free, each subscription tier with its price, posts sold one by one), media counts by type, the posting date range and the titles this account cannot open.download --dry-runshows the same overview plus the plan: new, updated and already complete posts, media to fetch by type and the known size. Nothing is downloaded and the cache is not touched.Every
downloadrun ends with statistics - also after a systemic stop or Ctrl+C:A rerun over a cached blog stays short:
Run finished in 41s: nothing new to download.🧩 How it works
PostDTOreadssubscriptionLevel,price,currencyPricesand media sizes. All tolerant: a missing or malformed value defaults instead of failing the post, because this DTO is shared with the download path. Prices are grouped by the RUB value fromcurrencyPrices: the barepricecomes in the account's display currency, so two accounts would see the same tier priced differently.summarize_postsbuilds the overview from the listing alone, no extra API calls. Rendering lives in the CLI; author text is markup-escaped, so a title like[запись]cannot break or crash the output.filtering.pyso both share one definition. Metadata walks list 100 posts per page (MAX_POSTS_PER_PAGE): they touch no signed media links.DownloadContext. Media is counted once per post: only the attempt that finishes lands in the totals, so a clean run matches its dry-run plan.gatherleft the sibling downloads running. They raced the retry of the same post and died at interpreter exit withTask exception was never retrieved. Now the siblings are cancelled and awaited before the error surfaces.🧪 Tests
check,--dry-run, a full run and a rerun. The dry-run plan minus the one post that fails on the platform side equals the run statistics; no tracebacks at exit.✅ Checklist
--helpand README if neededdocs/if the download flow or dev process changed## Unreleasedin CHANGELOG.md (or theci/skip-changeloglabel if not user-facing)🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.