diff --git a/src/artist.rs b/src/artist.rs index c761270..70b636b 100644 --- a/src/artist.rs +++ b/src/artist.rs @@ -11,8 +11,6 @@ use crate::templates::template; static GENIUS_IMAGE_URL: &str = "https://images.genius.com/"; static GENIUS_BASE_PATTERN: Lazy = lazy_regex!(r#"https?://\w*.?genius\.com/"#); -static GENIUS_ALBUMS_PATTERN: Lazy = lazy_regex!(r#"https?://\w*.?genius\.com/"#); -static GENIUS_ARTIST_PATTERN: Lazy = lazy_regex!(r#"https?://\w*.?genius\.com/"#); #[derive(Template)] #[template(path = "artist.html")] @@ -50,8 +48,6 @@ fn rewrite_links(html: &str) -> String { GENIUS_IMAGE_URL, &format!("/api/image?url={}", GENIUS_IMAGE_URL), ); // Images - let html = GENIUS_ALBUMS_PATTERN.replace_all(&html, ""); // Albums - let html = GENIUS_ARTIST_PATTERN.replace_all(&html, ""); // Artists - let html = GENIUS_BASE_PATTERN.replace_all(&html, "/lyrics?path=/"); // Lyrics + let html = GENIUS_BASE_PATTERN.replace_all(&html, ""); // We follow Genius' schema html.to_string() } diff --git a/src/lyrics.rs b/src/lyrics.rs index 8ceae2a..9f4855d 100644 --- a/src/lyrics.rs +++ b/src/lyrics.rs @@ -25,34 +25,35 @@ struct Verse { #[derive(Template)] #[template(path = "lyrics.html")] -struct LyricsTemplate { +struct LyricsTemplate<'a> { settings: Settings, verses: Vec, - query: LyricsQuery, + path: &'a str, song: GeniusSong, } #[derive(Debug, Deserialize)] pub struct LyricsQuery { id: Option, - path: String, } -#[get("/lyrics")] +#[get("/{path:.*}")] pub async fn lyrics(req: HttpRequest, info: web::Query) -> Result { let document: Html; let song: GeniusSong; + let path = req.match_info().query("path").trim_end_matches('?'); + if let Some(id) = info.id { let responses = future::join( - genius::get_text(genius::SubDomain::Root, &info.path, None), + genius::get_text(genius::SubDomain::Root, path, None), genius::get_song(id), ) .await; document = Html::parse_document(&responses.0?); song = responses.1?; } else { - let lyric_page = genius::get_text(genius::SubDomain::Root, &info.path, None).await?; + let lyric_page = genius::get_text(genius::SubDomain::Root, path, None).await?; document = Html::parse_document(&lyric_page); let id = get_song_id(&document)?; song = genius::get_song(id).await?; @@ -65,7 +66,7 @@ pub async fn lyrics(req: HttpRequest, info: web::Query) -> Result std::io::Result<()> { .service(api::image) .service(artist::artist) .service(home::home) - .service(lyrics::lyrics) .service(search::search) .service(settings::settings) .service(settings::settings_form) @@ -111,6 +110,8 @@ async fn main() -> std::io::Result<()> { .service(resource::style_theme) .service(resource::icon) .service(resource::font) + // Must be last! + .service(lyrics::lyrics) }); if args.keep_alive_timeout > 0.0 { diff --git a/src/resource.rs b/src/resource.rs index 8f8268d..b07d1dc 100644 --- a/src/resource.rs +++ b/src/resource.rs @@ -3,7 +3,7 @@ use include_dir::{include_dir, Dir}; const STATIC_RESOURCES: Dir = include_dir!("$CARGO_MANIFEST_DIR/static"); -#[get("{resource}")] +#[get("{resource}.{ext}")] pub async fn resource(path: web::Path) -> impl Responder { asset(path.as_str()) } diff --git a/templates/lyrics.html b/templates/lyrics.html index f9138a8..86dd17a 100644 --- a/templates/lyrics.html +++ b/templates/lyrics.html @@ -6,7 +6,7 @@ {% block navright %} {% endblock %} diff --git a/templates/song.html b/templates/song.html index 48d80ea..a96708d 100644 --- a/templates/song.html +++ b/templates/song.html @@ -1,4 +1,4 @@ - +