diff --git a/negromate/songs/commands/__init__.py b/negromate/songs/commands/__init__.py new file mode 100644 index 0000000..518acca --- /dev/null +++ b/negromate/songs/commands/__init__.py @@ -0,0 +1,71 @@ +import argparse +import sys +try: + from importlib import metadata +except ImportError: # Python <3.8 + import importlib_metadata as metadata + + +def main(): + """ + Build parser for all the commands and launch appropiate command. + + Each command must be a module with at least the following members: + + * name: String with the command name. Will be used for + argparse subcommand. + * help_text: String with the help text. + * options: Function to build the parser of the command. Takes + one parametter, the argparser parser instance for this + subcommand. + * run: Function that runs the actual command. Takes one + parametter, the Namespace with the arguments. + + Minimal module example: + + # hello_world.py + name = 'hello' + help_text = 'Sample command' + + def options(parser): + parser.add_argument( + '-w', '--who', default='World' + help="Who to say hello, defaults to 'World'" + ) + + def run(args): + print("Hello {}".format(args.who)) + + To add more commands to negromate register 'negromate.commands' + entry point in setup.cfg. For example: + + [options.entry_points] + negromate.commands = + hello = negromate.web.commands.hello_world + + """ + commands = [] + # clean sys.argv for any module imported here + # Yes Kivy, I'm looking at you + args = sys.argv.copy() + sys.argv = args[:1] + + entry_points = metadata.entry_points().get('negromate.commands', []) + for entry_point in entry_points: + commands.append(entry_point.load()) + + parser = argparse.ArgumentParser() + parser.set_defaults(command=None) + subparsers = parser.add_subparsers() + for command in commands: + command_parser = subparsers.add_parser(command.name, help=command.help_text) + command_parser.set_defaults(command=command.name) + command.options(command_parser) + + args = parser.parse_args(args[1:]) + if args.command is None: + parser.print_usage() + else: + for command in commands: + if args.command == command.name: + command.run(args) diff --git a/negromate/songs/command.py b/negromate/songs/commands/songs.py similarity index 67% rename from negromate/songs/command.py rename to negromate/songs/commands/songs.py index 6519e73..239db3a 100644 --- a/negromate/songs/command.py +++ b/negromate/songs/commands/songs.py @@ -1,11 +1,20 @@ import sys from pathlib import Path -from .loader import load_songs +from ..loader import load_songs + +name = 'songs' +help_text = 'Update song database' -def main(): - songs, pending_songs = load_songs(Path(sys.argv[1])) +def options(parser): + parser.add_argument( + 'song_folder', type=Path, + help="Folder with the song database.") + + +def run(args): + songs, pending_songs = load_songs(args.song_folder) print( "#######\n" " Songs\n" diff --git a/negromate/songs/commands/thumbnail.py b/negromate/songs/commands/thumbnail.py new file mode 100644 index 0000000..31bad79 --- /dev/null +++ b/negromate/songs/commands/thumbnail.py @@ -0,0 +1,22 @@ +from pathlib import Path + +from negromate.songs.utils import generate_cover, generate_thumbnail + +name = 'thumbnail' +help_text = 'Generate cover and thumbnail for a video.' + + +def options(parser): + parser.add_argument( + 'video', help="Video of the song.", type=Path) + parser.add_argument( + 'second', type=int, + help='Take snapshot at this second.') + + +def run(args): + video = args.video + cover = video.parent / 'cover.jpg' + thumbnail = video.parent / 'thumb.jpg' + generate_cover(video, cover, args.second) + generate_thumbnail(cover, thumbnail) diff --git a/setup.cfg b/setup.cfg index 61f2f78..f53fa01 100644 --- a/setup.cfg +++ b/setup.cfg @@ -22,13 +22,17 @@ packages = find: zip_safe = true python_requires = >= 3.4 install_requires = + importlib_metadata webvtt-py asstosrt ==0.1.6 srt ==1.6.0 [options.entry_points] console_scripts = - negromate-songs = negromate.songs.command:main + negromate = negromate.songs.commands:main +negromate.commands = + songs = negromate.songs.commands.songs + thumbnail = negromate.songs.commands.thumbnail [bdist_wheel] # This flag says to generate wheels that support both Python 2 and Python