Start with generic negromate command with entry points for other modules
This commit is contained in:
parent
373b12bacd
commit
68d20da4cc
|
@ -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)
|
|
@ -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"
|
|
@ -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)
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue