use clap::Parser; use regex::Regex; use std::{net::SocketAddr, path::PathBuf}; use url::Url; #[derive(Parser, Debug)] #[command(version, about, long_about = None)] pub struct Config { /// Directory path to store preloaded data (e.g. `.torrent` files) /// /// * it's probably the same location as `public` dir for the [btracker](https://github.com/YGGverse/btracker) frontend #[arg(long)] pub preload: PathBuf, /// Absolute path(s) or URL(s) to import infohashes from the Aquatic tracker binary API /// /// * PR#233 feature ([Wiki](https://github.com/YGGverse/aquatic-crawler/wiki/Aquatic)) #[arg(long)] pub infohash: Vec, /// The P2P Blocklist file URL (to filter outgoing connections) /// /// * use `--blocklist=file:///path/to/blocklist.txt` format for the local path #[arg(long)] pub blocklist: Option, /// Define custom tracker(s) to preload the `.torrent` files info #[arg(long)] pub tracker: Vec, /// Define initial peer(s) to preload the `.torrent` files info #[arg(long)] pub initial_peer: Option>, /// Appends `--tracker` value to magnets and torrents #[arg(long, default_value_t = false)] pub export_trackers: bool, /// Enable DHT resolver #[arg(long, default_value_t = false)] pub enable_dht: bool, /// Enable LSD multicast #[arg(long, default_value_t = false)] pub enable_lsd: bool, /// Disable TCP connection #[arg(long, default_value_t = false)] pub disable_tcp: bool, /// Bind resolver session on specified device name (`tun0`, `mycelium`, etc.) #[arg(long)] pub bind: Option, /// Preload only files match regex pattern (list only without preload by default) /// * see also `preload_max_filesize`, `preload_max_filecount` options /// /// ## Example: /// /// Filter by image ext /// ``` /// --preload-regex '\.(png|gif|jpeg|jpg|webp|svg|log|txt)$' /// ``` /// /// * requires `storage` argument defined #[arg(long)] pub preload_regex: Option, /// Max size sum of preloaded files per torrent (match `preload_regex`) #[arg(long)] pub preload_max_filesize: Option, /// Max count of preloaded files per torrent (match `preload_regex`) #[arg(long)] pub preload_max_filecount: Option, /// Use `socks5://[username:password@]host:port` #[arg(long)] pub proxy_url: Option, // Tuneup the peers processor #[arg(long)] pub peer_connect_timeout: Option, #[arg(long)] pub peer_read_write_timeout: Option, #[arg(long)] pub peer_keep_alive_interval: Option, /// Estimated info-hash index capacity /// /// * use for memory optimization, depending on tracker volumes #[arg(long, default_value_t = 1000)] pub index_capacity: usize, /// Max time in seconds to add new torrent #[arg(long, default_value_t = 60)] pub add_torrent_timeout: u64, /// Ban time in seconds on torrent add failure (`add_torrent_timeout` is reached) #[arg(long, default_value_t = 3600)] pub add_torrent_ban: u64, /// Ban time in seconds on torrent resolve failure #[arg(long, default_value_t = 3600)] pub resolve_torrent_ban: u64, /// Ban time in seconds on torrent data download is longer than `add_torrent_timeout` #[arg(long)] pub slow_torrent_ban: Option, /// Crawl loop delay in seconds #[arg(long, default_value_t = 60)] pub sleep: u64, /// Limit download speed (b/s) #[arg(long)] pub download_limit: Option, // * reminder: upload feature is not planed by the crawler impl /// Skip long-thinking connections, /// try to handle the other hashes in this queue after `n` seconds #[arg(long, default_value_t = 60)] pub wait_until_completed: u64, }