adding latest working version

This commit is contained in:
dtomlinson
2020-03-06 17:24:14 +00:00
parent be8ce7edcb
commit 6a3c09ca21
4 changed files with 14634 additions and 4 deletions

14507
lyrics_count.json Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1 @@
[{"Le Pop [2009]": [1, 244, 203, 158, "No Lyrics", 129, 108, 1, 122, 163, 251, 176, 183]}, {"A Kiss Before You Go [2011]": [40, 319, 203, 205, 197, 188, 188, 177, 201, 323, 1, 101]}, {"Rockland [2015]": [187, 192, 313, 278, 290, 325, 264, 316, 200, 362, 237, 422, 194, 304]}]

View File

@@ -7,6 +7,8 @@ import html
import json import json
import os import os
from collections import Counter from collections import Counter
import string
import math
import musicbrainzngs import musicbrainzngs
import click import click
@@ -344,8 +346,9 @@ class LyricsBuilder(LyricsConcreteBuilder):
def count_words_in_lyrics(self) -> None: def count_words_in_lyrics(self) -> None:
# remove punctuation, fix click bar # remove punctuation, fix click bar
self.all_albums_lyrics_count = list() self.all_albums_lyrics_count = list()
print(self.total_track_count)
with click.progressbar( with click.progressbar(
length=self.total_track_count, label=f'Processing lyrics', length=self.total_track_count, label=f'Processing lyrics'
) as bar: ) as bar:
for x in self.all_albums_lyrics: for x in self.all_albums_lyrics:
for alb, lyrics in x.items(): for alb, lyrics in x.items():
@@ -364,8 +367,94 @@ class LyricsBuilder(LyricsConcreteBuilder):
) )
self.all_albums_lyrics_count.append(lyrics) self.all_albums_lyrics_count.append(lyrics)
bar.update(update - 1) bar.update(update - 1)
click.echo(f'Processed lyrics for {self.total_track_count} tracks.')
return self return self
def calculate_average_all_albums(self) -> None:
self.all_albums_lyrics_sum = list()
# with open(f'{os.getcwd()}/lyrics_count.json', 'r') as f:
# album_lyrics = json.load(f)
album_lyrics = self.all_albums_lyrics_count
count = 0
for i in album_lyrics:
count += len(i)
for album, lyrics_list in i.items():
album_avg = list()
d = addict.Dict()
print(album)
for j in lyrics_list:
if j != 'No Lyrics':
song_total = 0
for k in j:
song_total += k[1]
else:
song_total = "No Lyrics"
album_avg.append(song_total)
# We want to avoid a ValueError when we loop through
# the first time
try:
d = addict.Dict(**d, **addict.Dict(album, album_avg))
except ValueError:
d = addict.Dict((album, album_avg))
print(d)
self.all_albums_lyrics_sum.append(d)
print(count)
with open(f'{os.getcwd()}/lyrics_sum_all_album.json', 'w+') as f:
json.dump(self.all_albums_lyrics_sum, f)
return self
def calculate_final_average_by_album(self) -> None:
self.album_averages = addict.Dict()
with open(f'{os.getcwd()}/lyrics_sum_all_album.json', 'r') as f:
album_lyrics = json.load(f)
for i in album_lyrics:
for album, count in i.items():
album_total, album_running = (0, 0)
for c in count:
if isinstance(c, int):
album_running += c
album_total += 1
else:
pass
avg = math.ceil(album_running / album_total)
self.album_averages = addict.Dict(
**self.album_averages, **addict.Dict((album, avg))
)
print(self.album_averages)
def calculate_final_average_by_year(self) -> None:
group_by_years = addict.Dict()
self.year_averages = addict.Dict()
with open(f'{os.getcwd()}/lyrics_sum_all_album.json', 'r') as f:
album_lyrics = json.load(f)
for i in album_lyrics:
for album, count in i.items():
year = album.split('[')[-1].strip(']')
try:
group_by_years = addict.Dict(
**group_by_years, **addict.Dict((year, count))
)
# First loop returns value error for empty dict
except ValueError:
group_by_years = addict.Dict((year, count))
# Multiple years raise a TypeError - we append
except TypeError:
group_by_years.get(year).extend(count)
for year, y_count in group_by_years.items():
year_total, year_running = (0, 0)
for y in y_count:
if isinstance(y, int):
year_running += y
year_total += 1
else:
pass
avg = math.ceil(year_running / year_total)
print(year, avg)
self.year_averages = addict.Dict(
**self.year_averages, **addict.Dict((year, avg))
)
print(self.year_averages)
@staticmethod @staticmethod
def construct_lyrics_url(artist: str, song: str) -> str: def construct_lyrics_url(artist: str, song: str) -> str:
lyrics_api_base = 'https://api.lyrics.ovh/v1' lyrics_api_base = 'https://api.lyrics.ovh/v1'
@@ -378,11 +467,16 @@ class LyricsBuilder(LyricsConcreteBuilder):
# No lyrics for a song will return a key of 'error', we pass on this. # No lyrics for a song will return a key of 'error', we pass on this.
try: try:
lyrics = resp.json()['lyrics'] lyrics = LyricsBuilder.strip_punctuation(resp.json()['lyrics'])
return lyrics return lyrics
except KeyError: except (KeyError, json.decoder.JSONDecodeError):
return return
@staticmethod
def strip_punctuation(word: str) -> str:
_strip = word.translate(str.maketrans('', '', string.punctuation))
return _strip
class LyricsClickDirector: class LyricsClickDirector:
"""docstring for LyricsClickDirector""" """docstring for LyricsClickDirector"""
@@ -476,8 +570,22 @@ class LyricsClickDirector:
indent=4, indent=4,
sort_keys=True, sort_keys=True,
) )
self.builder._product.all_albums_lyrics_count = (
self.builder.all_albums_lyrics_count
)
return self return self
def _calculate_average(self) -> None:
self.builder.calculate_average_all_albums()
self.builder._product.all_albums_lyrics_sum = (
self.builder.all_albums_lyrics_sum
)
pprint(self.builder._product.all_albums_lyrics_sum)
def _dev(self) -> None:
self.builder.calculate_final_average_by_album()
self.builder.calculate_final_average_by_year()
@dataclass @dataclass
class Lyrics: class Lyrics:
@@ -489,9 +597,13 @@ class Lyrics:
'country', 'country',
'all_albums_with_tracks', 'all_albums_with_tracks',
'all_albums_with_lyrics', 'all_albums_with_lyrics',
'all_albums_lyrics_count',
'all_albums_lyrics_sum',
] ]
artist_id: str artist_id: str
artist: str artist: str
country: Union[str, None] country: Union[str, None]
all_albums_with_tracks: List[Dict[str, List[str]]] all_albums_with_tracks: List[Dict[str, List[str]]]
all_albums_with_lyrics: List[Dict[str, List[str]]] all_albums_with_lyrics: List[Dict[str, List[str]]]
all_albums_lyrics_count: List[Dict[str, List[List[str, int]]]]
all_albums_lyrics_sum: List[Dict[str, List[int, str]]]

