refactored cli

This commit is contained in:
Hellow2 2023-06-20 16:40:34 +02:00
parent 08b47b7f59
commit f95083050e
13 changed files with 209 additions and 199 deletions

View File

@ -6,12 +6,7 @@ from typing import List
import gc import gc
import musicbrainzngs import musicbrainzngs
from .cli import Shell from .utils.shared import MODIFY_GC
from . import objects, pages, download
from .utils import exception, shared, path_manager
from .utils.config import config, read, write, PATHS_SECTION
from .utils.shared import MUSIC_DIR, MODIFY_GC, NOT_A_GENRE_REGEX, get_random_message
from .utils.string_processing import fit_to_file_system
if MODIFY_GC: if MODIFY_GC:
@ -31,111 +26,3 @@ if MODIFY_GC:
logging.getLogger("musicbrainzngs").setLevel(logging.WARNING) logging.getLogger("musicbrainzngs").setLevel(logging.WARNING)
musicbrainzngs.set_useragent("metadata receiver", "0.1", "https://github.com/HeIIow2/music-downloader") musicbrainzngs.set_useragent("metadata receiver", "0.1", "https://github.com/HeIIow2/music-downloader")
URL_REGEX = 'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+'
DOWNLOAD_COMMANDS = {
"ok",
"download",
"\\d",
"hs"
}
EXIT_COMMANDS = {
"exit",
"quit"
}
def print_cute_message():
message = get_random_message()
try:
print(message)
except UnicodeEncodeError:
message = str(c for c in message if 0 < ord(c) < 127)
print(message)
def exit_message():
print()
print_cute_message()
print("See you soon! :3")
def settings(
name: str = None,
value: str = None,
):
def modify_setting(_name: str, _value: str, invalid_ok: bool = True) -> bool:
try:
config.set_name_to_value(_name, _value)
except exception.config.SettingException as e:
if invalid_ok:
print(e)
return False
else:
raise e
write()
return True
def print_settings():
for i, attribute in enumerate(config):
print(f"{i:0>2}: {attribute.name}={attribute.value}")
def modify_setting_by_index(index: int) -> bool:
attribute = list(config)[index]
print()
print(attribute)
input__ = input(f"{attribute.name}=")
if not modify_setting(attribute.name, input__.strip()):
return modify_setting_by_index(index)
return True
if name is not None and value is not None:
modify_setting(name, value, invalid_ok=True)
print()
print_cute_message()
print()
return
while True:
print_settings()
input_ = input("Id of setting to modify: ")
print()
if input_.isdigit() and int(input_) < len(config):
if modify_setting_by_index(int(input_)):
print()
print_cute_message()
print()
return
else:
print("Please input a valid ID.")
print()
def cli(
genre: str = None,
download_all: bool = False,
direct_download_url: str = None,
command_list: List[str] = None
):
shell = Shell(genre=genre)
if command_list is not None:
for command in command_list:
shell.process_input(command)
return
if direct_download_url is not None:
if shell.download(direct_download_url, download_all=download_all):
exit_message()
return
shell.mainloop()
exit_message()

View File

@ -80,44 +80,39 @@ if __name__ == "__main__":
print("Setting logging-level to DEBUG") print("Setting logging-level to DEBUG")
logging.getLogger().setLevel(logging.DEBUG) logging.getLogger().setLevel(logging.DEBUG)
import music_kraken from . import cli
from .utils.config import read_config
music_kraken.read() from .utils import shared
if arguments.setting is not None:
music_kraken.settings(*arguments.setting)
exit()
if arguments.settings:
music_kraken.settings()
exit()
if arguments.paths:
music_kraken.paths()
exit()
if arguments.r: if arguments.r:
import os import os
if os.path.exists(music_kraken.shared.CONFIG_FILE): if os.path.exists(shared.CONFIG_FILE):
os.remove(music_kraken.shared.CONFIG_FILE) os.remove(shared.CONFIG_FILE)
music_kraken.read() read_config()
exit()
read_config()
if arguments.setting is not None:
cli.settings(*arguments.setting)
if arguments.settings:
cli.settings()
if arguments.paths:
cli.print_paths()
if arguments.frontend: if arguments.frontend:
from .cli.options.frontend import set_frontend cli.set_frontend(silent=False)
set_frontend()
exit()
# getting the genre # getting the genre
genre: str = arguments.genre genre: str = arguments.genre
if arguments.test: if arguments.test:
genre = "test" genre = "test"
try: cli.download(
music_kraken.cli( genre=genre,
genre=genre, download_all=arguments.all,
download_all=arguments.all, direct_download_url=arguments.url
direct_download_url=arguments.url )
)
except KeyboardInterrupt:
print("\n\nRaise an issue if I fucked up:\nhttps://github.com/HeIIow2/music-downloader/issues")
music_kraken.exit_message()

