@@ -166,6 +166,7 @@ def __str__(self):
166166HTTP_CT_IMAGE = "image/jpeg"
167167HTTP_CT_DMAP = "application/x-dmap-tagged"
168168
169+
169170def setup_global_structs (args ):
170171 global sonos_one_info
171172 global sonos_one_setup
@@ -176,21 +177,26 @@ def setup_global_structs(args):
176177 sonos_one_info = {
177178 # 'OSInfo': 'Linux 3.10.53',
178179 # 'PTPInfo': 'OpenAVNU ArtAndLogic-aPTP-changes a5d7f94-0.0.1',
179- 'audioLatencies' : [ { 'inputLatencyMicros' : 0 ,
180- 'outputLatencyMicros' : 400000 ,
181- 'type' : 100 },
182- { 'audioType' : 'default' ,
183- 'inputLatencyMicros' : 0 ,
184- 'outputLatencyMicros' : 400000 ,
185- 'type' : 100 },
186- { 'audioType' : 'media' ,
187- 'inputLatencyMicros' : 0 ,
188- 'outputLatencyMicros' : 400000 ,
189- 'type' : 100 },
190- { 'audioType' : 'media' ,
191- 'inputLatencyMicros' : 0 ,
192- 'outputLatencyMicros' : 400000 ,
193- 'type' : 102 }],
180+ 'audioLatencies' : [{
181+ 'inputLatencyMicros' : 0 ,
182+ 'outputLatencyMicros' : 400000 ,
183+ 'type' : 100 },
184+ {
185+ 'audioType' : 'default' ,
186+ 'inputLatencyMicros' : 0 ,
187+ 'outputLatencyMicros' : 400000 ,
188+ 'type' : 100 },
189+ {
190+ 'audioType' : 'media' ,
191+ 'inputLatencyMicros' : 0 ,
192+ 'outputLatencyMicros' : 400000 ,
193+ 'type' : 100 },
194+ {
195+ 'audioType' : 'media' ,
196+ 'inputLatencyMicros' : 0 ,
197+ 'outputLatencyMicros' : 400000 ,
198+ 'type' : 102
199+ }],
194200 # 'build': '16.0',
195201 'deviceID' : DEVICE_ID ,
196202 'features' : FEATURES ,
@@ -204,60 +210,64 @@ def setup_global_structs(args):
204210 'model' : 'One' ,
205211 'name' : 'Camera da letto' ,
206212 'nameIsFactoryDefault' : False ,
207- 'pi' : 'ba5cb8df-7f14-4249-901a-5e748ce57a93' , # UUID generated casually..
213+ 'pi' : 'ba5cb8df-7f14-4249-901a-5e748ce57a93' , # UUID generated casually..
208214 'protocolVersion' : '1.1' ,
209215 'sdk' : 'AirPlay;2.0.2' ,
210216 'sourceVersion' : '366.0' ,
211217 'statusFlags' : 4 ,
212218 # 'statusFlags': 0x404 # Sonos One
213- }
219+ }
214220
215221 if DISABLE_VM :
216222 volume = 0
217- else :
223+ else :
218224 volume = get_volume ()
219225 second_stage_info = {
220226 "initialVolume" : volume ,
221- }
227+ }
222228
223229 sonos_one_setup = {
224- 'eventPort' : 0 , # AP2 receiver event server
225- 'timingPort' : 0 ,
226- 'timingPeerInfo' : {
227- 'Addresses' : [
228- IPV4 , IPV6 ],
229- 'ID' : IPV4 }
230- }
230+ 'eventPort' : 0 , # AP2 receiver event server
231+ 'timingPort' : 0 ,
232+ 'timingPeerInfo' : {
233+ 'Addresses' :
234+ [
235+ IPV4 ,
236+ IPV6
237+ ],
238+ 'ID' : IPV4 }
239+ }
231240
232241 sonos_one_setup_data = {
233- 'streams' : [
234- {
235- 'type' : 96 ,
236- 'dataPort' : 0 , # AP2 receiver data server
237- 'controlPort' : 0 # AP2 receiver control server
238- }
239- ]
242+ 'streams' : [
243+ {
244+ 'type' : 96 ,
245+ 'dataPort' : 0 , # AP2 receiver data server
246+ 'controlPort' : 0 # AP2 receiver control server
240247 }
248+ ]
249+ }
241250
242251 mdns_props = {
243- "srcvers" : SERVER_VERSION ,
244- "deviceid" : DEVICE_ID ,
245- "features" : "%s,%s" % (hex (FEATURES & 0xffffffff ), hex (FEATURES >> 32 & 0xffffffff )),
246- "flags" : "0x4" ,
247- # "name": "GINO", # random
248- "model" : "Airplay2-Receiver" , # random
249- # "manufacturer": "Pino", # random
250- # "serialNumber": "01234xX321", # random
251- "protovers" : "1.1" ,
252- "acl" : "0" ,
253- "rsf" : "0x0" ,
254- "fv" : "p20.78000.12" ,
255- "pi" : "5dccfd20-b166-49cc-a593-6abd5f724ddb" , # UUID generated casually
256- "gid" : "5dccfd20-b166-49cc-a593-6abd5f724ddb" , # UUID generated casually
257- "gcgl" : "0" ,
258- # "vn": "65537",
259- "pk" : "de352b0df39042e201d31564049023af58a106c6d904b74a68aa65012852997f"
260- }
252+ "srcvers" : SERVER_VERSION ,
253+ "deviceid" : DEVICE_ID ,
254+ "features" : "%s,%s" % (hex (FEATURES & 0xffffffff ), hex (FEATURES >> 32 & 0xffffffff )),
255+ "flags" : "0x4" ,
256+ # "name": "GINO", # random
257+ "model" : "Airplay2-Receiver" , # random
258+ # "manufacturer": "Pino", # random
259+ # "serialNumber": "01234xX321", # random
260+ "protovers" : "1.1" ,
261+ "acl" : "0" ,
262+ "rsf" : "0x0" ,
263+ "fv" : "p20.78000.12" ,
264+ "pi" : "5dccfd20-b166-49cc-a593-6abd5f724ddb" , # UUID generated casually
265+ "gid" : "5dccfd20-b166-49cc-a593-6abd5f724ddb" , # UUID generated casually
266+ "gcgl" : "0" ,
267+ # "vn": "65537",
268+ "pk" : "de352b0df39042e201d31564049023af58a106c6d904b74a68aa65012852997f"
269+ }
270+
261271
262272class AP2Handler (http .server .BaseHTTPRequestHandler ):
263273
@@ -299,7 +309,7 @@ def do_OPTIONS(self):
299309 self .send_response (200 )
300310 self .send_header ("Server" , self .version_string ())
301311 self .send_header ("CSeq" , self .headers ["CSeq" ])
302- self .send_header ("Public" , "ANNOUNCE, SETUP, RECORD, PAUSE, FLUSH, FLUSHBUFFERED, TEARDOWN, OPTIONS, POST, GET, PUT" )
312+ self .send_header ("Public" , "ANNOUNCE, SETUP, RECORD, PAUSE, FLUSH, FLUSHBUFFERED, TEARDOWN, OPTIONS, POST, GET, PUT" )
303313 self .end_headers ()
304314
305315 def do_FLUSHBUFFERED (self ):
@@ -389,7 +399,7 @@ def do_SETUP(self):
389399 self .wfile .write (res )
390400 else :
391401 print ("Sending CONTROL/DATA:" )
392- buff = 8388608 # determines how many CODEC frame size 1024 we can hold
402+ buff = 8388608 # determines how many CODEC frame size 1024 we can hold
393403 stream = Stream (plist ["streams" ][0 ], buff )
394404 self .server .streams .append (stream )
395405 sonos_one_setup_data ["streams" ][0 ]["controlPort" ] = stream .control_port
@@ -441,7 +451,7 @@ def do_GET_PARAMETER(self):
441451 self .send_header ("Server" , self .version_string ())
442452 self .send_header ("CSeq" , self .headers ["CSeq" ])
443453 self .end_headers ()
444- hexdump (res );
454+ hexdump (res )
445455 self .wfile .write (res )
446456
447457 def do_SET_PARAMETER (self ):
@@ -539,7 +549,7 @@ def do_TEARDOWN(self):
539549 self .send_header ("Server" , self .version_string ())
540550 self .send_header ("CSeq" , self .headers ["CSeq" ])
541551 self .end_headers ()
542-
552+
543553 # Erase the hap() instance, otherwise reconnects fail
544554 self .server .hap = None
545555
@@ -597,7 +607,7 @@ def handle_feedback(self):
597607
598608 plist = readPlistFromString (body )
599609 # feedback logs are pretty much noise...
600- #self.pp.pprint(plist)
610+ # self.pp.pprint(plist)
601611 self .send_response (200 )
602612 self .send_header ("Server" , self .version_string ())
603613 self .send_header ("CSeq" , self .headers ["CSeq" ])
@@ -731,40 +741,46 @@ def handle_info(self):
731741
732742 def upgrade_to_encrypted (self , shared_key ):
733743 self .request = self .server .upgrade_to_encrypted (
734- self .client_address ,
735- shared_key )
744+ self .client_address ,
745+ shared_key )
736746 self .connection = self .request
737747 self .rfile = self .connection .makefile ('rb' , self .rbufsize )
738748 self .wfile = self .connection .makefile ('wb' )
739749 self .is_encrypted = True
740750 print ("----- ENCRYPTED CHANNEL -----" )
741751
752+
742753def register_mdns (receiver_name ):
743754 addresses = []
744755 for ifen in ni .interfaces ():
745756 ifenaddr = ni .ifaddresses (ifen )
746757 if ni .AF_INET in ifenaddr :
747- addresses .append (socket .inet_pton (ni .AF_INET ,
748- ifenaddr [ni .AF_INET ][0 ]["addr" ]))
758+ addresses .append (socket .inet_pton (
759+ ni .AF_INET ,
760+ ifenaddr [ni .AF_INET ][0 ]["addr" ])
761+ )
749762 if ni .AF_INET6 in ifenaddr :
750- addresses .append (socket .inet_pton (ni .AF_INET6 ,
751- ifenaddr [ni .AF_INET6 ][0 ]["addr" ].split ("%" )[0 ]))
763+ addresses .append (socket .inet_pton (
764+ ni .AF_INET6 ,
765+ ifenaddr [ni .AF_INET6 ][0 ]["addr" ].split ("%" )[0 ])
766+ )
752767
753768 info = ServiceInfo (
754- "_airplay._tcp.local." ,
755- "%s._airplay._tcp.local." % receiver_name ,
756- # addresses=[socket.inet_aton("127.0.0.1")],
757- addresses = addresses ,
758- port = 7000 ,
759- properties = mdns_props ,
760- server = "%s.local." % receiver_name ,
761- )
769+ "_airplay._tcp.local." ,
770+ "%s._airplay._tcp.local." % receiver_name ,
771+ # addresses=[socket.inet_aton("127.0.0.1")],
772+ addresses = addresses ,
773+ port = 7000 ,
774+ properties = mdns_props ,
775+ server = "%s.local." % receiver_name ,
776+ )
762777
763778 zeroconf = Zeroconf (ip_version = IPVersion .V4Only )
764779 zeroconf .register_service (info )
765780 print ("mDNS service registered" )
766781 return (zeroconf , info )
767782
783+
768784def unregister_mdns (zeroconf , info ):
769785 print ("Unregistering..." )
770786 zeroconf .unregister_service (info )
@@ -793,7 +809,7 @@ def __init__(self, addr_port, handler):
793809 self .enc_layer = False
794810 self .streams = []
795811
796- #Override
812+ # Override
797813 def get_request (self ):
798814 client_socket , client_addr = super ().get_request ()
799815 print ("Got connection with %s:%d" % client_addr )
@@ -806,6 +822,7 @@ def upgrade_to_encrypted(self, client_address, shared_key):
806822 self .connections [client_address ] = hap_socket
807823 return hap_socket
808824
825+
809826if __name__ == "__main__" :
810827
811828 multiprocessing .set_start_method ("spawn" )
0 commit comments