From 6fb07c1bf5c59aa2349a88a3d30d52c02c55019e Mon Sep 17 00:00:00 2001 From: mangofeet Date: Sat, 4 Jul 2026 14:52:09 -0600 Subject: [PATCH 1/4] add channel number to `display-name` in xmltv channel listings --- crates/ersatztv/src/xmltv.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/crates/ersatztv/src/xmltv.rs b/crates/ersatztv/src/xmltv.rs index e52eb47..d4cd088 100644 --- a/crates/ersatztv/src/xmltv.rs +++ b/crates/ersatztv/src/xmltv.rs @@ -10,6 +10,7 @@ use crate::LineupState; use crate::channel_model::ChannelModel; struct ChannelMeta { + pub number: String, pub name: String, pub tvg_id: String, pub logo: Option, @@ -18,6 +19,7 @@ struct ChannelMeta { impl From<&ChannelModel> for ChannelMeta { fn from(model: &ChannelModel) -> Self { Self { + number: model.number().to_string(), name: model.name().to_string(), tvg_id: model.tvg_id().to_string(), logo: model.logo().map(|s| s.to_string()), @@ -46,9 +48,17 @@ fn generate_blocking( w.create_element("channel") .with_attribute(("id", channel.tvg_id.as_str())) .write_inner_content(|inner_writer| { + let channel_num = channel.number.as_str(); + let channel_name = channel.name.as_str(); + let display_name = format!("{channel_num} {channel_name}"); + inner_writer .create_element("display-name") - .write_text_content(BytesText::new(channel.name.as_str()))?; + .write_text_content(BytesText::new(&display_name))?; + + inner_writer + .create_element("display-name") + .write_text_content(BytesText::new(&channel_name))?; if let Some(logo) = &channel.logo { inner_writer From 78e3548dbc66dfd61d373104b41caea5c3c18ad6 Mon Sep 17 00:00:00 2001 From: mangofeet Date: Thu, 9 Jul 2026 07:38:01 -0600 Subject: [PATCH 2/4] also add single number for channel like legacy --- crates/ersatztv/src/xmltv.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/ersatztv/src/xmltv.rs b/crates/ersatztv/src/xmltv.rs index d4cd088..194ebcc 100644 --- a/crates/ersatztv/src/xmltv.rs +++ b/crates/ersatztv/src/xmltv.rs @@ -56,6 +56,10 @@ fn generate_blocking( .create_element("display-name") .write_text_content(BytesText::new(&display_name))?; + inner_writer + .create_element("display-name") + .write_text_content(BytesText::new(&channel_num))?; + inner_writer .create_element("display-name") .write_text_content(BytesText::new(&channel_name))?; From c0dc15b49202a57c3b40f43a56749ef0a60c23ff Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Fri, 10 Jul 2026 07:54:03 -0500 Subject: [PATCH 3/4] fix build --- crates/ersatztv/src/xmltv.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/ersatztv/src/xmltv.rs b/crates/ersatztv/src/xmltv.rs index 194ebcc..2e8a683 100644 --- a/crates/ersatztv/src/xmltv.rs +++ b/crates/ersatztv/src/xmltv.rs @@ -51,18 +51,18 @@ fn generate_blocking( let channel_num = channel.number.as_str(); let channel_name = channel.name.as_str(); let display_name = format!("{channel_num} {channel_name}"); - + inner_writer .create_element("display-name") .write_text_content(BytesText::new(&display_name))?; inner_writer .create_element("display-name") - .write_text_content(BytesText::new(&channel_num))?; + .write_text_content(BytesText::new(channel_num))?; inner_writer .create_element("display-name") - .write_text_content(BytesText::new(&channel_name))?; + .write_text_content(BytesText::new(channel_name))?; if let Some(logo) = &channel.logo { inner_writer From d816801ca8bfb4c2cce48eec628bc22bd9c53d38 Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Fri, 10 Jul 2026 07:57:13 -0500 Subject: [PATCH 4/4] add test --- crates/ersatztv/src/xmltv.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/crates/ersatztv/src/xmltv.rs b/crates/ersatztv/src/xmltv.rs index 2e8a683..78d9e34 100644 --- a/crates/ersatztv/src/xmltv.rs +++ b/crates/ersatztv/src/xmltv.rs @@ -174,4 +174,21 @@ mod tests { "child element dropped: {output}" ); } + + #[test] + fn generate_blocking_includes_display_names() { + let channels = vec![ChannelMeta { + number: "1.1".to_string(), + name: "Test Channel".to_string(), + tvg_id: "test.1".to_string(), + logo: None, + }]; + + let result = generate_blocking(None, &channels).unwrap(); + let output = String::from_utf8(result).unwrap(); + + assert!(output.contains("1.1 Test Channel")); + assert!(output.contains("1.1")); + assert!(output.contains("Test Channel")); + } }