Add name and peers to magnet links
Add additional data to magnet links in `imdl torrent link`. - Set the `dn` query parameter with `metinfo.info.name` - Add peers to the `x.pe` query parameter: imdl torrent link --peer HOST:PORT type: added
This commit is contained in:
parent
57a358e458
commit
aeb9d8b317
|
@ -15,6 +15,13 @@ pub(crate) struct Link {
|
||||||
parse(from_os_str)
|
parse(from_os_str)
|
||||||
)]
|
)]
|
||||||
input: PathBuf,
|
input: PathBuf,
|
||||||
|
#[structopt(
|
||||||
|
long = "peer",
|
||||||
|
short = "p",
|
||||||
|
value_name = "PEER",
|
||||||
|
help = "Add `PEER` to magnet link."
|
||||||
|
)]
|
||||||
|
peers: Vec<HostPort>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Link {
|
impl Link {
|
||||||
|
@ -25,6 +32,8 @@ impl Link {
|
||||||
|
|
||||||
let mut link = MagnetLink::with_infohash(infohash);
|
let mut link = MagnetLink::with_infohash(infohash);
|
||||||
|
|
||||||
|
link.set_name(&metainfo.info.name);
|
||||||
|
|
||||||
let mut trackers = HashSet::new();
|
let mut trackers = HashSet::new();
|
||||||
for result in metainfo.trackers() {
|
for result in metainfo.trackers() {
|
||||||
let tracker = result?;
|
let tracker = result?;
|
||||||
|
@ -34,6 +43,10 @@ impl Link {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for peer in self.peers {
|
||||||
|
link.add_peer(peer);
|
||||||
|
}
|
||||||
|
|
||||||
outln!(env, "{}", link.to_url())?;
|
outln!(env, "{}", link.to_url())?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -67,7 +80,10 @@ mod tests {
|
||||||
|
|
||||||
let infohash = Sha1Digest::from_data(INFO.as_bytes());
|
let infohash = Sha1Digest::from_data(INFO.as_bytes());
|
||||||
|
|
||||||
assert_eq!(env.out(), format!("magnet:?xt=urn:btih:{}\n", infohash),);
|
assert_eq!(
|
||||||
|
env.out(),
|
||||||
|
format!("magnet:?xt=urn:btih:{}&dn=foo\n", infohash),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -96,7 +112,73 @@ mod tests {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
env.out(),
|
env.out(),
|
||||||
format!(
|
format!(
|
||||||
"magnet:?xt=urn:btih:{}&tr=https://foo.com/announce\n",
|
"magnet:?xt=urn:btih:{}&dn=foo&tr=https://foo.com/announce\n",
|
||||||
|
infohash
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn unique_trackers() {
|
||||||
|
let mut env = test_env! {
|
||||||
|
args: [
|
||||||
|
"torrent",
|
||||||
|
"link",
|
||||||
|
"--input",
|
||||||
|
"foo.torrent",
|
||||||
|
],
|
||||||
|
tree: {
|
||||||
|
"foo.torrent": "d\
|
||||||
|
8:announce24:https://foo.com/announce\
|
||||||
|
13:announce-listll24:https://foo.com/announceel24:https://bar.com/announceee\
|
||||||
|
4:infod6:lengthi0e4:name3:foo12:piece lengthi1e6:pieces0:e\
|
||||||
|
e",
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
assert_ok!(env.run());
|
||||||
|
|
||||||
|
const INFO: &str = "d6:lengthi0e4:name3:foo12:piece lengthi1e6:pieces0:e";
|
||||||
|
|
||||||
|
let infohash = Sha1Digest::from_data(INFO.as_bytes());
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
env.out(),
|
||||||
|
format!(
|
||||||
|
"magnet:?xt=urn:btih:{}&dn=foo&tr=https://foo.com/announce&tr=https://bar.com/announce\n",
|
||||||
|
infohash
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn with_peer() {
|
||||||
|
let mut env = test_env! {
|
||||||
|
args: [
|
||||||
|
"torrent",
|
||||||
|
"link",
|
||||||
|
"--input",
|
||||||
|
"foo.torrent",
|
||||||
|
"--peer",
|
||||||
|
"foo.com:1337",
|
||||||
|
],
|
||||||
|
tree: {
|
||||||
|
"foo.torrent": "d\
|
||||||
|
8:announce24:https://foo.com/announce\
|
||||||
|
4:infod6:lengthi0e4:name3:foo12:piece lengthi1e6:pieces0:e\
|
||||||
|
e",
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
assert_ok!(env.run());
|
||||||
|
|
||||||
|
const INFO: &str = "d6:lengthi0e4:name3:foo12:piece lengthi1e6:pieces0:e";
|
||||||
|
|
||||||
|
let infohash = Sha1Digest::from_data(INFO.as_bytes());
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
env.out(),
|
||||||
|
format!(
|
||||||
|
"magnet:?xt=urn:btih:{}&dn=foo&tr=https://foo.com/announce&x.pe=foo.com:1337\n",
|
||||||
infohash
|
infohash
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -122,7 +204,10 @@ mod tests {
|
||||||
|
|
||||||
let infohash = Sha1Digest::from_data(INFO.as_bytes());
|
let infohash = Sha1Digest::from_data(INFO.as_bytes());
|
||||||
|
|
||||||
assert_eq!(env.out(), format!("magnet:?xt=urn:btih:{}\n", infohash),);
|
assert_eq!(
|
||||||
|
env.out(),
|
||||||
|
format!("magnet:?xt=urn:btih:{}&dn=foo\n", infohash),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user