# Changelog of Kick Streamers Scraper (`badr_xba/kick-streamers-scraper`) Actor

- **URL**: https://apify.com/badr_xba/kick-streamers-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/badr_xba/kick-streamers-scraper.md

## Changelog

### 2026-11-09 (review invitation)

- Successful runs that saved at least one result end their status message with one short, optional invitation to leave a Store review or open an issue (never on failed or empty runs); README section "Feedback and reviews". Output and billing unchanged.

### 2026-11-08 (visual kit 1.1.0)

#### Added

- Inputs `maxViewers` and `maxFollowers` (0 = no maximum, the default) to target small and mid-size creators;
  with *Most watched first*, live pages entirely above the maximum are not counted as empty.
- Output fields `facebookUrl` and `bannerImage` (the channel's own Kick banner), with channel data on.
- Visual report (kit 1.1.0): live progress (channels checked, or streamers saved when browsing), warnings and
  failed inputs grouped by code (`notFound`, `blocked`, `unreadable`, `invalidInput`), data-quality panel, at
  most 3 images per streamer (live preview or banner, avatar, banner).

#### Fixed

- Social links built from what streamers type: "@handle", pasted full URLs and text with spaces no longer give
  broken links such as `x.com/@name` or `facebook.com/https://…`; unusable text gives an empty link (the raw
  text stays in `socialProfiles`).
- The REPORT page is also written when the run crashes (final status FAILED instead of "Running").

### 2026-11-08

#### Added

- **Visual report** (`REPORT` record, Output tab → *Visual report*): one card per streamer with profile picture,
  LIVE badge, viewers, time live, live preview, category, language, followers, bio and social links; key
  figures, charts, search, filters, sorting, table view, full-size viewer and CSV/JSON export of the filtered
  rows. Built by the shared `src/visual_kit.py` (v1.0.1) with this Actor's `src/report.py`. At most 2,000 rows
  are kept in memory for it; it is never billed and a report error is only logged as a warning.
- Dataset views show the profile picture (*Overview*, *Contacts*) and the live preview (*Overview*).
- Output schema: *Rapport visuel* link; key-value store schema: `REPORT` (text/html).

#### Fixed

- `thumbnail` was always empty: Kick's live list gives the preview as `{"src", "srcset"}`, not `{"url"}`. It is
  now read from `src` (720p), `url` still accepted.
- `profilePic` and `thumbnail` are normalized: `//host/…` becomes `https://host/…`, blank or non-http(s) values
  become `null`. Valid links are kept unchanged.

#### Tests

- `tests/test_report.py`: 13 tests on 15 real production rows and 5 rows mapped from the saved live page
  (image ownership, live preview gallery, placeholders, socials, thumbnail fix, URL normalization, escaping,
  a 5,000-row synthetic set, export = embedded data, failure safety).

### 2026-11-07

#### Fixed

- With *US only*, *Minimum followers* or *Verified only*, only the first "remaining" streamers of a listing page were completed; those the filters rejected were not replaced by the next streamers of the same page, which were already marked as seen and lost for the rest of the run. The page is now read in chunks until the maximum is reached (reproduced offline: 3 of 5 requested streamers before, 5 of 5 after).
- Switches sent as text by API clients (`"false"`, `"0"`, `"no"`) are read as off (`usOnly`, `verifiedOnly`, `excludeMature`, `includeFeatured`, `includeChannelDetails`).
- A non-object `proxyConfiguration` is ignored with a warning instead of crashing.

#### Improved

- Without a proxy, one pooled HTTP client is reused (no new TLS handshake for each channel page); with a proxy, each attempt still gets a new client and a new IP.
- Retry pauses have jitter, so parallel retries do not fire in step.
- Every row is checked against the dataset schema types before it is saved; `RUN_SUMMARY` adds `outputTypeMismatches`.
- Log, status and `FAILED_INPUTS` messages are in English, like the README. Data values (such as the `usSignals` labels) are unchanged for existing integrations.
- Local measurements: 15 English streamers 7.4 s → 7.2 s; 10 US-only streamers 5.2 s → 4.3 s (no live page needed after the fix); peak memory ~90 → 81 MB.

#### Schemas and docs

- Dataset field descriptions in English, with notes on columns that are often empty.
- Input schema: `minViewers` / `minFollowers` default 0 and `categoryKeywords` default empty, with "0 keeps everything" in the descriptions.
- README: how filtered streamers are replaced and how retries work.

#### Tests

- `tests/`: offline tests for the Kick mappers on saved API answers, schema checks on real platform rows, US scoring, input parsing, retries / 404 / refusals with a mocked HTTP layer, and whole runs of `main()` with Apify and Kick mocked. Run `python -m pytest -q`.
