Skip to content

EPG Acquisition and Merge — multi-lineup identity, validation, provenance, and deterministic XMLTV #40

Open

Description

@Jumpstile

Current main status — 2026-08-16

GitHub main at 88b81fb contains delivered local XMLTV functionality across fd1e556, e7c1168, 519828e, 6fa6797, and 88b81fb: local .xml, gzip, and single-entry ZIP ingestion; streaming validation with DTD/external-entity protections and bounded decompressed input; Programme and evidence/provenance records; deterministic merge; deterministic XMLTV export; and Build-Lineup integration with fail-closed publication.

Recent comments that describe source catalogs, preflight or web surfaces, source-metadata reconciliation, SQLite/cache, or 884/884 validation refer to dirty or disposable worktree state and are not implementation evidence for main. Historical comments remain unchanged for auditability; this section is the authoritative mainline status.

Remaining #40 ownership is the broader EPG parent scope: canonical station identity and channel/guide binding; coverage and fit analysis; source quality, freshness, and conflict reporting; provider/catalog and guide-adapter concerns; scheduling/refresh; mirrors and rights; and broader downstream EPG behavior.

#89 owns XMLTV remote acquisition/transport/cache work. #88 owns provider M3U live fetch and remains separate.

Mission

Build a provider-neutral EPG Acquisition and Merge pipeline for traditional linear channels that can fetch, validate, normalize, compare, and deterministically merge multiple XMLTV/guide lineups while preserving station identity, provenance, freshness, and user policy.

Gracenote2XML is a useful research reference for scheduled guide acquisition, account/lineup configuration, multiple-lineup merging, timespan/timezone controls, station/callsign ordering, and client-specific XMLTV output options. ChannelForge must implement a lawful, source-neutral architecture and must not require that container, Gracenote, Zap2it, or any single upstream service.

Acquire guides safely, preserve identity, merge with evidence, and never hide conflicts behind one convenient XML file.

Product outcomes

A user should be able to:

  1. Add one or more XMLTV files, URLs, or supported guide-provider connections.
  2. Test access and preview lineup/station coverage before saving.
  3. Schedule safe refreshes with source-aware intervals and bounded retries.
  4. See freshness, completeness, overlap, conflicts, and unmapped stations.
  5. Merge sources deterministically according to explicit policies.
  6. Preserve stable station identity across lineup renames, number changes, and source refreshes.
  7. Publish validated, atomic XMLTV output suitable for supported downstream clients.
  8. See an explicit per-source outcome (Fetched, CacheHit, Stale, Failed, or NeedsReview) when an upstream source fails or returns stale data, rather than a silently substituted 'good enough' result.

Guide catalog and fit analysis

Provide a catalog layer for discovering user-authorized public, private, and local guide feeds without confusing catalog metadata with guide truth.

Catalog entries may be organized by:

  • country, continent, market, postal/lineup context, language, or theme
  • standard station-ID/callsign edition
  • IPTV-friendly channel-name-plus-country ID edition
  • individual market, country, continent, or combined/full guide
  • look-back/look-ahead horizon such as 3, 7, or 14 days
  • XML/XMLTV and supported compressed variants
  • generation method/source family
  • mirror or alternate delivery endpoint

Each entry should expose a machine-readable manifest where available or derived safely:

  • stable catalog/source ID
  • display name and geographic/market coverage
  • channel count and identifier scheme
  • sample or complete channel manifest without downloading all programme data when possible
  • programme coverage start/end
  • generated/updated time, content length, hash, and compression
  • source family and mirror relationship
  • intended-use, licensing, redistribution, and attribution terms
  • expected refresh cadence
  • availability/health history
  • schema/parser warnings
  • supported compatibility profiles

Fit analyzer

Compare catalog manifests against the user's canonical lineup before subscription:

  • exact canonical-station coverage
  • exact and candidate tvg-id/station-ID coverage
  • callsign/name candidates requiring review
  • missing lineup channels
  • extra guide channels
  • market/regional conflicts
  • duplicated coverage across selected guides
  • estimated programme window and download/storage cost
  • rights or intended-use incompatibility

Recommend the smallest suitable guide or combination that meets the user's coverage and horizon needs. A country or market guide should normally be preferred over a continent/full guide when coverage is equivalent, reducing downloads, parsing, storage, and conflict surface.

Never silently switch identifier schemes. Standard station-ID/callsign and IPTV-friendly channelname.countrycode editions must be represented as explicit compatibility choices with a preview of expected mapping changes.

Mirrors and resilience

  • model mirrors as alternate delivery endpoints for one logical source
  • fail over between mirrors only when terms and content identity permit
  • verify content/hash/generation metadata before treating mirrors as equivalent
  • do not count agreement between mirrors of the same generated guide as independent evidence
  • avoid duplicate downloads and duplicate programme evidence
  • preserve the last-known-good endpoint/content during outages
  • show mirror divergence as a source-integrity warning

Catalog UX

  • search and filter guides by geography, market, language, theme, horizon, format, identifier scheme, rights, and health
  • preview channels before adding a guide
  • show predicted lineup coverage and unresolved mappings
  • compare candidate guides side by side
  • copy or save a source definition without exposing credentials
  • warn before selecting oversized full guides or incompatible intended-use terms
  • keep user/private catalog entries local unless explicitly exported

