feat: add unavailable field for music tracks

fix: handling albums with unavailable tracks
This commit is contained in:
ThetaDev 2025-06-18 14:59:55 +02:00
parent 443cef39dc
commit a8dfdf611e
59 changed files with 1718 additions and 34 deletions

File diff suppressed because it is too large Load diff

View file

@ -40,6 +40,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(1),
by_va: false,
unavailable: false,
),
TrackItem(
id: "Jz-26iiDuYs",
@ -61,6 +62,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(2),
by_va: false,
unavailable: false,
),
TrackItem(
id: "Bu26uFtpt58",
@ -82,6 +84,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(3),
by_va: false,
unavailable: false,
),
TrackItem(
id: "RgwNqqiVqdY",
@ -103,6 +106,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(4),
by_va: false,
unavailable: false,
),
TrackItem(
id: "2TuOh30XbCI",
@ -124,6 +128,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(5),
by_va: false,
unavailable: false,
),
],
variants: [],

View file

@ -39,6 +39,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(1),
by_va: false,
unavailable: false,
),
TrackItem(
id: "s-qSnZyyvzs",
@ -60,6 +61,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(2),
by_va: false,
unavailable: false,
),
TrackItem(
id: "4jXoRBcQ8PY",
@ -81,6 +83,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(3),
by_va: false,
unavailable: false,
),
TrackItem(
id: "DRES9S4VQI8",
@ -102,6 +105,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(4),
by_va: false,
unavailable: false,
),
TrackItem(
id: "yhZVimwD4B4",
@ -127,6 +131,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(5),
by_va: false,
unavailable: false,
),
TrackItem(
id: "5d6YiFkdzLM",
@ -148,6 +153,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(6),
by_va: false,
unavailable: false,
),
TrackItem(
id: "3Qe7-uN2PjU",
@ -173,6 +179,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(7),
by_va: false,
unavailable: false,
),
TrackItem(
id: "SKZ_MTsXFP4",
@ -194,6 +201,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(8),
by_va: false,
unavailable: false,
),
TrackItem(
id: "n5-ujUwazDA",
@ -215,6 +223,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(9),
by_va: false,
unavailable: false,
),
TrackItem(
id: "VaREivfDJeY",
@ -236,6 +245,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(10),
by_va: false,
unavailable: false,
),
TrackItem(
id: "cWcD0WIK2PA",
@ -261,6 +271,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(11),
by_va: false,
unavailable: false,
),
TrackItem(
id: "QRELvH564T4",
@ -282,6 +293,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(12),
by_va: false,
unavailable: false,
),
TrackItem(
id: "eCY0-GyG46s",
@ -303,6 +315,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(13),
by_va: false,
unavailable: false,
),
TrackItem(
id: "UIrHYTEyUfA",
@ -328,6 +341,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(14),
by_va: false,
unavailable: false,
),
],
variants: [],

View file

@ -56,6 +56,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(1),
by_va: false,
unavailable: false,
),
],
variants: [],

View file

@ -66,6 +66,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(1),
by_va: false,
unavailable: false,
),
TrackItem(
id: "-xFJfXE2Cms",
@ -91,6 +92,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(2),
by_va: false,
unavailable: false,
),
TrackItem(
id: "KWDAaQDq8CQ",
@ -116,6 +118,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(3),
by_va: false,
unavailable: false,
),
TrackItem(
id: "0bcovdD1gQo",
@ -141,6 +144,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(4),
by_va: false,
unavailable: false,
),
TrackItem(
id: "lJsqxERcxR8",
@ -162,6 +166,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(5),
by_va: false,
unavailable: false,
),
TrackItem(
id: "iLfB6-slQdc",
@ -183,6 +188,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(6),
by_va: false,
unavailable: false,
),
TrackItem(
id: "4DjGZIdMcZk",
@ -204,6 +210,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(7),
by_va: false,
unavailable: false,
),
TrackItem(
id: "hakoZyX4QIc",
@ -225,6 +232,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(8),
by_va: false,
unavailable: false,
),
TrackItem(
id: "GOh96GiHVgI",
@ -246,6 +254,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(9),
by_va: false,
unavailable: false,
),
TrackItem(
id: "ne_jRAHABx0",
@ -267,6 +276,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(10),
by_va: false,
unavailable: false,
),
TrackItem(
id: "g8oyC2g5V64",
@ -288,6 +298,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(11),
by_va: false,
unavailable: false,
),
TrackItem(
id: "RxTEv7wXvG0",
@ -309,6 +320,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(12),
by_va: false,
unavailable: false,
),
TrackItem(
id: "V8iVLlSZeNs",
@ -330,6 +342,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(13),
by_va: false,
unavailable: false,
),
TrackItem(
id: "OESslKlpao4",
@ -351,6 +364,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(14),
by_va: false,
unavailable: false,
),
TrackItem(
id: "ennw5cHAebo",
@ -372,6 +386,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(15),
by_va: false,
unavailable: false,
),
],
variants: [],

