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.
- A pipeline run creates 16 channels, numbered 2500 to 2515.
- Every one is created carrying the provider's
tvg_id. Channel 2500 reads BossSports.HBO Max UK.017.
- 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.
- 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
What would you like this feature to do?
Today a Create Channel action always copies the matched stream's
tvg_idonto 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.
tvg_id. Channel 2500 readsBossSports.HBO Max UK.017.assign_epgoverwrites it. After that run, channel 2500 readsecm-2500and 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_channelinbackend/channel_pipeline_executor.pycopiestvg_idfrom the matched stream into the create payload whenever the stream has one. Dispatcharr does not default it server-side.tvg_idfrom the stream, so any workaround that clears the field by hand is repopulated on the next run.assign_epg'sset_tvg_idflag covers stamping an ECM-owned id, and the standaloneassign_tvg_idaction refuses an empty value, so nothing in the current vocabulary can clear the field.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 exacttvg_idlookup 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_modeon the Create Channel action:inheritnonetvg_idfrom the create payload, and skip the merge back-fill for channels created by this rule.generateassign_epg.set_tvg_idmechanism or by rendering a template at create time.Two notes on that:
generatelargely exists already viaassign_epgwithset_tvg_id: true, so the genuinely missing mode isnone.none, otherwise the next run undoes it.How critical do you think this is?
High - Would significantly improve my experience
Additional Context
tvg_idinheritance at create time.tvg_idwas confirmed againstapps/channels/serializers.py,apps/channels/models.py,apps/channels/tasks.pyandapps/channels/epg_matching.pyon the Dispatcharrmainbranch.tvg_idstays that way across refreshes.