Source types

Support a common EpgSource boundary for:

  • local XMLTV files
  • remote XMLTV URLs
  • compressed XMLTV variants
  • generated XMLTV outputs
  • authenticated guide-provider adapters where lawful and maintainable
  • multiple lineups/accounts from the same provider
  • supplemental sources that contribute only selected stations or programme fields

Every adapter must declare capabilities such as:

  • lineup discovery
  • station discovery
  • programme window limits
  • incremental fetch support
  • authentication method
  • timezone semantics
  • source-provided identifiers
  • image/metadata fields
  • rate-limit and refresh guidance
  • terms/licensing notes requiring user acknowledgment where applicable

Normal XMLTV ingestion must not require any provider adapter.

Provider interface

Define a contract equivalent to:

EpgSourceProvider
  id
  capabilities()
  validateConfiguration()
  testConnection()
  discoverLineups()                 # optional
  discoverStations(lineup)          # optional
  fetch(window, cursor, conditionalHeaders)
  checkpoint()
  health()

Requirements:

  • bounded time windows and response sizes
  • conditional requests where supported
  • pagination/incremental cursors where supported
  • explicit timezone and locale behavior
  • idempotent replay
  • structured authentication, authorization, rate-limit, malformed-data, and transient errors
  • cancellation, timeouts, backoff, and jitter
  • adapter/source version in provenance
  • no provider-specific types beyond the adapter boundary

Canonical station identity

Normalize guide channels into stable station candidates using evidence such as:

  • source station ID
  • Gracenote/TMS or other authoritative IDs when lawfully supplied
  • XMLTV channel ID
  • callsign
  • affiliate/network
  • channel number and subchannel
  • country, market, postal/lineup context
  • language
  • normalized display names
  • historical identity and user-approved mappings

Rules:

  • keep external IDs namespaced by authority/source
  • never assume equal numeric IDs from different authorities are equivalent
  • callsign/name matching is supporting evidence, not proof across markets
  • lineup channel-number changes should not create a new station when stronger identity evidence agrees
  • ambiguous station merges require review
  • preserve aliases and identifier history with provenance
  • allow split, merge, pin, and rollback

This complements the channel identity and Match Inspector work in #25 and #27.

Programme normalization

Preserve and normalize, where available:

  • title, subtitle, description
  • start/stop timestamps and original timezone/offset evidence
  • categories/genres
  • episode numbering systems
  • new/live/premiere/finale/rerun flags
  • ratings and advisories
  • credits
  • language
  • icon/artwork references
  • source programme/series IDs
  • station identity
  • source fetch time and provenance

Do not invent missing programme facts. Output transformations such as appending markers to titles must be optional presentation policies, never modifications to canonical facts.

Multi-lineup merge

Merge station and programme data using explicit, deterministic policies.

Station merge

  • detect exact authoritative-ID agreement
  • preserve lineup-specific numbers and aliases
  • identify duplicate, overlapping, and conflicting station candidates
  • allow source/field priority by station, market, or lineup
  • retain all contributing sources and reason codes

Programme merge

  • identify candidate duplicates by canonical station, time interval, IDs, and normalized programme identity
  • distinguish true duplicates from adjacent episodes, overruns, regional variants, and schedule corrections
  • resolve field differences by explicit priority, freshness, completeness, and trust policy
  • retain contradictory evidence
  • avoid counting mirrored copies as independent corroboration
  • allow supplemental sources to fill missing fields without replacing stronger canonical values
  • never silently discard a conflict that could materially change what the guide shows

Source quality and coverage

Track per source/lineup:

  • last attempt and success
  • data generation time when available
  • coverage start/end
  • station count
  • programme count
  • empty/invalid station rate
  • gaps and overlaps
  • timestamp validity
  • identifier stability
  • schema/parse warnings
  • agreement and contradiction with other sources
  • historical freshness and correctness evidence
  • credential/rate-limit/availability state

Present quality as explainable dimensions rather than one opaque score. Source popularity or repetition does not prove correctness.

Refresh scheduling

  • choose safe defaults from source guidance, cache headers, and coverage window
  • support configurable look-back and look-ahead windows
  • refresh before coverage expires
  • use conditional fetches and content hashes
  • add bounded jitter and exponential backoff
  • avoid synchronized refreshes across lineups
  • respect provider limits and account/lineup constraints
  • on authentication, network, parsing, or merge failure, resolve the source to Failed or NeedsReview; retain the prior validated evidence record for inspection/rollback, but never republish it as current successful output
  • validate complete candidate output before replacing active state
  • support manual refresh, cancellation, progress, partial success, and degraded mode
  • do not require the GUI to remain open

Related unattended operation: #35.

XMLTV validation and security

Treat every guide as hostile input:

  • streaming parse for large documents
  • prohibit external entity expansion and unsafe DTD/network resolution
  • bound nesting, text/attribute sizes, channel/programme counts, decompression ratio, total bytes, and parse duration
  • validate timestamp syntax/ranges and reject pathological intervals
  • sanitize URLs and image references
  • validate gzip/zip content and prevent archive traversal
  • reject unsupported content types safely
  • redact credentials, signed URLs, cookies, headers, and source paths from logs/diagnostics
  • store credentials only in the existing secret mechanism
  • apply SSRF and outbound-host policy to remote sources/adapters
  • use atomic staging and publication
  • preserve a sanitized validation report and source hash, not secrets or unnecessary raw account responses

