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