Skip to content

musixmatch

MusixMatch lyrics provider.

MusixMatch ¤

Bases: LyricsProvider

MusixMatch lyrics provider class.

extract_lyrics(url, **kwargs) ¤

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/musixmatch.py
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
def extract_lyrics(self, url: str, **kwargs) -> 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.
    """

    lyrics_resp = requests.get(url, headers=self.headers, timeout=10)

    lyrics_soup = BeautifulSoup(lyrics_resp.text, "html.parser")
    lyrics_paragraphs = lyrics_soup.select("p.mxm-lyrics__content")
    lyrics = "\n".join(i.get_text() for i in lyrics_paragraphs)

    return lyrics

get_results(name, artists, **kwargs) ¤

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/musixmatch.py
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
def get_results(self, name: str, artists: List[str], **kwargs) -> 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.)
    """

    track_search = kwargs.get("track_search", False)
    artists_str = ", ".join(
        artist for artist in artists if artist.lower() not in name.lower()
    )

    # quote the query so that it's safe to use in a url
    # e.g "Au/Ra" -> "Au%2FRa"
    query = quote(f"{name} - {artists_str}", safe="")

    # search the `tracks page` if track_search is True
    if track_search:
        query += "/tracks"

    search_url = f"https://www.musixmatch.com/search/{query}"
    search_resp = requests.get(search_url, headers=self.headers, timeout=10)
    search_soup = BeautifulSoup(search_resp.text, "html.parser")
    song_url_tag = search_soup.select("a[href^='/lyrics/']")

    if not song_url_tag:
        # song_url_tag being None means no results were found on the
        # All Results page, therefore, we use `track_search` to
        # search the tracks page.

        # track_serach being True means we are already searching the tracks page.
        if track_search:
            return {}

        return self.get_results(name, artists, track_search=True)

    results: Dict[str, str] = {}
    for tag in song_url_tag:
        results[tag.get_text()] = "https://www.musixmatch.com" + str(
            tag.get("href", "")
        )

    return results