Skip to content

lrc

LRC related functions

generate_lrc(song, output_file) ¤

Generates an LRC file for the current song

Arguments¤
  • song: Song object
  • output_file: Path to the output file
Source code in spotdl/utils/lrc.py
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
def generate_lrc(song: Song, output_file: Path):
    """
    Generates an LRC file for the current song

    ### Arguments
    - song: Song object
    - output_file: Path to the output file
    """

    if song.lyrics and has_translation(song.lyrics):
        lrc_data = song.lyrics
    else:
        try:
            lrc_data = syncedlyrics_search(song.display_name)
        except Exception:
            lrc_data = None

    if lrc_data:
        Lyrics(lrc_data).save_lrc_file(
            str(output_file.with_suffix(".lrc")), TargetType.PREFER_SYNCED
        )
        logger.debug("Saved lrc file for %s", song.display_name)
    else:
        logger.debug("No lrc file found for %s", song.display_name)

parse_lrc_timestamps(lyrics) ¤

Parses LRC lyrics and extracts text with timestamps in milliseconds

Arguments¤
  • lyrics: LRC formatted lyrics string
Returns¤
  • List of tuples containing (text, timestamp_ms)
Source code in spotdl/utils/lrc.py
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
90
91
92
93
94
95
def parse_lrc_timestamps(lyrics: str) -> List[Tuple[str, float]]:
    """
    Parses LRC lyrics and extracts text with timestamps in milliseconds

    ### Arguments
    - lyrics: LRC formatted lyrics string

    ### Returns
    - List of tuples containing (text, timestamp_ms)
    """

    lrc_data = []
    for line in lyrics.splitlines():
        if not line or "]" not in line:
            continue

        time_tag = line.split("]", 1)[0] + "]"
        text = line.replace(time_tag, "")

        time_tag = time_tag.replace("[", "")
        time_tag = time_tag.replace("]", "")
        time_tag = time_tag.replace(".", ":")
        time_tag_vals = time_tag.split(":")

        if len(time_tag_vals) != 3:
            continue

        try:
            minute, sec, millisecond = time_tag_vals
            time = to_ms(min=minute, sec=sec, ms=millisecond)
            lrc_data.append((text, time))
        except (ValueError, TypeError):
            continue

    return lrc_data

remove_lrc(lyrics) ¤

Removes lrc tags from lyrics

Arguments¤
  • lyrics: Lyrics string
Returns¤
  • Lyrics string without lrc tags
Source code in spotdl/utils/lrc.py
47
48
49
50
51
52
53
54
55
56
57
58
def remove_lrc(lyrics: str) -> str:
    """
    Removes lrc tags from lyrics

    ### Arguments
    - lyrics: Lyrics string

    ### Returns
    - Lyrics string without lrc tags
    """

    return re.sub(r"\[.*?\]", "", lyrics)