refactor!: add client_type field to DownloadError, rename cli option po-token-cache to pot-cache
This commit is contained in:
parent
5f5ac65ce9
commit
594e675b39
4 changed files with 23 additions and 11 deletions
|
|
@ -146,6 +146,7 @@ Fetch a list of all the items saved in your YouTube/YouTube Music profile.
|
||||||
given path for generating PO tokens
|
given path for generating PO tokens
|
||||||
- `--no-botguard` Disable Botguard, only download videos using clients that dont require
|
- `--no-botguard` Disable Botguard, only download videos using clients that dont require
|
||||||
it
|
it
|
||||||
|
- `--pot-cache` Enable caching for session-bound PO tokens
|
||||||
|
|
||||||
### Output format
|
### Output format
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,7 @@ struct Cli {
|
||||||
no_botguard: bool,
|
no_botguard: bool,
|
||||||
/// Enable caching for session-bound PO tokens
|
/// Enable caching for session-bound PO tokens
|
||||||
#[clap(long, global = true)]
|
#[clap(long, global = true)]
|
||||||
po_token_cache: bool,
|
pot_cache: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
|
|
@ -916,7 +916,7 @@ async fn run() -> anyhow::Result<()> {
|
||||||
if cli.no_botguard {
|
if cli.no_botguard {
|
||||||
rp = rp.no_botguard();
|
rp = rp.no_botguard();
|
||||||
}
|
}
|
||||||
if cli.po_token_cache {
|
if cli.pot_cache {
|
||||||
rp = rp.po_token_cache();
|
rp = rp.po_token_cache();
|
||||||
}
|
}
|
||||||
if cli.auth {
|
if cli.auth {
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,13 @@ pub enum DownloadError {
|
||||||
#[error("http error: {0}")]
|
#[error("http error: {0}")]
|
||||||
Http(#[from] reqwest::Error),
|
Http(#[from] reqwest::Error),
|
||||||
/// 403 error trying to download video
|
/// 403 error trying to download video
|
||||||
#[error("YouTube returned 403 error; visitor_data={}", .1.as_deref().unwrap_or_default())]
|
#[error("YouTube returned 403 error; visitor_data={}", .visitor_data.as_deref().unwrap_or_default())]
|
||||||
Forbidden(ClientType, Option<String>),
|
Forbidden {
|
||||||
|
/// Client type used to fetch the failed stream
|
||||||
|
client_type: ClientType,
|
||||||
|
/// Visitor data used to fetch the failed stream
|
||||||
|
visitor_data: Option<String>,
|
||||||
|
},
|
||||||
/// File IO error
|
/// File IO error
|
||||||
#[error(transparent)]
|
#[error(transparent)]
|
||||||
Io(#[from] std::io::Error),
|
Io(#[from] std::io::Error),
|
||||||
|
|
|
||||||
|
|
@ -660,9 +660,15 @@ impl DownloadQuery {
|
||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
Ok(res) => return Ok(res),
|
Ok(res) => return Ok(res),
|
||||||
Err(DownloadError::Forbidden(c, vd)) => {
|
Err(DownloadError::Forbidden {
|
||||||
failed_client = Some(c);
|
client_type,
|
||||||
DownloadError::Forbidden(c, vd)
|
visitor_data,
|
||||||
|
}) => {
|
||||||
|
failed_client = Some(client_type);
|
||||||
|
DownloadError::Forbidden {
|
||||||
|
client_type,
|
||||||
|
visitor_data,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Err(DownloadError::Http(e)) => {
|
Err(DownloadError::Http(e)) => {
|
||||||
if !e.is_timeout() {
|
if !e.is_timeout() {
|
||||||
|
|
@ -842,10 +848,10 @@ impl DownloadQuery {
|
||||||
if let Some(vd) = &player_data.visitor_data {
|
if let Some(vd) = &player_data.visitor_data {
|
||||||
q.remove_visitor_data(vd);
|
q.remove_visitor_data(vd);
|
||||||
}
|
}
|
||||||
return DownloadError::Forbidden(
|
return DownloadError::Forbidden {
|
||||||
player_data.client_type,
|
client_type: player_data.client_type,
|
||||||
player_data.visitor_data.clone(),
|
visitor_data: player_data.visitor_data.clone(),
|
||||||
);
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
e
|
e
|
||||||
|
|
|
||||||
Reference in a new issue