diff --git a/src/client/channel_rss.rs b/src/client/channel_rss.rs index 80de0e2..0cb9322 100644 --- a/src/client/channel_rss.rs +++ b/src/client/channel_rss.rs @@ -17,7 +17,13 @@ impl RustyPipeQuery { let xml = self .client .http_request_txt(self.client.inner.http.get(&url).build()?) - .await?; + .await + .map_err(|e| match e { + Error::HttpStatus(404) => Error::Extraction(ExtractionError::ContentUnavailable( + "Channel not found".into(), + )), + _ => e, + })?; match quick_xml::de::from_str::(&xml) { Ok(feed) => Ok(feed.into()), diff --git a/src/client/mod.rs b/src/client/mod.rs index 981e4f2..1249fe5 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -505,7 +505,14 @@ impl RustyPipe { /// Execute the given http request, returning an error in case of a /// non-successful status code. async fn http_request_estatus(&self, request: Request) -> Result { - Ok(self.http_request(request).await?.error_for_status()?) + let res = self.http_request(request).await?; + let status = res.status(); + + if status.is_client_error() || status.is_server_error() { + Err(Error::HttpStatus(status.into())) + } else { + Ok(res) + } } /// Execute the given http request, returning the response body as a string. diff --git a/tests/youtube.rs b/tests/youtube.rs index 0fc7c46..668da38 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -921,6 +921,21 @@ async fn get_channel_rss() { assert!(!channel.videos.is_empty()); } +#[tokio::test] +async fn get_channel_rss_not_found() { + let rp = RustyPipe::builder().strict().build(); + let err = rp + .query() + .channel_rss("UCHnyfMqiRRG1u-2MsSQLbXZ") + .await + .unwrap_err(); + + assert!(matches!( + err, + Error::Extraction(ExtractionError::ContentUnavailable(_)) + )); +} + //#SEARCH #[tokio::test]