// yt - A fully featured command line YouTube client // // Copyright (C) 2025 Benedikt Peetz // SPDX-License-Identifier: GPL-3.0-or-later // // This file is part of Yt. // // You should have received a copy of the License along with this program. // If not, see . #[macro_export] macro_rules! wrap_progress_hook { ($name:ident, $new_name:ident) => { pub(crate) fn $new_name( py: yt_dlp::progress_hook::__priv::pyo3::Python<'_>, ) -> yt_dlp::progress_hook::__priv::pyo3::PyResult< yt_dlp::progress_hook::__priv::pyo3::Bound< '_, yt_dlp::progress_hook::__priv::pyo3::types::PyCFunction, >, > { #[yt_dlp::progress_hook::__priv::pyo3::pyfunction] #[pyo3(crate = "yt_dlp::progress_hook::__priv::pyo3")] fn inner( input: yt_dlp::progress_hook::__priv::pyo3::Bound< '_, yt_dlp::progress_hook::__priv::pyo3::types::PyDict, >, ) -> yt_dlp::progress_hook::__priv::pyo3::PyResult<()> { let processed_input = { let new_dict = yt_dlp::progress_hook::__priv::pyo3::types::PyDict::new(input.py()); input .into_iter() .filter_map(|(name, value)| { let real_name = yt_dlp::progress_hook::__priv::pyo3::types::PyAnyMethods::extract::(&name).expect("Should always be a string"); if real_name.starts_with('_') { None } else { Some((real_name, value)) } }) .for_each(|(key, value)| { yt_dlp::progress_hook::__priv::pyo3::types::PyDictMethods::set_item(&new_dict, &key, value) .expect("This is a transpositions, should always be valid"); }); yt_dlp::progress_hook::__priv::json_dumps(&new_dict) }; $name(processed_input)?; Ok(()) } let module = yt_dlp::progress_hook::__priv::pyo3::types::PyModule::new(py, "progress_hook")?; let fun = yt_dlp::progress_hook::__priv::pyo3::wrap_pyfunction!(inner, module)?; Ok(fun) } }; } pub mod __priv { pub use crate::info_json::{json_dumps, json_loads}; pub use pyo3; }