use anyhow::Context;
use clap::Parser;
#[derive(Parser)]
struct Args {
#[arg(long, default_value = "http://localhost:4443/anon")]
url: url::Url,
#[arg(long)]
source: String,
#[arg(long)]
output: Option<String>,
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
moq_native::Log::new(tracing::Level::INFO).init()?;
let args = Args::parse();
let output_path = args
.output
.clone()
.unwrap_or_else(|| format!("{}/transcode.hang", args.source));
let publish = moq_net::Origin::random().produce();
let remote = moq_net::Origin::random().produce();
let client = moq_native::ClientConfig::default().init()?;
let mut session = client
.with_publisher(&publish)
.with_subscriber(remote.clone())
.reconnect(args.url.clone());
while !matches!(session.status().await?, moq_native::Status::Connected) {}
let source = remote
.consume()
.request_broadcast(&args.source)
.await
.context("source broadcast unavailable")?;
let mut config = moq_transcode::Config::default();
config.source = Some(moq_net::PathRelativeOwned::from("..".to_string()));
let output = publish
.create_broadcast(&output_path, moq_net::broadcast::Route::new().with_announce(true))
.context("failed to create the derivative broadcast")?;
tracing::info!(source = %args.source, output = %output_path, "transcoding");
tokio::select! {
res = moq_transcode::run(source, output, config) => Ok(res?),
res = session.closed() => Ok(res?),
}
}