View File

@@ -29,9 +29,12 @@ from musicbrainzapi.api.command_builders import lyrics
@click.option( @click.option(
'--save-lyrics', required=False, is_flag=True, help='Save the lyrics ' '--save-lyrics', required=False, is_flag=True, help='Save the lyrics '
) )
@click.option('--dev', is_flag=True)
@click.command() @click.command()
@pass_environment @pass_environment
def cli(ctx, artist: str, country: Union[str, None], save_lyrics) -> None: def cli(
ctx, artist: str, country: Union[str, None], save_lyrics, dev: bool
) -> None:
""" """
Search for lyrics of an Artist/Group. Search for lyrics of an Artist/Group.
""" """
@@ -39,7 +42,14 @@ def cli(ctx, artist: str, country: Union[str, None], save_lyrics) -> None:
director = lyrics.LyricsClickDirector() director = lyrics.LyricsClickDirector()
builder = lyrics.LyricsBuilder() builder = lyrics.LyricsBuilder()
director.builder = builder director.builder = builder
if dev:
director._dev()
raise(SystemExit)
director._get_initial_artists(artist, country) director._get_initial_artists(artist, country)
director._confirm_final_artist() director._confirm_final_artist()
director._query_for_data() director._query_for_data()
director._get_lyrics() director._get_lyrics()
director._calculate_average()
def dev():
pass