Print stats for each managed torrent now

This commit is contained in:
Igor Katson 2021-10-10 11:52:21 +01:00
parent 218aa4d9ee
commit d0757d41c5
2 changed files with 49 additions and 29 deletions

View file

@ -22,15 +22,17 @@ use crate::{
torrent_manager::{TorrentManagerBuilder, TorrentManagerHandle}, torrent_manager::{TorrentManagerBuilder, TorrentManagerHandle},
}; };
#[derive(Clone)]
pub enum ManagedTorrentState { pub enum ManagedTorrentState {
Initializing, Initializing,
Running(TorrentManagerHandle), Running(TorrentManagerHandle),
} }
#[derive(Clone)]
pub struct ManagedTorrent { pub struct ManagedTorrent {
info_hash: Id20, pub info_hash: Id20,
output_folder: PathBuf, pub output_folder: PathBuf,
state: ManagedTorrentState, pub state: ManagedTorrentState,
} }
impl PartialEq for ManagedTorrent { impl PartialEq for ManagedTorrent {
@ -167,6 +169,12 @@ impl Session {
pub fn get_dht(&self) -> Option<Dht> { pub fn get_dht(&self) -> Option<Dht> {
self.dht.clone() self.dht.clone()
} }
pub fn with_torrents<F>(&self, callback: F)
where
F: Fn(&[ManagedTorrent]),
{
callback(&self.locked.read().torrents)
}
pub async fn add_torrent( pub async fn add_torrent(
&self, &self,
url: String, url: String,

View file

@ -5,7 +5,7 @@ use clap::Clap;
use librqbit::{ use librqbit::{
http_api::HttpApi, http_api::HttpApi,
peer_connection::PeerConnectionOptions, peer_connection::PeerConnectionOptions,
session::{AddTorrentOptions, Session, SessionOptions}, session::{AddTorrentOptions, ManagedTorrentState, Session, SessionOptions},
spawn_utils::{spawn, BlockingSpawner}, spawn_utils::{spawn, BlockingSpawner},
}; };
use log::info; use log::info;
@ -182,9 +182,16 @@ async fn async_main(opts: Opts, spawner: BlockingSpawner) -> anyhow::Result<()>
}; };
spawn("Stats printer", { spawn("Stats printer", {
let handle = handle.clone(); let session = session.clone();
async move { async move {
loop { loop {
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 peer_stats = handle.torrent_state().peer_stats_snapshot();
let stats = handle.torrent_state().stats_snapshot(); let stats = handle.torrent_state().stats_snapshot();
let speed = handle.speed_estimator(); let speed = handle.speed_estimator();
@ -196,7 +203,8 @@ async fn async_main(opts: Opts, spawner: BlockingSpawner) -> anyhow::Result<()>
(progress as f64 / total as f64) * 100f64 (progress as f64 / total as f64) * 100f64
}; };
info!( info!(
"Stats: {:.2}% ({:.2}), down speed {:.2} Mbps, fetched {}, remaining {:.2} of {:.2}, uploaded {:.2}, peers: {{live: {}, connecting: {}, queued: {}, seen: {}}}", "[{}]: {:.2}% ({:.2}), down speed {:.2} Mbps, fetched {}, remaining {:.2} of {:.2}, uploaded {:.2}, peers: {{live: {}, connecting: {}, queued: {}, seen: {}}}",
idx,
downloaded_pct, downloaded_pct,
SF::new(progress), SF::new(progress),
speed.download_mbps(), speed.download_mbps(),
@ -209,6 +217,10 @@ async fn async_main(opts: Opts, spawner: BlockingSpawner) -> anyhow::Result<()>
peer_stats.queued, peer_stats.queued,
peer_stats.seen, peer_stats.seen,
); );
},
}
}
});
tokio::time::sleep(Duration::from_secs(1)).await; tokio::time::sleep(Duration::from_secs(1)).await;
} }
} }