fuck yea refactored lyrics
This commit is contained in:
@@ -4,7 +4,9 @@ from bs4 import BeautifulSoup
|
||||
import pycountry
|
||||
|
||||
from ..database import (
|
||||
Lyrics
|
||||
Lyrics,
|
||||
Song,
|
||||
Artist
|
||||
)
|
||||
from ..utils.shared import *
|
||||
from ..utils import phonetic_compares
|
||||
@@ -25,7 +27,7 @@ session.proxies = proxies
|
||||
logger = GENIUS_LOGGER
|
||||
|
||||
|
||||
class Song:
|
||||
class LyricsSong:
|
||||
def __init__(self, raw_data: dict, desirered_data: dict):
|
||||
self.raw_data = raw_data
|
||||
self.desired_data = desirered_data
|
||||
@@ -72,7 +74,7 @@ class Song:
|
||||
|
||||
r = session.get(self.url)
|
||||
if r.status_code != 200:
|
||||
logging.warning(f"{r.url} returned {r.status_code}:\n{r.content}")
|
||||
logger.warning(f"{r.url} returned {r.status_code}:\n{r.content}")
|
||||
return None
|
||||
|
||||
soup = BeautifulSoup(r.content, "html.parser")
|
||||
@@ -80,23 +82,29 @@ class Song:
|
||||
if len(lyrics_soups) == 0:
|
||||
logger.warning(f"didn't found lyrics on {self.url}")
|
||||
return None
|
||||
if len(lyrics_soups) != 1:
|
||||
logger.warning(f"number of lyrics_soups doesn't equals 1, but {len(lyrics_soups)} on {self.url}")
|
||||
# if len(lyrics_soups) != 1:
|
||||
# logger.warning(f"number of lyrics_soups doesn't equals 1, but {len(lyrics_soups)} on {self.url}")
|
||||
|
||||
lyrics = "\n".join([lyrics_soup.getText(separator="\n", strip=True) for lyrics_soup in lyrics_soups])
|
||||
print(lyrics)
|
||||
|
||||
# <div data-lyrics-container="true" class="Lyrics__Container-sc-1ynbvzw-6 YYrds">With the soundle
|
||||
self.lyrics = lyrics
|
||||
return lyrics
|
||||
|
||||
def get_lyrics_object(self) -> Lyrics | None:
|
||||
if self.lyrics is None:
|
||||
return None
|
||||
return Lyrics(text=self.lyrics, language=self.lang or "en")
|
||||
|
||||
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]
|
||||
lyrics_object = property(fget=get_lyrics_object)
|
||||
|
||||
|
||||
def process_multiple_songs(song_datas: list, desired_data: dict) -> List[LyricsSong]:
|
||||
all_songs = [LyricsSong(song_data, desired_data) for song_data in song_datas]
|
||||
return all_songs
|
||||
|
||||
|
||||
def search_song_list(artist: str, track: str) -> List[Song]:
|
||||
def search_song_list(artist: str, track: str) -> List[LyricsSong]:
|
||||
endpoint = "https://genius.com/api/search/multi?q="
|
||||
url = f"{endpoint}{artist} - {track}"
|
||||
logging.info(f"requesting {url}")
|
||||
@@ -124,18 +132,31 @@ def search_song_list(artist: str, track: str) -> List[Song]:
|
||||
return []
|
||||
|
||||
|
||||
def search(artist: str, track: str) -> list:
|
||||
results = []
|
||||
r = search_song_list(artist, track)
|
||||
for r_ in r:
|
||||
if r_.valid:
|
||||
results.append(r_)
|
||||
return results
|
||||
def fetch_lyrics_from_artist(song: Song, artist: Artist) -> List[Lyrics]:
|
||||
lyrics_list: List[Lyrics] = []
|
||||
lyrics_song_list = search_song_list(artist.name, song.title)
|
||||
|
||||
for lyrics_song in lyrics_song_list:
|
||||
if lyrics_song.valid:
|
||||
lyrics_list.append(lyrics_song.lyrics_object)
|
||||
|
||||
return lyrics_list
|
||||
|
||||
|
||||
def fetch_lyrics(song: Song) -> List[Lyrics]:
|
||||
lyrics: List[Lyrics] = []
|
||||
|
||||
for artist in song.artists:
|
||||
lyrics.extend(fetch_lyrics_from_artist(song, artist))
|
||||
|
||||
return lyrics
|
||||
|
||||
|
||||
"""
|
||||
if __name__ == "__main__":
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
|
||||
songs = search("Zombiez", "WALL OF Z")
|
||||
for song in songs:
|
||||
print(song)
|
||||
"""
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
from typing import List
|
||||
|
||||
import mutagen
|
||||
from mutagen.id3 import ID3, USLT
|
||||
|
||||
@@ -5,7 +7,9 @@ from ..utils.shared import *
|
||||
from . import genius
|
||||
from ..database import (
|
||||
Song,
|
||||
cache
|
||||
cache,
|
||||
Lyrics,
|
||||
Target
|
||||
)
|
||||
|
||||
logger = LYRICS_LOGGER
|
||||
@@ -34,36 +38,43 @@ 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_path: str, lyrics):
|
||||
if not os.path.exists(file_path):
|
||||
def add_lyrics(target: Target, lyrics):
|
||||
if not os.path.exists(target.file):
|
||||
return
|
||||
|
||||
try:
|
||||
tags = ID3(file_path)
|
||||
tags = ID3(target.file)
|
||||
except mutagen.id3.ID3NoHeaderError:
|
||||
return
|
||||
|
||||
logger.info(f"adding lyrics to the file {file_path}")
|
||||
logger.info(f"adding lyrics to the file {target.file}")
|
||||
|
||||
uslt_output = USLT(encoding=3, lang=lyrics.lang, desc=u'desc', text=lyrics.lyrics)
|
||||
uslt_output = USLT(encoding=3, lang=lyrics.language, desc=u'desc', text=lyrics.text)
|
||||
tags["USLT::'eng'"] = uslt_output
|
||||
tags.save(file_path)
|
||||
tags.save(target.file)
|
||||
|
||||
|
||||
def fetch_single_lyrics(song: Song):
|
||||
logger.info(f"try fetching lyrics for {song}")
|
||||
|
||||
lyrics = []
|
||||
lyrics_list: List[Lyrics] = genius.fetch_lyrics(song)
|
||||
"""
|
||||
for artist in song.get_artist_names():
|
||||
lyrics.extend(genius.search(artist, song.title))
|
||||
if len(lyrics) == 0:
|
||||
"""
|
||||
if len(lyrics_list) == 0:
|
||||
return
|
||||
|
||||
logger.info("found lyrics")
|
||||
cache.add_lyrics(song.id, lyrics=lyrics[0])
|
||||
add_lyrics(song.target.file, lyrics[0])
|
||||
logger.info(f"found lyrics for {song}")
|
||||
song.lyrics.extend(lyrics_list)
|
||||
print(lyrics_list)
|
||||
cache.add_lyrics(song=song, lyrics=lyrics_list[0])
|
||||
add_lyrics(song.target, lyrics_list[0])
|
||||
|
||||
# cache.add_lyrics(song.id, lyrics=lyrics[0])
|
||||
# add_lyrics(song.target.file, lyrics[0])
|
||||
|
||||
|
||||
def fetch_lyrics():
|
||||
for song in cache.get_tracks_for_lyrics():
|
||||
def fetch_lyrics(songs: List[Song]):
|
||||
for song in songs:
|
||||
fetch_single_lyrics(song)
|
||||
|
||||
Reference in New Issue
Block a user