diff --git a/lyricsget.py b/lyricsget.py new file mode 100644 index 0000000..43170e6 --- /dev/null +++ b/lyricsget.py @@ -0,0 +1,93 @@ +import json +import os +import pathlib +from dataclasses import dataclass + +import mutagen +import requests +from mutagen.flac import Picture +from mutagen.id3._frames import APIC + + +@dataclass +class Cover: + data: bytes + mimeType: str + + +print("Input directory with music") +dir = input() + +# TODO: Rename folder like albumYear - albumName +# TODO: Rename song with format like 05 - Song when it 05. Song +for root, _, files in os.walk(dir, topdown=True): + coverData = None + # TODO: Fetch cover from url + for cover in files: + suffix = pathlib.Path(cover).suffix + if suffix == ".jpg": + path = root + "/" + cover + data = None + with open(path, "rb") as f: + data = f.read() + + coverData = Cover(data=data, mimeType="image/jpeg") + break + elif suffix == ".png": + path = root + "/" + cover + data = None + with open(path, "rb") as f: + data = f.read() + + coverData = Cover(data=data, mimeType="image/png") + + break + for file in files: + suffix = pathlib.Path(file).suffix + if suffix == ".flac" or suffix == ".mp3": + try: + path = root + "/" + file + audio = mutagen.File(path) + + params = { + "artist_name": audio["artist"], + "track_name": audio["title"], + "album_name": audio["album"], + "duration": audio.info.length, + } + + # Maybe add more sites with lyrics? + lrcreq = requests.get("https://lrclib.net/api/get", params) + + if lrcreq.status_code == 200: + jsonLyrics = json.loads(lrcreq.text) + + if "syncedLyrics" in jsonLyrics: + audio["lyrics"] = jsonLyrics["syncedLyrics"] + else: + audio["lyrics"] = jsonLyrics["plainLyrics"] + else: + print(lrcreq.text) + + if coverData is not None: + if suffix == ".flac": + pic = Picture() + pic.type = 3 + pic.mime = coverData.mimeType + pic.data = coverData.data + audio.add_picture(pic) + + elif suffix == ".mp3": + if not audio.tags: + audio.add_tags() + audio.tags.add( + APIC( + encoding=3, + mime=coverData.mimeType, + type=3, + data=coverData.data, + ) + ) + audio.save() + except Exception as e: + print(f"Error while trying to clean the music: {e}")