def do_GET_PARAMETER(self): print("GET_PARAMETER %s" % self.path) print(self.headers) params_res = {} content_len = int(self.headers["Content-Length"]) if content_len > 0: body = self.rfile.read(content_len) params = body.splitlines() for p in params: if p == b"volume": print("GET_PARAMETER: %s" % p) if not DISABLE_VM: params_res[p] = str(get_volume(AUDIO_DEVICE)).encode() else: print("Volume Management is disabled") else: print("Ops GET_PARAMETER: %s" % p) if DISABLE_VM: res = b"volume: 0" + b"\r\n" else: res = b"\r\n".join(b"%s: %s" % (k, v) for k, v in params_res.items()) + b"\r\n" self.send_response(200) self.send_header("Content-Length", len(res)) self.send_header("Content-Type", HTTP_CT_PARAM) self.send_header("Server", self.version_string()) self.send_header("CSeq", self.headers["CSeq"]) self.end_headers() hexdump(res) self.wfile.write(res)
def setup_global_structs(args): global sonos_one_info global sonos_one_setup global sonos_one_setup_data global second_stage_info global mdns_props sonos_one_info = { # 'OSInfo': 'Linux 3.10.53', # 'PTPInfo': 'OpenAVNU ArtAndLogic-aPTP-changes a5d7f94-0.0.1', 'audioLatencies': [{ 'inputLatencyMicros': 0, 'outputLatencyMicros': 400000, 'type': 100 }, { 'audioType': 'default', 'inputLatencyMicros': 0, 'outputLatencyMicros': 400000, 'type': 100 }, { 'audioType': 'media', 'inputLatencyMicros': 0, 'outputLatencyMicros': 400000, 'type': 100 }, { 'audioType': 'media', 'inputLatencyMicros': 0, 'outputLatencyMicros': 400000, 'type': 102 }], # 'build': '16.0', 'deviceID': DEVICE_ID, 'features': FEATURES, # 'features': 496155769145856, # Sonos One # 'firmwareBuildDate': 'Nov 5 2019', # 'firmwareRevision': '53.3-71050', # 'hardwareRevision': '1.21.1.8-2', 'keepAliveLowPower': True, 'keepAliveSendStatsAsBody': True, 'manufacturer': 'Sonos', 'model': 'One', 'name': 'Camera da letto', 'nameIsFactoryDefault': False, 'pi': 'ba5cb8df-7f14-4249-901a-5e748ce57a93', # UUID generated casually.. 'protocolVersion': '1.1', 'sdk': 'AirPlay;2.0.2', 'sourceVersion': '366.0', 'statusFlags': 4, # 'statusFlags': 0x404 # Sonos One } if DISABLE_VM: volume = 0 else: volume = get_volume(AUDIO_DEVICE) second_stage_info = { "initialVolume": volume, } sonos_one_setup = { 'eventPort': 0, # AP2 receiver event server 'timingPort': 0, 'timingPeerInfo': { 'Addresses': [IPV4, IPV6], 'ID': IPV4 } } sonos_one_setup_data = { 'streams': [{ 'type': 96, 'dataPort': 0, # AP2 receiver data server 'controlPort': 0 # AP2 receiver control server }] } mdns_props = { "srcvers": SERVER_VERSION, "deviceid": DEVICE_ID, "features": "%s,%s" % (hex(FEATURES & 0xffffffff), hex(FEATURES >> 32 & 0xffffffff)), "flags": "0x4", # "name": "GINO", # random "model": "Airplay2-Receiver", # random # "manufacturer": "Pino", # random # "serialNumber": "01234xX321", # random "protovers": "1.1", "acl": "0", "rsf": "0x0", "fv": "p20.78000.12", "pi": "5dccfd20-b166-49cc-a593-6abd5f724ddb", # UUID generated casually "gid": "5dccfd20-b166-49cc-a593-6abd5f724ddb", # UUID generated casually "gcgl": "0", # "vn": "65537", "pk": "de352b0df39042e201d31564049023af58a106c6d904b74a68aa65012852997f" }
def setup_global_structs(args): global sonos_one_info global sonos_one_setup global sonos_one_setup_data global second_stage_info global mdns_props sonos_one_info = { # 'OSInfo': 'Linux 3.10.53', # 'PTPInfo': 'OpenAVNU ArtAndLogic-aPTP-changes a5d7f94-0.0.1', 'audioLatencies': [{ 'inputLatencyMicros': 0, 'outputLatencyMicros': 400000, 'type': 100 }, { 'audioType': 'default', 'inputLatencyMicros': 0, 'outputLatencyMicros': 400000, 'type': 100 }, { 'audioType': 'media', 'inputLatencyMicros': 0, 'outputLatencyMicros': 400000, 'type': 100 }, { 'audioType': 'media', 'inputLatencyMicros': 0, 'outputLatencyMicros': 400000, 'type': 102 }], # 'build': '16.0', 'deviceID': DEVICE_ID, 'features': FEATURES, # 'features': 496155769145856, # Sonos One # 'firmwareBuildDate': 'Nov 5 2019', # 'firmwareRevision': '53.3-71050', # 'hardwareRevision': '1.21.1.8-2', 'keepAliveLowPower': True, 'keepAliveSendStatsAsBody': True, 'manufacturer': 'Sonos', 'model': 'One', 'name': args.mdns, 'nameIsFactoryDefault': False, 'pi': 'ba5cb8df-7f14-4249-901a-5e748ce57a93', # UUID generated casually.. 'protocolVersion': '1.1', 'sdk': 'AirPlay;2.0.2', 'sourceVersion': '366.0', 'statusFlags': 4, # 'statusFlags': 0x404 # Sonos One } if DISABLE_VM: volume = 0 else: volume = get_volume() second_stage_info = { "initialVolume": volume, } sonos_one_setup = { 'eventPort': 0 # AP2 receiver event server } if not DISABLE_PTP_MASTER: sonos_one_setup['timingPort'] = 0 sonos_one_setup['timingPeerInfo'] = { 'Addresses': [IPV4, IPV6], 'ID': IPV4 } sonos_one_setup_data = { 'streams': [{ 'type': 96, 'dataPort': 0, # AP2 receiver data server 'controlPort': 0 # AP2 receiver control server }] } mdns_props = { "srcvers": SERVER_VERSION, "deviceid": DEVICE_ID, # typically MAC addr "features": "%s,%s" % (hex(FEATURES & 0xffffffff), hex(FEATURES >> 32 & 0xffffffff)), "flags": "0x4", # "name": "GINO", # random "model": "Airplay2-Receiver", # random # "manufacturer": "Pino", # random # "serialNumber": "01234xX321", # random "protovers": "1.1", "acl": "0", # Access ControL. 0,1,2 == anon,users,admin(?) # These are found under the <deviceid>@<name> mDNS record. # "am": "One", # Model # "cn": "0,1", # CompressioN. 0,1 == None aka PCM, ALAC # "da": "true", # Digest Auth(?) support # "et": "0,1,3,4,5", # Audio Encryption Types(?). # "md": "0,1,2", # MetaData(?) 0,1,2 == Text, Gfx, Progress # "sf": "0x804", # Status Flags? # "tp": "UDP", # TransPort for media? csv of transports? # "vs": "366", # Source version? "rsf": "0x0", # bitmask: required sender features(?) "fv": "p20.78000.12", # Firmware version. p20 == AirPlay Src revision? "pi": PI, # Pairing UUID (generated casually) "gid": "5dccfd20-b166-49cc-a593-6abd5f724ddb", # Group UUID (generated casually) "gcgl": "0", # Group Contains Group Leader. # "isGroupLeader": "0" # See gcgl # "vn": "65537", # (Airplay) version number (supported) 16.16, 65537 == 1.1 "pk": LTPK.get_pub_string() # Ed25519 PubKey }