[mythtv] Services API: Does Dvr/AddRecordSchedule work?
Bill Meek
keemllib at gmail.com
Mon Oct 15 20:00:52 UTC 2018
On 10/15/2018 02:55 PM, John P Poet wrote:
> Yes, I am making use of those tools that you have written. They are a huge
> help -- although I had not noticed your `api` application, and will need to
> check it out.
api only exists on my box, but attached here. I'll look at the
tool Peter just mentioned too.
--
Bill
-------------- next part --------------
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
A Utilities API test tool.
Examples:
api.py --host yourBackendHostNameOrIP --endpoint Myth/GetHostName
Same thing only easier to type:
api.py --ho BE --en Myth/GetHostName
api.py --ho BE --en Dvr/GetRecordedList --rest Count=1
api.py --ho frontendHostName --port 6547 --end Frontend/SendNotification \
--wrmi --post 'Message=Test Error=true'
Bill Meek 2015
"""
from __future__ import print_function
from __future__ import absolute_import
import argparse
import json
import logging
import sys
from mythtv_services_api import send as api
# pylint: disable=anomalous-backslash-in-string
def get_program_arguments():
"""
Process the command line.
"""
parser = argparse.ArgumentParser(
description='Services API Tester',
epilog='* E.g. Id=1 TitleRegEx=\*News\*. Default values are in ()s.')
mandatory = parser.add_argument_group('required arguments')
m_exclusive = parser.add_mutually_exclusive_group()
parser.add_argument(
'--debug', action='store_true',
help='output additional information (%(default)s)')
parser.add_argument(
'--digest', type=str, metavar='<user:pass>', default='admin:mythtv',
help='digest username:password')
mandatory.add_argument(
'--host', type=str, nargs='+', metavar='<host>',
help='server hostname(s) or IP address(s)')
mandatory.add_argument(
'--endpoint', type=str, required=True,
metavar='<ep>', help='endpoint to test')
parser.add_argument(
'--noetag', action='store_true',
help='tell the backend not to return a ETag (%(default)s)')
parser.add_argument(
'--nogzip', action='store_true',
help='tell the backend not to return gzipped data (%(default)s)')
parser.add_argument(
'--oneline', action='store_true',
help='print the response on one line, no formatting (%(default)s)')
parser.add_argument(
'--port', type=int, metavar='<port>', default=6544,
help='back/frontend port (%(default)i)')
m_exclusive.add_argument(
'--postdata', type=str, nargs='+', metavar='<pd>',
help='Tag=Value *')
m_exclusive.add_argument(
'--rest', type=str, nargs='+', metavar='<rest>',
help='Tag=Value *')
parser.add_argument(
'--quiet', action='store_true',
help='don\'t print any responses (%(default)s)')
parser.add_argument(
'--timeout', type=int, metavar='<seconds>', default=10,
help='seconds to wait for a response (%(default)s)')
parser.add_argument(
'--usexml', action='store_true',
help='ask for an XML response (%(default)s)')
parser.add_argument(
'--version', action='version', version='%(prog)s 0.9')
parser.add_argument(
'--wrmi', action='store_true',
help='allows postdata to be sent to the server (%(default)s)')
return vars(parser.parse_args())
# pylint: enable=anomalous-backslash-in-string
def postdata_to_dict(postdata_items):
"""Convert Key=Value sets to Python dicts."""
postdata = dict()
for kv_pair in postdata_items:
try:
key, value = kv_pair.split('=', 1)
except ValueError:
sys.exit('usage: postdata format is: key=value [key=value...]')
postdata[key] = value
return postdata
def rest_to_string(rest_items):
"""
Convert Key=Value sets to an '&' separated string. Makes
sure there is a single = between the key/value.
"""
rest = ''
for kv_pair in rest_items:
try:
key, value = kv_pair.split('=', 1)
rest += '{}={}'.format(key, value)
except ValueError:
sys.exit('usage: rest format is: key=value [key=value...]')
rest += '&'
return rest[:-1]
# pylint: disable=too-many-arguments
def process_host(host='', port=6544, endpoint='', opts=None, postdata=None,
rest='', oneline=False, quiet=False):
"""Send the query for a single host."""
backend = api.Send(host=host, port=port)
try:
if postdata:
resp_dict = backend.send(endpoint=endpoint, postdata=postdata,
opts=opts)
elif rest:
resp_dict = backend.send(endpoint=endpoint, rest=rest, opts=opts)
else:
resp_dict = backend.send(endpoint=endpoint, opts=opts)
if oneline:
print('{}'.format(resp_dict))
elif quiet:
pass
else:
print(json.dumps(resp_dict, sort_keys=True, indent=4,
separators=(',', ': ')))
except RuntimeWarning as warning:
print('\nWarning: "{}"'.format(warning))
except RuntimeError as error:
sys.exit('\nFatal error: "{}"'.format(error))
backend.close_session()
# pylint: enable=too-many-arguments
def main():
"""Basic stuff, fix this comment"""
args = get_program_arguments()
opts = {'noetag': args['noetag'], 'nogzip': args['nogzip'],
'usexml': args['usexml'], 'wrmi': args['wrmi'], 'wsdl': False}
if args['timeout']:
opts['timeout'] = args['timeout']
logging.basicConfig(level=logging.DEBUG if args['debug'] else logging.INFO)
logging.getLogger('requests.packages.urllib3').setLevel(logging.WARNING)
logging.getLogger('urllib3.connectionpool').setLevel(logging.WARNING)
try:
opts['user'], opts['pass'] = args['digest'].split(':')
except (AttributeError, ValueError):
pass
postdata = dict()
if args['postdata']:
postdata = postdata_to_dict(args['postdata'])
rest = ''
if args['rest']:
rest = rest_to_string(args['rest'])
for hostname in args['host']:
process_host(host=hostname, port=args['port'],
endpoint=args['endpoint'], opts=opts,
postdata=postdata, rest=rest,
oneline=args['oneline'], quiet=args['quiet'])
if __name__ == '__main__':
main()
# :!% --host mc0 ofc0 --endpoint=Dvr/version --oneline
# vim: set expandtab tabstop=4 shiftwidth=4 smartindent colorcolumn=80:
More information about the mythtv-dev
mailing list