9
9
"""
10
10
11
11
import asyncio
12
+ import logging
12
13
import socket
13
- from pprint import pprint
14
14
from time import gmtime , strftime
15
+
15
16
import aiohttp
16
17
import lxml .etree
17
18
23
24
MEDIA_DEVICE = 'urn:schemas-upnp-org:device:MediaRenderer:1'
24
25
AVTRANSPORT_SERVICE = 'urn:schemas-upnp-org:service:AVTransport:1'
25
26
27
+ _LOGGER = logging .getLogger (__name__ )
28
+
26
29
27
30
def _get_ipaddress ():
28
31
sock = socket .socket (socket .AF_INET , socket .SOCK_DGRAM )
@@ -138,12 +141,7 @@ class Upnp():
138
141
" Upnp class "
139
142
140
143
# pylint: disable=redefined-outer-name
141
- def __init__ (self ,
142
- loop ,
143
- ssdp_host = SSDP_HOST ,
144
- ssdp_port = SSDP_PORT ,
145
- verbose = False ):
146
- self ._verbose = verbose
144
+ def __init__ (self , loop , ssdp_host = SSDP_HOST , ssdp_port = SSDP_PORT ):
147
145
self ._loop = loop
148
146
self ._ssdp_host = ssdp_host
149
147
self ._ssdp_port = ssdp_port
@@ -157,17 +155,15 @@ def __init__(self,
157
155
class DiscoverProtocol :
158
156
""" Discovery Protocol """
159
157
160
- def __init__ (self , upnp , future , search_target , verbose = False ):
158
+ def __init__ (self , upnp , future , search_target ):
161
159
self ._upnp = upnp
162
160
self ._future = future
163
161
self ._search_target = search_target
164
162
self ._transport = None
165
- self ._verbose = verbose
166
163
167
164
def connection_made (self , transport ):
168
165
""" Protocol connection made """
169
- if self ._verbose :
170
- print ('Connection made' )
166
+ _LOGGER .debug ('Connection made' )
171
167
self ._transport = transport
172
168
sock = self ._transport .get_extra_info ('socket' )
173
169
# sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
@@ -182,7 +178,7 @@ def connection_made(self, transport):
182
178
str (self ._upnp .ssdp_port ),
183
179
'Man: "ssdp:discover"' ,
184
180
'ST: {}' .format (self ._search_target ),
185
- # 'ST: ssdp:all',
181
+ # 'ST: ssdp:all',
186
182
'MX: 3' ,
187
183
'' ,
188
184
'' )
@@ -204,21 +200,19 @@ def datagram_received(self, data, _):
204
200
for k , v in
205
201
[item .split (': ' ) for item in content if ": " in item ]
206
202
}
207
- if self ._verbose :
208
- print (reply ['st' ])
203
+ _LOGGER .debug (reply ['st' ])
209
204
if reply ['st' ] == self ._search_target :
210
205
url = reply ['location' ]
211
206
self ._future .set_result (url )
212
207
self ._transport .close ()
213
208
214
209
def error_received (self , exc ): # pylint: disable=no-self-use
215
210
""" error received """
216
- print ('[E] Error received:' , exc )
211
+ _LOGGER . error ('[E] Error received: ' , exc )
217
212
218
213
def connection_lost (self , _ ):
219
214
""" connection lost """
220
- if self ._verbose :
221
- print ("[I] Connection lost." )
215
+ _LOGGER .warning ("[I] Connection lost." )
222
216
self ._transport .close ()
223
217
224
218
async def discover (self , search_target , _addr = None ):
@@ -227,7 +221,7 @@ async def discover(self, search_target, _addr=None):
227
221
self ._asyncio_ensure_future (
228
222
self ._loop .create_datagram_endpoint (
229
223
lambda : Upnp .DiscoverProtocol (
230
- self , future , search_target , self . _verbose
224
+ self , future , search_target
231
225
),
232
226
family = socket .AF_INET ,
233
227
proto = socket .IPPROTO_UDP ))
@@ -264,8 +258,7 @@ async def _soapaction(self, service, action, url=None, body=None):
264
258
content = await response .read ()
265
259
await response .release ()
266
260
267
- if self ._verbose :
268
- print (content )
261
+ _LOGGER .debug (content )
269
262
return content
270
263
271
264
async def query_renderer (self , service , url = None ):
@@ -310,8 +303,7 @@ async def set_avtransport_uri(self, uri, url=None):
310
303
'</s:Envelope>' ).format (
311
304
service = service , uri = uri )
312
305
response_xml = await self ._soapaction (service , action , url , body )
313
- if self ._verbose :
314
- pprint (response_xml )
306
+ _LOGGER .debug (response_xml )
315
307
316
308
async def set_play (self , url = None ):
317
309
" play "
@@ -328,8 +320,7 @@ async def set_play(self, url=None):
328
320
'</s:Body>'
329
321
'</s:Envelope>' ).format (service )
330
322
response_xml = await self ._soapaction (service , "Play" , url , body )
331
- if self ._verbose :
332
- pprint (response_xml )
323
+ _LOGGER .debug (response_xml )
333
324
334
325
@property
335
326
def ssdp_host (self ):
@@ -345,19 +336,17 @@ def ssdp_port(self):
345
336
class PlayContentServer (asyncio .Protocol ):
346
337
""" Play Content Server """
347
338
348
- def __init__ (self , content , content_type , verbose = False ):
339
+ def __init__ (self , content , content_type ):
349
340
self ._content = content
350
341
self ._content_type = content_type
351
342
self ._transport = None
352
- self ._verbose = verbose
353
343
354
344
def connection_made (self , transport ):
355
345
self ._transport = transport
356
346
357
347
def data_received (self , data ):
358
348
# dont care of request, sent data anyway...
359
- if self ._verbose :
360
- pprint (data )
349
+ _LOGGER .debug (data )
361
350
362
351
response = HttpResponse (200 )
363
352
# response.add_header('Content-Length', content.getbuffer().nbytes)
@@ -371,22 +360,23 @@ def data_received(self, data):
371
360
class AioHeosUpnp ():
372
361
" Heos version of Upnp "
373
362
374
- def __init__ (self , loop , verbose = False ):
375
- self ._verbose = verbose
376
- self ._upnp = Upnp (loop = loop , verbose = verbose )
363
+ def __init__ (self , loop ):
377
364
self ._loop = loop
365
+ self ._upnp = None
378
366
self ._url = None
379
367
self ._path = None
380
368
self ._renderer_uri = None
381
369
382
370
async def discover (self ):
383
371
" discover "
372
+ if not self ._upnp :
373
+ self ._upnp = Upnp (loop = self ._loop )
384
374
self ._url = await self ._upnp .discover (DENON_DEVICE )
385
375
return self ._url
386
376
387
377
async def query_renderer (self ):
388
378
" query renderer "
389
- if not self ._url :
379
+ if not self ._url or not self . _upnp :
390
380
return
391
381
self ._path = await self ._upnp .query_renderer (
392
382
AVTRANSPORT_SERVICE , self ._url )
@@ -415,8 +405,7 @@ async def play_content(self, content, content_type='audio/mpeg', port=0):
415
405
416
406
# http server
417
407
http_server = self ._loop .create_server (
418
- lambda : PlayContentServer (content , content_type ,
419
- verbose = self ._verbose ),
408
+ lambda : PlayContentServer (content , content_type ),
420
409
sock = sock
421
410
)
422
411
@@ -428,12 +417,11 @@ async def play_content(self, content, content_type='audio/mpeg', port=0):
428
417
429
418
async def main (aioloop ): # pylint: disable=redefined-outer-name
430
419
" main "
420
+ from pprint import pprint
431
421
432
- _verbose = True
433
- upnp = AioHeosUpnp (loop = aioloop , verbose = _verbose )
422
+ upnp = AioHeosUpnp (loop = aioloop )
434
423
url = await upnp .discover ()
435
- if _verbose :
436
- pprint (url )
424
+ pprint (url )
437
425
438
426
print ('Query renderer' )
439
427
await upnp .query_renderer ()
0 commit comments