Rights and provider policy

  • document the source, access method, refresh limits, and intended-use constraints
  • require the user to supply and authorize their own credentials where needed
  • do not bypass paywalls, authentication controls, rate limits, CAPTCHAs, or technical restrictions
  • do not ship shared credentials
  • do not imply that guide data, station metadata, or artwork may be redistributed merely because it is technically retrievable
  • keep proprietary provider adapters optional and independently disableable
  • allow lawful user-supplied XMLTV to remain the universal path
  • provide deletion/export controls for cached provider data and credentials

Source stewardship and retirement

Guide catalogs and endpoints can outlive, lose, or change maintainers. ChannelForge must model that as an operational and trust-boundary event, not as permission to take over or redistribute the source.

  • Record publicly documented project stewardship, repository/archive state, endpoint identity, source family, licensing/intended-use evidence, attribution, expected cadence, last success, and last verified content hash.
  • Never store private biographical or social-media details about maintainers.
  • Treat a maintainer's absence or death as neither proof that a service is abandoned nor a change to copyright, license, attribution, personal-use, or redistribution terms.
  • Distinguish an outage from a stale source, deliberate retirement, archive, successor-operated continuation, unexpected ownership transfer, and suspected compromise.
  • Revalidate redirects, domains, certificates, signing keys, repository/package ownership, content structure, and terms before trusting a successor endpoint.
  • Do not automatically grant a new owner the prior source's trust score or treat a renamed/rehosted feed as identical without verifiable provenance and content identity.
  • Pin optional generators and containers to reviewed versions or immutable digests; do not make a mutable image tag or personal account part of normal operation.
  • Provide disable, replace, export, and migration workflows while preserving canonical station mappings and rights-permitted last-known-good data.
  • Recommend alternate sources based on coverage, rights compatibility, health, and identifier fit; never silently substitute a source with materially different terms.
  • Cross-link lifecycle detection, degraded operation, and notification behavior to Autonomous Operations — scheduled refresh, multi-guide learning, source drift detection, and zero-touch maintenance #35.

Output compatibility profiles

Keep one canonical internal representation and apply explicit output profiles only at serialization time.

Profiles may control:

  • channel ordering by number, callsign, display name, or station ID
  • display-name ordering/selection
  • episode-number element ordering
  • optional live/new markers
  • timezone/offset serialization
  • icon handling
  • past/future programme window
  • deterministic channel/programme ordering
  • compression and filename

Requirements:

  • defaults follow XMLTV conventions
  • profiles are named, versioned, previewable, and testable
  • transformations are visible in the build report
  • no client-specific behavior contaminates canonical storage
  • identical canonical data and profile version produce byte-stable output where practical

GUI

Provide a guided workflow:

  1. Choose source type.
  2. Enter location/credentials using secret-safe controls.
  3. Test connection.
  4. Discover/select lineups or validate the XMLTV source.
  5. Preview stations, coverage, timezone, freshness, and warnings.
  6. Choose a recommended refresh/window policy.
  7. Review overlaps and merge policy.
  8. Save and run an initial staged import.

Default health view:

  • source status and coverage horizon
  • last/next refresh
  • stations/programmes imported
  • gaps, conflicts, and unmapped stations
  • per-source outcome state (Fetched/CacheHit/Stale/Failed/NeedsReview)
  • items needing review

Advanced mode may expose field priorities, window controls, serialization profiles, and adapter diagnostics.

Non-goals

  • Making Gracenote, Zap2it, Gracenote2XML, or any proprietary guide service mandatory.
  • Shipping or sharing upstream-service credentials.
  • Circumventing provider access controls or terms.
  • Replacing a commercial guide-data license.
  • Treating source-specific station IDs as globally universal.
  • Flattening conflicting sources without provenance.
  • Editing canonical titles merely to satisfy a client display preference.
  • Loading untrusted XML with external entities or unbounded decompression.
  • Making guide acquisition dependent on Docker.
  • Combining sports schedule providers with linear EPG adapters behind one misleading interface; they may share canonical evidence models while retaining distinct source contracts.

Phased delivery

Phase 0 - contracts, XMLTV profile, and threat model

  • Define EpgSourceProvider, source capabilities, provenance, error taxonomy, and source lifecycle/trust states.
  • Define the canonical station/programme model and supported XMLTV subset/extensions.
  • Threat-model XML, compressed input, remote fetches, credentials, and proprietary providers.
  • Create sanitized multi-lineup fixtures with conflicts, gaps, malformed data, and timezone cases.

Phase 1 - universal XMLTV ingestion

  • Add local/remote/compressed XMLTV sources.
  • Implement streaming validation, structural inventory, content hashing, and staged import.
  • Add source health, coverage, last-known-good, atomic replacement, and deterministic serialization.

Phase 2 - identity and merging

  • Add canonical station resolution with external-ID namespaces and review.
  • Implement deterministic station/programme merge policies with conflict preservation.
  • Add source quality dimensions, overlap/gap analysis, and field-level provenance.

Phase 3 - scheduling and compatibility

Phase 4 - optional provider adapters

  • Define adapter eligibility based on lawful access, stability, documentation, and testability.
  • Add selected adapters independently behind the provider contract.
  • Add capability/version matrices, credential deletion, rate-limit tests, and offline fixtures.
  • Ensure removal of every proprietary adapter leaves universal XMLTV ingestion fully functional.