View file

@ -48,6 +48,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(1),
by_va: false,
unavailable: false,
),
TrackItem(
id: "Wqrg6ceVgK8",
@ -73,6 +74,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(2),
by_va: false,
unavailable: false,
),
TrackItem(
id: "oWlZR0mU3fQ",
@ -98,6 +100,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(3),
by_va: false,
unavailable: false,
),
TrackItem(
id: "pcdWTaNK_w4",
@ -123,6 +126,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(4),
by_va: false,
unavailable: false,
),
TrackItem(
id: "hJhcL8A4AEI",
@ -148,6 +152,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(5),
by_va: false,
unavailable: false,
),
TrackItem(
id: "ROwmS2PzXiE",
@ -173,6 +178,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(6),
by_va: false,
unavailable: false,
),
TrackItem(
id: "u5fduXogSKU",
@ -198,6 +204,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(7),
by_va: false,
unavailable: false,
),
TrackItem(
id: "37aeBkbW5Y4",
@ -223,6 +230,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(8),
by_va: false,
unavailable: false,
),
TrackItem(
id: "Hn2701yNst0",
@ -248,6 +256,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(9),
by_va: false,
unavailable: false,
),
TrackItem(
id: "dQiTv0BdwwA",
@ -273,6 +282,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(10),
by_va: false,
unavailable: false,
),
TrackItem(
id: "DXYXlAljscM",
@ -298,6 +308,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(11),
by_va: false,
unavailable: false,
),
TrackItem(
id: "mfbmff4MQ2M",
@ -323,6 +334,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(12),
by_va: false,
unavailable: false,
),
TrackItem(
id: "mHkR5PHlHpQ",
@ -348,6 +360,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(13),
by_va: false,
unavailable: false,
),
TrackItem(
id: "VBnKIZ1b5Cg",
@ -373,6 +386,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(14),
by_va: false,
unavailable: false,
),
TrackItem(
id: "1iOIPRlLFgM",
@ -398,6 +412,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(15),
by_va: false,
unavailable: false,
),
TrackItem(
id: "z1nDiIcnxoM",
@ -423,6 +438,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(16),
by_va: false,
unavailable: false,
),
TrackItem(
id: "TNpe9wfbW9U",
@ -448,6 +464,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(17),
by_va: false,
unavailable: false,
),
TrackItem(
id: "9FtXAfifarI",
@ -473,6 +490,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(18),
by_va: false,
unavailable: false,
),
TrackItem(
id: "bRG8YR7ZBtI",
@ -498,6 +516,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(19),
by_va: false,
unavailable: false,
),
TrackItem(
id: "wYV9GxkHdRE",
@ -523,6 +542,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(20),
by_va: false,
unavailable: false,
),
TrackItem(
id: "wbrz2yUKiwo",
@ -548,6 +568,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(21),
by_va: false,
unavailable: false,
),
TrackItem(
id: "_MUx8LqzuY8",
@ -573,6 +594,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(22),
by_va: false,
unavailable: false,
),
TrackItem(
id: "s0xXo8ftgCA",
@ -598,6 +620,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(23),
by_va: false,
unavailable: false,
),
TrackItem(
id: "6Q_etK9rgV8",
@ -623,6 +646,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(24),
by_va: false,
unavailable: false,
),
TrackItem(
id: "4pwRZBhZH6Y",
@ -648,6 +672,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(25),
by_va: false,
unavailable: false,
),
TrackItem(
id: "O75q5a1s02E",
@ -673,6 +698,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(26),
by_va: false,
unavailable: false,
),
TrackItem(
id: "KSD9dI_ZgPQ",
@ -698,6 +724,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(27),
by_va: false,
unavailable: false,
),
],
variants: [],

View file

@ -48,6 +48,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(1),
by_va: false,
unavailable: false,
),
],
variants: [],

View file

