fix: retry on 429 status, handle episodes
This commit is contained in:
parent
0bd742e836
commit
0101fc0c6b
3 changed files with 76 additions and 19 deletions
|
|
@ -492,10 +492,9 @@ impl RustyPipe {
|
|||
Ok(response) => {
|
||||
let status = response.status();
|
||||
// Immediately return in case of success or unrecoverable status code
|
||||
if status.is_success() || !status.is_server_error() {
|
||||
if status.is_success() || (!status.is_server_error() && status != 429) {
|
||||
return res;
|
||||
}
|
||||
// TODO: handle 429 (captcha)
|
||||
status.to_string()
|
||||
}
|
||||
Err(e) => {
|
||||
|
|
|
|||
|
|
@ -71,28 +71,59 @@ pub(crate) struct ListMusicItem {
|
|||
#[serde(default)]
|
||||
#[serde_as(deserialize_as = "DefaultOnError")]
|
||||
pub playlist_item_data: Option<PlaylistItemData>,
|
||||
/// `[<"Das Beste">], [<"Silbermond">], [<"Laut Gedacht (Re-Edition)">]`
|
||||
/// Playlist track (title, artist, album)
|
||||
/// ### Playlist track
|
||||
///
|
||||
/// `[<"Der Himmel reißt auf">]` Album track (title)
|
||||
/// `[<"Das Beste">], [<"Silbermond">], [<"Laut Gedacht (Re-Edition)">]`
|
||||
///
|
||||
/// (title, artist, album)
|
||||
///
|
||||
/// ### Album track
|
||||
///
|
||||
/// `[<"Der Himmel reißt auf">]`
|
||||
///
|
||||
/// (title)
|
||||
///
|
||||
/// ### Search track
|
||||
///
|
||||
/// `[<"Girls">], ["Song", " • ", <"aespa">, " • ", <"Girls - The 2nd Mini Album">, " • ", "4:01"]`
|
||||
/// Search track (title, artist, album, duration).
|
||||
///
|
||||
/// (title, artist, album, duration)
|
||||
///
|
||||
/// Info: "Song" label is missing in the "Songs" tab
|
||||
///
|
||||
/// ### Search video
|
||||
///
|
||||
/// `[<"Black Mamba">], ["Video", " • ", <"aespa">, " • ", "235M views", " • ", "3:50"]`
|
||||
/// Search video (title, artist, view count, duration)
|
||||
///
|
||||
/// (title, artist, view count, duration)
|
||||
///
|
||||
/// Info: "Video" label is missing in the "Videos" tab
|
||||
///
|
||||
/// `["Next Level"], ["Single", " • ", <"aespa">, " • ", "2021"]`
|
||||
/// Search album (title, type, artist, year)
|
||||
/// ### Search podcast episode
|
||||
///
|
||||
/// `["Test Shot Starfish"], ["Artist", " • ", "1660 subscribers"]` Search artist
|
||||
/// `["Blond - Da muss man dabei..."], ["Episode", " • ", "Dec 24, 2020", " • ", <"BLOND_OFFICIAL">], ["Dec 24, 2020"]`
|
||||
///
|
||||
/// (title, date, artist, date again?)
|
||||
///
|
||||
/// Info: "Episode" label is missing in the "Videos" tab
|
||||
///
|
||||
/// ### Search album
|
||||
///
|
||||
/// `["Next Level"], ["Single", " • ", <"aespa">, " • ", "2021"]`
|
||||
///
|
||||
/// (title, type, artist, year)
|
||||
///
|
||||
/// ### Search artist
|
||||
///
|
||||
/// `["Test Shot Starfish"], ["Artist", " • ", "1660 subscribers"]`
|
||||
///
|
||||
/// (subscriber count)
|
||||
///
|
||||
/// ### Search playlist
|
||||
///
|
||||
/// `["aespa - All Songs & MV"], ["Playlist", " • ", <"Jerwen">, " • ", "49 songs"]`
|
||||
/// Search playlist (title, creator, track count)
|
||||
///
|
||||
/// (title, creator, track count)
|
||||
///
|
||||
/// Info: "Playlist" label is missing in the "Playlists" tab
|
||||
pub flex_columns: Vec<MusicColumn>,
|
||||
|
|
@ -414,6 +445,7 @@ impl MusicListMapper {
|
|||
|
||||
let (artists_p, album_p, duration_p) = match item.flex_column_display_style
|
||||
{
|
||||
// Search result
|
||||
FlexColumnDisplayStyle::TwoLines => {
|
||||
let mut subtitle_parts = c2
|
||||
.ok_or_else(|| format!("track {}: could not get subtitle", id))?
|
||||
|
|
@ -421,16 +453,24 @@ impl MusicListMapper {
|
|||
.text
|
||||
.split(util::DOT_SEPARATOR)
|
||||
.into_iter();
|
||||
// Skip first part (track type)
|
||||
if subtitle_parts.len() > 3 {
|
||||
subtitle_parts.next();
|
||||
|
||||
// Is it a podcast episode?
|
||||
if subtitle_parts.len() <= 3 && c3.is_some() {
|
||||
(subtitle_parts.rev().next(), None, None)
|
||||
} else {
|
||||
// Skip first part (track type)
|
||||
if subtitle_parts.len() > 3 {
|
||||
subtitle_parts.next();
|
||||
}
|
||||
|
||||
(
|
||||
subtitle_parts.next(),
|
||||
subtitle_parts.next(),
|
||||
subtitle_parts.next(),
|
||||
)
|
||||
}
|
||||
(
|
||||
subtitle_parts.next(),
|
||||
subtitle_parts.next(),
|
||||
subtitle_parts.next(),
|
||||
)
|
||||
}
|
||||
// Playlist item
|
||||
FlexColumnDisplayStyle::Default => {
|
||||
let mut fixed_columns = item.fixed_columns;
|
||||
(
|
||||
|
|
|
|||
|
|
@ -1557,6 +1557,24 @@ async fn music_search_videos() {
|
|||
assert_next(res.items, &rp.query(), 15, 2).await;
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn music_search_episode() {
|
||||
let rp = RustyPipe::builder().strict().build();
|
||||
let res = rp
|
||||
.query()
|
||||
.music_search_videos("Blond - Da muss man dabei gewesen sein: Das Hörspiel - Fall #1")
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
let track = &res.items.items[0];
|
||||
assert_eq!(track.id, "Zq_-LDy7AgE");
|
||||
assert_eq!(
|
||||
track.title,
|
||||
"Blond - Da muss man dabei gewesen sein: Das Hörspiel - Fall #1"
|
||||
);
|
||||
assert!(!track.cover.is_empty(), "got no cover");
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
#[case::single(
|
||||
"black mamba",
|
||||
|
|
|
|||
Reference in a new issue