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) => {
|
Ok(response) => {
|
||||||
let status = response.status();
|
let status = response.status();
|
||||||
// Immediately return in case of success or unrecoverable status code
|
// 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;
|
return res;
|
||||||
}
|
}
|
||||||
// TODO: handle 429 (captcha)
|
|
||||||
status.to_string()
|
status.to_string()
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
|
|
||||||
|
|
@ -71,28 +71,59 @@ pub(crate) struct ListMusicItem {
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
#[serde_as(deserialize_as = "DefaultOnError")]
|
#[serde_as(deserialize_as = "DefaultOnError")]
|
||||||
pub playlist_item_data: Option<PlaylistItemData>,
|
pub playlist_item_data: Option<PlaylistItemData>,
|
||||||
/// `[<"Das Beste">], [<"Silbermond">], [<"Laut Gedacht (Re-Edition)">]`
|
/// ### Playlist track
|
||||||
/// Playlist track (title, artist, album)
|
|
||||||
///
|
///
|
||||||
/// `[<"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"]`
|
/// `[<"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
|
/// Info: "Song" label is missing in the "Songs" tab
|
||||||
///
|
///
|
||||||
|
/// ### Search video
|
||||||
|
///
|
||||||
/// `[<"Black Mamba">], ["Video", " • ", <"aespa">, " • ", "235M views", " • ", "3:50"]`
|
/// `[<"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
|
/// Info: "Video" label is missing in the "Videos" tab
|
||||||
///
|
///
|
||||||
/// `["Next Level"], ["Single", " • ", <"aespa">, " • ", "2021"]`
|
/// ### Search podcast episode
|
||||||
/// Search album (title, type, artist, year)
|
|
||||||
///
|
///
|
||||||
/// `["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"]`
|
/// `["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
|
/// Info: "Playlist" label is missing in the "Playlists" tab
|
||||||
pub flex_columns: Vec<MusicColumn>,
|
pub flex_columns: Vec<MusicColumn>,
|
||||||
|
|
@ -414,6 +445,7 @@ impl MusicListMapper {
|
||||||
|
|
||||||
let (artists_p, album_p, duration_p) = match item.flex_column_display_style
|
let (artists_p, album_p, duration_p) = match item.flex_column_display_style
|
||||||
{
|
{
|
||||||
|
// Search result
|
||||||
FlexColumnDisplayStyle::TwoLines => {
|
FlexColumnDisplayStyle::TwoLines => {
|
||||||
let mut subtitle_parts = c2
|
let mut subtitle_parts = c2
|
||||||
.ok_or_else(|| format!("track {}: could not get subtitle", id))?
|
.ok_or_else(|| format!("track {}: could not get subtitle", id))?
|
||||||
|
|
@ -421,16 +453,24 @@ impl MusicListMapper {
|
||||||
.text
|
.text
|
||||||
.split(util::DOT_SEPARATOR)
|
.split(util::DOT_SEPARATOR)
|
||||||
.into_iter();
|
.into_iter();
|
||||||
// Skip first part (track type)
|
|
||||||
if subtitle_parts.len() > 3 {
|
// Is it a podcast episode?
|
||||||
subtitle_parts.next();
|
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 => {
|
FlexColumnDisplayStyle::Default => {
|
||||||
let mut fixed_columns = item.fixed_columns;
|
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;
|
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]
|
#[rstest]
|
||||||
#[case::single(
|
#[case::single(
|
||||||
"black mamba",
|
"black mamba",
|
||||||
|
|
|
||||||
Reference in a new issue