9 个稳定版本
2.0.0 | 2021年7月29日 |
---|---|
1.2.2 | 2021年5月20日 |
1.2.1 | 2021年2月18日 |
#1019 in 网络编程
每月207次下载
用于 2 crate
26KB
161 行
什么是磁力链接
磁力链接是一种通过文件的哈希值来识别文件的URI方案,通常用于点对点文件共享网络(如BitTorrent)。基本上,磁力链接可以识别你想要下载的种子,并告诉种子客户端如何下载。它们使通过互联网共享文件变得非常容易,并使用DHT和追踪器组合来告诉你的种子客户端其他可以与你共享文件的对等方的位置。
为什么是 magnet_url
在我做的一个副项目时,我意识到自己不幸地尝试获取磁力链接的各个部分并进行进一步处理。我很快为此编写了一些正则表达式,但后来我意识到这对其他处理Rust中种子项目的项目来说会非常有用。通过使其可修改,它还允许创建自定义磁力链接,这对基于种子的项目也有用。
为什么使用 magnet_url
magnet_url 的目标是解析磁力链接的各个部分,它使用一些相对简单的正则表达式来完成此操作。该crate设计得非常简单高效,具有很多灵活性。它还设计得相对容易处理错误,并且通过文档和许可证鼓励对源代码进行修改。
如何使用此 crate
解析磁力链接非常简单
use magnet_url::Magnet;
let magneturl = Magnet::new("magnet:?xt=urn:btih:08ada5a7a6183aae1e09d831df6748d566095a10&dn=Sintel&tr=udp%3A%2F%2Fexplodie.org%3A6969&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.empire-js.us%3A1337&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=wss%3A%2F%2Ftracker.btorrent.xyz&tr=wss%3A%2F%2Ftracker.fastcast.nz&tr=wss%3A%2F%2Ftracker.openwebtorrent.com&ws=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2F&xs=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2Fsintel.torrent");
这将返回一个 Magnet 结构体,由本节以下列出的字段组成。访问这些字段也非常简单
use magnet_url::Magnet;
let magneturl = Magnet::new("magnet:?xt=urn:btih:08ada5a7a6183aae1e09d831df6748d566095a10&dn=Sintel&tr=udp%3A%2F%2Fexplodie.org%3A6969&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.empire-js.us%3A1337&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=wss%3A%2F%2Ftracker.btorrent.xyz&tr=wss%3A%2F%2Ftracker.fastcast.nz&tr=wss%3A%2F%2Ftracker.openwebtorrent.com&ws=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2F&xs=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2Fsintel.torrent");
println!("{:?}", magneturl.dn);
如果您想修改磁力链接的某些部分以进行自定义,也可以这样做!
use magnet_url::Magnet;
let mut magneturl = Magnet::new("magnet:?xt=urn:btih:08ada5a7a6183aae1e09d831df6748d566095a10&dn=Sintel&tr=udp%3A%2F%2Fexplodie.org%3A6969&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.empire-js.us%3A1337&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=wss%3A%2F%2Ftracker.btorrent.xyz&tr=wss%3A%2F%2Ftracker.fastcast.nz&tr=wss%3A%2F%2Ftracker.openwebtorrent.com&ws=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2F&xs=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2Fsintel.torrent");
println!("{:?}", magneturl.dn);
magneturl.dn = String::from("hello_world");
println!("{:?}", magneturl.dn);
事实上,只要填写所有参数,您还可以构建自己的磁力链接!
use magnet_url::Magnet;
//Note, this magnet won't actually download, sorry :/
Magnet {
dn: "hello_world".to_string(),
hash_type: "sha1".to_string(),
xt: "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed".to_string(),
xl: 1234567890,
tr:
{
let mut tr_vec = Vec::new();
tr_vec.push("https://example.com/".to_string());
tr_vec
},
kt: "cool+stuff".to_string(),
ws: String::new(),
acceptable_source: String::new(),
mt: String::new(),
xs: String::new(),
};
您可以从 Magnet 结构体再次生成磁力链接字符串
use magnet_url::Magnet;
//Note, this magnet won't actually download, sorry :/
let magnet_struct = Magnet {
dn: "hello_world".to_string(),
hash_type: "sha1".to_string(),
xt: "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed".to_string(),
xl: 1234567890,
tr: vec!["https://example.com/".to_string()],
kt: "cool+stuff".to_string(),
ws: String::new(),
acceptable_source: String::new(),
mt: String::new(),
xs: String::new(),
};
let magnet_string = magnet_struct.to_string();
println!("{}", magnet_string);
无效的磁力链接将导致 panic!
(这将改为错误,在v2.0.0中
use magnet_url::Magnet;
#[should_panic]
let _magnet_link = Magnet::new("https://example.com");
依赖项
~2.1–3MB
~54K SLoC