refactored cli
This commit is contained in:
parent
08b47b7f59
commit
f95083050e
@ -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()
|
|
||||||
|
@ -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()
|
|
@ -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
|
||||||
|
|
||||||
|
@ -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}")
|
@ -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:
|
|
||||||
"""
|
|
||||||
TODO:
|
|
||||||
|
|
||||||
- Implement search and download for direct urls
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
class Downloader:
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
exclude_pages: Set[Type[Page]] = None,
|
exclude_pages: Set[Type[Page]] = None,
|
||||||
@ -389,3 +373,22 @@ class Shell:
|
|||||||
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()
|
@ -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\"")
|
||||||
@ -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)
|
||||||
|
|
71
src/music_kraken/cli/options/settings.py
Normal file
71
src/music_kraken/cli/options/settings.py
Normal 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()
|
32
src/music_kraken/cli/utils.py
Normal file
32
src/music_kraken/cli/utils.py
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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"]
|
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
|
||||||
|
@ -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()
|
||||||
|
Loading…
Reference in New Issue
Block a user