Plex DVR is mixing channels program when similar channel / station name

Server Version#: 1.42.2.10156
Player Version#:
Tuner Make/Model: VBox Android TV Gateway XTi 4144
Guide/Lineup name:
Using XMLTV?: xml EPG from VBox Android TV Gateway XTi 4144
Channel number/Name: Nova, Nova Cinema, Nova Fun / Prima Prima Love, Prima Cool - in Czech republic

I am trying conect my - supported tunner - VBox Android TV Gateway XTi 4144 and using its EPG XML build from the Air/Antena. In Vbox and other software program looks fine. But when load it into Plex for some reason Plex MIX program of the Main station channel with its sub channels: sub channels program are fine.

I did some external edits to kill XML issue, becouse some station really not care and send nonvalid XML / hidden symbols into EPG and kill XML validation. But it changed nothing

Example

Nova - main channel with mixed program - just random program from other nova channels
Nova Cinema - EPG program is fine
Nova Action - EPG program is fine
Nova Fun - EPG program is fine

Prima - main channel with mixed program - just random program from other Prima channels
Prima Cool - EPG program is fine
Prima Max - EPG program is fine

CT1- EPG program is fine
CT2 - mixed program with CT24 station
CT24 - EPG program is fine

XML attached. Any idea how is it mapping the program with the station and what is wrong in XML, that Plex interpret it wronkly?

EPG XML Head example

<channel id="www.Nova.co.un">
	<display-name>Nova</display-name>
	<display-name>TV</display-name>
	<display-name>T-CZE-20cb03ea2ee1</display-name>
	<display-name>Free</display-name>
	<display-name>6</display-name>
	<icon src="http://VBOX:55555/Media//icons/nova.png"/>
	<url src="http://VBOX:55555/Nova"/>
</channel>
<channel id="www.Nova%20Cinema.co.un">
	<display-name>Nova Cinema</display-name>
	<display-name>TV</display-name>
	<display-name>T-CZE-20cb03ea2ee2</display-name>
	<display-name>Free</display-name>
	<display-name>7</display-name>
	<icon src="http://VBOX:55555/Media//icons/nova_cinema.png"/>
	<url src="http://VBOX:55555/Nova%20Cinema"/>
</channel>
<channel id="www.Prima.co.un">
	<display-name>Prima</display-name>
	<display-name>TV</display-name>
	<display-name>T-CZE-20cb03ea2ee3</display-name>
	<display-name>Free</display-name>
	<display-name>12</display-name>
	<icon src="http://VBOX:55555/Media//icons/prima.png"/>
	<url src="http://VBOX:55555/Prima"/>
</channel>
<channel id="www.Prima%20COOL.co.un">
	<display-name>Prima COOL</display-name>
	<display-name>TV</display-name>
	<display-name>T-CZE-20cb03ea2ee4</display-name>
	<display-name>Free</display-name>
	<display-name>13</display-name>
	<icon src="http://VBOX:55555/Media//icons/prima_cool.png"/>
	<url src="http://VBOX:55555/Prima%20COOL"/>
</channel>
<programme start="20260527143500 +0200" stop="20260527153000 +0200" channel="www.Nova.co.un">
	<title lang="cze">Kriminálka Miami (S4, E3)</title>
	<desc lang="cze">Kamarádka dívky nahlásí zmizení své přítelkyně. Zanedlouho je nalezen její vůz, který měla pronajatý. V něm policisté objeví sledovací kameru. Brzy zjistí, že dívku sledoval na jejím výletě její nevlastní... Rok: 2005 Hrají: David Caruso, Emily Procter, Adam Rodriguez, Khandi Alexander, Jonathan Togo</desc>
	<rating system="VBOX">
		<value>15</value>
	</rating>
</programme>
<programme start="20260527142000 +0200" stop="20260527162500 +0200" channel="www.Nova%20Cinema.co.un">
	<title lang="cze">Mamma Mia!</title>
	<desc lang="cze">Mladičká Sophie žije s mírně praštěnou matkou Donnou na řeckém ostrůvku Kalokairi, kde vedou lehce uvadající rodinný hotýlek. Ani s jednou není k vydržení, protože Sophie se má zanedlouho vdávat. Zatímco... Rok: 2008 Režie: Phyllida Lloyd Hrají: Meryl Streep, Pierce Brosnan, Amanda Seyfried, Colin Firth, Stellan Skarsgård</desc>
	<rating system="VBOX">
		<value>8</value>
	</rating>
</programme>

FULL raw EPG XML from vbox tunner box

I think i solve it. When I replaced station ID with something more rubost and not include escape %20 for space

example

original:

<channel id="www.Nova.co.un">
	<display-name>Nova</display-name>
	<display-name>TV</display-name>
	<display-name>T-CZE-20cb03ea2ee1</display-name>
	<display-name>Free</display-name>
	<display-name>6</display-name>
	<icon src="http://VBOX:55555/Media//icons/nova.png"/>
	<url src="http://VBOX:55555/Nova"/>
</channel>

Replaced version

    <channel id="T-CZE-20cb03ea2ee1">
            <display-name>Nova</display-name>
            <display-name>6</display-name>
            <icon src="http://VBOX:55555/Media//icons/nova.png" />
            <url src="http://VBOX:55555/Nova" />
    </channel>
    <programme start="20260603103000 +0200" stop="20260603113000 +0200" channel="T-CZE-20cb03eb32c9">
            <title lang="cze">Vyprávěj (S2, E15)</title>
            <desc lang="cze">Karel a Kamila se nakonec sblíží a užívají si spolu tajný milenecký vztah. Karel je myšlenkami stále u své milenky, a tak brzy čelí obvinění, že v práci nedodržuje termíny. Evina sestra Katarína by si chtěla... Rok: 2010 Režie: Biser A. Arichtev Hrají: Svatopluk Skopal, Veronika Freimanová, Andrea Růžičková, Roman Vojtek, Nina Divíšková</desc>
            <rating system="VBOX">
                    <value>12</value>
            </rating>
    </programme>
#!/bin/bash

#1. DOwnload and clanup

curl -s http://VBOX:55555/vboxXmltv.xml | iconv -f UTF-8 -t UTF-8 -c | tr -d ‘\000-\010\013\014\016-\037’ | sed “s/'/'/g” > /tmp/vbox_raw.xml

#2. Python transformation of ID and deleting unwanted tags TV, Radio, Free

python3 -c "
import xml.etree.ElementTree as ET

tree = ET.parse(‘/tmp/vbox_raw.xml’)
root = tree.getroot()
id_map = {}

#Channel name change

for channel in root.findall(‘channel’):
old_id = channel.get(‘id’)
new_id = old_id

# Find the ID T-CZE
for dn in channel.findall('display-name'):
    if dn.text and str(dn.text).startswith('T-CZE'):
        new_id = str(dn.text)
        break
        
id_map[old_id] = new_id
channel.set('id', new_id)

# Delete unwanted tags
for dn in channel.findall('display-name'):
    if dn.text in ['TV', 'Radio', 'Free'] or (dn.text and str(dn.text).startswith('T-CZE')):
        channel.remove(dn)

#Correct id in programme tags

for prog in root.findall(‘programme’):
old_channel = prog.get(‘channel’)
if old_channel in id_map:
prog.set(‘channel’, id_map[old_channel])

tree.write(‘/tmp/vbox_clean.xml’, encoding=‘utf-8’, xml_declaration=True)
"

#3. Fix right and delete temp

chmod 644 /tmp/vbox_clean.xml
rm /tmp/vbox_raw.xml