Skip to content

[Feature]: Let Create Channel produce a channel without an inherited tvg_id #1005

Description

@lukeeexd

What would you like this feature to do?

Today a Create Channel action always copies the matched stream's tvg_id onto the new Dispatcharr channel, and there is no way to turn that off. A rule that pairs ECM-created channels with a dummy EPG profile therefore creates channels that are born bound to the provider's guide identity, and Dispatcharr's exact-match EPG pass will happily bind them to the provider feed before ECM's own EPG assignment lands.

I would like a per-rule choice on the Create Channel action so a channel can be created with an empty tvg_id (and kept empty across re-runs), with today's inherit-from-stream behaviour remaining the default.

Observed on a live system (ECM 0.18.1, Dispatcharr 0.30.0, September 2026):

Rule "Snooker (MAX UK)" matches provider stream slots and creates one channel per match into a curated group, paired with a dummy EPG profile.

  1. A pipeline run creates 16 channels, numbered 2500 to 2515.
  2. Every one is created carrying the provider's tvg_id. Channel 2500 reads BossSports.HBO Max UK.017.
  3. Dispatcharr matches that id exactly against the provider's own EPG feed, which for these slots is filler programming. The channel shows provider filler instead of the intended dummy guide.
  4. The channel keeps the provider id until a later pipeline run's assign_epg overwrites it. After that run, channel 2500 reads ecm-2500 and is bound to the dummy source.

Between steps 2 and 4 the channel exists with a provider-owned id, and a Dispatcharr EPG match landing in that window binds it to provider EPG. Because the group-bound event-sync assignment path deliberately skips channels already carrying foreign EPG, that binding then persists.

Where the behaviour comes from (verified in source, not hypothesised):

  • _execute_create_channel in backend/channel_pipeline_executor.py copies tvg_id from the matched stream into the create payload whenever the stream has one. Dispatcharr does not default it server-side.
  • The merge path for already-existing channels back-fills an empty tvg_id from the stream, so any workaround that clears the field by hand is repopulated on the next run.
  • There is no per-rule, per-profile or global switch to suppress this. assign_epg's set_tvg_id flag covers stamping an ECM-owned id, and the standalone assign_tvg_id action refuses an empty value, so nothing in the current vocabulary can clear the field.
  • Dispatcharr tolerates an empty tvg_id. The field is nullable and blankable, the create serializer does no auto-linking, and the matcher only touches channels whose EPG is unset, trying an exact tvg_id lookup first and falling back to fuzzy name matching when the id is empty. Checked against the Dispatcharr source.

This issue is scoped to one behaviour: Create Channel cannot produce a channel without an inherited tvg_id. The ordering between channel creation and dummy EPG regeneration is a separate concern and is deliberately left out.

How would you suggest implementing?

Offered as one possible shape; happy to defer to whatever fits the schema better.

A tvg_id_mode on the Create Channel action:

Mode Behaviour
inherit Default. Byte-identical to today.
none Omit tvg_id from the create payload, and skip the merge back-fill for channels created by this rule.
generate Stamp an ECM-owned id, either by reusing the existing assign_epg.set_tvg_id mechanism or by rendering a template at create time.

Two notes on that:

  • generate largely exists already via assign_epg with set_tvg_id: true, so the genuinely missing mode is none.
  • Both the create path and the merge back-fill would need to honour none, otherwise the next run undoes it.

How critical do you think this is?

High - Would significantly improve my experience

Additional Context

Activity

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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions