#parse-url #magnet #file-sharing #parser #parse #url-scheme #torrent

magnet-url

一个简单、可修改的 Rust 磁力链接解析器

9 个稳定版本

2.0.0 2021年7月29日
1.2.2 2021年5月20日
1.2.1 2021年2月18日

#1019 in 网络编程

Download history 97/week @ 2024-03-11 93/week @ 2024-03-18 91/week @ 2024-03-25 64/week @ 2024-04-01 88/week @ 2024-04-08 60/week @ 2024-04-15 64/week @ 2024-04-22 76/week @ 2024-04-29 91/week @ 2024-05-06 48/week @ 2024-05-13 44/week @ 2024-05-20 45/week @ 2024-05-27 38/week @ 2024-06-03 58/week @ 2024-06-10 62/week @ 2024-06-17 43/week @ 2024-06-24

每月207次下载
用于 2 crate

MIT 许可证

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