implement format getters

This commit is contained in:
yggverse 2025-08-09 01:56:40 +03:00
parent 9291328401
commit c5a0684466
4 changed files with 50 additions and 44 deletions

View file

@ -1,4 +1,4 @@
use crate::{Torrent, format}; use crate::Torrent;
use url::Url; use url::Url;
/// Export crawl index to the RSS file /// Export crawl index to the RSS file
@ -68,11 +68,11 @@ impl Feed {
.map(|b| b.to_string()) .map(|b| b.to_string())
.unwrap_or("?".into()) // @TODO .unwrap_or("?".into()) // @TODO
), ),
escape(format::magnet(&torrent.info_hash, self.trackers.as_ref())) escape(torrent.magnet(self.trackers.as_ref()))
)); ));
buffer.push_str("<description>"); buffer.push_str("<description>");
buffer.push_str(&escape(format::bytes(torrent.size))); buffer.push_str(&format!("{}\n{}", torrent.size(), torrent.files()));
buffer.push_str("</description>"); buffer.push_str("</description>");
buffer.push_str("<pubDate>"); buffer.push_str("<pubDate>");

View file

@ -1,32 +0,0 @@
pub fn bytes(value: u64) -> String {
const KB: f32 = 1024.0;
const MB: f32 = KB * KB;
const GB: f32 = MB * KB;
let f = value as f32;
if f < KB {
format!("{value} B")
} else if f < MB {
format!("{:.2} KB", f / KB)
} else if f < GB {
format!("{:.2} MB", f / MB)
} else {
format!("{:.2} GB", f / GB)
}
}
pub fn magnet(info_hash: &str, trackers: Option<&Vec<url::Url>>) -> String {
let mut b = if info_hash.len() == 40 {
format!("magnet:?xt=urn:btih:{info_hash}")
} else {
todo!("info-hash v2 yet not supported") // librqbit_core::hash_id::Id
};
if let Some(t) = trackers {
for tracker in t {
b.push_str("&tr=");
b.push_str(&urlencoding::encode(tracker.as_str()))
}
}
b
}

View file

@ -3,13 +3,13 @@ extern crate rocket;
mod config; mod config;
mod feed; mod feed;
mod format;
mod scraper; mod scraper;
mod storage; mod storage;
mod torrent; mod torrent;
use config::Config; use config::Config;
use feed::Feed; use feed::Feed;
use plurify::Plurify;
use rocket::{ use rocket::{
State, State,
http::Status, http::Status,
@ -41,8 +41,6 @@ fn index(
storage: &State<Storage>, storage: &State<Storage>,
meta: &State<Meta>, meta: &State<Meta>,
) -> Result<Template, Custom<String>> { ) -> Result<Template, Custom<String>> {
use plurify::Plurify;
#[derive(Serialize)] #[derive(Serialize)]
#[serde(crate = "rocket::serde")] #[serde(crate = "rocket::serde")]
struct Row { struct Row {
@ -81,13 +79,10 @@ fn index(
.creation_date .creation_date
.map(|t| t.format(&meta.format_time).to_string()), .map(|t| t.format(&meta.format_time).to_string()),
indexed: torrent.time.format(&meta.format_time).to_string(), indexed: torrent.time.format(&meta.format_time).to_string(),
magnet: format::magnet(&torrent.info_hash, meta.trackers.as_ref()), magnet: torrent.magnet(meta.trackers.as_ref()),
scrape: scraper.scrape(&torrent.info_hash), scrape: scraper.scrape(&torrent.info_hash),
size: format::bytes(torrent.size), size: torrent.size(),
files: torrent.files.as_ref().map_or("1 file".into(), |f| { files: torrent.files(),
let l = f.len();
format!("{l} {}", l.plurify(&["file", "files", "files"]))
}),
torrent, torrent,
}), }),
Err(e) => { Err(e) => {

View file

@ -76,4 +76,47 @@ impl Torrent {
time, time,
}) })
} }
// Format getters
pub fn files(&self) -> String {
use plurify::Plurify;
self.files.as_ref().map_or("1 file".into(), |f| {
let l = f.len();
format!("{l} {}", l.plurify(&["file", "files", "files"]))
})
}
pub fn size(&self) -> String {
const KB: f32 = 1024.0;
const MB: f32 = KB * KB;
const GB: f32 = MB * KB;
let f = self.size as f32;
if f < KB {
format!("{} B", self.size)
} else if f < MB {
format!("{:.2} KB", f / KB)
} else if f < GB {
format!("{:.2} MB", f / MB)
} else {
format!("{:.2} GB", f / GB)
}
}
pub fn magnet(&self, trackers: Option<&Vec<url::Url>>) -> String {
let mut b = if self.info_hash.len() == 40 {
format!("magnet:?xt=urn:btih:{}", self.info_hash)
} else {
todo!("info-hash v2 yet not supported") // librqbit_core::hash_id::Id
};
if let Some(t) = trackers {
for tracker in t {
b.push_str("&tr=");
b.push_str(&urlencoding::encode(tracker.as_str()))
}
}
b
}
} }