Skip to content

genius

Genius Lyrics module.

Genius(access_token) ¤

Bases: LyricsProvider

Genius lyrics provider class.

Source code in spotdl/providers/lyrics/genius.py
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
def __init__(self, access_token: str):
    """
    Init the lyrics provider search and set headers.
    """

    super().__init__()

    self.access_token = access_token

    self.headers.update(
        {
            "Authorization": f"Bearer {self.access_token}",
        }
    )

    self.session = requests.Session()
    self.session.headers.update(self.headers)

extract_lyrics(url, **_) ¤

Extracts the lyrics from the given url.

Arguments¤
  • url: The url to extract the lyrics from.
  • kwargs: Additional arguments.
Returns¤
  • The lyrics of the song or None if no lyrics were found.
Source code in spotdl/providers/lyrics/genius.py
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
def extract_lyrics(self, url: str, **_) -> Optional[str]:
    """
    Extracts the lyrics from the given url.

    ### Arguments
    - url: The url to extract the lyrics from.
    - kwargs: Additional arguments.

    ### Returns
    - The lyrics of the song or None if no lyrics were found.
    """

    url = f"https://api.genius.com/songs/{url}"
    song_response = self.session.get(
        url,
        headers=self.headers,
        timeout=10,
        proxies=GlobalConfig.get_parameter("proxies"),
    )
    url = song_response.json()["response"]["song"]["url"]

    soup = None
    counter = 0
    while counter < 4:
        genius_page_response = self.session.get(
            url,
            headers=self.headers,
            timeout=10,
            proxies=GlobalConfig.get_parameter("proxies"),
        )

        if not genius_page_response.ok:
            counter += 1
            continue

        soup = BeautifulSoup(
            genius_page_response.text.replace("<br/>", "\n"), "html.parser"
        )

        break

    if soup is None:
        return None

    lyrics_div = soup.select_one("div.lyrics")
    lyrics_containers = soup.select("div[class^=Lyrics__Container]")

    # Get lyrics
    if lyrics_div:
        lyrics = lyrics_div.get_text()
    elif lyrics_containers:
        lyrics = "\n".join(con.get_text() for con in lyrics_containers)
    else:
        return None

    if not lyrics:
        return None

    # Clean lyrics
    lyrics = lyrics.strip()

    # Remove desc at the beginning if it exists
    for to_remove in ["desc", "Desc"]:
        lyrics.replace(to_remove, "", 1)

    return lyrics

get_results(name, artists, **_) ¤

Returns the results for the given song.

Arguments¤
  • name: The name of the song.
  • artists: The artists of the song.
  • kwargs: Additional arguments.
Returns¤
  • A dictionary with the results. (The key is the title and the value is the url.)
Source code in spotdl/providers/lyrics/genius.py
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
def get_results(self, name: str, artists: List[str], **_) -> Dict[str, str]:
    """
    Returns the results for the given song.

    ### Arguments
    - name: The name of the song.
    - artists: The artists of the song.
    - kwargs: Additional arguments.

    ### Returns
    - A dictionary with the results. (The key is the title and the value is the url.)
    """

    artists_str = ", ".join(artists)
    title = f"{name} - {artists_str}"

    search_response = self.session.get(
        "https://api.genius.com/search",
        params={"q": title},
        headers=self.headers,
        timeout=10,
        proxies=GlobalConfig.get_parameter("proxies"),
    )

    results: Dict[str, str] = {}
    for hit in search_response.json()["response"]["hits"]:
        results[hit["result"]["full_title"]] = hit["result"]["id"]

    return results