## 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.