Allow opening magnet links after creation
Magnet links can now be opened after creation: imdl torrent link --open --input METAINFO type: added
This commit is contained in:
parent
aeb9d8b317
commit
d8055c6e6a
|
@ -1,3 +1,11 @@
|
||||||
|
pub(crate) const ABOUT: &str = concat!(
|
||||||
|
env!("CARGO_PKG_DESCRIPTION"),
|
||||||
|
" - ",
|
||||||
|
env!("CARGO_PKG_HOMEPAGE")
|
||||||
|
);
|
||||||
|
|
||||||
|
pub(crate) const AUTHOR: &str = env!("CARGO_PKG_AUTHORS");
|
||||||
|
|
||||||
/// Default value for `created by` torrent metainfo field.
|
/// Default value for `created by` torrent metainfo field.
|
||||||
///
|
///
|
||||||
/// Example: imdl/0.0.0 (1234567890AB)
|
/// Example: imdl/0.0.0 (1234567890AB)
|
||||||
|
@ -12,20 +20,8 @@ pub(crate) const CREATED_BY_DEFAULT: &str = concat!(
|
||||||
/// Value for `encoding` torrent metainfo field.
|
/// Value for `encoding` torrent metainfo field.
|
||||||
pub(crate) const ENCODING_UTF8: &str = "UTF-8";
|
pub(crate) const ENCODING_UTF8: &str = "UTF-8";
|
||||||
|
|
||||||
pub(crate) const ABOUT: &str = concat!(
|
|
||||||
env!("CARGO_PKG_DESCRIPTION"),
|
|
||||||
" - ",
|
|
||||||
env!("CARGO_PKG_HOMEPAGE")
|
|
||||||
);
|
|
||||||
|
|
||||||
pub(crate) const VERSION: &str = concat!("v", env!("CARGO_PKG_VERSION"));
|
|
||||||
|
|
||||||
pub(crate) const AUTHOR: &str = env!("CARGO_PKG_AUTHORS");
|
|
||||||
|
|
||||||
pub(crate) const HELP_MESSAGE: &str = "Print help message.";
|
pub(crate) const HELP_MESSAGE: &str = "Print help message.";
|
||||||
|
|
||||||
pub(crate) const VERSION_MESSAGE: &str = "Print version number.";
|
|
||||||
|
|
||||||
/// The pogress chars are from the
|
/// The pogress chars are from the
|
||||||
/// [Block Elements unicode block](https://en.wikipedia.org/wiki/Block_Elements).
|
/// [Block Elements unicode block](https://en.wikipedia.org/wiki/Block_Elements).
|
||||||
pub(crate) const PROGRESS_CHARS: &str = "█▉▊▋▌▍▎▏ ";
|
pub(crate) const PROGRESS_CHARS: &str = "█▉▊▋▌▍▎▏ ";
|
||||||
|
@ -66,3 +62,7 @@ pub(crate) const TICK_CHARS: &str = concat!(
|
||||||
"⢰⢱⢲⢳⢴⢵⢶⢷⣰⣱⣲⣳⣴⣵⣶⣷", // 0b1110----
|
"⢰⢱⢲⢳⢴⢵⢶⢷⣰⣱⣲⣳⣴⣵⣶⣷", // 0b1110----
|
||||||
"⢸⢹⢺⢻⢼⢽⢾⢿⣸⣹⣺⣻⣼⣽⣾⣿", // 0b1111----
|
"⢸⢹⢺⢻⢼⢽⢾⢿⣸⣹⣺⣻⣼⣽⣾⣿", // 0b1111----
|
||||||
);
|
);
|
||||||
|
|
||||||
|
pub(crate) const VERSION: &str = concat!("v", env!("CARGO_PKG_VERSION"));
|
||||||
|
|
||||||
|
pub(crate) const VERSION_MESSAGE: &str = "Print version number.";
|
||||||
|
|
|
@ -1,9 +1,22 @@
|
||||||
use crate::common::*;
|
use crate::common::*;
|
||||||
|
|
||||||
pub(crate) trait PlatformInterface {
|
pub(crate) trait PlatformInterface {
|
||||||
fn open(path: &Path) -> Result<(), Error> {
|
fn open_file(path: &Path) -> Result<(), Error> {
|
||||||
|
Self::open_raw(path.as_os_str())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn open_url(url: &Url) -> Result<(), Error> {
|
||||||
|
if cfg!(windows) {
|
||||||
|
let escaped = format!("\"{}\"", url);
|
||||||
|
Self::open_raw(escaped.as_str().as_ref())
|
||||||
|
} else {
|
||||||
|
Self::open_raw(url.as_str().as_ref())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn open_raw(target: &OsStr) -> Result<(), Error> {
|
||||||
let mut command = Self::opener()?;
|
let mut command = Self::opener()?;
|
||||||
command.push(OsString::from(path));
|
command.push(OsString::from(target));
|
||||||
|
|
||||||
let command_string = || {
|
let command_string = || {
|
||||||
command
|
command
|
||||||
|
|
|
@ -140,7 +140,7 @@ pub(crate) struct Create {
|
||||||
long = "open",
|
long = "open",
|
||||||
short = "O",
|
short = "O",
|
||||||
help = "Open `.torrent` file after creation. Uses `xdg-open`, `gnome-open`, or `kde-open` on \
|
help = "Open `.torrent` file after creation. Uses `xdg-open`, `gnome-open`, or `kde-open` on \
|
||||||
Linux; `open` on macOS; and `cmd /C start on Windows"
|
Linux; `open` on macOS; and `cmd /C start` on Windows"
|
||||||
)]
|
)]
|
||||||
open: bool,
|
open: bool,
|
||||||
#[structopt(
|
#[structopt(
|
||||||
|
@ -396,7 +396,7 @@ impl Create {
|
||||||
|
|
||||||
if let OutputTarget::File(path) = output {
|
if let OutputTarget::File(path) = output {
|
||||||
if self.open {
|
if self.open {
|
||||||
Platform::open(&path)?;
|
Platform::open_file(&path)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,13 @@ pub(crate) struct Link {
|
||||||
parse(from_os_str)
|
parse(from_os_str)
|
||||||
)]
|
)]
|
||||||
input: PathBuf,
|
input: PathBuf,
|
||||||
|
#[structopt(
|
||||||
|
long = "open",
|
||||||
|
short = "O",
|
||||||
|
help = "Open generated magnet link. Uses `xdg-open`, `gnome-open`, or `kde-open` on Linux; \
|
||||||
|
`open` on macOS; and `cmd /C start` on Windows"
|
||||||
|
)]
|
||||||
|
open: bool,
|
||||||
#[structopt(
|
#[structopt(
|
||||||
long = "peer",
|
long = "peer",
|
||||||
short = "p",
|
short = "p",
|
||||||
|
@ -47,7 +54,13 @@ impl Link {
|
||||||
link.add_peer(peer);
|
link.add_peer(peer);
|
||||||
}
|
}
|
||||||
|
|
||||||
outln!(env, "{}", link.to_url())?;
|
let url = link.to_url();
|
||||||
|
|
||||||
|
outln!(env, "{}", url)?;
|
||||||
|
|
||||||
|
if self.open {
|
||||||
|
Platform::open_url(&url)?;
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -229,4 +242,81 @@ mod tests {
|
||||||
if path == env.resolve("foo.torrent")
|
if path == env.resolve("foo.torrent")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn open() {
|
||||||
|
let mut create_env = test_env! {
|
||||||
|
args: [
|
||||||
|
"torrent",
|
||||||
|
"create",
|
||||||
|
"--input",
|
||||||
|
"foo",
|
||||||
|
],
|
||||||
|
tree: {
|
||||||
|
foo: "",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
assert_matches!(create_env.run(), Ok(()));
|
||||||
|
|
||||||
|
let torrent = create_env.resolve("foo.torrent");
|
||||||
|
|
||||||
|
let mut env = test_env! {
|
||||||
|
args: [
|
||||||
|
"torrent",
|
||||||
|
"link",
|
||||||
|
"--input",
|
||||||
|
&torrent,
|
||||||
|
"--open",
|
||||||
|
],
|
||||||
|
tree: {},
|
||||||
|
};
|
||||||
|
|
||||||
|
let opened = env.resolve("opened.txt");
|
||||||
|
|
||||||
|
let link = "magnet:?xt=urn:btih:516735f4b80f2b5487eed5f226075bdcde33a54e&dn=foo";
|
||||||
|
|
||||||
|
let expected = if cfg!(target_os = "windows") {
|
||||||
|
let script = env.resolve("open.bat");
|
||||||
|
fs::write(&script, format!("echo > {}", opened.display())).unwrap();
|
||||||
|
format!("ECHO is on.\r\n")
|
||||||
|
} else {
|
||||||
|
let script = env.resolve(&Platform::opener().unwrap()[0]);
|
||||||
|
fs::write(
|
||||||
|
&script,
|
||||||
|
format!("#!/usr/bin/env sh\necho $1 > {}", opened.display()),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
Command::new("chmod")
|
||||||
|
.arg("+x")
|
||||||
|
.arg(&script)
|
||||||
|
.status()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
format!("{}\n", link)
|
||||||
|
};
|
||||||
|
|
||||||
|
const KEY: &str = "PATH";
|
||||||
|
let path = env::var_os(KEY).unwrap();
|
||||||
|
let mut split = env::split_paths(&path)
|
||||||
|
.into_iter()
|
||||||
|
.collect::<Vec<PathBuf>>();
|
||||||
|
split.insert(0, env.dir().to_owned());
|
||||||
|
let new = env::join_paths(split).unwrap();
|
||||||
|
env::set_var(KEY, new);
|
||||||
|
|
||||||
|
assert_matches!(env.run(), Ok(()));
|
||||||
|
|
||||||
|
let start = Instant::now();
|
||||||
|
|
||||||
|
while start.elapsed() < Duration::new(2, 0) {
|
||||||
|
if let Ok(text) = fs::read_to_string(&opened) {
|
||||||
|
assert_eq!(text, expected);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
panic!("Failed to read `opened.txt`.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user