# Changelog of YouTube Emerging Long-Form Channel Hunter (`italianscraper/youtube-emerging-long-form-channel-hunter`) Actor

- **URL**: https://apify.com/italianscraper/youtube-emerging-long-form-channel-hunter/changelog.md
- **Full Actor documentation**: https://apify.com/italianscraper/youtube-emerging-long-form-channel-hunter.md

## Changelog

All notable changes to this project are documented here.

### \[1.1.0] — 2026-03-11 — Freemium tier

#### Added

- **FREEMIUM-1** Freemium gate via `APIFY_USER_IS_PAYING` env variable (set automatically by Apify)
- **FREEMIUM-2** Free users: locked to Light scan mode, results capped at 3 channels
- **FREEMIUM-3** Free users: keywords, regions and maxPages overrides are ignored
- **FREEMIUM-4** Paid users: full access unchanged — all scan modes, custom overrides, up to 50 channels
- **FREEMIUM-5** Added `FREE_MAX_CHANNELS = 3` constant for easy future tuning
- **FREEMIUM-6** Log messages clearly indicate Free vs Paid plan at run start
- **FREEMIUM-7** `Actor.set_status_message()` at run end for free users with upgrade CTA

#### Updated

- `README.md`: added Free vs Paid comparison table, freemium FAQ entry, scan mode notes
- `.actor/input_schema.json`: added 🆓 / ✅ plan notes to scanMode, keywords, regions, maxPages, topN fields
- `src/main.py`: version bumped to 1.1.0

### \[1.0.2] — 2026-03-09 — Second bug-fix round

#### Fixed

- **NEW-1** `YouTubeClient._get()`: aggiunta gestione `httpx.TransportError` (timeout/rete)
  con retry automatico (max 2, wait 5s/10s) — prima crashava il run completo
- **NEW-2** `YouTubeClient._get()`: rimosso dead code — loop ristrutturato con `break`
  esplicito così la riga `raise` dopo il loop è ora raggiungibile e logicamente corretta
- **NEW-3** `.actor/actor.json`: rimosso campo non-standard `"changelog"` che generava
  validation warning con `apify push`
- **NEW-4** Docstring: aggiornato `Version: 1.0.0` → `Version: 1.0.2`
- **NEW-5** `enrich_videos()` / `enrich_channels()`: aggiunto `except Exception` a livello
  di batch per resistenza totale a errori di rete — il batch fallito viene skippato e
  il run continua con i dati parziali invece di crashare

### \[1.0.1] — 2026-03-09 — First bug-fix round

#### Fixed

- **BUG-1** Import relativo mancante in `__main__.py`
- **BUG-2** `src/__init__.py` aggiunto
- **BUG-3** Mutazione dict params in `_get()`
- **BUG-4** Gestione HTTP 429 con retry
- **BUG-5** Filtro canali con `hiddenSubscriberCount=True`
- **BUG-6** Conversione bool sicura con `to_bool()`
- **BUG-7** Fallback `channelUrl` da channelId
- **BUG-8** `version` in `actor.json` portato a formato Apify `"0.0"`
- **BUG-9** Override keywords/regions con lista vuota ora fallback al preset
- **BUG-10** Quote nidificate in f-string risolte con variabili temporanee

### \[1.0.0] — 2026-03-09 — Initial release

#### Added

- Initial release by ItalianScraper
- YouTube Data API v3 integration con chiave utente
- 4 scan modes: Light, Standard, Full, Multi-region
- Filtri canale emergente: max subscriber, max video, max età, min engagement
- Viral Score formula composita
- Delta tracking via Apify KeyValueStore
- Client quota-aware con risultati parziali su limite
