made the lyrics downloader actually working. Still needs much refactoring attention though
This commit is contained in:
		| @@ -4,6 +4,7 @@ import os | ||||
| import logging | ||||
| from typing import List | ||||
| from bs4 import BeautifulSoup | ||||
| import pycountry | ||||
|  | ||||
| current = os.path.dirname(os.path.realpath(__file__)) | ||||
| parent = os.path.dirname(current) | ||||
| @@ -44,7 +45,9 @@ class Song: | ||||
|         self.artist = get_elem_from_obj(song_data, ['primary_artist', 'name']) | ||||
|         self.title = get_elem_from_obj(song_data, ['title']) | ||||
|  | ||||
|         self.language = get_elem_from_obj(song_data, ['language']) | ||||
|         lang_code = get_elem_from_obj(song_data, ['language']) or "en" | ||||
|         self.language = pycountry.languages.get(alpha_2=lang_code) | ||||
|         self.lang = self.language.alpha_3 | ||||
|         self.url = get_elem_from_obj(song_data, ['url']) | ||||
|  | ||||
|         # maybe could be implemented | ||||
| @@ -57,8 +60,12 @@ class Song: | ||||
|         self.valid = self.is_valid() | ||||
|         if self.valid: | ||||
|             logger.info(f"found lyrics for \"{self.__repr__()}\"") | ||||
|         else: | ||||
|             return | ||||
|  | ||||
|         self.lyrics: str | ||||
|         self.lyrics = self.fetch_lyrics() | ||||
|         if self.lyrics is None: | ||||
|             self.valid = False | ||||
|  | ||||
|     def is_valid(self) -> bool: | ||||
|         title_match, title_distance = phonetic_compares.match_titles(self.title, self.desired_data['track']) | ||||
| @@ -96,7 +103,7 @@ class Song: | ||||
|  | ||||
| def process_multiple_songs(song_datas: list, desired_data: dict) -> List[Song]: | ||||
|     all_songs = [Song(song_data, desired_data) for song_data in song_datas] | ||||
|     return [song_ for song_ in all_songs if not song_.valid] | ||||
|     return all_songs | ||||
|  | ||||
|  | ||||
| def search_song_list(artist: str, track: str) -> List[Song]: | ||||
| @@ -128,14 +135,18 @@ def search_song_list(artist: str, track: str) -> List[Song]: | ||||
|  | ||||
|  | ||||
| def search(artist: str, track: str): | ||||
|     raw_songs = search_song_list(artist, track) | ||||
|     all_lyrics = [raw_song.fetch_lyrics() for raw_song in raw_songs] | ||||
|     return [i for i in all_lyrics if i is not None] | ||||
|     results = [] | ||||
|     r = search_song_list(artist, track) | ||||
|     for r_ in r: | ||||
|         if r_.valid: | ||||
|             results.append(r_) | ||||
|     return results | ||||
|  | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     logging.basicConfig(level=logging.DEBUG) | ||||
|  | ||||
|     """ | ||||
|     song = Song( | ||||
|         {'highlights': [], 'index': 'song', 'type': 'song', | ||||
|          'result': {'_type': 'song', 'annotation_count': 0, 'api_path': '/songs/6142483', | ||||
| @@ -166,8 +177,8 @@ if __name__ == "__main__": | ||||
|         {'artist': 'Psychonaut 4', 'track': 'Sana Sana Sana, Cura Cura Cura'} | ||||
|     ) | ||||
|     print(song.fetch_lyrics()) | ||||
|     """ | ||||
|  | ||||
|     exit() | ||||
|     songs = search("Psychonaut 4", "Sana Sana Sana, Cura Cura Cura") | ||||
|     songs = search("Psychonaut 4", "Sana-sana-sana - Cura-cura-cura") | ||||
|     for song in songs: | ||||
|         print(song) | ||||
|   | ||||
| @@ -29,10 +29,9 @@ I have written that Rhythmbox plugin: https://github.com/HeIIow2/rythmbox-id3-ly | ||||
| # https://code.activestate.com/recipes/577138-embed-lyrics-into-mp3-files-using-mutagen-uslt-tag/ | ||||
|  | ||||
|  | ||||
| def add_lyrics(file_name, lyrics=""): | ||||
|     print(lyrics) | ||||
| def add_lyrics(file_name, lyrics): | ||||
|     tags = ID3(file_name) | ||||
|     uslt_output = USLT(encoding=3, lang=u'eng', desc=u'desc', text=lyrics) | ||||
|     uslt_output = USLT(encoding=3, lang=lyrics.lang, desc=u'desc', text=lyrics.lyrics) | ||||
|     tags["USLT::'eng'"] = uslt_output | ||||
|  | ||||
|     tags.save(file_name) | ||||
| @@ -50,16 +49,16 @@ def fetch_single_lyrics(row: dict): | ||||
|  | ||||
|     if not os.path.exists(file_): | ||||
|         return | ||||
|     print(file_, artist, track) | ||||
|     lyrics = genius.search(artist, track) | ||||
|     if len(lyrics) == 0: | ||||
|         return | ||||
|     print("found something") | ||||
|     add_lyrics(file_, lyrics[0]) | ||||
|  | ||||
|  | ||||
| def fetch_lyrics(database: db.Database): | ||||
|     for row in database.get_custom_track([]): | ||||
|         print(row) | ||||
|         print(row['title']) | ||||
|         fetch_single_lyrics(row) | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -75,6 +75,7 @@ def search_for_metadata(): | ||||
|         print() | ||||
|         print(search.search_from_query(input_)) | ||||
|  | ||||
|     print(search.current_option) | ||||
|     return search.current_option | ||||
|  | ||||
|  | ||||
| @@ -109,7 +110,8 @@ def cli(start_at: int = 0): | ||||
|         logging.info(f"{genre} has been set as genre.") | ||||
|  | ||||
|     if start_at <= 0: | ||||
|         search = search_for_metadata() | ||||
|         # search = search_for_metadata() | ||||
|         search = metadata.search.Option("release", "f8d4b24d-2c46-4e9c-8078-0c0f337c84dd", "Beautyfall") | ||||
|         logging.info("Starting Downloading of metadata") | ||||
|         metadata_downloader = MetadataDownloader(database, METADATA_DOWNLOAD_LOGGER) | ||||
|         metadata_downloader.download(search) | ||||
|   | ||||
| @@ -18,6 +18,7 @@ OPTION_TYPES = ['artist', 'release_group', 'release', 'recording'] | ||||
|  | ||||
| class Option: | ||||
|     def __init__(self, type_: str, id_: str, name: str, additional_info: str = "") -> None: | ||||
|         # print(type_, id_, name) | ||||
|         if type_ not in OPTION_TYPES: | ||||
|             raise ValueError(f"type: {type_} doesn't exist. Leagal Values: {OPTION_TYPES}") | ||||
|         self.type = type_ | ||||
|   | ||||
| @@ -1,9 +1,18 @@ | ||||
| import jellyfish | ||||
| import string | ||||
|  | ||||
| TITLE_THRESHOLD_LEVENSHTEIN = 2 | ||||
| UNIFY_TO = " " | ||||
|  | ||||
|  | ||||
| def unify_punctuation(to_unify: str) -> str: | ||||
|     for char in string.punctuation: | ||||
|         to_unify = to_unify.replace(char, UNIFY_TO) | ||||
|     return to_unify | ||||
|  | ||||
|  | ||||
| def match_titles(title_1: str, title_2: str) -> (bool, int): | ||||
|     title_1, title_2 = unify_punctuation(title_1).lower(), unify_punctuation(title_2).lower() | ||||
|     distance = jellyfish.levenshtein_distance(title_1, title_2) | ||||
|     return distance > TITLE_THRESHOLD_LEVENSHTEIN, distance | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user