68 lines
2.0 KiB
Rust
68 lines
2.0 KiB
Rust
//! YouTube cookie refresh via headless Firefox.
|
|
|
|
use std::path::PathBuf;
|
|
use std::process::Stdio;
|
|
|
|
use tokio::process::Command;
|
|
|
|
/// Run a headless cookie refresh. Returns success message or error.
|
|
pub async fn run_refresh() -> Result<String, String> {
|
|
let profile_dir = shanty_config::data_dir().join("firefox-profile");
|
|
let cookies_path = shanty_config::data_dir().join("cookies.txt");
|
|
|
|
if !profile_dir.exists() {
|
|
return Err(format!("no Firefox profile at {}", profile_dir.display()));
|
|
}
|
|
|
|
let script = find_script()?;
|
|
|
|
let output = Command::new("python3")
|
|
.arg(&script)
|
|
.args([
|
|
"refresh",
|
|
&profile_dir.to_string_lossy(),
|
|
&cookies_path.to_string_lossy(),
|
|
])
|
|
.stdout(Stdio::piped())
|
|
.stderr(Stdio::piped())
|
|
.output()
|
|
.await
|
|
.map_err(|e| format!("failed to run cookie_manager.py: {e}"))?;
|
|
|
|
if !output.status.success() {
|
|
let stderr = String::from_utf8_lossy(&output.stderr);
|
|
return Err(format!("cookie_manager.py failed: {stderr}"));
|
|
}
|
|
|
|
let stdout = String::from_utf8_lossy(&output.stdout).to_string();
|
|
|
|
// Check for error in JSON response
|
|
if let Ok(v) = serde_json::from_str::<serde_json::Value>(&stdout)
|
|
&& v.get("status").and_then(|s| s.as_str()) == Some("error")
|
|
{
|
|
let err = v.get("error").and_then(|e| e.as_str()).unwrap_or("unknown");
|
|
return Err(err.to_string());
|
|
}
|
|
|
|
Ok(stdout)
|
|
}
|
|
|
|
fn find_script() -> Result<PathBuf, String> {
|
|
let candidates = [
|
|
std::env::current_exe()
|
|
.ok()
|
|
.and_then(|p| p.parent().map(|d| d.join("cookie_manager.py"))),
|
|
Some(PathBuf::from("/usr/share/shanty/cookie_manager.py")),
|
|
Some(PathBuf::from("/usr/local/share/shanty/cookie_manager.py")),
|
|
Some(PathBuf::from("shanty-dl/scripts/cookie_manager.py")),
|
|
];
|
|
|
|
for candidate in candidates.into_iter().flatten() {
|
|
if candidate.exists() {
|
|
return Ok(candidate);
|
|
}
|
|
}
|
|
|
|
Err("cookie_manager.py not found".into())
|
|
}
|