- Add delete button (SVG X, hover-reveal) and confirmation modal to comic cards
- Add DELETE /api/comics/delete endpoint with path traversal protection
- Fix container downloads: delegate Cloudflare-blocked requests to FlareSolverr
(headless Chrome sidecar) instead of retrying with Go HTTP client, whose Linux
TCP fingerprint is flagged by Cloudflare even with network_mode: host
- Add FlareSolverr service to docker-compose; inject FLARESOLVERR_URL env var
- Add diagnostic logging to BatcaveBizMarkup request flow
- Trim URL whitespace before storing in download job
- Guard Archive() against empty filelist; fix runJob error-check ordering
## What changed
- `BatcaveBizMarkup` now accepts a `clientChan chan *http.Client` and
sends the authenticated cookie jar client back to the caller after
completing the Cloudflare challenge flow. All error paths send nil so
the caller never blocks.
- `Comic` struct gains a `Client *http.Client` field. `NewComic` wires
up the channel, receives the client, and stores it so downstream code
can reuse the same authenticated session.
- `downloadFile` branches on `c.Client`: when set it builds the request
manually and only attaches a `Referer: https://batcave.biz/` header
when the image URL is actually on batcave.biz. Some issues host images
on third-party CDNs (e.g. readcomicsonline.ru) that actively block
requests with a batcave Referer, returning 403 — omitting the header
fixes those.
- `ParseBatcaveBizTitle` extracts the chapter title from the
`__DATA__.chapters` JSON array by matching the chapter ID in the URL's
last path segment. The HTML `<title>` on batcave.biz is prefixed with
"Read " and suffixed with "comics online for free", making it
unsuitable as a filename. Using the chapter data gives clean titles
like "Nightwing (1996) 153". "Issue #" and bare "#" are stripped since
the hash character causes problems on some filesystems and tools.
- `ParseBatcaveBizImageLinks` now unescapes `\/` → `/` in extracted
URLs. The `__DATA__` JSON often contains forward-slash-escaped URLs
that would otherwise be stored verbatim.
- `archive.go`: `filepath.Walk` was called on `filepath.Dir(sourcePath)`
(the library root) instead of `sourcePath` (the comic's own folder).
This caused any leftover image files from previous downloads in sibling
directories to be included in every new CBZ. Fixed by walking
`sourcePath` directly.
- `BatcaveBizMarkup` client now has a 30s `Timeout`. Without it, a
single stalled CDN connection would hang the worker goroutine
indefinitely, causing `Download()` to block forever waiting for a
result that never arrives.
- Fixed `for e := range err` in `cli/root.go` — ranging over `[]error`
with one variable yields the index, not the error value.
When readallcomics.com pages have a <title> containing only the issue
number (e.g. '#018 (2026)'), fall back to the h1 element first, then
derive the title from the URL slug by stripping the trailing year and
title-casing the hyphen-separated segments.
Closes#4
Add tag, gitea-release, and release targets to encode the corrected
versioning process (no v-prefix). VERSION is now overridable via the
command line for use in make release VERSION=x.y.z.
- Add mobile/tablet responsive breakpoints to web UI
- Redesign cards as full-bleed poster layout with gradient overlay
- Add skeleton loading state, comic count badge, and search icon
- Switch to Docker image format for registry compatibility
- Add docker-build and docker-push Makefile targets with versioned tags
- Update README to document web UI, Docker deployment, and serve command
Adds a `yoink serve` command that starts an HTTP server with a
Sonarr/MeTube-inspired dark UI. Features a URL input bar for
triggering downloads, a 150x300 cover grid with filter and sort
controls, a live download queue strip, and toast notifications.
Includes Dockerfile (multi-stage, distroless runtime) and
docker-compose.yml for easy deployment.