#[cfg(test)] #[macro_use] extern crate indoc; extern crate clap; extern crate colored; extern crate tokio; extern crate hyper; extern crate futures; use colored::*; use clap::{Arg, App}; use std::path::Path; use std::process; use std::thread; use std::sync::mpsc; use hyper::{Client, Request}; use hyper::body::Body; use tokio::runtime::Runtime; use futures::Future; mod cli; mod upnp; mod serve; mod notify; fn main() { let app = App::new(env!("CARGO_PKG_NAME")) .version(env!("CARGO_PKG_VERSION")) .author("Yuval Adam") .about(env!("CARGO_PKG_DESCRIPTION")) .arg(Arg::with_name("device") .short("d") .long("device") .value_name("DEVICE") .help("Target specific device address")) .arg(Arg::with_name("subtitles") .short("s") .long("subtitles") .value_name("SUBTITLES") .help("Subtitles file to use with the video")) .arg(Arg::with_name("FILE") .value_name("FILE") .help("Media file to stream") .index(1) .required(true)); let matches = app.get_matches(); let infile = matches.value_of("FILE").unwrap(); if Path::new(infile).exists() { println!("\n{} {}\n", "Using input file:".green(), infile.green()); } else { println!("\n{} {}\n", "Input file does not exist:".red(), infile.red()); process::exit(1); } let mut rt = Runtime::new().unwrap(); serve::run(&mut rt); let client = Client::new(); let req1 = Request::builder() .method("POST") .uri("http://10.5.1.201:38400/serviceControl/AVTransport") .header("Content-Type", "text/xml") .header("SOAPACTION", notify::A_SET) .body(Body::from(notify::BODY_SET_URI)) .unwrap(); let f = client .request(req1) .map(|_res| { println!("OK") }) .map_err(|_err| { println!("Something bad happened"); }); rt.spawn(f); // let _udp = thread::spawn(move || { // upnp::discover(); // }); let playing = true; let (tx, rx) = mpsc::channel(); let child = thread::spawn(move || { let mut controller = cli::Controller::init(); loop { let c = controller.read(); tx.send(c).unwrap(); if c == 113 { break; } if c == 32 { let req2 = if playing { Request::builder() .method("POST") .uri("http://10.5.1.201:38400/serviceControl/AVTransport") .header("Content-Type", "text/xml") .header("SOAPACTION", notify::A_STOP) .body(Body::from(notify::BODY_STOP)) .unwrap() } else { Request::builder() .method("POST") .uri("http://10.5.1.201:38400/serviceControl/AVTransport") .header("Content-Type", "text/xml") .header("SOAPACTION", notify::A_PLAY) .body(Body::from(notify::BODY_PLAY)) .unwrap() }; let f = client .request(req2) .map(|_res| { println!("OK"); }) .map_err(|_err| { println!("Err"); }); rt.spawn(f); } } controller.destroy(); }); for received in rx { println!("Got char: {}", received); } println!("Waiting for all thread"); let _res = child.join(); println!("Done!"); }