feat: add AniList browsing with on-demand ZokoAnime playback

This commit is contained in:
2026-10-25 15:44:41 +01:00
parent a281c6730a
commit e328ff3883
20 changed files with 1062 additions and 235 deletions
+28
View File
@@ -67,3 +67,31 @@ fn catalog_and_actual_episode_numbers_remain_distinct() {
""
);
}
#[test]
fn anilist_catalog_numbers_are_not_planned_totals_or_stream_claims() {
let metadata = serde_json::json!({"id":"1","catalog_provider":"anilist","title":{"romaji":"Cowboy Bebop"},"status":"FINISHED","episode_count":26,"catalog_count":26});
let series = anilist_series(metadata).unwrap();
assert_eq!(series.episodes.len(), 26);
assert_eq!(
series.episodes.last().unwrap().identity.key(),
"anilist:1:26"
);
let snapshot = series.episodes[0].snapshot(&series.media);
assert_eq!(snapshot.channel.as_deref(), Some("AniList"));
assert_eq!(
crate::youtube::video_url(&snapshot.id).unwrap(),
"https://zokoanime.video/stream/ani/1/1/sub"
);
let ongoing = anilist_series(serde_json::json!({"id":"2","catalog_provider":"anilist","title":{"romaji":"Ongoing"},"status":"RELEASING","episode_count":24,"nextAiringEpisode":{"episode":4},"catalog_count":3})).unwrap();
assert_eq!(ongoing.episodes.len(), 3);
let unknown = anilist_series(serde_json::json!({"id":"3","catalog_provider":"anilist","title":{"romaji":"Unknown"},"status":"RELEASING","episode_count":null,"catalog_count":null})).unwrap();
assert!(unknown.episodes.is_empty());
assert!(unknown.media.metadata["catalog_count"].is_null());
assert_eq!(
anilist_episode(&unknown.media, 42).unwrap().identity.key(),
"anilist:3:42"
);
assert!(anilist_episode(&unknown.media, 0).is_err());
assert!(anilist_episode(&unknown.media, i32::MAX as u32 + 1).is_err());
}