Acceptance criteria

  • Local, remote, and compressed XMLTV sources ingest without a proprietary provider account.
  • Catalog entries expose geography, horizon, format, identifier scheme, freshness, source family/mirrors, and rights metadata.
  • Users can preview a guide's channel manifest and predicted lineup coverage before downloading full programme data when the source permits.
  • Fit analysis recommends the smallest adequate guide set and explains missing, extra, conflicting, and duplicated coverage.
  • Standard and IPTV-friendly identifier editions remain explicit compatibility choices and never switch silently.
  • Mirrors provide delivery resilience without being counted as independent corroborating sources.
  • Multiple lineups merge deterministically while preserving field-level provenance and conflicts.
  • External station IDs remain authority-namespaced and ambiguous merges require review.
  • Renumbering or display-name changes do not break stable station identity when stronger evidence agrees.
  • Programme duplicates, corrections, regional variants, gaps, and overlaps have deterministic tested behavior.
  • Source health exposes coverage, freshness, validity, gaps, conflicts, and last-known-good state.
  • Refresh scheduling respects coverage, conditional requests, rate limits, backoff, cancellation, and provider-safe defaults.
  • Failed refreshes or merges never replace validated active guide state.
  • XML parsing disables external entities and enforces size, depth, count, duration, and decompression limits.
  • Credentials and sensitive URLs are absent from tracked configuration, logs, fixtures, reports, and diagnostics.
  • Output profiles are explicit serialization policies and do not mutate canonical facts.
  • Identical canonical data and profile version serialize deterministically.
  • Proprietary adapters are optional, removable, and covered by sanitized/offline contract fixtures.
  • Documentation states access requirements, refresh guidance, retention/deletion behavior, and rights limitations.
  • Normal ChannelForge operation remains possible with only user-supplied XMLTV files.
  • Stale, archived, retired, successor-operated, ownership-changed, and integrity-suspect sources have distinct tested behavior.
  • A changed domain, repository owner, package publisher, signing key, or redirect cannot silently inherit prior trust.
  • Source replacement preserves canonical mappings and valid provenance while retaining all applicable rights and attribution restrictions.

Dependencies and cross-links

Research references

  • Gracenote2XML - scheduled guide retrieval, multiple account/lineup support, XMLTV merging, configurable coverage windows, timezone/output controls, station/callsign ordering, and downstream compatibility switches.
  • epg.guru / epg.fyi - browsable country, continent, combined, themed, legacy, and individual-market guides; standard and IPTV-friendly identifier editions; multiple guide horizons; compressed downloads; channel previews; and explicit personal-use restrictions.
  • epg.jesmann.com - earlier/catalog-related EPG service supplied by the same maintainer; retain as historical research context and verify any current source metadata before relying on it.

These are research references only, not dependencies or bundled guide sources. As observed, epg.guru and epg.fyi present the same EPG Hub content and should be modeled as related endpoints/mirrors rather than independent evidence. Their published personal-use restriction must be preserved and surfaced; ChannelForge must not include those guides in a commercial distribution or redistribute them without explicit permission.

Definition of done

ChannelForge can safely acquire, validate, normalize, compare, and merge multiple linear EPG sources into deterministic XMLTV output with stable station identity, complete provenance, coverage-aware refresh, last-known-good protection, and explicit client compatibility-without requiring a proprietary guide service or weakening provider access and rights boundaries.

ChannelForge product premise and scope guardrail

ChannelForge exists to make the user's existing content and services easier to discover and use.

Required product test

Before implementation, this issue must answer yes to the following question:

Does this reduce the effort required to find, understand, choose, or open content from services the user already has?

If the answer is no, unclear, or depends on building a parallel provider product, stop and re-scope the issue.

Scope rules

  • Aggregate content and capabilities across providers into a clearer discovery experience.
  • Use, link to, or delegate to provider-owned systems wherever available; do not recreate provider products.
  • Keep providers as the systems of record for content, playback, recordings, schedules, entitlements, accounts, billing, storage, permissions, and service-specific state.
  • Limit ChannelForge-owned behavior to what makes aggregation easier: permitted ingestion, normalization, identity matching, source comparison, presentation, routing, explainability, and safe configuration.
  • Preserve provider attribution, access controls, terms, content rights, capability differences, and failure boundaries.
  • Prefer the smallest integration that removes meaningful user effort. A deep link is better than a new subsystem when it solves the user's problem.
  • Do not add setup, decisions, dashboards, automation, or maintenance burden unless the issue removes more complexity than it introduces.
  • Default to a simple path for beginners; expose advanced controls only when they provide real value.

Definition-of-done addition

This issue is not complete until evidence shows that it makes a real user task easier without duplicating a provider capability or creating a second system of record.

Integrate before rebuild. Aggregate without taking ownership. Make things easier.

Current implementation status — 2026-08-16

Status: local XMLTV ingestion, deterministic merge/export, and Build-Lineup publication are implemented on GitHub main; broader EPG identity, catalog, freshness, scheduling, and remote transport work remains open.

