# Changelog of Image Scraper - Download All Images From Site (`logiover/website-image-media-extractor`) Actor

- **URL**: https://apify.com/logiover/website-image-media-extractor/changelog.md
- **Full Actor documentation**: https://apify.com/logiover/website-image-media-extractor.md

## Changelog

### 2026-09-23

- Fleet-wide quality audit. Verified end to end against live data and re-checked the input schema, the output columns and the run configuration.
- Output verified on a live run: 171 row(s) across 12 columns, 73.1% of cells populated.
- Run reliability reviewed: 100.0% of public runs succeeded in the last 30 days.
- Input schema, output schema and pricing configuration reviewed.
- Noted that 1 column(s) came back empty in this sample (`title`); these are under review.

### 2026-09-11

- **Duplicate results fixed.** Reported via the Issues tab: the same image came back several times from one page even with **Unique assets only** enabled. The de-duplicator compared raw URL strings, but one picture is referenced through a whole family of them — every `srcset` width, `<picture>` variant, CDN rendition (`?w=`, `?width=`, `?resize=`), image proxies such as `/_next/image?url=…` and Jetpack's `i0.wp.com/<site>/…`, and `-300x200` filename suffixes. Different strings, same file, so every rendition billed as its own result. Assets are now compared by identity, so the whole family collapses into one row. Measured over 13 live sites: **2,324 → 857 results (63% fewer), with no asset lost** — 95% fewer on The Verge, 83% on Unsplash, 70% on wordpress.org/news.
- `mediaUrl` now carries the **largest available version** of each asset rather than whichever rendition happened to be parsed first, and the new **`variantCount`** field reports how many URLs were merged into that row.
- Added the input **Merge resized copies of the same image** (default on). Turn it off to receive every URL separately, exactly as before.
- **Fixed `srcset` parsing.** Candidates were split on every comma, which cut URLs that legitimately contain one (`?resize=225,169`, Cloudinary `w_300,h_200`) in half — and chopped inline `data:image/…;base64,…` URIs into multi-kilobyte nonsense URLs that were billed as results. Parsing now follows the HTML specification.
- **Lazy-loaded images are no longer missed.** Sites that keep a spacer in `src` and the real image in `data-srcset` / `data-src` now return the actual photos: one news homepage went from 9 assets to 34, with alt-text coverage rising from 3 rows to 31. Alt text follows the real image when `src` is a spacer.
- **Spacers and 1×1 tracking pixels are dropped** instead of consuming a result. The rule is deliberately strict, so photos that merely contain words like `pixel` or `gray` in the filename are untouched.
- **Reliability.** Results are written one batch per page; a single unsaveable row is skipped with a warning instead of failing the run; assets are marked as seen only once genuinely saved, so a transient write error no longer silently drops a page's results; a platform migration mid-crawl no longer re-emits assets already delivered; and tracking parameters (`utm_*`, `fbclid`, `gclid`, …) are stripped when following links so the same page is not crawled twice.

### 2026-09-01

- Fleet-wide health check. Verified against this Actor's real run history: 30-day success rate, output row counts, per-field fill rates, and peak memory against the configured memory limit.
- Reviewed for the failure patterns that have cost this fleet runs — unguarded proxy setup, retry loops that can outlast the run's own time budget, and full-page HTML parsing that can exhaust a small container.
- No change to input, output fields or scraping logic.

### 2026-08-11

- Maintenance release: refreshed the build and dependencies.
- Re-verified live execution, non-empty structured output and dataset field/type integrity.
- Reviewed reliability (retries, pagination) and output quality as part of a full-fleet QA pass.

### 2026-08-01

- Monthly matrix review confirmed that a reachable text-only page can legitimately yield zero media; refreshed the alternate check to an image-rich Books to Scrape category and verified 309 unique media rows across 20 pages.
- Completed the August 2026 full health check: verified empty/programmatic default, Console UI default, and two source-informed alternative inputs on Apify.
- Confirmed successful live execution, non-empty structured output, dataset-field/type integrity, and logical sample quality within the 5-minute quality window.
- Replaced the text-only quotes.toscrape.com variation with an image-rich Books to Scrape category; the exact 20-page input produced 309 unique image/icon rows, while preserving legitimate zero-media semantics for reachable pages with no requested assets.

### 2026-07-30

- Quality-test fix: lightened the default demo run (prefilled **Max pages** 1000 → 150) and tightened the crawl time budget to ~3 minutes, so the Actor finishes and returns data comfortably inside the platform's 5-minute automated test window even on large sites. Whole-site crawling is unchanged — raise **Max pages** (0 = no limit) and the run timeout to go deeper.

### 2026-07-18

- Maintenance & reliability pass — re-verified end-to-end against live data via the Apify API; confirmed the Actor completes successfully and returns non-empty, well-formed results within the 5-minute quality window on its default input.
- Refreshed build so the latest version is current; no change to inputs, output fields or scraping logic.

### 2026-07-12

- Empty input now works: running with no Start URLs crawls a sensible default site (books.toscrape.com) instead of erroring, so a bare `{}` returns data.
- No field is required anymore — every input is optional.
- Added a **Crawl scope** dropdown (same domain / include subdomains / single page only) for precise control over how far the crawler follows links.
- Routes requests through Apify Proxy (automatic) by default, with a configurable proxy option.
- Image **Width** and **Height** are now real numbers instead of text; non-numeric values (e.g. "100%") are stored as null.
- Documented every output field (title + description) in the dataset schema.
- Added a ~4-minute time budget so large sites finish gracefully and still save every asset found; the run no longer hard-fails on crawl errors.

### 2026-06-28

- Health check passed — actor verified working end-to-end on Apify platform.
- Changelog refreshed for Store quality compliance.

### 2026-06-20

- Maintenance & reliability pass: re-verified end-to-end against live data and confirmed the Actor completes successfully within the 5-minute quality window on the default input.
- Refreshed the prefilled example input and tuned run defaults for faster, lower-cost runs.
