Advance forge rollout, Ethereum rails, and NBC sources
This commit is contained in:
parent
be26313225
commit
7d84510eac
88 changed files with 11230 additions and 302 deletions
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue