Advance forge rollout, Ethereum rails, and NBC sources

This commit is contained in:
every.channel 2026-04-01 15:58:49 -07:00
parent be26313225
commit 7d84510eac
No known key found for this signature in database
88 changed files with 11230 additions and 302 deletions

View file

@ -555,9 +555,39 @@ fn lineup_from_json_value(json: &Value, device_id: Option<&DeviceId>) -> Result<
));
}
if let Some(callsign) = json_string_field(entry, &["CallSign", "Callsign", "CallSignRaw"]) {
metadata.push(ChannelMetadata::Callsign(callsign));
}
if let Some(network) = json_string_field(entry, &["Network"]) {
metadata.push(ChannelMetadata::Network(network));
}
if let Some(region) = json_string_field(entry, &["Region", "Market"]) {
metadata.push(ChannelMetadata::Region(region));
}
if let Some(frequency) = json_string_field(entry, &["Frequency", "FrequencyHz"]) {
metadata.push(ChannelMetadata::Frequency(frequency));
}
let program_id = json_u16_field(entry, &["ProgramNumber", "ProgramID", "Program"]);
if let Some(obj) = entry.as_object() {
for (key, value) in obj.iter() {
if key == "GuideNumber" || key == "GuideName" || key == "Tags" || key == "URL" {
if key == "GuideNumber"
|| key == "GuideName"
|| key == "Tags"
|| key == "URL"
|| key == "CallSign"
|| key == "Callsign"
|| key == "CallSignRaw"
|| key == "Network"
|| key == "Region"
|| key == "Market"
|| key == "Frequency"
|| key == "FrequencyHz"
|| key == "ProgramNumber"
|| key == "ProgramID"
|| key == "Program"
{
continue;
}
metadata.push(ChannelMetadata::Extra(key.clone(), value.to_string()));
@ -568,7 +598,7 @@ fn lineup_from_json_value(json: &Value, device_id: Option<&DeviceId>) -> Result<
id,
name: guide_name,
number: parsed.guide_number,
program_id: None,
program_id,
metadata,
};
@ -583,6 +613,44 @@ fn lineup_from_json_value(json: &Value, device_id: Option<&DeviceId>) -> Result<
Ok(output)
}
fn json_string_field(value: &Value, keys: &[&str]) -> Option<String> {
let obj = value.as_object()?;
for key in keys {
let Some(value) = obj.get(*key) else {
continue;
};
let text = match value {
Value::String(text) => text.trim().to_string(),
Value::Number(number) => number.to_string(),
_ => continue,
};
if !text.is_empty() {
return Some(text);
}
}
None
}
fn json_u16_field(value: &Value, keys: &[&str]) -> Option<u16> {
let obj = value.as_object()?;
for key in keys {
let Some(value) = obj.get(*key) else {
continue;
};
let parsed = match value {
Value::Number(number) => number
.as_u64()
.and_then(|number| u16::try_from(number).ok()),
Value::String(text) => text.trim().parse::<u16>().ok(),
_ => None,
};
if parsed.is_some() {
return parsed;
}
}
None
}
#[cfg(test)]
mod tests {
use super::*;
@ -648,6 +716,9 @@ mod tests {
"GuideName": "KCBS-HD",
"Tags": "drm,encrypted,",
"URL": "http://hdhr/auto/v2.1",
"CallSign": "KCBS",
"ProgramNumber": "3",
"Frequency": "573000000",
"Foo": "Bar"
},
{
@ -662,8 +733,17 @@ mod tests {
assert_eq!(entries[0].channel.id.0, "hdhr:ABCDEF01:2.1");
assert_eq!(entries[0].channel.name, "KCBS-HD");
assert_eq!(entries[0].channel.number.as_deref(), Some("2.1"));
assert_eq!(entries[0].channel.program_id, Some(3));
assert_eq!(entries[0].stream_url, "http://hdhr/auto/v2.1");
assert!(entries[0].tags.iter().any(|t| t == "drm"));
assert!(entries[0].channel.metadata.iter().any(|m| match m {
ChannelMetadata::Callsign(value) => value == "KCBS",
_ => false,
}));
assert!(entries[0].channel.metadata.iter().any(|m| match m {
ChannelMetadata::Frequency(value) => value == "573000000",
_ => false,
}));
assert!(entries[0].channel.metadata.iter().any(|m| match m {
ChannelMetadata::Extra(key, value) => key == "guide_number" && value == "2.1",
_ => false,