tests: completed for all languages

fix: parsing search videos without duration
This commit is contained in:
ThetaDev 2023-05-05 15:18:37 +02:00
parent b88faa9d05
commit bb396968dc
20 changed files with 927 additions and 688 deletions

View file

@ -15,6 +15,24 @@ testyt10:
cargo test --all-features --test youtube; \
done
testintl:
#!/usr/bin/env bash
set -e
LANGUAGES=(
"af" "am" "ar" "as" "az" "be" "bg" "bn" "bs" "ca" "cs" "da" "de" "el" "en" "en-GB" "en-IN"
"es" "es-419" "es-US" "et" "eu" "fa" "fi" "fil" "fr" "fr-CA" "gl" "gu"
"hi" "hr" "hu" "hy" "id" "is" "it" "iw" "ja" "ka" "kk" "km" "kn" "ko" "ky"
"lo" "lt" "lv" "mk" "ml" "mn" "mr" "ms" "my" "ne" "nl" "no" "or" "pa" "pl"
"pt" "pt-PT" "ro" "ru" "si" "sk" "sl" "sq" "sr" "sr-Latn" "sv" "sw" "ta"
"te" "th" "tr" "uk" "ur" "uz" "vi" "zh-CN" "zh-HK" "zh-TW" "zu"
)
for YT_LANG in "${LANGUAGES[@]}"; do \
echo "---TESTS FOR $YT_LANG ---"; \
YT_LANG="$YT_LANG" cargo test --test youtube -- --skip music_artist --skip music_playlist --skip get_video_details --skip startpage; \
echo "--- $YT_LANG COMPLETED ---"; \
sleep 10; \
done
testfiles:
cargo run -p rustypipe-codegen -- -d . download-testfiles

View file

