huge refactoring of search
This commit is contained in:
parent
8801ce1887
commit
0b5e4d60b6
92
src/metadata/search.py
Normal file
92
src/metadata/search.py
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
import logging
|
||||||
|
import musicbrainzngs
|
||||||
|
|
||||||
|
try:
|
||||||
|
from object_handeling import get_elem_from_obj, parse_music_brainz_date
|
||||||
|
|
||||||
|
except ModuleNotFoundError:
|
||||||
|
from metadata.object_handeling import get_elem_from_obj, parse_music_brainz_date
|
||||||
|
|
||||||
|
|
||||||
|
mb_log = logging.getLogger("musicbrainzngs")
|
||||||
|
mb_log.setLevel(logging.WARNING)
|
||||||
|
musicbrainzngs.set_useragent("metadata receiver", "0.1", "https://github.com/HeIIow2/music-downloader")
|
||||||
|
|
||||||
|
|
||||||
|
OPTION_TYPES = ['artist', 'release_group', 'release', 'recording']
|
||||||
|
|
||||||
|
class Option:
|
||||||
|
def __init__(self, type_: str, id: str, name: str, additional_info: str = "") -> None:
|
||||||
|
if type_ not in OPTION_TYPES:
|
||||||
|
raise ValueError(f"type: {type_} doesn't exist. Leagal Values: {OPTION_TYPES}")
|
||||||
|
self.type = type_
|
||||||
|
self.name = name
|
||||||
|
self.id = str
|
||||||
|
|
||||||
|
self.additional_info = additional_info
|
||||||
|
|
||||||
|
def __repr__(self) -> str:
|
||||||
|
type_repr = {
|
||||||
|
'artist': 'artist\t\t',
|
||||||
|
'release_group': 'release group\t',
|
||||||
|
'release': 'release\t\t',
|
||||||
|
'recording': 'recording\t'
|
||||||
|
}
|
||||||
|
return f"{type_repr[self.type]}: \"{self.name}\"{self.additional_info}"
|
||||||
|
|
||||||
|
|
||||||
|
class Search:
|
||||||
|
def __init__(self, logger: logging.Logger) -> None:
|
||||||
|
self.logger = logger
|
||||||
|
|
||||||
|
self.options_history = []
|
||||||
|
|
||||||
|
def search_recording_from_text(self, artist: str = None, release_group: str = None, recording: str = None):
|
||||||
|
result = musicbrainzngs.search_recordings(artist=artist, release=release_group, recording=recording)
|
||||||
|
recording_list = get_elem_from_obj(result, ['recording-list'], return_if_none=[])
|
||||||
|
print(recording_list[0])
|
||||||
|
resulting_options = [Option("recording", get_elem_from_obj(recording_, ['id']), get_elem_from_obj(recording_, ['title']), additional_info=f"") for recording_ in recording_list]
|
||||||
|
return resulting_options
|
||||||
|
|
||||||
|
def search_release_group_from_text(self, artist: str = None, release_group: str = None):
|
||||||
|
result = musicbrainzngs.search_release_groups(artist=artist, releasegroup=release_group)
|
||||||
|
release_group_list = get_elem_from_obj(result, ['release-group-list'], return_if_none=[])
|
||||||
|
|
||||||
|
resulting_options = [Option("release_group", get_elem_from_obj(release_group_, ['id']), get_elem_from_obj(release_group_, ['title']), additional_info=f" by {get_elem_from_obj(release_group_, ['artist-credit', 0, 'name'])}") for release_group_ in release_group_list]
|
||||||
|
return resulting_options
|
||||||
|
|
||||||
|
def search_artist_from_text(self, artist: str = None):
|
||||||
|
result = musicbrainzngs.search_artists(artist=artist)
|
||||||
|
artist_list = get_elem_from_obj(result, ['artist-list'], return_if_none=[])
|
||||||
|
|
||||||
|
print(artist_list[0])
|
||||||
|
|
||||||
|
resulting_options = [Option("artist", get_elem_from_obj(artist_, ['id']), get_elem_from_obj(artist_, ['name']), additional_info=f": {', '.join([i['name'] for i in get_elem_from_obj(artist_, ['tag-list'], return_if_none=[])])}") for artist_ in artist_list]
|
||||||
|
return resulting_options
|
||||||
|
|
||||||
|
|
||||||
|
def search_from_text(self, artist: str = None, release_group: str = None, recording: str = None):
|
||||||
|
if artist is None and release_group is None and recording is None:
|
||||||
|
self.logger.error("either artist, release group or recording has to be set")
|
||||||
|
return -1
|
||||||
|
|
||||||
|
results = []
|
||||||
|
if recording is not None:
|
||||||
|
results = self.search_recording_from_text(artist=artist, release_group=release_group, recording=recording)
|
||||||
|
elif release_group is not None:
|
||||||
|
results = self.search_release_group_from_text(artist=artist, release_group=release_group)
|
||||||
|
else:
|
||||||
|
results = self.search_artist_from_text(artist=artist)
|
||||||
|
|
||||||
|
for res in results:
|
||||||
|
print(res)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
logger_ = logging.getLogger("test")
|
||||||
|
|
||||||
|
search = Search(logger=logger_)
|
||||||
|
# search.search_from_text(artist="I Prevail")
|
||||||
|
# search.search_from_text(artist="I Prevail", release_group="TRAUMA")
|
||||||
|
search.search_from_text(artist="I Prevail", release_group="TRAUMA", recording="breaking down")
|
Loading…
Reference in New Issue
Block a user