iptv-org/iptv
58.1
Adequate · 27 September 2026
3.6k
lines of production code
TypeScript
primary language
4
measurements over time
What this system is
This system is a CLI-based tool for managing, validating, and generating curated IPTV M3U playlists. It automates the ingestion of channel data, enforces data integrity through stream validation and issue tracking, and produces organized, country-specific playlist files. The system also handles documentation updates and generates reports on stream availability and request status.
How it got here
2018–2023 — CLI tooling and automation infrastructure
15 changes.
This period focused on building a comprehensive TypeScript-based CLI framework to automate IPTV playlist management, documentation, and reporting. The work introduced new model classes, data generators, and validation scripts to handle stream testing, metadata updates, and issue tracking. These components established the automated workflows for maintaining current M3U playlists and generating project documentation.
2025 — test coverage expansion
12 changes.
This period focused on expanding the test suite by adding comprehensive fixtures for playlist parsing, generation, validation, and export across numerous countries and edge cases. The work included creating test data for error scenarios, DRM configurations, and external integrations like GitHub issues and offline DNS mocking to ensure robust verification of the system's behavior.
2026 — Issue validation and test coverage
7 changes.
This period focused on implementing a new validation script for GitHub issue-based stream operations to ensure data integrity and prevent invalid updates. Concurrently, extensive test fixtures were added to cover playlist updates, nested formats, and malformed URL handling, ensuring robust validation of stream management workflows.
Features
Automated report generation for stream and channel requests
A new script in scripts/commands/report creates a comprehensive report by analyzing GitHub issues and discussions. It validates 'streams:add', 'streams:edit', and 'streams:remove' requests against existing stream data and channel blocklists, and processes 'Channel Search' discussions to determine fulfillment status, outputting a structured report with statuses like pending, fulfilled, or invalid.
scripts/commands/report · high confidence
Introduce core CLI utilities and media stream testing capabilities
This change adds a new set of core scripts to the \scripts/core\ directory, introducing structured output formatting via \CliTable\ (console) and \HTMLTable\ (HTML), data handling with \DataSet\, and parsing utilities for logs, numbers, playlists, and proxies. It also introduces a \StreamTester\ class that validates media streams using \axios\ and \mediainfo.js\, supporting proxy configurations (including SOCKS) and configurable timeouts, while replacing the previous \ffprobe\ dependency with \mediainfo.js\ for media analysis.
scripts/core · high confidence
New API data loading script
A new script at scripts/commands/api/load.ts has been added to facilitate loading API data. This script serves as a command-line entry point that invokes the downloadData function from the api module, allowing users to trigger data downloads via the command line.
scripts/commands/api · high confidence
New README table generation scripts for categories, countries, languages, and regions
Added new TypeScript scripts in the \scripts/tables\ directory that generate summary tables for the project's README files. These scripts parse \generators.log\ to extract channel counts for categories, countries (including subdivisions and cities), languages, and regions, then write the formatted Markdown content to \\_categories.md\, \\_countries.md\, \\_languages.md\, and \\_regions.md\ respectively.
scripts/tables · high confidence
New interactive playlist management and maintenance commands
The playlist maintenance workflow now includes a suite of new CLI commands for editing, formatting, testing, and validating playlists. The new \edit\ command provides an interactive interface to resolve missing channel IDs by selecting from similar channels or typing custom IDs. The \format\ command normalizes URLs, removes duplicates, and automatically detects stream quality using mediainfo.js, with configurable parallelism, proxy, and timeout options. The \test\ command verifies stream availability with live progress updates and can automatically remove broken links via the \--fix\ flag, while also checking for internet connectivity before running. The \validate\ command checks for missing IDs, invalid URLs, duplicates, and blocklist violations. Additionally, \update\ and \generate\ commands handle issue-based stream modifications and index generation.
scripts/commands/playlist · high confidence
New model classes for streams, playlists, and discussions
The \scripts/models\ directory now includes new TypeScript classes (\Stream\, \Playlist\, \Discussion\, \Issue\) that structure how IPTV playlist data is processed and exported. The \Stream\ class extends the SDK's stream model to handle parsing of quality suffixes, 24/7 labels, and geo-blocking flags from playlist names, while the \Playlist\ class manages the collection of streams and generates the final M3U output with guide URLs. These models provide the core logic for validating stream URLs, updating metadata from issue data, and formatting the final playlist string.
scripts/models · high confidence
New script generators for categorized M3U playlists
Added a suite of TypeScript generators in the scripts/generators directory that produce organized M3U playlist files from stream data. These include index generators (index.m3u, index.category.m3u, index.country.m3u, index.language.m3u) and categorized playlists grouped by categories, cities, countries, languages, regions, and subdivisions, as well as raw and source-based groupings. Each generator filters streams (e.g., SFW-only where applicable), groups them by the relevant attribute, and saves the resulting playlists to the public directory while logging output details.
scripts/generators · high confidence
New script infrastructure for data management and search
The scripts directory now includes a new api.ts module that handles downloading, loading, and searching IPTV data (channels, feeds, categories, etc.) using the @iptv-org/sdk, alongside new constants.ts and utils.ts files that provide path resolution, URL normalization, and stream info parsing utilities.
scripts · high confidence
New script to generate README documentation from API data
A new script (scripts/commands/readme/update.ts) has been added to automate the generation of the project's README documentation. This script fetches data from the API and updates the PLAYLISTS.md file by compiling it from a template, while also generating tables for categories, languages, countries, and regions. The script relies on the newly installed @freearhey/core package for logging functionality.
scripts/commands/readme · high confidence
Behavioural changes
Automated playlist and documentation updates
The repository's curated IPTV playlists and associated documentation (README, PLAYLISTS, FAQ) are automatically refreshed daily by a bot to reflect changes in channel availability, add new country-specific playlists, remove dead links, and update channel counts. This ensures the provided M3U lists remain current and that user guides accurately reflect the available content.
(repo-wide) · high confidence
New validation script for issue-based stream operations
A new \validate.ts\ script has been added to the \scripts/commands/issue\ directory to validate GitHub issue submissions for stream management. This tool checks the markdown body of issues labeled \streams:add\, \streams:remove\, or \streams:edit\ against the current database state. It verifies that stream URLs are valid URIs with correct domains, ensures requested stream IDs correspond to existing channels and feeds, and prevents duplicate additions or removals of non-existent streams. It also flags channels blocked for DMCA or NSFW reasons. The script exits with an error log if validation fails, ensuring data integrity before any changes are processed.
scripts/commands/issue · high confidence
Updated global IPTV stream playlists
The M3U playlist files in the streams directory have been updated with new, replaced, and removed live TV stream URLs across all country-specific and service-specific files (e.g., us.m3u, uk.m3u, jp.m3u). This includes adding new channels, fixing broken links, and removing dead or non-working streams to ensure the available channels remain functional.
streams · high confidence
Test coverage
Added expected playlist test data for Afghanistan and Antigua & Barbuda; Added test coverage for playlist management commands; Added test fixture for nested playlist format; Added test fixture for playlist generation log output; Added test fixture for readme update generators; Added test fixtures for AT, IN, and NL playlist formats; Added test fixtures for BR, CY, UK, and US M3U playlists; Added test fixtures for GitHub issues, discussions, and offline DNS mocking; Added test fixtures for playlist export validation; Added test fixtures for playlist parsing with error scenarios; Added test fixtures for playlist update scenarios; Added test fixtures for playlist validation edge cases; Added test for readme update command; Added test for report:create command; Added test input data for issue validation; Added test input data for playlist editing with CRLF line endings; Added test input for malformed URLs in playlist normalization; Added tests for the issue:validate command; Test data: new M3U playlist inputs for Andorra, Canada, Indonesia, India, Kyrgyzstan, Qatar, UK, and unsorted streams; Updated expected playlist generation test fixtures; Updated expected test data for playlist update validation.
Dependencies
Initialize project dependencies and tooling
The project now includes a defined set of dependencies and build scripts. Key additions include the \iptv-playlist-parser\ for handling playlist data, \m3u-linter\ for validation, and \mediainfo.js\ for media inspection. The tooling stack uses \eslint\ (v9) and \vitest\ for code quality and testing, while \axios\ is updated to v1.19.0. An override is configured to pin \esbuild\ to version 0.23.1.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.
Score
- CAI 34 → 58 (+23.9)
- Rubric changed (rubric-2026.08.15 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 85 → 83 (-2.2)
- Architecture 65 (new)
- Maturity 54 → 54 (+0.6)
- Readiness 23 → 53 (+29.5)
- Security 28 → 76 (+48.3)
Resolved (93)
- Change coupling: countriesGenerator.ts ↔ rawGenerator.ts (scripts/generators/countriesGenerator.ts)
- Change coupling: countriesGenerator.ts ↔ sourcesGenerator.ts (scripts/generators/countriesGenerator.ts)
- Change coupling: countriesGenerator.ts ↔ subdivisionsGenerator.ts (scripts/generators/countriesGenerator.ts)
- Change coupling: rawGenerator.ts ↔ sourcesGenerator.ts (scripts/generators/rawGenerator.ts)
- Change coupling: rawGenerator.ts ↔ subdivisionsGenerator.ts (scripts/generators/rawGenerator.ts)
- Change coupling: sourcesGenerator.ts ↔ subdivisionsGenerator.ts (scripts/generators/sourcesGenerator.ts)
- Change coupling: update.ts ↔ rawGenerator.ts (scripts/commands/readme/update.ts)
- Change coupling: update.ts ↔ sourcesGenerator.ts (scripts/commands/readme/update.ts)
- Change coupling: update.ts ↔ subdivisionsGenerator.ts (scripts/commands/readme/update.ts)
- Dimension evaluation failed
- High CVE: [GHSA redacted] (package-lock.json)
- High CVE: [GHSA redacted] (package-lock.json)
- High CVE: [GHSA redacted] (package-lock.json)
- High CVE: [GHSA redacted] (package-lock.json)
- High CVE: [GHSA redacted] (package-lock.json)
- High CVE: [GHSA redacted] (package-lock.json)
- High CVE: [GHSA redacted] (package-lock.json)
- High CVE: [GHSA redacted] (package-lock.json)
- High CVE: [GHSA redacted] (package-lock.json)
- High CVE: [GHSA redacted] (package-lock.json)
- …and 73 more
New (812)
- CountriesTable.create (cognitive 23) (scripts/tables/countriesTable.ts)
- CountriesTable.create (cyclomatic 18) (scripts/tables/countriesTable.ts)
- Coverage not measured — JavaScript/TypeScript suite
- FunctionTooLong: create.main (scripts/commands/report/create.ts)
- FunctionTooLong: validate.main (scripts/commands/playlist/validate.ts)
- High: security finding (details withheld)
- Hotspot: scripts/commands/issue/validate.ts (scripts/commands/issue/validate.ts)
- Hotspot: scripts/commands/playlist/validate.ts (scripts/commands/playlist/validate.ts)
- Hotspot: scripts/commands/report/create.ts (scripts/commands/report/create.ts)
- Hotspot: scripts/utils.ts (scripts/utils.ts)
- Medium CVE: [GHSA redacted] (package-lock.json)
- MethodTooLong: CountriesTable.create (scripts/tables/countriesTable.ts)
- No assertions: skip the file if it does not exist (tests/commands/playlist/validate.test.ts)
- Off-boarding risk: anonymized user #1
- Outdated (npm): @eslint/js
- Outdated (npm): @freearhey/core
- Outdated (npm): @freearhey/storage-js
- Outdated (npm): @inquirer/prompts
- Outdated (npm): @octokit/plugin-paginate-rest
- Outdated (npm): @octokit/plugin-rest-endpoint-methods
- …and 792 more
Changes since last survey
- 251 commits — 236 feature/other, 15 fixes
By area
- (root) — 56 commits
- (repo) — 47 commits
- streams/ar.m3u — 19 commits
- scripts/commands — 12 commits
- streams/ph_comclark.m3u — 11 commits
- tests/data — 10 commits
- .github/workflows — 7 commits
- tests/commands — 7 commits
- scripts/utils.ts — 6 commits
- streams/in.m3u — 6 commits
- streams/us.m3u — 5 commits
- streams/es.m3u — 4 commits
- streams/al.m3u — 3 commits
- streams/br.m3u — 3 commits
- streams/ca.m3u — 3 commits
- streams/pl.m3u — 3 commits
- .github/ISSUE_TEMPLATE — 2 commits
- .github/docs — 2 commits
- streams/ae.m3u — 2 commits
- streams/am.m3u — 2 commits
Notable commits
- fix: Fix issue:validate tests on Windows (#49523)
- fix: Potential fix for pull request finding 'CodeQL / Workflow does not contain permissions'
- fix: Potential fix for pull request finding 'CodeQL / Workflow does not contain permissions'
- fix: Update ph_comclark.m3u (fix)
- fix: fix: add missing http-user-agent directive for 101tv Antequera
- fix: fix: address nested playlist review feedback
- fix: fix: correct Live 24/7 handling and label regressions
- fix: fix: handle formatter paths relative to workspace
- fix: fix: harden getStoragePath and keep CRLF endings
- fix: fix: keep malformed URLs during normalization (#49870)
- fix: fix: make report:create test independent of log output and line endings
- fix: fix: mark 101tv Antequera as Geo-blocked
- fix: fix: preserve nested playlist paths when formatting
- fix: fix: reject formatter paths outside storage
- fix: fix: tolerate missing playlist metadata (#49868)
- change: Add 3ABN Int to comclark
- change: Add and modifying streams (081326) (#48302)
- change: Add: 101tv Antequera (101tvAntequera.es@SD)
- change: Add: Suara Surabaya to id.m3u
- change: Assign tvg-id for Oxygen Music
- …and 231 more
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
iptv-org/iptv was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 27 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 5eaeec966cf0234a3b2d70e3f7ab1ceed7ca6d86 — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-d00c643c3f66.