From d0757d41c5bebb0c24e7cdfecf259d686130bc51 Mon Sep 17 00:00:00 2001 From: Igor Katson Date: Sun, 10 Oct 2021 11:52:21 +0100 Subject: [PATCH] Print stats for each managed torrent now --- crates/librqbit/src/session.rs | 14 ++++++-- crates/rqbit/src/main.rs | 64 ++++++++++++++++++++-------------- 2 files changed, 49 insertions(+), 29 deletions(-) diff --git a/crates/librqbit/src/session.rs b/crates/librqbit/src/session.rs index 001917e..53d63de 100644 --- a/crates/librqbit/src/session.rs +++ b/crates/librqbit/src/session.rs @@ -22,15 +22,17 @@ use crate::{ torrent_manager::{TorrentManagerBuilder, TorrentManagerHandle}, }; +#[derive(Clone)] pub enum ManagedTorrentState { Initializing, Running(TorrentManagerHandle), } +#[derive(Clone)] pub struct ManagedTorrent { - info_hash: Id20, - output_folder: PathBuf, - state: ManagedTorrentState, + pub info_hash: Id20, + pub output_folder: PathBuf, + pub state: ManagedTorrentState, } impl PartialEq for ManagedTorrent { @@ -167,6 +169,12 @@ impl Session { pub fn get_dht(&self) -> Option { self.dht.clone() } + pub fn with_torrents(&self, callback: F) + where + F: Fn(&[ManagedTorrent]), + { + callback(&self.locked.read().torrents) + } pub async fn add_torrent( &self, url: String, diff --git a/crates/rqbit/src/main.rs b/crates/rqbit/src/main.rs index 6abfbe2..5f3b1b0 100644 --- a/crates/rqbit/src/main.rs +++ b/crates/rqbit/src/main.rs @@ -5,7 +5,7 @@ use clap::Clap; use librqbit::{ http_api::HttpApi, peer_connection::PeerConnectionOptions, - session::{AddTorrentOptions, Session, SessionOptions}, + session::{AddTorrentOptions, ManagedTorrentState, Session, SessionOptions}, spawn_utils::{spawn, BlockingSpawner}, }; use log::info; @@ -182,33 +182,45 @@ async fn async_main(opts: Opts, spawner: BlockingSpawner) -> anyhow::Result<()> }; spawn("Stats printer", { - let handle = handle.clone(); + let session = session.clone(); async move { loop { - let peer_stats = handle.torrent_state().peer_stats_snapshot(); - let stats = handle.torrent_state().stats_snapshot(); - let speed = handle.speed_estimator(); - let total = stats.total_bytes; - let progress = stats.total_bytes - stats.remaining_bytes; - let downloaded_pct = if stats.remaining_bytes == 0 { - 100f64 - } else { - (progress as f64 / total as f64) * 100f64 - }; - info!( - "Stats: {:.2}% ({:.2}), down speed {:.2} Mbps, fetched {}, remaining {:.2} of {:.2}, uploaded {:.2}, peers: {{live: {}, connecting: {}, queued: {}, seen: {}}}", - downloaded_pct, - SF::new(progress), - speed.download_mbps(), - SF::new(stats.fetched_bytes), - SF::new(stats.remaining_bytes), - SF::new(total), - SF::new(stats.uploaded_bytes), - peer_stats.live, - peer_stats.connecting, - peer_stats.queued, - peer_stats.seen, - ); + session.with_torrents(|torrents| { + for (idx, torrent) in torrents.iter().enumerate() { + match &torrent.state { + ManagedTorrentState::Initializing => { + info!("[{}] initializing", idx); + }, + ManagedTorrentState::Running(handle) => { + let peer_stats = handle.torrent_state().peer_stats_snapshot(); + let stats = handle.torrent_state().stats_snapshot(); + let speed = handle.speed_estimator(); + let total = stats.total_bytes; + let progress = stats.total_bytes - stats.remaining_bytes; + let downloaded_pct = if stats.remaining_bytes == 0 { + 100f64 + } else { + (progress as f64 / total as f64) * 100f64 + }; + info!( + "[{}]: {:.2}% ({:.2}), down speed {:.2} Mbps, fetched {}, remaining {:.2} of {:.2}, uploaded {:.2}, peers: {{live: {}, connecting: {}, queued: {}, seen: {}}}", + idx, + downloaded_pct, + SF::new(progress), + speed.download_mbps(), + SF::new(stats.fetched_bytes), + SF::new(stats.remaining_bytes), + SF::new(total), + SF::new(stats.uploaded_bytes), + peer_stats.live, + peer_stats.connecting, + peer_stats.queued, + peer_stats.seen, + ); + }, + } + } + }); tokio::time::sleep(Duration::from_secs(1)).await; } }