From 0c285753fbf5602a7809b80428a71ed2f8535727 Mon Sep 17 00:00:00 2001 From: wisp3rwind <17089248+wisp3rwind@users.noreply.github.com> Date: Sun, 4 Jul 2021 00:45:12 +0200 Subject: [PATCH] lyrics: Add some missing None-checks to the Tekstowo source The previous code had the potential to crash if (when?) Tekstowo changes their website structure sufficiently. The new code is rather ugly due to the explicit checks after each and every function call. Unfortunately, the alternative would be to catch a bunch of very generic Exceptions (AttributeError, ...), since there's no such thing as a `BeautifulSoupNotFoundError`. --- beetsplug/lyrics.py | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/beetsplug/lyrics.py b/beetsplug/lyrics.py index b6457fc47..93c31d938 100644 --- a/beetsplug/lyrics.py +++ b/beetsplug/lyrics.py @@ -461,20 +461,27 @@ class Tekstowo(Backend): if not soup: return None - song_rows = soup.find("div", class_="content"). \ - find("div", class_="card"). \ - find_all("div", class_="box-przeboje") + content_div = soup.find("div", class_="content") + if not content_div: + return None + card_div = content_div.find("div", class_="card") + if not card_div: + return None + + song_rows = card_div.find_all("div", class_="box-przeboje") if not song_rows: return None song_row = song_rows[0] - if not song_row: return None - href = song_row.find('a').get('href') - return self.BASE_URL + href + link = song_row.find('a') + if not link: + return None + + return self.BASE_URL + link.get('href') def extract_lyrics(self, html): html = _scrape_strip_cruft(html) @@ -484,10 +491,11 @@ class Tekstowo(Backend): if not soup: return None - c = soup.find("div", class_="song-text") - if c: - return c.get_text() - return None + lyrics_div = soup.find("div", class_="song-text") + if not lyrics_div: + return None + + return lyrics_div.get_text() def remove_credits(text):