1use std::fmt::{Display, Write};
2
3use url::Url;
4
5#[derive(Debug)]
6pub enum UrlError<'a> {
7 NoBaseUrl(&'a Url),
8}
9
10pub(crate) fn get_original_image(url: &Url) -> Result<Url, UrlError<'_>> {
11 let cb = url
12 .query_pairs()
13 .filter(|(key, _val)| key.contains("cb"))
14 .fold(String::new(), |mut out, (k, v)| {
15 let _ = write!(out, "{}={}", k, v);
16 out
17 });
18
19 let segments = url
20 .path_segments()
21 .ok_or(UrlError::NoBaseUrl(url))?
22 .map_while(|seg| {
23 if seg.contains("scale-to-width") {
24 return None;
25 }
26
27 Some(seg)
28 })
29 .collect::<Vec<_>>()
30 .join("/");
31
32 let base = format!(
33 "{}://{}/{}",
34 url.scheme(),
35 url.host_str().unwrap(),
36 segments
37 );
38 let mut res = Url::parse(&base).unwrap();
39
40 res.set_query(Some(cb.as_str()));
41
42 Ok(res)
43}
44
45pub(crate) fn canonicalize<U: Display>(url: U) -> String {
46 format!("https://honkai-star-rail.fandom.com{}", url)
47}
48
49#[cfg(test)]
50mod test {
51 use super::*;
52
53 #[test]
54 fn get_original_image_works() {
55 let raw = "https://static.wikia.nocookie.net/houkai-star-rail/images/c/c2/Character_Clara_Splash_Art.png/revision/latest/scale-to-width-down/185?cb=20230216231958";
56 let expected = "https://static.wikia.nocookie.net/houkai-star-rail/images/c/c2/Character_Clara_Splash_Art.png/revision/latest?cb=20230216231958";
57
58 let url = Url::parse(raw).unwrap();
59 let expected_url = Url::parse(expected).unwrap();
60
61 let original_image = get_original_image(&url);
62
63 assert!(original_image.is_ok());
64 assert_eq!(original_image.unwrap(), expected_url);
65 }
66}