Implemented on GitHub main at 88b81fb:

  • local .xml, gzip, and single-entry ZIP XMLTV ingestion
  • XmlReader streaming parsing with DTD/external-entity protections and bounded decompressed input
  • Programme and evidence/provenance records
  • deterministic source-aware merge and XMLTV export
  • Build-Lineup local XMLTV integration with fail-closed publication

Not implemented on main and remaining under this epic:

  • canonical station identity/binding and coverage/fit analysis
  • source quality, freshness, conflict, and broader EPG behavior
  • provider/catalog/guide-adapter concerns, mirrors, and rights
  • scheduling/refresh
  • downstream compatibility and broader output behavior
  • remote XMLTV transport and disposable fetch cache (tracked under XMLTV EPG fetch/parse/cache — streaming parser and disposable fetch cache #89)

Claims in earlier comments about source catalogs, preflight or web surfaces, source-metadata reconciliation, SQLite/cache, or 884/884 validation were produced from dirty or disposable worktrees and are not evidence of mainline implementation.

Activity

  1. added
    architectureArchitecture, boundaries, and system design
    featureNew user-facing or product capability
    testingAutomated tests and validation coverage
    securitySecurity hardening, secrets, trust, and vulnerability work
    on Jul 19, 2026
  2. added
    roadmapAccepted into the ChannelForge implementation roadmap
    area:guide-mediaEPG, artwork, stream evidence, and media metadata
    on Jul 19, 2026
  3. Jumpstile commented on Jul 19, 2026

    @Jumpstile
    OwnerAuthor

    Tvheadend research note

    Tvheadend reinforces these EPG requirements:

    • multiple internal/external grabbers remain independently identifiable
    • source and field priority are explicit rather than hidden in merge order
    • the guide supports filters by text, time, channel, tag, duration, and language
    • full-text search can include title, subtitle, summary, and description
    • channel access/output scope constrains returned guide results
    • optional metadata such as rating labels retains authority and country context

    ChannelForge should preserve source provenance and expose search through #43 without adopting Tvheadend's in-memory/server architecture.

    References: https://docs.tvheadend.org/documentation/configuration/electronic-program-guide and https://docs.tvheadend.org/documentation/development/json-api/api-description/epg

  4. Jumpstile commented on Jul 19, 2026

    @Jumpstile
    OwnerAuthor

    Ecosystem research — IPTVnator

    IPTVnator v0.22 reinforces: EPG sources scoped per playlist/profile; transparent decoding of compressed XMLTV; explicit source trust; private-network redirect protection during probes; and clear errors when an EPG/catch-up reference cannot resolve. ChannelForge should apply these controls to guide acquisition while keeping playback/catch-up out of scope.

    Reference: https://github.com/4gray/iptvnator/releases/tag/v0.22.0

  5. Jumpstile commented on Jul 19, 2026

    @Jumpstile
    OwnerAuthor

    Security regression requirements from Dispatcharr v0.28.0

    EPG file upload/import must require the appropriate administrative capability and validate the resolved destination beneath the dedicated upload root. Test traversal, absolute paths, encoded separators, Unicode normalization, collisions, symlink/reparse escapes, archive paths, oversized names, and empty filenames. The client-supplied filename is metadata, never an authoritative filesystem path.

    Reference: https://github.com/Dispatcharr/Dispatcharr/releases/tag/v0.28.0

  6. Jumpstile commented on Jul 19, 2026

    @Jumpstile
    OwnerAuthor

    Dispatcharr v0.28.0 correctness cases

    Add regression fixtures for XZ in addition to gzip/zip; database/server timezone differing from configured guide timezone; concurrent full refresh and per-channel parsing; failed per-channel parse preserving prior programmes; progress denominators changing as discovery grows; and cold output rebuilds not blocking unrelated reads. Guide replacement must occur only after the complete candidate result validates.

    Reference: https://github.com/Dispatcharr/Dispatcharr/releases/tag/v0.28.0

  7. removed
    architectureArchitecture, boundaries, and system design
    featureNew user-facing or product capability
    testingAutomated tests and validation coverage
    securitySecurity hardening, secrets, trust, and vulnerability work
    on Jul 25, 2026
  8. 100 remaining items

  9. Jumpstile commented on Oct 6, 2026

    @Jumpstile
    OwnerAuthor

    TVHeadend XMLTV programme-year export — 2026-10-06

  10. Jumpstile commented on Oct 8, 2026

    @Jumpstile
    OwnerAuthor

    Guide acquisition and metadata integrity — 2026-10-08

    Observed UTC: 2026-10-08 13:01. Project/destination: Jumpstile/ChannelForge #40, related #35/#27/#31/#46. Status: NEW; exact mc2xml, ziggogo and PR searches plus current canonical comments found no prior records. These are source/tool evidence, not observed changes to the user's own lineup.

    Schedules Direct — October 7 mc2xml notice

    The official Schedules Direct homepage now has an October 7, 2026 notice reporting multiple mc2xml problems. SD says mc2xml has never been a supported application and recommends XMLTV Project grabbers: tv_grab_na_dd (legacy DataDirect, US/Canada), tv_grab_zz_sdjson or tv_grab_zz_sdjson_sqlite. No affected mc2xml version or root cause is specified.

    Channel/evidence: provider service notice, not a software release. Impact: missing/stale guide acquisition can be a client/grabber failure rather than channel deletion or callsign drift. Preserve last-known-good mappings and flag source freshness. Evaluate supported acquisition paths only under the relevant provider terms and permissions; no automatic migration, new subscription or credential change. Confidence: high for the provider warning; actual user exposure unknown. Existing Jellyfin/older-client warnings remain separate; this notice does not prove they were fixed.

    iptv-org/epg — metadata quality changes on master

    • Ziggo PR #3225, merged October 3 10:21:45 UTC, discards implausible season/episode values where the upstream API leaks internal IDs into those fields. The inspected patch accepts season values strictly between 0 and 1,000 and episode values strictly between 0 and 100,000; real four-digit episode numbers are retained. The original contributor samples predate this watch window, while the merge is new in-window evidence.
    • Freeview PR #3292, merged October 8 03:33:29 UTC, reports that programme-detail requests were refused from October 1 while the main guide still returned programmes, yielding guides with titles/times but no descriptions. A merged request-compatibility change restores descriptions in the contributor's sample. This is upstream reported/tested behavior, not a ChannelForge runtime result or permission to bypass a source restriction.

    Channel: development/master commits; no new stable XMLTV Project release is implied. XMLTV/xmltv remains stable v1.4.0 and has no commits in the inspected September 24–October 8 window.

    Affected mappings / why: programme/episode evidence and field-level guide completeness. Missing descriptions or implausible episode numbers must not become false canonical episode identities, global aliases, or channel removals.

    Recommendation: preserve raw source provenance and mark rejected values explicitly; apply source-specific plausibility checks without assuming these bounds universally. Distinguish transport failure, missing enrichment, valid empty coverage and absent channels. Add fixtures for partial detail failure, legitimate large episode numbers and source-ID leakage.

    Classification/priority/scope: Study / compatibility impact / review-needed; medium guide-integrity priority, high false-identity regression value. Confidence high for provider notice and inspected code; runtime applicability unverified. No source access, guide publication, installation or accepted-state changes were performed.

  11. Jumpstile commented on Oct 20, 2026

    @Jumpstile
    OwnerAuthor

    Ecosystem evidence — 2026-10-20: m3u-editor guide-preservation regressions

    Observed 12:51 UTC. NEW, not found in exact v0.13.5/SHA searches or the 14-day canonical reconciliation. Stable v0.13.5 was published October 19 at 16:29:38 UTC; its experimental companion is not the stable boundary.

    First-party implementation evidence:

    • e6a6f339 and 22d8ee77: retain an existing guide when XMLTV is truncated/malformed or a source returns non-XMLTV; discard queued import chunks on failure. Regression fixtures cover truncation after channels, midway through programmes, and partial queued batches.
    • ca156c26: reject Schedules Direct errors embedded in HTTP 200, non-JSON/missing lineup fields, and an empty station map when an existing guide exists. Tests assert preservation of prior station IDs, guide data and bindings.

    Adopt regression scenarios / Study implementation, medium priority, source acquisition and guide-binding integrity (#175; related completed fetch slice #89). A failed refresh must not be interpreted as channel removal or erase accepted mappings. Keep prior evidence explicitly stale/failed, not silently current or publishable. Important non-adoption boundary: upstream permits a partially parsed initial guide and treats an explicit item limit as completion; neither behavior relaxes ChannelForge's fail-closed publication contract.

    Confidence high in published release and inspected source/tests; tests were not executed here and no ChannelForge defect is claimed. No provider lineup, identity, installation or accepted-state change. Existing taxonomy and milestone retained.

  12. Jumpstile commented on Oct 22, 2026

    @Jumpstile
    OwnerAuthor

    Guide acquisition delta — 2026-10-22

    Observed 12:48 UTC. First-party m3ue/m3u-editor development source after stable v0.13.5; no runtime test or stable inclusion claimed. NEW after current #40/#35 comments and 14-day reconciliation; extends #35 comment 6316134857 and #40 comment 6291273170.

    • m3ue/m3u-editor@0b8876b (Oct21 15:27 UTC) changes login/IP-limit cooldown from next UTC midnight to rolling 24 hours, stores the actual cooldown reason, and distinguishes image-limit/expired-account/missing-image/token-error responses, including JSON errors inside HTTP 200. This is implementation evidence, not independent verification of the provider's complete contract.
    • m3ue/m3u-editor@de6c847 (15:49 UTC) propagates token expiry across schedule/program/artwork paths for bounded reauthentication; calculates remaining token lifetime using provider serverTime when present; fails exhausted service requests or a listed-programme batch yielding no programmes rather than publishing an empty replacement.
    • m3ue/m3u-editor@068d14e (16:19 UTC) completes the temporary-download-file approach: preserve prior guide until successful completion, discard failed/interrupted output, replace the stale temporary file on the next run. Source includes regression fixtures for shared token invalidation, clock skew, failed batches and interrupted files; not executed here.

    Why/recommendation: failed acquisition must not erase channel bindings or become removal evidence. Adopt regression scenarios / Study implementation: explicitly separate rolling login windows from daily image limits, record retry reason, preserve last-known-good with stale/error status, and validate completed data before replacement. No assumption that a progress value of 100 proves success.
    Priority medium; scope #40 acquisition and #35 recovery, not a demonstrated ChannelForge defect or release blocker. Confidence high inspected source, provider/runtime applicability unverified. Existing taxonomy/milestone retained. No install, credentials, provider or accepted-state changes.

  13. Jumpstile commented on Oct 22, 2026

    @Jumpstile
    OwnerAuthor

    Community guide-source discovery — 2026-10-22

    Observed 12:51 UTC. iptv-org/epg merged PR #3281 at 00:30 UTC, adding two epg.kanya.io worker listings for US and Kenya:
    iptv-org/epg#3281
    iptv-org/epg@46da07d

    Contributor claims 1,401 US and 157 Kenya channels, XML/GZIP output, daily 06:30 UTC refresh, with US inputs from TV Guide/Pluto/Plex/Xumo and Kenya from epgshare01. Those are community discovery assertions, not independent availability, rights, freshness or provider-carriage verification. The inspected merge adds worker references, not channel identities or a new official upstream API.

    Recommendation keep as review-only source-catalog candidates. Before any adoption verify schema, freshness, rights, completeness, rate limits and identity provenance; correlated mirrors must not count as independent corroboration. No access to worker payloads, subscription, installation or ingestion was performed.
    Classification Study / review-needed suggestion; low source-discovery priority, scope #40/#35, no release impact. Confidence high in merged registry delta, low in unverified coverage/service assertions. Status NEW after exact-host search and canonical #40/14-day review. Existing taxonomy/milestone retained.

  14. Jumpstile commented on Oct 23, 2026

    @Jumpstile
    OwnerAuthor

    Guide release promotion and identity/time-boundary regressions — 2026-10-23

    Observed 12:55 UTC. First-party release/source evidence; no runtime certification. CHANGED plus NEW after last-14-day canonical reconciliation and exact-version/SHA searches.

    Release boundary: m3u-editor v0.13.6 stable, published Oct22 15:59:30 UTC, now includes the Schedules Direct permanent/transient authentication, rolling-window, token-expiry, failed-batch and prior-guide preservation fixes previously recorded as development-only in #35 comment 6316134857 and #40 comment 6341148268. It also includes the category-move fix in #27 comment 6341158385. This is a stable promotion, not a second discovery or proof of installed recovery. The separately published v0.13.6-exp is experimental.

    New development AFTER that release:

    • 417fb398, Oct23 00:36 UTC, preserves literal XMLTV channel ID "0"; accepts even-length 8–14-digit date prefixes; buckets cached programmes using the application's day boundary; validates merged-guide candidates against their source EPG IDs; and invalidates all affected playlist/merged/custom XMLTV caches after manual guide reassignment. A false "nothing cached" return no longer stops invalidation of later playlists. Editing a future guide day refreshes that day rather than today.
    • d1fde1e6, 00:42 UTC, supplies the actual numeric-timeshift timestamp correction omitted from the prior commit despite its description: parse/format in the same configured timezone to preserve the requested instant. Catch-up failover in 417fb398 separately uses the selected provider's archive timezone.
    • a5917665, 01:24 UTC, avoids skipping unmapped channels when successful mapping shrinks a paginated result set; an unresolved explicit channel filter now fails rather than silently returning unrestricted DVR results.

    Why/recommendation: Adopt regression scenarios / Study implementation for source-scoped merged bindings, valid zero IDs, partial-precision times, midnight/offset/alternate-provider boundaries, multi-cache invalidation and mutable-result pagination. Verify persisted mapping and generated output, not only an "Applied" notification. Do not infer provider removal from missing cached programmes or an unresolved filter. Upstream tests are present, not executed here; date-parser coverage is not claimed to implement every XMLTV date form.

    Classification Compatibility impact / Study; medium acquisition/mapping priority, high identity-integrity fixture value. Scope #40, related #175/#27/#31/#35/#59; no demonstrated ChannelForge defect or release blocker. Confidence high inspected source/release facts; actual provider/runtime applicability unknown. Existing taxonomy/milestone retained. No install, credentials, accepted-state or provider change.

  15. Jumpstile commented on Oct 23, 2026

    @Jumpstile
    OwnerAuthor

    Community guide adapters: duplicate airings, empty guides and wrong-day data — 2026-10-23

    Observed 13:00 UTC. iptv-org/epg default-branch merges today, community-maintained adapter/source evidence, NOT provider-confirmed carriage, complete-guide certification or access/rights approval. NEW after canonical 14-day review and exact PR/source checks.

    • Telenet #3254, merged 12:24 UTC: shares six-hour segment fetches, deduplicates event IDs per channel across segment/day boundaries, and retains basic event data when optional details fail. Failed segment downloads are not cached; off-air placeholders are deliberately removed. This means an empty interval can be an adapter choice, not missing provider content. Cross-day state is process-local and first-emitted-day based, so reverse-order/repeated-date/reused-ID cases need independent validation before adoption.
    • VRT #3253, merged 12:20 UTC: handles changed tagged epoch cursors, paginates beyond the old 50-item limit, obtains the currently airing item separately, and uses duration metadata for the final programme. It distinguishes programme pages from episode pages and avoids treating future unpublished episode URLs as playable. Its bounded paging/error paths do not themselves prove completeness; the snapshot path is an additional upstream endpoint, not a blanket integration recommendation.
    • tv.dir.bg #3252, merged 12:19 UTC: skips the previous-day column when the site supplies three columns, avoiding a one-day schedule displacement.
    • On TV Tonight #3261, merged 12:28 UTC: accommodates nested title/description markup instead of producing description-only programmes.

    Recommendation Adopt regression scenarios / Study implementation: stable event-plus-source identity across segments/midnight, repeated airings and deterministic processing order, explicit partial/failed acquisition state, cursor type/time validation, day-column changes and non-playable/future links. Preserve last-known-good guide and distinguish deduplication/off-air filtering from lifecycle removal. Do not treat scraper accessibility or a merge as licensing permission.

    Confidence high inspected source diffs; provider behavior, rights, deployed output and runtime unverified. Upstream tests present, not executed here. Classification Study / review-needed suggestion; medium guide-integrity fixture value, low integration priority absent relevant sources. Scope #40/#35/#38/#191; no ChannelForge release blocker, installation, ingestion or accepted-state change. Existing taxonomy/milestone retained.

  16. Jumpstile commented on Nov 4, 2026

    @Jumpstile
    OwnerAuthor

    m3u-editor 0.14.0: guide-output consistency and bounded refresh, 2026-11-04

    Observed 13:24 UTC. Stable v0.14.0, published November 2, is distinct from the separately published dev/experimental tags. NEW after canonical #35/#40/#121 reconciliation and exact-version/SHA search. First-party release and inspected source; tests were inspected, not run.

    • 36f73808: applying provider migration invalidates the replacement playlist's XMLTV/gzip cache; dry-run leaves it intact. Corrected confirmation says settings are copied to the replacement playlist, the source stays unchanged, and existing clients must change to replacement URLs. Migration completion is not transparent endpoint continuity.
    • 92c10f26: changing channel/group AED assignment or bulk setting/removing profiles clears affected playlist, alias, merged and custom outputs. Before this fix the live guide API could show the new assignment while warmed exported XMLTV still served old programmes.
    • e4fbe4f7: disabled Schedules Direct makes no edit-form discovery/auth requests while retaining saved country values. Missing token-expiry fallback uses 86,400 elapsed seconds, with existing expiry skew, instead of a DST-sensitive calendar day.
    • 39b49f6e: incremental Schedules Direct sync uses content-change metadata; image URL tokens are no longer assumed permanently content-addressed. Source last-update versions can refresh stale artwork while failed acquisition retains a stale fallback. Scheduled successful refreshes are bounded to at most hourly; failed retries retain their separate cooldown/backoff. This is the integration's implementation of upstream guidelines, not an independently verified provider policy statement.
    • 313f463f: reset records a cutoff so older queued jobs/chains stop at their next guarded job instead of running beside the replacement sync. The marker expires after 24 hours and absent markers retain previous behavior; this is not proof of immediate interruption or durable exactly-once fencing.

    Recommendation: Adopt regression scenarios / Study implementation for persisted mapping versus every generated output, migration destination readback, dry-run no-op, DST boundaries, feature-off network silence, stale artwork fallback and reset during queued/in-flight work. Preserve accepted state and source-scoped ownership. Related #27/#35/#121.

    Classification Compatibility impact / Study; medium acquisition priority, high preservation fixture value. Confidence high source facts; deployed/provider behavior unverified. No demonstrated ChannelForge defect, new dependency or release blocker. Existing labels/milestone retained. No migration, login, installation or user-state change.

  17. Jumpstile commented on Nov 4, 2026

    @Jumpstile
    OwnerAuthor

    Community guide adapter: highlights must not advance the schedule day, 2026-11-04

    Observed 13:28 UTC. NEW after recent #40 reconciliation and exact PR/source search. iptv-org/epg PR #3307 merged October 29; inspected source c9dd2bc1, October 24.

    The mon-programme-tv.be adapter previously selected every programme-shaped box, including a top-of-page evening highlights block before the full-day grid. Repeated late-night highlights could advance inferred day rollover before the morning schedule. The selector now limits parsing to the full-day sublists; a fixture checks morning, evening and after-midnight entries without duplicated highlights.

    Recommendation: Adopt presentation-order and duplicate-summary fixtures alongside October 23's wrong-day-column evidence. HTML display ordering and promotional highlights are not programme-time authority. Validate source date/timezone and chronological bounds, preserve prior valid data on parser uncertainty, and distinguish filtered decorations from cancelled events.

    Classification Study / compatibility regression; medium guide-integrity fixture value, low adapter priority absent a relevant source. Community-maintained source change, not broadcaster confirmation, complete-guide certification or access/rights permission. Confidence high inspected patch; tests present but not executed; source runtime/rights unverified. Related #35/#38. No ingestion, installation or accepted-state change; metadata retained.

  18. Jumpstile commented on Nov 14, 2026

    @Jumpstile
    OwnerAuthor

    Phase 1 progress for this issue, all merged to main:

    All three code changes are report-only: no channel is dropped, the build behavior and the published playlist and guide bytes are unchanged, and the frozen contracts (guide-id v1.0, raw digest projections, M3U byte format) are untouched. CI passed on each PR.

    Not done: PR 4 of the note (Build-My-Lineup reading several guide files) is skipped until a second guide file exists. Not verified: a real Build-Lineup run on the trial files with these reports. Leaving this issue open until that run is done.
    🤖 Generated with Claude Code

    https://claude.ai/code/session_01NzHAckAcs78Lu3rv8Gqgrf

  19. added a commit that references this issue on Nov 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions