From ac77420ba9c839983e67f5422bce3a423ecf38d2 Mon Sep 17 00:00:00 2001 From: chris west Date: Sat, 30 May 2020 11:36:29 -0700 Subject: [PATCH] hook up --media flag --- src/args.rs | 21 +++++++++++++++++++++ src/ui.rs | 4 ++-- src/utils.rs | 20 +++++++++++--------- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/args.rs b/src/args.rs index 6dc0e02..22a28b5 100644 --- a/src/args.rs +++ b/src/args.rs @@ -106,6 +106,9 @@ pub fn parse>(args: &[T]) -> Result { let mut set_notls = false; let mut set_tor = false; let mut set_notor = false; + let mut set_media = false; + let mut set_nomedia = false; + while let Some(arg) = iter.next() { match arg.as_ref() { "-v" | "--version" | "-version" => { @@ -162,6 +165,24 @@ pub fn parse>(args: &[T]) -> Result { set_notor = true; cfg.tor = false; } + "-m" | "--media" | "-media" => { + if set_nomedia { + return Err(ArgError::new("can't set both --media and --no-media")); + } + set_media = true; + if let Some(player) = iter.next() { + cfg.media = Some(player.as_ref().to_string()); + } else { + return Err(ArgError::new("--media expects a PROGRAM arg")); + } + } + "-M" | "--no-media" | "-no-media" => { + if set_media { + return Err(ArgError::new("can't set both --media and --no-media")); + } + set_nomedia = true; + cfg.media = None; + } arg => { if arg.starts_with('-') { return Err(ArgError::new(format!("unknown flag: {}", arg))); diff --git a/src/ui.rs b/src/ui.rs index 92a0d5d..501072a 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -188,10 +188,10 @@ impl UI { // binary downloads let typ = gopher::type_for_url(url); - if typ.is_media() { + if typ.is_media() && self.config.media.is_some() { self.dirty = true; return if self.confirm(&format!("Open in media player? {}", url)) { - utils::open_media(url) + utils::open_media(self.config.media.as_ref().unwrap(), url) } else { Ok(()) }; diff --git a/src/utils.rs b/src/utils.rs index 17f1bda..4b95f08 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,5 +1,6 @@ //! Helper functions and macros. use std::{ + borrow::Cow, io::{Result, Write}, process::{self, Stdio}, }; @@ -96,12 +97,16 @@ pub fn open_external(url: &str) -> Result<()> { } } -/// Opens a media file with `mpv`. -pub fn open_media(url: &str) -> Result<()> { +/// Opens a media file with `mpv` or `--media`. +pub fn open_media(program: &str, url: &str) -> Result<()> { use {crate::terminal, std::io}; // mpv only supports /9/ - let url = url.replace("/;/", "/9/").replace("/s/", "/9/"); + let url = if program.ends_with("mpv") { + Cow::from(url.replace("/;/", "/9/").replace("/s/", "/9/")) + } else { + Cow::from(url) + }; // support URL: selectors let url = if let Some(idx) = url.find("URL:") { @@ -111,11 +116,8 @@ pub fn open_media(url: &str) -> Result<()> { }; let errfn = |e| { - if let Err(e) = terminal::enable_raw_mode() { - error!("`mpv` error: {}", e) - } else { - error!("`mpv` error: {}", e) - } + terminal::enable_raw_mode().unwrap(); + error!("Media player error: {}", e) }; // clear screen first @@ -124,7 +126,7 @@ pub fn open_media(url: &str) -> Result<()> { stdout.flush()?; terminal::disable_raw_mode()?; - let mut cmd = process::Command::new("mpv") + let mut cmd = process::Command::new(program) .arg(url) .stdin(Stdio::inherit()) .stdout(Stdio::inherit())