Start with generic negromate command with entry points for other modules

This commit is contained in:
Ales (Shagi) Zabala Alava 2020-11-06 16:26:55 +01:00
parent 373b12bacd
commit 68d20da4cc
4 changed files with 110 additions and 4 deletions

View File

@ -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)

View File

@ -1,11 +1,20 @@
import sys import sys
from pathlib import Path from pathlib import Path
from .loader import load_songs from ..loader import load_songs
name = 'songs'
help_text = 'Update song database'
def main(): def options(parser):
songs, pending_songs = load_songs(Path(sys.argv[1])) 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( print(
"#######\n" "#######\n"
" Songs\n" " Songs\n"

View File

@ -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)

View File

@ -22,13 +22,17 @@ packages = find:
zip_safe = true zip_safe = true
python_requires = >= 3.4 python_requires = >= 3.4
install_requires = install_requires =
importlib_metadata
webvtt-py webvtt-py
asstosrt ==0.1.6 asstosrt ==0.1.6
srt ==1.6.0 srt ==1.6.0
[options.entry_points] [options.entry_points]
console_scripts = 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] [bdist_wheel]
# This flag says to generate wheels that support both Python 2 and Python # This flag says to generate wheels that support both Python 2 and Python