@ -48,6 +48,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(1),
by_va: false,
unavailable: false,
),
TrackItem(
id: "t0v0UOgOt18",
@ -69,6 +70,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(2),
by_va: false,
unavailable: false,
),
TrackItem(
id: "HjJYAkUXrxI",
@ -90,10 +92,33 @@ MusicAlbum(
track_type: track,
track_nr: Some(3),
by_va: false,
unavailable: false,
),
TrackItem(
id: "d53Dhq4_VvA",
name: "Severed",
duration: Some(244),
cover: [],
artists: [
ArtistId(
id: None,
name: "The Decemberists",
),
],
artist_id: None,
album: Some(AlbumId(
id: "MPREb_AzuWg8qAVVl",
name: "13 Reasons Why (Season 3)",
)),
view_count: "[view_count]",
track_type: track,
track_nr: Some(4),
by_va: false,
unavailable: true,
),
TrackItem(
id: "Hg0KUOTL06I",
name: "Swim Home",
name: "SWIM HOME",
duration: Some(187),
cover: [],
artists: [
@ -111,6 +136,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(5),
by_va: false,
unavailable: false,
),
TrackItem(
id: "c8AfY6yhdkM",
@ -132,6 +158,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(6),
by_va: false,
unavailable: false,
),
TrackItem(
id: "_ZmdHjVvwhc",
@ -153,6 +180,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(7),
by_va: false,
unavailable: false,
),
TrackItem(
id: "wBe1Zi3q1n8",
@ -174,6 +202,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(8),
by_va: false,
unavailable: false,
),
TrackItem(
id: "l8Pj8s9uPGc",
@ -195,6 +224,29 @@ MusicAlbum(
track_type: track,
track_nr: Some(9),
by_va: false,
unavailable: false,
),
TrackItem(
id: "2ZbW3zfLfXo",
name: "Young Forever",
duration: Some(244),
cover: [],
artists: [
ArtistId(
id: None,
name: "JR JR",
),
],
artist_id: None,
album: Some(AlbumId(
id: "MPREb_AzuWg8qAVVl",
name: "13 Reasons Why (Season 3)",
)),
view_count: "[view_count]",
track_type: track,
track_nr: Some(10),
by_va: false,
unavailable: true,
),
TrackItem(
id: "Kn3cruxYj0c",
@ -216,6 +268,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(11),
by_va: false,
unavailable: false,
),
TrackItem(
id: "Sy1lIOl1YN0",
@ -237,6 +290,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(12),
by_va: false,
unavailable: false,
),
TrackItem(
id: "njdlNT1RRo4",
@ -258,6 +312,95 @@ MusicAlbum(
track_type: track,
track_nr: Some(13),
by_va: false,
unavailable: false,
),
TrackItem(
id: "bANUH8SNV4E",
name: "SLAVES OF FEAR",
duration: Some(294),
cover: [],
artists: [
ArtistId(
id: None,
name: "HEALTH",
),
],
artist_id: None,
album: Some(AlbumId(
id: "MPREb_AzuWg8qAVVl",
name: "13 Reasons Why (Season 3)",
)),
view_count: "[view_count]",
track_type: track,
track_nr: Some(14),
by_va: false,
unavailable: true,
),
TrackItem(
id: "jn7fJSTUbUM",
name: "All Your Life",
duration: Some(266),
cover: [],
artists: [
ArtistId(
id: None,
name: "Angelo De Augustine",
),
],
artist_id: None,
album: Some(AlbumId(
id: "MPREb_AzuWg8qAVVl",
name: "13 Reasons Why (Season 3)",
)),
view_count: "[view_count]",
track_type: track,
track_nr: Some(15),
by_va: false,
unavailable: true,
),
TrackItem(
id: "-MCzjr9LSIA",
name: "Culture",
duration: Some(194),
cover: [],
artists: [
ArtistId(
id: None,
name: "Hembree",
),
],
artist_id: None,
album: Some(AlbumId(
id: "MPREb_AzuWg8qAVVl",
name: "13 Reasons Why (Season 3)",
)),
view_count: "[view_count]",
track_type: track,
track_nr: Some(16),
by_va: false,
unavailable: true,
),
TrackItem(
id: "StZKjRiFtOQ",
name: "Still Want To Be Here",
duration: Some(233),
cover: [],
artists: [
ArtistId(
id: None,
name: "Frightened Rabbit",
),
],
artist_id: None,
album: Some(AlbumId(
id: "MPREb_AzuWg8qAVVl",
name: "13 Reasons Why (Season 3)",
)),
view_count: "[view_count]",
track_type: track,
track_nr: Some(17),
by_va: false,
unavailable: true,
),
TrackItem(
id: "Si-CXM8CHqQ",
@ -279,6 +422,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(18),
by_va: false,
unavailable: false,
),
],
variants: [],

View file

@ -35,6 +35,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(1),
by_va: false,
unavailable: false,
),
TrackItem(
id: "9WYpLYAEub0",
@ -56,6 +57,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(2),
by_va: false,
unavailable: false,
),
TrackItem(
id: "R48tE237bW4",
@ -77,6 +79,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(3),
by_va: false,
unavailable: false,
),
TrackItem(
id: "-UzsoR6z-vg",
@ -98,6 +101,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(4),
by_va: false,
unavailable: false,
),
TrackItem(
id: "kbNVyn8Ex28",
@ -119,6 +123,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(5),
by_va: false,
unavailable: false,
),
TrackItem(
id: "NJrQZUzWP5Y",
@ -140,6 +145,7 @@ MusicAlbum(
track_type: track,
track_nr: Some(6),
by_va: false,
unavailable: false,
),
],
variants: [],

View file

@ -101,21 +101,6 @@ MusicArtist(
year: Some(2003),
by_va: false,
),
AlbumItem(
id: "MPREb_QyGCcLWExXj",
name: "Als wär\'s das erste Mal (Exklusive Piano Version)",
cover: "[cover]",
artists: [
ArtistId(
id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"),
name: "Unheilig",
),
],
artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"),
album_type: single,
year: Some(2014),
by_va: false,
),
AlbumItem(
id: "MPREb_R3p5kDRIGKL",
name: "Astronaut",
@ -161,6 +146,21 @@ MusicArtist(
year: Some(2017),
by_va: false,
),
AlbumItem(
id: "MPREb_UA3c5UyVGYs",
name: "Geboren um zu leben",
cover: "[cover]",
artists: [
ArtistId(
id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"),
name: "Unheilig",
),
],
artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"),
album_type: single,
year: Some(2025),
by_va: false,
),
AlbumItem(
id: "MPREb_V0FEmw2pj2u",
name: "Sonnentag",

View file

@ -20,6 +20,7 @@ TrackDetails(
track_type: video,
track_nr: None,
by_va: false,
unavailable: false,
),
lyrics_id: Some("MPLYt_wrKjTn9hmry"),
related_id: Some("MPTRt_wrKjTn9hmry"),

View file

@ -27,6 +27,7 @@ TrackDetails(
track_type: track,
track_nr: None,
by_va: false,
unavailable: false,
),
lyrics_id: Some("MPLYt_cjEzeaBgZAq-2"),
related_id: Some("MPTRt_cjEzeaBgZAq-2"),

View file

@ -20,6 +20,7 @@ TrackDetails(
track_type: video,
track_nr: None,
by_va: false,
unavailable: false,
),
lyrics_id: None,
related_id: None,

View file

@ -27,7 +27,7 @@ use rustypipe::validate;
//#PLAYER
#[rstest]
#[case::desktop(ClientType::Desktop)]
// #[case::desktop(ClientType::Desktop)] TODO: add SABR support
#[case::tv(ClientType::Tv)]
#[case::mobile(ClientType::Mobile)]
// #[case::android(ClientType::Android)] Removed since it requires Android device attestation
@ -721,7 +721,7 @@ async fn get_video_details_live(rp: RustyPipe) {
assert_eq!(details.channel.id, "UCSJ4gkVC6NrvII8umztf0Ow");
assert_eq!(details.channel.name, "Lofi Girl");
assert!(!details.channel.avatar.is_empty(), "no channel avatars");
assert_eq!(details.channel.verification, Verification::Verified);
assert_eq!(details.channel.verification, Verification::Artist);
assert_gteo(details.channel.subscriber_count, 5_500_000, "subscribers");
assert_gte(details.view_count, 100, "views");
assert_gteo(details.like_count, 1_800_000, "likes");
@ -2507,17 +2507,17 @@ async fn music_radio_not_found(rp: RustyPipe) {
#[tokio::test]
async fn music_charts(
#[case] country: Country,
#[case] plid_top: &str,
#[case] plid_trend: &str,
#[case] _plid_top: &str,
#[case] _plid_trend: &str,
rp: RustyPipe,
) {
let charts = rp.query().music_charts(Some(country)).await.unwrap();
assert_eq!(charts.top_playlist_id.expect("top_playlist_id"), plid_top);
assert_gte(charts.top_tracks.len(), 30, "top tracks");
// assert_eq!(charts.top_playlist_id.expect("top_playlist_id"), plid_top);
// assert_gte(charts.top_tracks.len(), 30, "top tracks");
assert_gte(charts.artists.len(), 30, "top artists");
/*
// Currently (01.02.2024) is no trending playlist shown for Global and US
if country != Country::Us {
assert_eq!(
@ -2526,6 +2526,7 @@ async fn music_charts(
);
assert_gte(charts.trending_tracks.len(), 15, "trending tracks");
}
*/
// Chart playlists only available in USA
if country == Country::Us {
@ -2703,7 +2704,7 @@ async fn isrc_search_languages(rp: RustyPipe) {
.unwrap();
let track_id = &tracks.items.items[0].id;
assert!(
track_id == "g0iRiJ_ck48" || track_id == "YgUZtELr_jw",
track_id == "g0iRiJ_ck48" || track_id == "YgUZtELr_jw" || track_id == "oMhM4CFEY3I",
"lang: {lang}; track: {track_id}"
);
}