Merge branch 'develop'
This commit is contained in:
2
setup.py
2
setup.py
@@ -33,10 +33,8 @@ entry_points = \
|
|||||||
setup_kwargs = {
|
setup_kwargs = {
|
||||||
'name': 'musicbrainzapi',
|
'name': 'musicbrainzapi',
|
||||||
'version': '1.0.0',
|
'version': '1.0.0',
|
||||||
'description': '',
|
|
||||||
'long_description': None,
|
'long_description': None,
|
||||||
'description': 'Python module to calculate statistics and generate a wordcloud for a given artist. Uses the Musicbrainz API and the lyrics.ovh API.',
|
'description': 'Python module to calculate statistics and generate a wordcloud for a given artist. Uses the Musicbrainz API and the lyrics.ovh API.',
|
||||||
'long_description': '',
|
|
||||||
'author': 'dtomlinson',
|
'author': 'dtomlinson',
|
||||||
'author_email': 'dtomlinson@panaetius.co.uk',
|
'author_email': 'dtomlinson@panaetius.co.uk',
|
||||||
'maintainer': None,
|
'maintainer': None,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"""
|
"""
|
||||||
musicbrainzapi: A CLI lyrics searcher
|
musicbrainzapi: A CLI lyrics searcher.
|
||||||
=====================================
|
======================================
|
||||||
|
|
||||||
This module was written by dtomlinson <dtomlinson@panaetius.co.uk> for Aire Logic
|
This module was written by dtomlinson <dtomlinson@panaetius.co.uk> for Aire Logic
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
"""
|
||||||
|
Lyrics object with statistics.
|
||||||
|
===============================
|
||||||
|
"""
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
from typing import Union, Dict, List
|
from typing import Union, Dict, List
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
@@ -10,8 +14,7 @@ import numpy as np
|
|||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class Lyrics:
|
class Lyrics:
|
||||||
"""Lyrics object for an artist.
|
"""Lyrics object for an artist."""
|
||||||
"""
|
|
||||||
|
|
||||||
artist_id: str
|
artist_id: str
|
||||||
artist: str
|
artist: str
|
||||||
|
|||||||
@@ -106,6 +106,7 @@ class LyricsBuilder(LyricsConcreteBuilder):
|
|||||||
-------
|
-------
|
||||||
str
|
str
|
||||||
URL for lyrics from the lyrics api.
|
URL for lyrics from the lyrics api.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
lyrics_api_base = 'https://api.lyrics.ovh/v1'
|
lyrics_api_base = 'https://api.lyrics.ovh/v1'
|
||||||
lyrics_api_url = html.escape(f'{lyrics_api_base}/{artist}/{song}')
|
lyrics_api_url = html.escape(f'{lyrics_api_base}/{artist}/{song}')
|
||||||
@@ -123,7 +124,8 @@ class LyricsBuilder(LyricsConcreteBuilder):
|
|||||||
Returns
|
Returns
|
||||||
-------
|
-------
|
||||||
str
|
str
|
||||||
Lyrics of the trakc
|
Lyrics of the track.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
resp = requests.get(url)
|
resp = requests.get(url)
|
||||||
|
|
||||||
@@ -192,6 +194,7 @@ class LyricsBuilder(LyricsConcreteBuilder):
|
|||||||
return _d
|
return _d
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
|
"""Create a builder instance to build a Lyrics object."""
|
||||||
self.reset()
|
self.reset()
|
||||||
|
|
||||||
def reset(self) -> None:
|
def reset(self) -> None:
|
||||||
@@ -208,8 +211,7 @@ class LyricsBuilder(LyricsConcreteBuilder):
|
|||||||
return self
|
return self
|
||||||
|
|
||||||
def sort_artists(self) -> None:
|
def sort_artists(self) -> None:
|
||||||
"""Sort the artists from the Musicbrainzapi
|
"""Sort the artists from the Musicbrainzapi."""
|
||||||
"""
|
|
||||||
self._sort_names = dict(
|
self._sort_names = dict(
|
||||||
(i.get('id'), f'{i.get("name")} | {i.get("disambiguation")}')
|
(i.get('id'), f'{i.get("name")} | {i.get("disambiguation")}')
|
||||||
if i.get('disambiguation') is not None
|
if i.get('disambiguation') is not None
|
||||||
@@ -241,8 +243,7 @@ class LyricsBuilder(LyricsConcreteBuilder):
|
|||||||
return self
|
return self
|
||||||
|
|
||||||
def find_all_albums(self) -> None:
|
def find_all_albums(self) -> None:
|
||||||
"""Find all albums for the chosen artist
|
"""Find all albums for the chosen artist."""
|
||||||
"""
|
|
||||||
limit, offset, page = (100, 0, 1)
|
limit, offset, page = (100, 0, 1)
|
||||||
|
|
||||||
resp_0 = addict.Dict(
|
resp_0 = addict.Dict(
|
||||||
@@ -365,8 +366,7 @@ class LyricsBuilder(LyricsConcreteBuilder):
|
|||||||
return self
|
return self
|
||||||
|
|
||||||
def find_lyrics_urls(self) -> None:
|
def find_lyrics_urls(self) -> None:
|
||||||
"""Construct the URL for the lyrics api.
|
"""Construct the URL for the lyrics api."""
|
||||||
"""
|
|
||||||
self.all_albums_lyrics_url = list()
|
self.all_albums_lyrics_url = list()
|
||||||
for x in self.all_albums:
|
for x in self.all_albums:
|
||||||
for alb, tracks in x.items():
|
for alb, tracks in x.items():
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ class LyricsClickDirector:
|
|||||||
"""Director for Lyrics builder."""
|
"""Director for Lyrics builder."""
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
|
"""Create a Director to orchestrate the builder."""
|
||||||
self._builder = None
|
self._builder = None
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@@ -62,6 +63,7 @@ class LyricsClickDirector:
|
|||||||
------
|
------
|
||||||
SystemExit
|
SystemExit
|
||||||
If no artist is found will cleanly quit.
|
If no artist is found will cleanly quit.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
artist_meta = None
|
artist_meta = None
|
||||||
for i, j in self.builder._top_five_results.items():
|
for i, j in self.builder._top_five_results.items():
|
||||||
@@ -111,8 +113,7 @@ class LyricsClickDirector:
|
|||||||
return self
|
return self
|
||||||
|
|
||||||
def _query_for_data(self) -> None:
|
def _query_for_data(self) -> None:
|
||||||
"""Query Musicbrainz api for albums + track data.
|
"""Query Musicbrainz api for albums + track data."""
|
||||||
"""
|
|
||||||
self.builder.find_all_albums()
|
self.builder.find_all_albums()
|
||||||
self.builder.find_all_tracks()
|
self.builder.find_all_tracks()
|
||||||
self.builder._product.all_albums_with_tracks = self.builder.all_albums
|
self.builder._product.all_albums_with_tracks = self.builder.all_albums
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
"""
|
||||||
|
Wordcloud from lyrics.
|
||||||
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
import collections
|
import collections
|
||||||
from importlib import resources
|
from importlib import resources
|
||||||
@@ -41,6 +45,8 @@ class LyricsWordcloud:
|
|||||||
all_albums_lyrics_count: 'Lyrics.all_albums_lyrics_count',
|
all_albums_lyrics_count: 'Lyrics.all_albums_lyrics_count',
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
|
Create a worcloud object.
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
pillow_img : PIL.PngImagePlugin.PngImageFile
|
pillow_img : PIL.PngImagePlugin.PngImageFile
|
||||||
@@ -55,12 +61,14 @@ class LyricsWordcloud:
|
|||||||
def use_microphone(
|
def use_microphone(
|
||||||
cls, all_albums_lyrics_count: 'Lyrics.all_albums_lyrics_count',
|
cls, all_albums_lyrics_count: 'Lyrics.all_albums_lyrics_count',
|
||||||
) -> LyricsWordcloud:
|
) -> LyricsWordcloud:
|
||||||
"""Class method to instantiate with a microphone base image.
|
"""
|
||||||
|
Class method to instantiate with a microphone base image.
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
all_albums_lyrics_count : Lyrics.all_albums_lyrics_count
|
all_albums_lyrics_count : Lyrics.all_albums_lyrics_count
|
||||||
List of all albums + track lyrics counted by each word
|
List of all albums + track lyrics counted by each word
|
||||||
|
|
||||||
"""
|
"""
|
||||||
mic_resource = resources.path(
|
mic_resource = resources.path(
|
||||||
'musicbrainzapi.wordcloud.resources', 'mic.png'
|
'musicbrainzapi.wordcloud.resources', 'mic.png'
|
||||||
@@ -78,7 +86,7 @@ class LyricsWordcloud:
|
|||||||
*args,
|
*args,
|
||||||
**kwargs,
|
**kwargs,
|
||||||
) -> str:
|
) -> str:
|
||||||
"""Static method to generate a random grey colour"""
|
"""Static method to generate a random grey colour."""
|
||||||
colour = f'hsl(0, 0%, {random.randint(60, 100)}%)'
|
colour = f'hsl(0, 0%, {random.randint(60, 100)}%)'
|
||||||
return colour
|
return colour
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user