@ -67,11 +67,8 @@ pub async fn collect_dates(project_root: &Path, concurrency: usize) {
// These are the sample playlists
let cases = [
(
DateCase::Today,
"RDCLAK5uy_kj3rhiar1LINmyDcuFnXihEO0K1NQa2jI",
),
(DateCase::Yesterday, "PL7zsB-C3aNu2yRY2869T0zj1FhtRIu5am"),
(DateCase::Today, "PLMC9KNkIncKtPzgY-5rmhvj7fax8fdxoj"),
(DateCase::Yesterday, "PLcirGkCPmbmFeQ1sm4wFciF03D_EroIfr"),
(DateCase::Ago, "PLmB6td997u3kUOrfFwkULZ910ho44oQSy"),
(DateCase::Jan, "PL1J-6JOckZtFjcni6Xj1pLYglJp6JCpKD"),
(DateCase::Feb, "PL1J-6JOckZtETrbzwZE7mRIIK6BzWNLAs"),

32
notes/dictionary.md Normal file
View file

@ -0,0 +1,32 @@
# Parsing localized data from YouTube
Since YouTube's API is outputting the website as it should be rendered by the client,
the data received from the API is already localized. This affects dates, times and
number formats.
To be able to successfully parse them, we need to collect samples in every language and
build a dictionary.
### Timeago
- Relative date format used for video upload dates and comments.
- Examples: "1 hour ago", "3 months ago"
### Playlist dates
- Playlist update dates are always day-accurate, either as textual dates or in the form
of "n days ago"
- Examples: "Last updated on Jan 3, 2020", "Updated today", "Updated yesterday",
"Updated 3 days ago"
### Video duration
- In Danisch ("da") video durations are formatted using dots instead of colons. Example:
"12.31", "3.03.52"
### Numbers
- Large numbers (subscriber/view counts) are rounded and shown using a decimal prefix
- Examples: "1.4M views"
- There is an exception for the value 0 ("no views") and in some languages for the value
1 (pt: "Um vídeo")

View file

@ -587,7 +587,9 @@ impl MusicListMapper {
(subtitle_parts.rev().next(), None, None)
} else {
// Skip first part (track type)
if subtitle_parts.len() > 3 {
if subtitle_parts.len() > 3
|| (is_video && subtitle_parts.len() == 2)
{
subtitle_parts.next();
}

View file

@ -536,6 +536,11 @@ mod tests {
"Last updated on Jun 04, 2003",
Some(ParsedDate::Absolute(date!(2003-6-4)))
)]
#[case(
Language::Bn,
"যোগ দিয়েছেন 24 সেপ, 2013",
Some(ParsedDate::Absolute(date!(2013-9-24)))
)]
fn t_parse_date(
#[case] lang: Language,
#[case] textual_date: &str,

File diff suppressed because it is too large Load diff

View file

@ -143,7 +143,7 @@ where
/// and return the duration in seconds.
pub fn parse_video_length(text: &str) -> Option<u32> {
static VIDEO_LENGTH_REGEX: Lazy<Regex> =
Lazy::new(|| Regex::new(r#"(?:(\d+):)?(\d{1,2}):(\d{2})"#).unwrap());
Lazy::new(|| Regex::new(r#"(?:(\d+)[:.])?(\d{1,2})[:.](\d{2})"#).unwrap());
VIDEO_LENGTH_REGEX.captures(text).map(|cap| {
let hrs = cap
.get(1)
@ -294,11 +294,40 @@ where
}
} else if c == decimal_point {
after_point = true;
} else if !matches!(c, '\u{200b}' | '.' | ',') {
} else if !matches!(
c,
'\u{200b}'
| '\u{202b}'
| '\u{202c}'
| '\u{202e}'
| '\u{200e}'
| '\u{200f}'
| '.'
| ','
) {
filtered.push(c);
}
}
(ok_or_bail!(buf.parse::<u64>(), None), exp, filtered)
if buf.is_empty() {
// TODO: integrate into dictionary
if lang == Language::Ar && string.contains("واحد")
|| lang == Language::Iw && string.contains("אחד")
|| lang == Language::As && string.contains('১') // ১টা
|| lang == Language::Bn && string.contains('১')
|| lang == Language::Fa && string.contains('۱')
|| lang == Language::Is && (string.contains("Eitt ") || string.contains("Einn "))
|| lang == Language::My && string.contains('၁')
|| lang == Language::No && string.contains("Én ")
|| lang == Language::Pt && string.contains("Um ")
|| lang == Language::Ro && string.contains("Un ")
{
return 1.try_into().ok();
}
return None;
} else {
(buf.parse::<u64>().ok()?, exp, filtered)
}
};
let lookup_token = |token: &str| match token {
@ -467,6 +496,17 @@ pub(crate) mod tests {
assert_eq!(res, expect);
}
#[rstest]
#[case(
Language::Iw,
"\u{200f}\u{202b}3.36M\u{200f}\u{202c}\u{200f} \u{200f}מנויים\u{200f}",
3360000
)]
fn t_parse_large_numstr_1(#[case] lang: Language, #[case] string: &str, #[case] expect: u64) {
let res = parse_large_numstr::<u64>(string, lang).unwrap();
assert_eq!(res, expect);
}
#[test]
fn t_parse_large_numstr_samples() {
let json_path = path!(*TESTFILES / "dict" / "large_number_samples.json");

View file

@ -141,8 +141,7 @@
"آلاف": 3,
"ألف": 3,
"مليار": 9,
"مليون": 6,
"واحد": 0
"مليون": 6
},
"album_types": {
"أغنية منفردة": "Single",
@ -176,7 +175,12 @@
"নিঃটা": 6,
"নিযুতটা": 6,
"লাখটা": 5,
"হাজাৰটা": 3
"হাজাৰটা": 3,
"লাখ": 5,
"নিযুত": 6,
"হাজাৰ": 3,
"হা": 3,
"লা": 5
},
"album_types": {
"ep": "Ep",
@ -345,18 +349,18 @@
},
"date_order": "DY",
"months": {
"অক্টোবর,": 10,
"অক্টো,": 10,
"আগস্ট,": 8,
"এপ্রি,": 4,
"এপ্রি,": 4,
"জানু,": 1,
"জুন,": 6,
"জুলাই,": 7,
"জুল,": 7,
"ডিসেম্বর,": 12,
"নভেম্বর,": 11,
"নভে,": 11,
"ফেব,": 2,
"মার্চ,": 3,
"মে,": 5,
"সেপ্টেম্বর,": 9
"সেপ,": 9
},
"timeago_nd_tokens": {
"আজ": "0D",
@ -367,7 +371,10 @@
"কোটি": 7,
"লাটি": 5,
"শত": 2,
"হাটি": 3
"হাটি": 3,
"হা": 3,
"লা": 5,
"কো": 7
},
"album_types": {
"অডিওবুক": "Audiobook",
@ -399,7 +406,8 @@
"sedmicu": "W",
"sekunde": "s",
"sekundi": "s",
"sekundu": "s"
"sekundu": "s",
"sekunda": "s"
},
"date_order": "DY",
"months": {
@ -504,7 +512,10 @@
"sekundami": "s",
"sekundou": "s",
"týdnem": "W",
"týdny": "W"
"týdny": "W",
"sekund": "s",
"sekunda": "s",
"minuta": "m"
},
"date_order": "DMY",
"months": {},
@ -1267,6 +1278,7 @@
"sekunde": "s",
"sekundi": "s",
"sekundu": "s",
"sekunda": "s",
"tjedan": "W",
"tjedna": "W"
},
@ -1313,10 +1325,12 @@
"hónappal": "M",
"másodperccel": "s",
"másodperce": "s",
"másodperc": "s",
"napja": "D",
"nappal": "D",
"perccel": "m",
"perce": "m",
"perc": "m",
"éve": "Y",
"évvel": "Y",
"órája": "h",
@ -1457,8 +1471,11 @@
"mánuðum": "M",
"mínútu": "m",
"mínútum": "m",
"mínúta": "m",
"sekúndu": "s",
"sekúndum": "s",
"sekúnda": "s",
"sekúndur": "s",
"viku": "W",
"vikum": "W",
"ári": "Y",
@ -1566,6 +1583,7 @@
"שנה": "Y",
"שניות": "s",
"שנייה": "s",
"שניה": "s",
"שנים": "Y",
"שנתיים": "2Y",
"שעה": "h",
@ -1594,9 +1612,9 @@
},
"comma_decimal": false,
"number_tokens": {
"B": 9,
"K": 3,
"M": 6
"B": 9,
"K": 3,
"M": 6
},
"album_types": {
"אלבום": "Album",
@ -1647,7 +1665,9 @@
"საათის": "h",
"წამის": "s",
"წლის": "Y",
"წუთის": "m"
"წუთის": "m",
"წუთი": "m",
"წამი": "s"
},
"date_order": "DY",
"months": {
@ -1738,7 +1758,9 @@
"នាទីមុន": "m",
"ម៉ោងមុន": "h",
"វិនាទីមុន": "s",
"សប្ដាហ៍មុន": "W"
"សប្ដាហ៍មុន": "W",
"នាទី": "m",
"វិនាទី": "s"
},
"date_order": "DY",
"months": {
@ -1757,6 +1779,7 @@
},
"timeago_nd_tokens": {
"បានធ្វើបច្ចុប្បន្នភាពថ្ងៃនេះ": "0D",
"បានធ្វើបច្ចុប្បន្នភាព​នៅថ្ងៃនេះ": "0D",
"បានធ្វើបច្ចុប្បន្នភាពម្សិលមិញ": "1D"
},
"comma_decimal": true,
@ -1790,7 +1813,9 @@
"ವಾರಗಳ": "W",
"ವಾರದ": "W",
"ಸೆಕೆಂಡುಗಳ": "s",
"ಸೆಕೆಂಡ್": "s"
"ಸೆಕೆಂಡ್": "s",
"ಸೆಕೆಂಡುಗಳು": "s",
"ನಿಮಿಷವು": "m"
},
"date_order": "DY",
"months": {
@ -1845,7 +1870,10 @@
"number_tokens": {
"만회": 4,
"억회": 8,
"천회": 3
"천회": 3,
"만명": 4,
"억명": 8,
"천명": 3
},
"album_types": {
"ep": "Ep",
@ -1910,7 +1938,9 @@
"ມື້ກ່ອນ": "D",
"ວິນາທີກ່ອນ": "s",
"ອາທິດກ່ອນ": "W",
"ເດືອນກ່ອນ": "M"
"ເດືອນກ່ອນ": "M",
"ວິນາທີ": "s",
"ນາທີ": "m"
},
"date_order": "DY",
"months": {
@ -1958,6 +1988,7 @@
"metų": "Y",
"minutes": "m",
"minutę": "m",
"minutė": "m",
"minučių": "m",
"mėnesius": "M",
"mėnesių": "M",
@ -1967,6 +1998,8 @@
"savaičių": "W",
"sekundes": "s",
"sekundę": "s",
"sekundės": "s",
"sekundė": "s",
"sekundžių": "s",
"valandas": "h",
"valandą": "h",
@ -2138,7 +2171,9 @@
"секундын": "s",
"хоногийн": "W",
"цагийн": "h",
"өдрийн": "D"
"өдрийн": "D",
"секунд": "s",
"минут": "m"
},
"date_order": "YMD",
"months": {},
@ -2177,7 +2212,9 @@
"वर्षांपूर्वी": "Y",
"वर्षापूर्वी": "Y",
"सेकंदांपूर्वी": "s",
"सेकंदापूर्वी": "s"
"सेकंदापूर्वी": "s",
"सेकंद": "s",
"मिनिट": "m"
},
"date_order": "DY",
"months": {
@ -2371,18 +2408,18 @@
},
"date_order": "DY",
"months": {
"apr.": 4,
"aug.": 8,
"dec.": 12,
"feb.": 2,
"jan.": 1,
"jul.": 7,
"jun.": 6,
"apr": 4,
"aug": 8,
"dec": 12,
"feb": 2,
"jan": 1,
"jul": 7,
"jun": 6,
"mei": 5,
"mrt.": 3,
"nov.": 11,
"okt.": 10,
"sep.": 9
"mrt": 3,
"nov": 11,
"okt": 10,
"sep": 9
},
"timeago_nd_tokens": {
"gisteren": "1D",
@ -2462,7 +2499,8 @@
"ମାସ": "M",
"ମିନିଟ୍": "m",
"ସପ୍ତାହ": "W",
"ସେକେଣ୍ଡ": "s"
"ସେକେଣ୍ଡ": "s",
"ମିନିଟ୍‌": "m"
},
"date_order": "DY",
"months": {
@ -2487,7 +2525,10 @@
"number_tokens": {
"ନିଟି": 6,
"ବିଟି": 9,
"ହଟି": 3
"ହଟି": 3,
"ବିଜଣ": 9,
"ନିଜଣ": 6,
"ହଜଣ": 3
},
"album_types": {
"ep": "Ep",
@ -2563,10 +2604,12 @@
"minut": "m",
"minuty": "m",
"minutę": "m",
"minuta": "m",
"rok": "Y",
"sekund": "s",
"sekundy": "s",
"sekundę": "s",
"sekunda": "s",
"tydzień": "W",
"tygodnie": "W"
},
@ -2861,10 +2904,13 @@
"mesiacom": "M",
"minútami": "m",
"minútou": "m",
"minúta": "m",
"rokmi": "Y",
"rokom": "Y",
"sekundami": "s",
"sekundou": "s",
"sekúnd": "s",
"sekunda": "s",
"týždňami": "W",
"týždňom": "W"
},
@ -2905,9 +2951,12 @@
"minutama": "m",
"minutami": "m",
"minuto": "m",
"minuta": "m",
"sekundama": "s",
"sekundami": "s",
"sekundo": "s",
"sekund": "s",
"sekunda": "s",
"tedni": "W",
"tednom": "W",
"tednoma": "W",
@ -3009,13 +3058,15 @@
"месеца": "M",
"месеци": "M",
"минута": "m",
"минут": "m",
"недеље": "W",
"недељу": "W",
"сат": "h",
"сата": "h",
"сати": "h",
"секунде": "s",
"секунди": "s"
"секунди": "s",
"секунда": "s"
},
"date_order": "DMY",
"months": {},
@ -3050,6 +3101,7 @@
"meseca": "M",
"meseci": "M",
"minuta": "m",
"minut": "m",
"nedelja": "W",
"nedelje": "W",
"nedelju": "W",
@ -3057,7 +3109,8 @@
"sata": "h",
"sati": "h",
"sekunde": "s",
"sekundi": "s"
"sekundi": "s",
"sekunda": "s"
},
"date_order": "DMY",
"months": {},
@ -3192,7 +3245,10 @@
"வாரங்களுக்கு": "W",
"வாரம்": "W",
"விநாடிகளுக்கு": "s",
"விநாடிக்கு": "s"
"விநாடிக்கு": "s",
"விநாடிகள்": "s",
"விநாடி": "s",
"நிமிடம்": "m"
},
"date_order": "DY",
"months": {
@ -3243,7 +3299,8 @@
"సంవత్సరం": "Y",
"సంవత్సరాల": "Y",
"సెకను": "s",
"సెకన్ల": "s"
"సెకన్ల": "s",
"సెకన్లు": "s"
},
"date_order": "DY",
"months": {

File diff suppressed because it is too large Load diff

View file

@ -5,7 +5,7 @@ expression: album
MusicAlbum(
id: "MPREb_u1I69lSAe5v",
playlist_id: Some("OLAK5uy_lGP_zv0vJDUlecQDzugUJmjcF7pvyVNyY"),
name: "Waldbrand",
name: "[name]",
cover: "[cover]",
artists: [
ArtistId(
@ -14,7 +14,7 @@ MusicAlbum(
),
],
artist_id: Some("UCpJyCbFbdTrx0M90HCNBHFQ"),
description: None,
description: "[description]",
album_type: Ep,
year: Some(2016),
by_va: false,
@ -33,7 +33,7 @@ MusicAlbum(
artist_id: Some("UCpJyCbFbdTrx0M90HCNBHFQ"),
album: Some(AlbumId(
id: "MPREb_u1I69lSAe5v",
name: "Waldbrand",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -54,7 +54,7 @@ MusicAlbum(
artist_id: Some("UCpJyCbFbdTrx0M90HCNBHFQ"),
album: Some(AlbumId(
id: "MPREb_u1I69lSAe5v",
name: "Waldbrand",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -75,7 +75,7 @@ MusicAlbum(
artist_id: Some("UCpJyCbFbdTrx0M90HCNBHFQ"),
album: Some(AlbumId(
id: "MPREb_u1I69lSAe5v",
name: "Waldbrand",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -96,7 +96,7 @@ MusicAlbum(
artist_id: Some("UCpJyCbFbdTrx0M90HCNBHFQ"),
album: Some(AlbumId(
id: "MPREb_u1I69lSAe5v",
name: "Waldbrand",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -117,7 +117,7 @@ MusicAlbum(
artist_id: Some("UCpJyCbFbdTrx0M90HCNBHFQ"),
album: Some(AlbumId(
id: "MPREb_u1I69lSAe5v",
name: "Waldbrand",
name: "[name]",
)),
view_count: None,
is_video: false,

View file

@ -5,11 +5,11 @@ expression: album
MusicAlbum(
id: "MPREb_bqWA6mAZFWS",
playlist_id: Some("OLAK5uy_mUiRbMqeQXFUH6h9KB87RcEmNtm45Qvs0"),
name: "Pedha Rasi Peddamma Katha",
name: "[name]",
cover: "[cover]",
artists: [],
artist_id: None,
description: None,
description: "[description]",
album_type: Ep,
year: Some(1968),
by_va: false,
@ -28,7 +28,7 @@ MusicAlbum(
artist_id: Some("UC1C05NyYICFB2mVGn9_ttEw"),
album: Some(AlbumId(
id: "MPREb_bqWA6mAZFWS",
name: "Pedha Rasi Peddamma Katha",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -49,7 +49,7 @@ MusicAlbum(
artist_id: Some("UCDqpyYkgWy2h03HamIfODjw"),
album: Some(AlbumId(
id: "MPREb_bqWA6mAZFWS",
name: "Pedha Rasi Peddamma Katha",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -70,7 +70,7 @@ MusicAlbum(
artist_id: None,
album: Some(AlbumId(
id: "MPREb_bqWA6mAZFWS",
name: "Pedha Rasi Peddamma Katha",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -91,7 +91,7 @@ MusicAlbum(
artist_id: Some("UCl4iPtukwe7m0kIxUMskkgA"),
album: Some(AlbumId(
id: "MPREb_bqWA6mAZFWS",
name: "Pedha Rasi Peddamma Katha",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -118,11 +118,11 @@ MusicAlbum(
artists: [
ArtistId(
id: Some("UCl4iPtukwe7m0kIxUMskkgA"),
name: "S P Balasubramaniam",
name: "[name]",
),
ArtistId(
id: Some("UCWgAqlYG7mXTUxrFiLyDSsg"),
name: "S Janaki",
name: "[name]",
),
],
artist_id: Some("UCl4iPtukwe7m0kIxUMskkgA"),

View file

@ -5,7 +5,7 @@ expression: album
MusicAlbum(
id: "MPREb_F3Af9UZZVxX",
playlist_id: Some("OLAK5uy_nim4i4eycEtlBtS3Ci6j4SvvTmdfBcRX4"),
name: "La Ultima Vez (Remix)",
name: "[name]",
cover: "[cover]",
artists: [
ArtistId(
@ -22,7 +22,7 @@ MusicAlbum(
),
],
artist_id: Some("UCAJwa_1l4rHzBJyWbeBtGZw"),
description: None,
description: "[description]",
album_type: Single,
year: None,
by_va: false,
@ -49,7 +49,7 @@ MusicAlbum(
artist_id: Some("UCAJwa_1l4rHzBJyWbeBtGZw"),
album: Some(AlbumId(
id: "MPREb_F3Af9UZZVxX",
name: "La Ultima Vez (Remix)",
name: "[name]",
)),
view_count: None,
is_video: false,

View file

@ -5,7 +5,7 @@ expression: album
MusicAlbum(
id: "MPREb_nlBWQROfvjo",
playlist_id: Some("OLAK5uy_myZkBX2d2TzcrlQhIwLy3hCj2MkAMaPR4"),
name: "Märchen enden gut",
name: "[name]",
cover: "[cover]",
artists: [
ArtistId(
@ -14,7 +14,7 @@ MusicAlbum(
),
],
artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),
description: None,
description: "[description]",
album_type: Album,
year: Some(2016),
by_va: false,
@ -33,7 +33,7 @@ MusicAlbum(
artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),
album: Some(AlbumId(
id: "MPREb_nlBWQROfvjo",
name: "Märchen enden gut",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -54,7 +54,7 @@ MusicAlbum(
artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),
album: Some(AlbumId(
id: "MPREb_nlBWQROfvjo",
name: "Märchen enden gut",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -75,7 +75,7 @@ MusicAlbum(
artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),
album: Some(AlbumId(
id: "MPREb_nlBWQROfvjo",
name: "Märchen enden gut",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -96,7 +96,7 @@ MusicAlbum(
artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),
album: Some(AlbumId(
id: "MPREb_nlBWQROfvjo",
name: "Märchen enden gut",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -117,7 +117,7 @@ MusicAlbum(
artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),
album: Some(AlbumId(
id: "MPREb_nlBWQROfvjo",
name: "Märchen enden gut",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -138,7 +138,7 @@ MusicAlbum(
artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),
album: Some(AlbumId(
id: "MPREb_nlBWQROfvjo",
name: "Märchen enden gut",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -159,7 +159,7 @@ MusicAlbum(
artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),
album: Some(AlbumId(
id: "MPREb_nlBWQROfvjo",
name: "Märchen enden gut",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -180,7 +180,7 @@ MusicAlbum(
artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),
album: Some(AlbumId(
id: "MPREb_nlBWQROfvjo",
name: "Märchen enden gut",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -201,7 +201,7 @@ MusicAlbum(
artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),
album: Some(AlbumId(
id: "MPREb_nlBWQROfvjo",
name: "Märchen enden gut",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -222,7 +222,7 @@ MusicAlbum(
artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),
album: Some(AlbumId(
id: "MPREb_nlBWQROfvjo",
name: "Märchen enden gut",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -243,7 +243,7 @@ MusicAlbum(
artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),
album: Some(AlbumId(
id: "MPREb_nlBWQROfvjo",
name: "Märchen enden gut",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -264,7 +264,7 @@ MusicAlbum(
artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),
album: Some(AlbumId(
id: "MPREb_nlBWQROfvjo",
name: "Märchen enden gut",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -285,7 +285,7 @@ MusicAlbum(
artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),
album: Some(AlbumId(
id: "MPREb_nlBWQROfvjo",
name: "Märchen enden gut",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -306,7 +306,7 @@ MusicAlbum(
artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),
album: Some(AlbumId(
id: "MPREb_nlBWQROfvjo",
name: "Märchen enden gut",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -327,7 +327,7 @@ MusicAlbum(
artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),
album: Some(AlbumId(
id: "MPREb_nlBWQROfvjo",
name: "Märchen enden gut",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -348,7 +348,7 @@ MusicAlbum(
artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),
album: Some(AlbumId(
id: "MPREb_nlBWQROfvjo",
name: "Märchen enden gut",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -369,7 +369,7 @@ MusicAlbum(
artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),
album: Some(AlbumId(
id: "MPREb_nlBWQROfvjo",
name: "Märchen enden gut",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -390,7 +390,7 @@ MusicAlbum(
artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),
album: Some(AlbumId(
id: "MPREb_nlBWQROfvjo",
name: "Märchen enden gut",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -417,7 +417,7 @@ MusicAlbum(
artists: [
ArtistId(
id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),
name: "Oonagh",
name: "[name]",
),
],
artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"),

View file

@ -5,7 +5,7 @@ expression: album
MusicAlbum(
id: "MPREb_cwzk8EUwypZ",
playlist_id: Some("OLAK5uy_kODvYZ5CEpYdtd4VPsmg0eRTlpazG0dvA"),
name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)",
name: "[name]",
cover: "[cover]",
artists: [
ArtistId(
@ -14,7 +14,7 @@ MusicAlbum(
),
],
artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"),
description: None,
description: "[description]",
album_type: Show,
year: Some(2022),
by_va: false,
@ -33,7 +33,7 @@ MusicAlbum(
artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"),
album: Some(AlbumId(
id: "MPREb_cwzk8EUwypZ",
name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -54,7 +54,7 @@ MusicAlbum(
artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"),
album: Some(AlbumId(
id: "MPREb_cwzk8EUwypZ",
name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -75,7 +75,7 @@ MusicAlbum(
artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"),
album: Some(AlbumId(
id: "MPREb_cwzk8EUwypZ",
name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -96,7 +96,7 @@ MusicAlbum(
artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"),
album: Some(AlbumId(
id: "MPREb_cwzk8EUwypZ",
name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -117,7 +117,7 @@ MusicAlbum(
artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"),
album: Some(AlbumId(
id: "MPREb_cwzk8EUwypZ",
name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -138,7 +138,7 @@ MusicAlbum(
artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"),
album: Some(AlbumId(
id: "MPREb_cwzk8EUwypZ",
name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -159,7 +159,7 @@ MusicAlbum(
artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"),
album: Some(AlbumId(
id: "MPREb_cwzk8EUwypZ",
name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -180,7 +180,7 @@ MusicAlbum(
artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"),
album: Some(AlbumId(
id: "MPREb_cwzk8EUwypZ",
name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -201,7 +201,7 @@ MusicAlbum(
artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"),
album: Some(AlbumId(
id: "MPREb_cwzk8EUwypZ",
name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -222,7 +222,7 @@ MusicAlbum(
artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"),
album: Some(AlbumId(
id: "MPREb_cwzk8EUwypZ",
name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -243,7 +243,7 @@ MusicAlbum(
artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"),
album: Some(AlbumId(
id: "MPREb_cwzk8EUwypZ",
name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -264,7 +264,7 @@ MusicAlbum(
artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"),
album: Some(AlbumId(
id: "MPREb_cwzk8EUwypZ",
name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -285,7 +285,7 @@ MusicAlbum(
artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"),
album: Some(AlbumId(
id: "MPREb_cwzk8EUwypZ",
name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -306,7 +306,7 @@ MusicAlbum(
artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"),
album: Some(AlbumId(
id: "MPREb_cwzk8EUwypZ",
name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)",
name: "[name]",
)),
view_count: None,
is_video: false,

View file

@ -5,7 +5,7 @@ expression: album
MusicAlbum(
id: "MPREb_bHfHGoy7vuv",
playlist_id: Some("OLAK5uy_kdSWBZ-9AZDkYkuy0QCc3p0KO9DEHVNH0"),
name: "Der Himmel reißt auf",
name: "[name]",
cover: "[cover]",
artists: [
ArtistId(
@ -18,7 +18,7 @@ MusicAlbum(
),
],
artist_id: Some("UCXGYZ-OhdOpPBamHX3K9YRg"),
description: None,
description: "[description]",
album_type: Single,
year: Some(2020),
by_va: false,
@ -41,7 +41,7 @@ MusicAlbum(
artist_id: Some("UCXGYZ-OhdOpPBamHX3K9YRg"),
album: Some(AlbumId(
id: "MPREb_bHfHGoy7vuv",
name: "Der Himmel reißt auf",
name: "[name]",
)),
view_count: None,
is_video: false,

View file

@ -5,11 +5,11 @@ expression: album
MusicAlbum(
id: "MPREb_AzuWg8qAVVl",
playlist_id: Some("OLAK5uy_mux5ygfN9sbiR1ma3yh1GHTmqNekZNoAI"),
name: "13 Reasons Why (Season 3)",
name: "[name]",
cover: "[cover]",
artists: [],
artist_id: None,
description: None,
description: "[description]",
album_type: Album,
year: Some(2019),
by_va: true,
@ -28,7 +28,7 @@ MusicAlbum(
artist_id: Some("UCCj0RlDqqahEB5BXVtDcPqg"),
album: Some(AlbumId(
id: "MPREb_AzuWg8qAVVl",
name: "13 Reasons Why (Season 3)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -49,7 +49,7 @@ MusicAlbum(
artist_id: Some("UCMrCoizKiBxqeg5pTpBXn1A"),
album: Some(AlbumId(
id: "MPREb_AzuWg8qAVVl",
name: "13 Reasons Why (Season 3)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -70,7 +70,7 @@ MusicAlbum(
artist_id: Some("UCWjoDY2SXJ5dvcdunWI6mjQ"),
album: Some(AlbumId(
id: "MPREb_AzuWg8qAVVl",
name: "13 Reasons Why (Season 3)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -91,7 +91,7 @@ MusicAlbum(
artist_id: Some("UChzK2t3sjnQkWzGnyKXOSSg"),
album: Some(AlbumId(
id: "MPREb_AzuWg8qAVVl",
name: "13 Reasons Why (Season 3)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -112,7 +112,7 @@ MusicAlbum(
artist_id: Some("UCvsgN5NKOzXnAURfaf3TOig"),
album: Some(AlbumId(
id: "MPREb_AzuWg8qAVVl",
name: "13 Reasons Why (Season 3)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -133,7 +133,7 @@ MusicAlbum(
artist_id: Some("UCI4YNnmHjXFaaKvfdmpWvJQ"),
album: Some(AlbumId(
id: "MPREb_AzuWg8qAVVl",
name: "13 Reasons Why (Season 3)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -154,7 +154,7 @@ MusicAlbum(
artist_id: Some("UCDaFVUr2n8T7_X1f5yJ1xlw"),
album: Some(AlbumId(
id: "MPREb_AzuWg8qAVVl",
name: "13 Reasons Why (Season 3)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -175,7 +175,7 @@ MusicAlbum(
artist_id: Some("UCZcc-WkffIMBVGUr6j9e6aQ"),
album: Some(AlbumId(
id: "MPREb_AzuWg8qAVVl",
name: "13 Reasons Why (Season 3)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -196,7 +196,7 @@ MusicAlbum(
artist_id: Some("UCQPPz_A65SWYi2wXX8z76AQ"),
album: Some(AlbumId(
id: "MPREb_AzuWg8qAVVl",
name: "13 Reasons Why (Season 3)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -217,7 +217,7 @@ MusicAlbum(
artist_id: Some("UChTOXkDhGJ0JftnfMWjpCCg"),
album: Some(AlbumId(
id: "MPREb_AzuWg8qAVVl",
name: "13 Reasons Why (Season 3)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -238,7 +238,7 @@ MusicAlbum(
artist_id: Some("UCMUB52aO4CqrUXmLwbfRWYA"),
album: Some(AlbumId(
id: "MPREb_AzuWg8qAVVl",
name: "13 Reasons Why (Season 3)",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -259,7 +259,7 @@ MusicAlbum(
artist_id: Some("UC4YvDAbE1EYwZpj6gQ-lpLw"),
album: Some(AlbumId(
id: "MPREb_AzuWg8qAVVl",
name: "13 Reasons Why (Season 3)",
name: "[name]",
)),
view_count: None,
is_video: false,

View file

@ -5,11 +5,11 @@ expression: album
MusicAlbum(
id: "MPREb_8QkDeEIawvX",
playlist_id: Some("OLAK5uy_mEX9ljZeeEWgTM1xLL1isyiGaWXoPyoOk"),
name: "Queendom2 FINAL",
name: "[name]",
cover: "[cover]",
artists: [],
artist_id: None,
description: None,
description: "[description]",
album_type: Single,
year: Some(2022),
by_va: true,
@ -28,7 +28,7 @@ MusicAlbum(
artist_id: None,
album: Some(AlbumId(
id: "MPREb_8QkDeEIawvX",
name: "Queendom2 FINAL",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -49,7 +49,7 @@ MusicAlbum(
artist_id: None,
album: Some(AlbumId(
id: "MPREb_8QkDeEIawvX",
name: "Queendom2 FINAL",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -70,7 +70,7 @@ MusicAlbum(
artist_id: Some("UCAKvDuIX3m1AUdPpDSqV_3w"),
album: Some(AlbumId(
id: "MPREb_8QkDeEIawvX",
name: "Queendom2 FINAL",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -91,7 +91,7 @@ MusicAlbum(
artist_id: None,
album: Some(AlbumId(
id: "MPREb_8QkDeEIawvX",
name: "Queendom2 FINAL",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -112,7 +112,7 @@ MusicAlbum(
artist_id: None,
album: Some(AlbumId(
id: "MPREb_8QkDeEIawvX",
name: "Queendom2 FINAL",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -133,7 +133,7 @@ MusicAlbum(
artist_id: None,
album: Some(AlbumId(
id: "MPREb_8QkDeEIawvX",
name: "Queendom2 FINAL",
name: "[name]",
)),
view_count: None,
is_video: false,

View file

@ -5,7 +5,7 @@ expression: album
MusicAlbum(
id: "MPREb_h8ltx5oKvyY",
playlist_id: Some("OLAK5uy_lIDfTi_k8V1RJ54MeJJGK_BduAeYbm-0s"),
name: "Pedha Rasi Peddamma Katha",
name: "[name]",
cover: "[cover]",
artists: [
ArtistId(
@ -18,7 +18,7 @@ MusicAlbum(
),
],
artist_id: Some("UCl4iPtukwe7m0kIxUMskkgA"),
description: None,
description: "[description]",
album_type: Ep,
year: Some(1968),
by_va: false,
@ -41,7 +41,7 @@ MusicAlbum(
artist_id: Some("UCl4iPtukwe7m0kIxUMskkgA"),
album: Some(AlbumId(
id: "MPREb_h8ltx5oKvyY",
name: "Pedha Rasi Peddamma Katha",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -62,7 +62,7 @@ MusicAlbum(
artist_id: Some("UC1C05NyYICFB2mVGn9_ttEw"),
album: Some(AlbumId(
id: "MPREb_h8ltx5oKvyY",
name: "Pedha Rasi Peddamma Katha",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -83,7 +83,7 @@ MusicAlbum(
artist_id: Some("UC_KQPMiRQl3CFAIKTVfCHwA"),
album: Some(AlbumId(
id: "MPREb_h8ltx5oKvyY",
name: "Pedha Rasi Peddamma Katha",
name: "[name]",
)),
view_count: None,
is_video: false,
@ -104,7 +104,7 @@ MusicAlbum(
artist_id: Some("UCDqpyYkgWy2h03HamIfODjw"),
album: Some(AlbumId(
id: "MPREb_h8ltx5oKvyY",
name: "Pedha Rasi Peddamma Katha",
name: "[name]",
)),
view_count: None,
is_video: false,

View file

@ -4,26 +4,30 @@ expression: track
---
TrackDetails(
track: TrackItem(
id: "7nigXQS1Xb0",
name: "INVU",
duration: Some(205),
id: "qIZ-vvg-wiU",
name: "Scheiße baut sich nicht von alleine",
duration: Some(232),
cover: "[cover]",
artists: [
ArtistId(
id: Some("UCwzCuKxyMY_sT7hr1E8G1XA"),
name: "TAEYEON",
id: Some("UCAbxL0lZcmlaQrzoUbrvS3A"),
name: "SDP",
),
ArtistId(
id: Some("UCVRREKn7V1Cb8qvf43dwZ6w"),
name: "257ers",
),
],
artist_id: Some("UCwzCuKxyMY_sT7hr1E8G1XA"),
artist_id: Some("UCAbxL0lZcmlaQrzoUbrvS3A"),
album: Some(AlbumId(
id: "MPREb_4xbv14CiQJm",
name: "INVU - The 3rd Album",
id: "MPREb_cjEzeaBgZAq",
name: "Ein Gutes Schlechtes Vorbild",
)),
view_count: "[view_count]",
is_video: false,
track_nr: None,
by_va: false,
),
lyrics_id: Some("MPLYt_4xbv14CiQJm-1"),
related_id: Some("MPTRt_4xbv14CiQJm-1"),
lyrics_id: Some("MPLYt_cjEzeaBgZAq-2"),
related_id: Some("MPTRt_cjEzeaBgZAq-2"),
)

View file

@ -348,11 +348,14 @@ fn get_playlist(
#[case] description: Option<String>,
#[case] channel: Option<(&str, &str)>,
rp: RustyPipe,
unlocalized: bool,
) {
let playlist = tokio_test::block_on(rp.query().playlist(id)).unwrap();
assert_eq!(playlist.id, id);
assert_eq!(playlist.name, name);
if unlocalized {
assert_eq!(playlist.name, name);
}
assert!(!playlist.videos.is_empty());
assert_eq!(!playlist.videos.is_exhausted(), is_long);
assert_gte(
@ -1046,11 +1049,12 @@ mod channel_rss {
fn search(rp: RustyPipe, unlocalized: bool) {
let result = tokio_test::block_on(rp.query().search("doobydoobap")).unwrap();
assert!(
result.items.count.unwrap() > 1000,
"expected > 1000 total results, got {}",
result.items.count.unwrap()
assert_gte(
result.items.count.unwrap(),
if unlocalized { 7000 } else { 150 },
"results",
);
if unlocalized {
assert_eq!(result.corrected_query.unwrap(), "doobydobap");
}
@ -1330,10 +1334,14 @@ fn music_album(#[case] name: &str, #[case] id: &str, rp: RustyPipe, unlocalized:
} else {
insta::assert_ron_snapshot!(format!("music_album_{name}_intl"), album,
{
".name" => "[name]",
".cover" => "[cover]",
".description" => "[description]",
".artists[].name" => "[name]",
".tracks[].name" => "[name]",
".tracks[].album.name" => "[name]",
".tracks[].artists[].name" => "[name]",
".variants[].artists[].name" => "[name]",
}
);
}
@ -1461,7 +1469,9 @@ fn music_search(#[case] typo: bool, rp: RustyPipe, unlocalized: bool) {
assert_eq!(res.order[0], MusicItemType::Track);
if typo {
assert_eq!(res.corrected_query.unwrap(), "lieblingsmensch namika");
if unlocalized {
assert_eq!(res.corrected_query.unwrap(), "lieblingsmensch namika");
}
} else {
assert_eq!(res.corrected_query, None);
}
@ -1655,6 +1665,7 @@ fn music_search_albums(
#[case] album_type: AlbumType,
#[case] more: bool,
rp: RustyPipe,
unlocalized: bool,
) {
let res = tokio_test::block_on(rp.query().music_search_albums(query)).unwrap();
@ -1664,7 +1675,9 @@ fn music_search_albums(
assert_eq!(album.artists.len(), 1);
let album_artist = &album.artists[0];
assert_eq!(album_artist.id.as_ref().unwrap(), artist_id);
assert_eq!(album_artist.name, artist);
if unlocalized {
assert_eq!(album_artist.name, artist);
}
assert_eq!(album.artist_id.as_ref().unwrap(), artist_id);
assert!(!album.cover.is_empty(), "got no cover");
@ -1823,7 +1836,7 @@ fn music_search_suggestion(
#[rstest]
#[case::mv("mv", "ZeerrnuLi5E")]
#[case::track("track", "7nigXQS1Xb0")]
#[case::track("track", "qIZ-vvg-wiU")]
fn music_details(#[case] name: &str, #[case] id: &str, rp: RustyPipe) {
let track = tokio_test::block_on(rp.query().music_details(id)).unwrap();