about summary refs log tree commit diff stats
path: root/crates/yt_dlp/src/lib.rs
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-10-19 14:28:32 +0200
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-10-19 14:28:32 +0200
commit709066c8c6a8ee1cc1f4dfbc032cfaad141e12f8 (patch)
treecad4068c00a2630975e7df88f323778f6e72e2d1 /crates/yt_dlp/src/lib.rs
parentfix(yt/cache): Don't try to delete video cache paths that don't exist anymore (diff)
downloadyt-709066c8c6a8ee1cc1f4dfbc032cfaad141e12f8.tar.gz
yt-709066c8c6a8ee1cc1f4dfbc032cfaad141e12f8.zip
fix(yt_dlp/lib/progress_hook): Estimate `total_byte_size` better
This still is sort of weird, because the total byte size changes whilst
downloading, but it is still immensely better than just putting a `0`
there.
Diffstat (limited to 'crates/yt_dlp/src/lib.rs')
-rw-r--r--crates/yt_dlp/src/lib.rs27
1 files changed, 13 insertions, 14 deletions
diff --git a/crates/yt_dlp/src/lib.rs b/crates/yt_dlp/src/lib.rs
index 4e35cb0..9d1a0c5 100644
--- a/crates/yt_dlp/src/lib.rs
+++ b/crates/yt_dlp/src/lib.rs
@@ -20,7 +20,7 @@ use std::{path::PathBuf, sync::Once};
 use crate::{duration::Duration, logging::setup_logging, wrapper::info_json::InfoJson};
 
 use bytes::Bytes;
-use log::{info, log_enabled, warn, Level};
+use log::{info, log_enabled, Level};
 use pyo3::types::{PyString, PyTuple, PyTupleMethods};
 use pyo3::{
     pyfunction,
@@ -102,6 +102,7 @@ signal.signal(signal.SIGINT, signal.SIG_DFL)",
 pub fn progress_hook(py: Python<'_>, input: &Bound<'_, PyDict>) -> PyResult<()> {
     // Only add the handler, if the log-level is higher than Debug (this avoids covering debug
     // messages).
+    // FIXME: We should actually just find a way to not cover printed messages. <2024-10-19>
     if log_enabled!(Level::Debug) {
         return Ok(());
     }
@@ -219,21 +220,19 @@ pub fn progress_hook(py: Python<'_>, input: &Bound<'_, PyDict>) -> PyResult<()>
             let total_bytes = {
                 let total_bytes = default_get!(as_u64, 0, "total_bytes");
                 if total_bytes == 0 {
-                    let estimate = default_get!(as_u64, 0, "total_bytes_estimate");
-                    warn!(
-                        "The video does not have a total_byte count, using an estimate of '{}'",
-                        estimate
-                    );
-                    estimate
+                    let maybe_estimate = default_get!(as_u64, 0, "total_bytes_estimate");
+
+                    if maybe_estimate == 0 {
+                        // The download speed should be in bytes per second and the eta in seconds.
+                        // Thus multiplying them gets us the raw bytes (which were estimated by `yt_dlp`, from their `info.json`)
+                        let bytes_still_needed = (speed * eta).ceil() as u64;
+
+                        downloaded_bytes + bytes_still_needed
+                    } else {
+                        maybe_estimate
+                    }
                 } else {
                     total_bytes
-                    // FIXME: The solution below _would_ work, if we had a info_json with the
-                    // values. <2024-08-24>
-                    //
-                    // let duration = default_get! {as_f64, 0.0, "duration"}.ceil() as u64;
-                    // // TODO: yt_dlp gets this from the format
-                    // let tbr = default_get! {as_f64, 0.0, "tbr"}.ceil() as u64;
-                    // duration * tbr * (1000 / 8)
                 }
             };
             let percent: f64 = {