initial prototype

This commit is contained in:
2025-07-19 15:35:04 +02:00
commit 673a0967b2
8 changed files with 1948 additions and 0 deletions

45
src/lib.rs Normal file
View File

@@ -0,0 +1,45 @@
use serde_json::Value;
pub async fn newest_morning_journal_streaming_url() -> Result<String, Box<dyn std::error::Error>> {
let url = get_newest_morning_journal().await?;
get_streaming_url(url).await
}
// List of broadcasts: https://audioapi.orf.at/oe1/api/json/current/broadcasts
//
// ^ contains link, e.g. https://audioapi.orf.at/oe1/api/json/4.0/broadcast/797577/20250611
async fn get_newest_morning_journal() -> Result<String, Box<dyn std::error::Error>> {
let url = "https://audioapi.orf.at/oe1/api/json/current/broadcasts";
let data: Value = reqwest::get(url).await?.json().await?;
if let Some(days) = data.as_array() {
for day in days.iter().rev() {
if let Some(broadcasts) = day["broadcasts"].as_array() {
for broadcast in broadcasts.iter().rev() {
if broadcast["title"] == "Ö1 Morgenjournal" {
if let Some(href) = broadcast["href"].as_str() {
return Ok(href.into());
}
}
}
}
}
}
Err(String::from("No Ö1 Morgenjournal found").into())
}
async fn get_streaming_url(url: String) -> Result<String, Box<dyn std::error::Error>> {
let data: Value = reqwest::get(url).await?.json().await?;
let Some(streams) = data["streams"].as_array() else {
return Err(String::from("No 'streams' found").into());
};
assert_eq!(streams.len(), 1);
let Some(id) = streams[0]["loopStreamId"].as_str() else {
return Err(String::from("No 'loopStreamId' found").into());
};
Ok(format!(
"https://loopstream01.apa.at/?channel=oe1&shoutcast=0&id={id}"
))
}