From fe76b2ac66cd0810ae9ec97b6e06a41e89e162ba Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 24 Jan 2023 23:06:17 +0100 Subject: [PATCH 1/2] feat: add error message to HttpStatus error dont create reports on http status errors --- src/client/channel_rss.rs | 6 +++--- src/client/mod.rs | 26 +++++++++----------------- src/error.rs | 4 ++-- 3 files changed, 14 insertions(+), 22 deletions(-) diff --git a/src/client/channel_rss.rs b/src/client/channel_rss.rs index 8153755..ca78521 100644 --- a/src/client/channel_rss.rs +++ b/src/client/channel_rss.rs @@ -25,9 +25,9 @@ impl RustyPipeQuery { .http_request_txt(self.client.inner.http.get(&url).build()?) .await .map_err(|e| match e { - Error::HttpStatus(404) => Error::Extraction(ExtractionError::ContentUnavailable( - "Channel not found".into(), - )), + Error::HttpStatus(404, _) => Error::Extraction( + ExtractionError::ContentUnavailable("Channel not found".into()), + ), _ => e, })?; diff --git a/src/client/mod.rs b/src/client/mod.rs index 93ab2ed..b454b8e 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -538,7 +538,7 @@ impl RustyPipe { let status = res.status(); if status.is_client_error() || status.is_server_error() { - Err(Error::HttpStatus(status.into())) + Err(Error::HttpStatus(status.into(), "none".into())) } else { Ok(res) } @@ -1086,26 +1086,18 @@ impl RustyPipeQuery { }; if status.is_client_error() || status.is_server_error() { - let status_code = status.as_u16(); + let error_msg = serde_json::from_str::(&resp_str) + .map(|r| r.error.message) + .unwrap_or_default(); return match status { StatusCode::NOT_FOUND => Err(Error::Extraction( - ExtractionError::ContentUnavailable("404 Not found".into()), + ExtractionError::ContentUnavailable(error_msg.into()), )), - StatusCode::BAD_REQUEST => { - let error_res = serde_json::from_str::(&resp_str); - Err(Error::Extraction(ExtractionError::BadRequest( - error_res - .map(|r| r.error.message) - .unwrap_or_default() - .into(), - ))) - } - _ => { - let e = Error::HttpStatus(status_code); - create_report(Level::ERR, Some(e.to_string()), vec![]); - Err(e) - } + StatusCode::BAD_REQUEST => Err(Error::Extraction(ExtractionError::BadRequest( + error_msg.into(), + ))), + _ => Err(Error::HttpStatus(status.as_u16(), error_msg.into())), }; } diff --git a/src/error.rs b/src/error.rs index abd7989..101bbfc 100644 --- a/src/error.rs +++ b/src/error.rs @@ -19,8 +19,8 @@ pub enum Error { #[error("http error: {0}")] Http(#[from] reqwest::Error), /// Erroneous HTTP status code received - #[error("http status code: {0}")] - HttpStatus(u16), + #[error("http status code: {0} message: {1}")] + HttpStatus(u16, Cow<'static, str>), /// Unspecified error #[error("error: {0}")] Other(Cow<'static, str>), From 53bdd5f0d288fe58e3d1dc93be7b1dfc899aa11d Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 25 Jan 2023 01:02:46 +0100 Subject: [PATCH 2/2] feat: add artist radio --- src/client/music_artist.rs | 10 ++++++- src/client/response/music_artist.rs | 5 +++- src/client/response/music_item.rs | 4 +-- ...tist__tests__map_music_artist_default.snap | 1 + ...st__tests__map_music_artist_no_artist.snap | 1 + ...tist__tests__map_music_artist_no_cont.snap | 1 + ...ests__map_music_artist_no_more_albums.snap | 1 + ...s__map_music_artist_only_more_singles.snap | 1 + ..._tests__map_music_artist_only_singles.snap | 1 + src/model/mod.rs | 2 ++ .../youtube__music_artist_basic.snap | 1 + .../youtube__music_artist_basic_all.snap | 1 + .../youtube__music_artist_no_artist.snap | 1 + .../youtube__music_artist_no_more_albums.snap | 1 + .../youtube__music_artist_only_singles.snap | 1 + tests/youtube.rs | 29 ++++++++++++++++++- 16 files changed, 56 insertions(+), 5 deletions(-) diff --git a/src/client/music_artist.rs b/src/client/music_artist.rs index b16dab4..12e79d4 100644 --- a/src/client/music_artist.rs +++ b/src/client/music_artist.rs @@ -166,7 +166,7 @@ fn map_artist_page( lang: crate::param::Language, skip_extendables: bool, ) -> Result)>, ExtractionError> { - // dbg!(&self); + // dbg!(&res); let header = res.header.music_immersive_header_renderer; @@ -272,6 +272,13 @@ fn map_artist_page( .map(|m| m.as_str().to_owned()) }); + let radio_id = header.start_radio_button.and_then(|b| { + b.button_renderer + .navigation_endpoint + .watch_endpoint + .and_then(|w| w.playlist_id) + }); + Ok(MapResult { c: ( MusicArtist { @@ -292,6 +299,7 @@ fn map_artist_page( similar_artists: mapped.c.artists, tracks_playlist_id, videos_playlist_id, + radio_id, }, album_page_params, ), diff --git a/src/client/response/music_artist.rs b/src/client/response/music_artist.rs index 811432b..e27f3a0 100644 --- a/src/client/response/music_artist.rs +++ b/src/client/response/music_artist.rs @@ -5,7 +5,7 @@ use crate::serializer::text::Text; use super::{ music_item::{ - Grid, ItemSection, MusicThumbnailRenderer, SimpleHeader, SingleColumnBrowseResult, + Button, Grid, ItemSection, MusicThumbnailRenderer, SimpleHeader, SingleColumnBrowseResult, }, SectionList, Tab, }; @@ -41,6 +41,9 @@ pub(crate) struct MusicHeaderRenderer { #[serde(default)] #[serde_as(as = "DefaultOnError")] pub share_endpoint: Option, + #[serde(default)] + #[serde_as(as = "DefaultOnError")] + pub start_radio_button: Option