#!/usr/bin/python3 """Audio API endpoint handling (Flask-restful).""" from flask import abort from flask_restful import Resource, reqparse, inputs from api_models import audio_model class AudioAPI(Resource): """API endpoint for controlling volume level and mute.""" def __init__(self, model): # mocked data for volume control self.model = model super(AudioAPI, self).__init__() # API methods def get(self): """Handler for GET requests. Return full state.""" return { 'level': self.model.get_level(), 'isMute': self.model.get_mute() }, 200, {'Access-Control-Allow-Origin': '*'} # <-temporary access ctl. def put(self): """Handler for PUT requests. Set state passed in header JSON. Return changed new state. {'level': } will set the volume level {'isMute': } will set the mute""" parser = reqparse.RequestParser() # used to parse requests parser.add_argument('isMute') # a JSON boolean, not a py bool. parser.add_argument('level', type=int, help="must be between %s and %s." % (audio_model.MIN_LEVEL, audio_model.MAX_LEVEL)) # get request arguments args = parser.parse_args() new_state = {} if args.isMute is not None: try: # convert arg to boolean, set and add to new_state: is_mute = inputs.boolean(args.isMute) new_state['isMute'] = self.model.set_mute(is_mute) except ValueError as err: abort(400, str(err)) # additional level validation if args.level is not None: try: was_muted = self.model.get_mute() # get pre-update mute state new_state['level'] = self.model.set_level(args.level) if was_muted: # add changed mute state to returned data. new_state['isMute'] = self.model.get_mute() except ValueError as err: abort(400, str(err)) return new_state, \ 200, {'Access-Control-Allow-Origin': '*'} # <-temporary access ctl.