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 source_path = moq_net::PathOwned::from(args.source);
let output_path = moq_net::PathOwned::from(
args.output
.clone()
.unwrap_or_else(|| format!("{source_path}/transcode.hang")),
);
let publish = moq_net::Origin::random().produce();
let remote = moq_net::Origin::random().produce();
let client = moq_native::ClientConfig::default().init()?;
let session = client
.with_publisher(&publish)
.with_subscriber(remote.clone())
.reconnect(args.url.clone());
let consumer = remote.consume();
tokio::select! {
announced = consumer.announced_broadcast(&source_path) => {
announced.context("origin closed before the source broadcast was announced")?;
}
closed = session.closed() => {
closed.context("session failed before the source broadcast was announced")?;
anyhow::bail!("session closed before the source broadcast was announced");
}
}
let source = consumer
.request_broadcast(&source_path)
.await
.context("source broadcast unavailable")?;
let mut config = moq_transcode::Config::default();
config.source = moq_transcode::source_reference(&source_path, &output_path);
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 = %source_path, output = %output_path, "transcoding");
tokio::select! {
res = moq_transcode::run(source, output, config) => Ok(res?),
res = session.closed() => Ok(res?),
}
}