# -*- coding: utf-8 -*-
-# Copyright (c) 2009-2015 kaliko <kaliko@azylum.org>
+# Copyright (c) 2009-2015, 2021 kaliko <kaliko@azylum.org>
#
# This file is part of sima
#
#
#
-from argparse import (ArgumentParser, SUPPRESS)
-
+from argparse import ArgumentParser, RawDescriptionHelpFormatter
from .utils import Wfile, Rfile, Wdir
DESCRIPTION = """
MPD_sima automagicaly queue new tracks in MPD playlist.
-Command line options override their equivalent in configuration file."""
+
+Command line options override their equivalent in configuration file.
+If a positional arguments is provided MPD_sima execute the command and returns.
+"""
def clean_dict(to_clean):
if not to_clean.get(k):
to_clean.pop(k)
-
# OPTIONS LIST
# pop out 'sw' value before creating Parser object.
# PAY ATTENTION:
# name it is meant to override.
OPTS = [
{
- 'sw':['-l', '--log'],
+ 'sw': ['-l', '--log'],
'type': str,
'dest': 'logfile',
'action': Wfile,
+ 'metavar': 'LOG',
'help': 'file to log message to, default is stdout/stderr'},
{
- 'sw':['-v', '--log-level'],
+ 'sw': ['-v', '--log-level'],
'type': str,
'dest': 'verbosity',
'choices': ['debug', 'info', 'warning', 'error'],
- 'help': 'Log messages verbosity, default is info'},
+ 'help': 'log messages verbosity, default is info'},
{
'sw': ['-p', '--pid'],
'dest': 'pidfile',
'action': Wfile,
+ 'metavar': 'FILE',
'help': 'file to save PID to, default is not to store pid'},
{
'sw': ['-d', '--daemon'],
'dest': 'daemon',
'action': 'store_true',
- 'help': 'Daemonize process.'},
+ 'help': 'daemonize process'},
{
'sw': ['-S', '--host'],
'dest': 'host',
- 'help': 'Host MPD in running on (IP or FQDN)'},
+ 'help': 'host MPD in running on (IP or FQDN)'},
{
'sw': ['-P', '--port'],
'type': int,
'dest': 'port',
- 'help': 'Port MPD in listening on'},
+ 'help': 'port MPD in listening on'},
{
- 'sw':['-c', '--config'],
+ 'sw': ['-c', '--config'],
'dest': 'conf_file',
'action': Rfile,
- 'help': 'Configuration file to load'},
+ 'metavar': 'CONFIG',
+ 'help': 'configuration file to load'},
{
- 'sw':['--generate-config'],
- 'dest': 'generate_config',
- 'action': 'store_true',
- 'help': 'Generate a sample configuration file to stdout according to the current\
- configuration. You can put other options with this one to get them in\
- the generated configuration.'},
- {
- 'sw':['--var-dir', '--var_dir'],
+ 'sw': ['--var-dir', '--var_dir'],
'dest': 'var_dir',
'action': Wdir,
- 'help': 'Directory to store var content (ie. database, cache)'},
- {
- 'sw': ['--create-db'],
- 'action': 'store_true',
- 'dest': 'create_db',
- 'help': '''Create database and exit, use destination
- specified in --var-dir or standard location.'''},
- {
- 'sw':['--queue-mode', '-q'],
- 'dest': 'queue_mode',
- 'choices': ['track', 'top', 'album'],
- #'help': 'Queue mode in [track, top, album]',
- 'help': SUPPRESS, },
- {
- 'sw':['--purge-history'],
- 'action': 'store_true',
- 'dest': 'do_purge_history',
- 'help': SUPPRESS},
+ 'help': 'directory to store var content (ie. database, cache)'},
+]
+# Commands
+CMDS = [
+ {'config-test': [{}], 'help': 'Test configuration (MPD connection and Tags plugin only)'},
+ {'create-db': [{}], 'help': 'Create the database'},
+ {'generate-config': [{}], 'help': 'Generate a configuration file to stdout'},
+ {'purge-history': [{}], 'help': 'Remove play history'},
+ {'bl-view': [{}], 'help': 'List blocklist IDs'},
+ {'bl-add-artist': [
+ {'name': 'artist', 'type': str, 'nargs': '?',
+ 'help': 'If artist is provided use it else use currently playing value'}
+ ], 'help': 'Add artist to the blocklist'},
+ {'bl-add-album': [
+ {'name': 'album', 'type': str, 'nargs': '?',
+ 'help': 'If album is provided use it else use currently playing value'}
+ ], 'help': 'Add album to the blocklist'},
+ {'bl-add-track': [
+ {'name': 'track', 'type': str, 'nargs': '?',
+ 'help': 'If track is provided use it else use currently playing value'}
+ ], 'help': 'Add track to the blocklist'},
+ {'bl-delete': [
+ {'name': 'id', 'type': int, 'nargs': '?',
+ 'help': 'blocklist ID to suppress (use bl-view to list IDs)'}
+ ], 'help': 'Remove entries from the blocklist'},
]
def __init__(self, script_info,):
self.parser = None
self.info = dict(script_info)
- self.options = dict()
+ self.options = {}
self.main()
def declare_opts(self):
self.parser = ArgumentParser(description=DESCRIPTION,
prog=self.info.get('prog'),
epilog='Happy Listening',
- )
+ formatter_class=RawDescriptionHelpFormatter,
+ )
self.parser.add_argument('--version', action='version',
version='%(prog)s {version}'.format(**self.info))
# Add all options declare in OPTS
for opt in OPTS:
opt_names = opt.pop('sw')
self.parser.add_argument(*opt_names, **opt)
+ # Add sub commands
+ spa = self.parser.add_subparsers(
+ title=f'{self.info["prog"]} commands as positional arguments',
+ description=f"""Use them after optionnal arguments.\n"{self.info["prog"]} command -h" for more info.""",
+ metavar='', dest='command')
+ for cmd in CMDS:
+ helpmsg = cmd.pop('help')
+ cmd, args = cmd.popitem()
+ _ = spa.add_parser(cmd, description=helpmsg, help=helpmsg)
+ for arg in args:
+ name = arg.pop('name', None)
+ if name:
+ _.add_argument(name, **arg)
def main(self):
"""