143 lines
5.1 KiB
Python
143 lines
5.1 KiB
Python
import logging
|
|
import musicbrainzngs
|
|
|
|
from metadata import options
|
|
|
|
mb_log = logging.getLogger("musicbrainzngs")
|
|
mb_log.setLevel(logging.WARNING)
|
|
musicbrainzngs.set_useragent("metadata receiver", "0.1", "https://github.com/HeIIow2/music-downloader")
|
|
|
|
KNOWN_KIND_OF_OPTIONS = ["artist", "release", "track"]
|
|
|
|
|
|
class Search:
|
|
def __init__(self, query: str = None, artist: str = None, temp: str = "temp"):
|
|
if query is None and artist is None:
|
|
raise ValueError("no query provided")
|
|
|
|
self.options_history = []
|
|
self.current_options = None
|
|
self.current_chosen_option = None
|
|
|
|
self.temp = temp
|
|
|
|
# initial search
|
|
if query is not None:
|
|
self.set_options(
|
|
options.Options([musicbrainzngs.search_artists(query), musicbrainzngs.search_releases(query),
|
|
musicbrainzngs.search_recordings(query)]))
|
|
elif artist is not None:
|
|
self.set_options(options.Options([musicbrainzngs.search_artists(artist=artist)]))
|
|
|
|
def browse_artist(self, artist: dict, limit: int = 25):
|
|
options_sets = [
|
|
{"artist-list": [artist, ], "artist-count": 1},
|
|
musicbrainzngs.browse_releases(artist=artist["id"], limit=limit),
|
|
musicbrainzngs.browse_recordings(artist=artist["id"], limit=limit)
|
|
]
|
|
return self.set_options(options.Options(options_sets))
|
|
|
|
def browse_release(self, release: dict, limit: int = 25):
|
|
options_sets = [
|
|
musicbrainzngs.browse_artists(release=release["id"], limit=limit),
|
|
{"release-list": [release, ], "release-count": 1},
|
|
musicbrainzngs.browse_recordings(release=release["id"], limit=limit)
|
|
]
|
|
return self.set_options(options.Options(options_sets))
|
|
|
|
def browse_track(self, track: dict, limit: int = 25):
|
|
options_sets = [
|
|
musicbrainzngs.browse_artists(recording=track["id"], limit=limit),
|
|
musicbrainzngs.browse_releases(recording=track["id"], limit=limit),
|
|
{"recording-list": [track, ], "recording-count": 1}
|
|
]
|
|
return self.set_options(options.Options(options_sets))
|
|
|
|
def choose(self, index, limit: int = 25, ignore_limit_for_tracklist: bool = True):
|
|
if not self.current_options.choose(index):
|
|
return self.current_options
|
|
|
|
self.current_chosen_option = self.current_options.get_current_option(komplex=True)
|
|
kind = self.current_chosen_option['type']
|
|
if kind == 'artist':
|
|
return self.browse_artist(self.current_chosen_option, limit=limit)
|
|
if kind == 'release':
|
|
release_limit = limit if not ignore_limit_for_tracklist else 100
|
|
release_limit = 100
|
|
return self.browse_release(self.current_chosen_option, limit=release_limit)
|
|
if kind == 'track':
|
|
track_limit = limit if not ignore_limit_for_tracklist else 100
|
|
return self.browse_track(self.current_chosen_option, limit=track_limit)
|
|
|
|
return self.current_options
|
|
|
|
def get_options(self):
|
|
return self.current_options
|
|
|
|
def set_options(self, option_instance):
|
|
self.options_history.append(option_instance)
|
|
self.current_options = option_instance
|
|
|
|
return option_instance
|
|
|
|
def get_previous_options(self):
|
|
self.options_history.pop(-1)
|
|
self.current_options = self.options_history[-1]
|
|
return self.current_options
|
|
|
|
options = property(fget=get_options)
|
|
|
|
|
|
def automated_demo():
|
|
search = Search(query="psychonaut 4")
|
|
print(search.options)
|
|
print(search.choose(0))
|
|
search.download()
|
|
print(search.choose(2))
|
|
search.download()
|
|
print(search.choose(4))
|
|
print(search.download())
|
|
|
|
|
|
def interactive_demo():
|
|
search = Search(query=input("initial query: "))
|
|
print(search.options)
|
|
while True:
|
|
input_ = input(
|
|
"d to download, q to quit, .. for previous options, . for current options, int for this element: ").lower()
|
|
input_.strip()
|
|
if input_ == "q":
|
|
break
|
|
if input_ == ".":
|
|
print(search.options)
|
|
continue
|
|
if input_ == "..":
|
|
print(search.get_previous_options())
|
|
continue
|
|
if input_.isdigit():
|
|
print(search.choose(int(input_)))
|
|
continue
|
|
if input_ == "d":
|
|
search.download()
|
|
break
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# interactive_demo()
|
|
# automated_demo()
|
|
search = Search(query="psychonaut 4")
|
|
# search.download_release("27f00fb8-983c-4d5c-950f-51418aac55dc")
|
|
search.download_release("1aeb676f-e556-4b17-b45e-64ab69ef0375")
|
|
# for track_ in search.download_artist("c0c720b5-012f-4204-a472-981403f37b12"):
|
|
# print(track_)
|
|
# res = search.download_track("83a30323-aee1-401a-b767-b3c1bdd026c0")
|
|
# res = search.download_track("5e1ee2c5-502c-44d3-b1bc-22803441d8c6")
|
|
res = search.download_track("86b43bec-eea6-40ae-8624-c1e404204ba1")
|
|
# res = search.download_track("5cc28584-10c6-40e2-b6d4-6891e7e7c575")
|
|
|
|
for key in res[0]:
|
|
if res[0][key] is None:
|
|
continue
|
|
|
|
print(key, res[0][key])
|