View File

@ -1 +1,5 @@
from .download.shell import Shell from .informations import print_paths
from .main_downloader import download
from .options.settings import settings
from .options.frontend import set_frontend

View File

@ -1,3 +1,5 @@
from ..utils import cli_function
from ...utils.path_manager import LOCATIONS from ...utils.path_manager import LOCATIONS
from ...utils import shared from ...utils import shared
@ -12,6 +14,7 @@ def all_paths():
} }
@cli_function
def print_paths(): def print_paths():
for name, path in all_paths().items(): for name, path in all_paths().items():
print(f"{name}:\t{path}") print(f"{name}:\t{path}")

View File

@ -2,14 +2,16 @@ from typing import Set, Type, Dict, List
from pathlib import Path from pathlib import Path
import re import re
from ...utils.shared import MUSIC_DIR, NOT_A_GENRE_REGEX, ENABLE_RESULT_HISTORY, HISTORY_LENGTH from .utils import cli_function
from ...utils.regex import URL_PATTERN
from ...utils.string_processing import fit_to_file_system from ..utils.shared import MUSIC_DIR, NOT_A_GENRE_REGEX, ENABLE_RESULT_HISTORY, HISTORY_LENGTH, HELP_MESSAGE
from ...utils.support_classes import Query, DownloadResult from ..utils.regex import URL_PATTERN
from ...download.results import Results, SearchResults, Option, PageResults from ..utils.string_processing import fit_to_file_system
from ...download.page_attributes import Pages from ..utils.support_classes import Query, DownloadResult
from ...pages import Page from ..download.results import Results, SearchResults, Option, PageResults
from ...objects import Song, Album, Artist, DatabaseObject from ..download.page_attributes import Pages
from ..pages import Page
from ..objects import Song, Album, Artist, DatabaseObject
""" """
@ -128,30 +130,12 @@ def get_genre():
def help_message(): def help_message():
print() print()
print(""" print(HELP_MESSAGE)
to search:
> s: {query or url}
> s: https://musify.club/release/some-random-release-183028492
> s: #a {artist} #r {release} #t {track}
to download:
> d: {option ids or direct url}
> d: 0, 3, 4
> d: 1
> d: https://musify.club/release/some-random-release-183028492
have fun :3
""".strip())
print() print()
class Shell:
""" class Downloader:
TODO:
- Implement search and download for direct urls
"""
def __init__( def __init__(
self, self,
exclude_pages: Set[Type[Page]] = None, exclude_pages: Set[Type[Page]] = None,
@ -388,4 +372,23 @@ class Shell:
while True: while True:
if self.process_input(input("> ")): if self.process_input(input("> ")):
return return
@cli_function
def download(
genre: str = None,
download_all: bool = False,
direct_download_url: str = None,
command_list: List[str] = None
):
shell = Downloader(genre=genre)
if command_list is not None:
for command in command_list:
shell.process_input(command)
return
if direct_download_url is not None:
if shell.download(direct_download_url, download_all=download_all):
return
shell.mainloop()

View File

@ -1,10 +1,11 @@
from typing import Dict, List from typing import Dict, List
import requests
from dataclasses import dataclass from dataclasses import dataclass
from collections import defaultdict from collections import defaultdict
from ..utils import cli_function
from ...objects import Country from ...objects import Country
from ...utils import config, write, shared from ...utils import config, write_config
from ...connection import Connection from ...connection import Connection
@ -45,7 +46,7 @@ class FrontendInstance:
def set_instance(self, instance: Instance): def set_instance(self, instance: Instance):
config.set_name_to_value(self.SETTING_NAME, instance.uri) config.set_name_to_value(self.SETTING_NAME, instance.uri)
write() write_config()
def _choose_country(self) -> List[Instance]: def _choose_country(self) -> List[Instance]:
print("Input the country code, an example would be \"US\"") print("Input the country code, an example would be \"US\"")
@ -123,7 +124,7 @@ class Invidious(FrontendInstance):
r = self.connection.get(self.endpoint) r = self.connection.get(self.endpoint)
if r is None: if r is None:
return return
for instance in r.json(): for instance in r.json():
self._process_instance(all_instance_data=instance) self._process_instance(all_instance_data=instance)
@ -177,6 +178,8 @@ class FrontendSelection:
self.piped.choose(silent) self.piped.choose(silent)
@cli_function
def set_frontend(silent: bool = False): def set_frontend(silent: bool = False):
shell = FrontendSelection() shell = FrontendSelection()
shell.choose(silent=silent) shell.choose(silent=silent)

View File

@ -0,0 +1,71 @@
from ..utils import cli_function
from ...utils.config import config, write_config
from ...utils import exception
def modify_setting(_name: str, _value: str, invalid_ok: bool = True) -> bool:
try:
config.set_name_to_value(_name, _value)
except exception.config.SettingException as e:
if invalid_ok:
print(e)
return False
else:
raise e
write_config()
return True
def print_settings():
for i, attribute in enumerate(config):
print(f"{i:0>2}: {attribute.name}={attribute.value}")
def modify_setting_by_index(index: int) -> bool:
attribute = list(config)[index]
print()
print(attribute)
input__ = input(f"{attribute.name}=")
if not modify_setting(attribute.name, input__.strip()):
return modify_setting_by_index(index)
return True
def modify_setting_by_index(index: int) -> bool:
attribute = list(config)[index]
print()
print(attribute)
input__ = input(f"{attribute.name}=")
if not modify_setting(attribute.name, input__.strip()):
return modify_setting_by_index(index)
return True
@cli_function
def settings(
name: str = None,
value: str = None,
):
if name is not None and value is not None:
modify_setting(name, value, invalid_ok=True)
return
while True:
print_settings()
input_ = input("Id of setting to modify: ")
print()
if input_.isdigit() and int(input_) < len(config):
if modify_setting_by_index(int(input_)):
return
else:
print("Please input a valid ID.")
print()

View File

@ -0,0 +1,32 @@
from ..utils.shared import get_random_message
def cli_function(function):
def wrapper(*args, **kwargs):
print_cute_message()
print()
try:
function(*args, **kwargs)
except KeyboardInterrupt:
print("\n\nRaise an issue if I fucked up:\nhttps://github.com/HeIIow2/music-downloader/issues")
finally:
print()
print_cute_message()
print("See you soon! :3")
exit()
return wrapper
def print_cute_message():
message = get_random_message()
try:
print(message)
except UnicodeEncodeError:
message = str(c for c in message if 0 < ord(c) < 127)
print(message)

View File

@ -1,4 +1 @@
from .config import config, read, write from .config import config, read_config, write_config
# tells what exists
__all__ = ["shared", "object_handeling", "phonetic_compares", "functions"]

View File

@ -4,7 +4,20 @@ from .connection import CONNECTION_SECTION
from .misc import MISC_SECTION from .misc import MISC_SECTION
from .paths import PATHS_SECTION from .paths import PATHS_SECTION
from .config import read, write, config from .paths import LOCATIONS
from .config import Config
read() config = Config()
def read_config():
if not LOCATIONS.CONFIG_FILE.is_file():
write_config()
config.read_from_config_file(LOCATIONS.CONFIG_FILE)
def write_config():
config.write_to_config_file(LOCATIONS.CONFIG_FILE)
set_name_to_value = config.set_name_to_value

View File

@ -125,16 +125,3 @@ class Config:
for section in self._section_list: for section in self._section_list:
for name, attribute in section.name_attribute_map.items(): for name, attribute in section.name_attribute_map.items():
yield attribute yield attribute
config = Config()
def read():
if not LOCATIONS.CONFIG_FILE.is_file():
write()
config.read_from_config_file(LOCATIONS.CONFIG_FILE)
def write():
config.write_to_config_file(LOCATIONS.CONFIG_FILE)

View File

@ -105,3 +105,18 @@ THREADED = False
ENABLE_RESULT_HISTORY: bool = MISC_SECTION.ENABLE_RESULT_HISTORY.object_from_value ENABLE_RESULT_HISTORY: bool = MISC_SECTION.ENABLE_RESULT_HISTORY.object_from_value
HISTORY_LENGTH: int = MISC_SECTION.HISTORY_LENGTH.object_from_value HISTORY_LENGTH: int = MISC_SECTION.HISTORY_LENGTH.object_from_value
HELP_MESSAGE = """
to search:
> s: {query or url}
> s: https://musify.club/release/some-random-release-183028492
> s: #a {artist} #r {release} #t {track}
to download:
> d: {option ids or direct url}
> d: 0, 3, 4
> d: 1
> d: https://musify.club/release/some-random-release-183028492
have fun :3
""".strip()