This commit is contained in:
Francesco Grillo 2026-02-03 03:22:40 +10:00 committed by GitHub
commit 55079b629a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 193 additions and 5 deletions

View file

@ -190,17 +190,24 @@ class LyricsRequestHandler(RequestHandler):
return f"{url}?{urlencode(params)}"
def get_text(
self, url: str, params: JSONDict | None = None, **kwargs
self,
url: str,
params: JSONDict | None = None,
force_utf8: bool = False,
**kwargs,
) -> str:
"""Return text / HTML data from the given URL.
Set the encoding to None to let requests handle it because some sites
set it incorrectly.
Set encoding to None to let requests auto-detect (works for most sites).
For Genius, force UTF-8 to avoid MacRoman misdetection.
"""
url = self.format_url(url, params)
self.debug("Fetching HTML from {}", url)
r = self.get(url, **kwargs)
r.encoding = None
if force_utf8:
r.encoding = r.encoding or "utf-8"
else:
r.encoding = None
return r.text
def get_json(self, url: str, params: JSONDict | None = None, **kwargs):
@ -544,6 +551,16 @@ class Genius(SearchBackend):
def headers(self) -> dict[str, str]:
return {"Authorization": f"Bearer {self.config['genius_api_key']}"}
def get_text(
self,
url: str,
params: JSONDict | None = None,
force_utf8: bool = True,
**kwargs,
) -> str:
"""Force UTF-8 encoding for Genius to avoid MacRoman misdetection."""
return super().get_text(url, params, force_utf8=force_utf8, **kwargs)
def search(self, artist: str, title: str) -> Iterable[SearchResult]:
search_data: GeniusAPI.Search = self.get_json(
self.SEARCH_URL,
@ -557,7 +574,10 @@ class Genius(SearchBackend):
def scrape(cls, html: str) -> str | None:
if m := cls.LYRICS_IN_JSON_RE.search(html):
html_text = cls.remove_backslash(m[0]).replace(r"\n", "\n")
return cls.get_soup(html_text).get_text().strip()
lyrics = cls.get_soup(html_text).get_text().strip()
# Genius embeds lyrics in JSON; escape sequences remain after parsing
lyrics = re.sub(r'\\+"', '"', lyrics)
return lyrics
return None

View file

@ -576,4 +576,172 @@ lyrics_pages = [
""",
marks=[pytest.mark.xfail(reason="Tekstowo seems to be broken again")],
),
LyricsPage.make(
"https://genius.com/Caparezza-argenti-vive-lyrics",
"""
Ciao Dante, ti ricordi di me? Sono Filippo Argenti
Il vicino di casa che nella Commedia ponesti tra questi violenti
Sono quello che annega nel fango, pestato dai demoni intorno
Cos'è, vuoi provocarmi, sommo? Puoi solo provocarmi sonno!
""",
artist="Caparezza",
track_title="Argenti vive",
marks=[xfail_on_ci("Genius returns 403 FORBIDDEN in CI")],
),
LyricsPage.make(
"https://genius.com/Arctic-monkeys-r-u-mine-lyrics",
"""
I go crazy 'cause here isn't where I wanna be
And satisfaction feels like a distant memory
And I can't help myself, all I
Wanna hear her say is "Are you mine?"
""",
artist="Arctic Monkeys",
track_title="R U Mine?",
marks=[xfail_on_ci("Genius returns 403 FORBIDDEN in CI")],
),
LyricsPage.make(
"https://www.azlyrics.com/lyrics/derivakat/bountyhunter.html",
"""
[Romanized:]
Living legend made of myths and made of stories
But I'm present, find the mark and I'll take the glory
Hit the dead-end, cornered like an animal, it just
Takes one second, I'm nothing if not practical
But I don't really care if you're right or you're wrong
Bùguǎn de wùhuì or you're just a disgrace
Get in the zone when I put on my song
Bìrán de xiànshí when I'm up in your face
Zhēn tài qíng kùn zài lóng de
But you'll find in the end that I'll leave you erased
(If they call?) I'm the one
(Got a job?) Get it done
All alone, you and me, I'll be leaving no trace
No place where I won't go to
No limits I won't break through
No godless deed I won't do
If they got problems, then they know to
Call the bounty hunter
Yeah, they got my number
I'm the problem solver
Leave you six feet under
You won't see another
Winter, spring or summer
huì ràng xiāoshī
No way to recover (Hey!)
Run it up
Night or day (Hey!)
Hunt you down
Run away
No mercy from this mercenary
Take away your sanctuary
Shìlì jiù xiàng 20/20
Way I see you'll end up buried
Don't deviate
Zhǎodào so I terminate
Wúlùn, huì make you pay
I'll double tap you like bang, bang
(Dead lilac) A ghost you only heard in rumor
(Dead lilac) But only if you heard me sooner
(Dead lilac) Losing your chances and losing your time
(Dead lilac) shìjiè wèilái méi de cúnzài (Yeah)
No place where I won't go to (I won't go to)
No limits I won't break through (I won't break through)
No godless deed I won't do (That I won't do)
If they got problems, then they know to
Call the bounty hunter (Hey)
Yeah, they got my number
I'm the problem solver (Hey)
Leave you six feet under
You won't see another (Hey)
Winter, spring or summer
huì ràng xiāoshī (Hey)
No way to recover (Hey!)
Run it up (Run it up)
Night or day (Hey!) (Day)
Hunt you down (Hunt you down)
Run away
[English/Chinese:]
Living legend made of myths and made of stories
But I'm present, find the mark and I'll take the glory
Hit the dead-end, cornered like an animal, it just
Takes one second, I'm nothing if not practical
But I don't really care if you're right or you're wrong
不管你的误会 or you're just a disgrace
Get in the zone when I put on my song
必然的现实 when I'm up in your face
真太可情 困在笼里的你
But you'll find in the end that I'll leave you erased
(If they call?) I'm the one
(Got a job?) Get it done
All alone, you and me, I'll be leaving no trace
No place where I won't go to
No limits I won't break through
No godless deed I won't do
If they got problems, then they know to
Call the bounty hunter
Yeah, they got my number
I'm the problem solver
Leave you six feet under
You won't see another
Winter, spring or summer
我会让你消失
No way to recover (Hey!)
Run it up
Night or day (Hey!)
Hunt you down
Run away
No mercy from this mercenary
Take away your sanctuary
视力就像 20/20
Way I see you'll end up buried
Don't deviate
找到你 so I terminate
无论, 我会 make you pay
I'll double tap you like bang, bang
(Dead lilac) A ghost you only heard in rumor
(Dead lilac) But only if you heard me sooner
(Dead lilac) Losing your chances and losing your time
(Dead lilac) 世界未来没你的存在 (Yeah)
No place where I won't go to (I won't go to)
No limits I won't break through (I won't break through)
No godless deed I won't do (That I won't do)
If they got problems, then they know to
Call the bounty hunter (Hey)
Yeah, they got my number
I'm the problem solver (Hey)
Leave you six feet under
You won't see another (Hey)
Winter, spring or summer
我会让你消失 (Hey)
No way to recover (Hey!)
Run it up (Run it up)
Night or day (Hey!) (Day)
Hunt you down (Hunt you down)
Run away
""",
artist="Derivakat",
track_title="Bounty Hunter",
url_title="Derivakat - Bounty Hunter Lyrics | AZLyrics.com",
marks=[xfail_on_ci("AZLyrics is blocked by Cloudflare")],
),
]