def test_parse_strings(self): in_data = tags.string_tag("stra", "") + tags.string_tag( "strb", "test string") parsed = parser.parse(in_data, lookup_tag) self.assertEqual(2, len(parsed)) self.assertEqual("", parser.first(parsed, "stra")) self.assertEqual("test string", parser.first(parsed, "strb"))
def test_parse_strings(): in_data = tags.string_tag("stra", "") + tags.string_tag( "strb", "test string") parsed = parser.parse(in_data, lookup_tag) assert 2 == len(parsed) assert "" == parser.first(parsed, "stra") assert "test string" == parser.first(parsed, "strb")
def test_parse_strings(self): in_data = tags.string_tag('stra', '') + \ tags.string_tag('strb', 'test string') parsed = parser.parse(in_data, lookup_tag) self.assertEqual(2, len(parsed)) self.assertEqual('', parser.first(parsed, 'stra')) self.assertEqual('test string', parser.first(parsed, 'strb'))
async def handle_playstatus(self, request): """Handle playstatus (currently playing) requests.""" self._verify_auth_parameters(request) body = b'' playing = self._get_response('playing') # Check if connection should be closed to trigger error on client side if playing.force_close: await request.transport.close() # Make sure revision matches revision = int(request.rel_url.query['revision-number']) if playing.revision != revision: # Not a valid response as a real device, just to make tests fail return web.Response(status=500) if playing.paused is not None: body += tags.uint32_tag('caps', 3 if playing.paused else 4) if playing.title is not None: body += tags.string_tag('cann', playing.title) if playing.artist is not None: body += tags.string_tag('cana', playing.artist) if playing.album is not None: body += tags.string_tag('canl', playing.album) if playing.genre is not None: body += tags.string_tag('cang', playing.genre) if playing.total_time is not None: total_time = playing.total_time * 1000 # sec -> ms body += tags.uint32_tag('cast', total_time) if playing.position is not None: pos = (playing.total_time - playing.position) print(playing.total_time, playing.position) body += tags.uint32_tag('cant', pos * 1000) # sec -> ms if playing.mediakind is not None: body += tags.uint32_tag('cmmk', playing.mediakind) if playing.playstatus is not None: body += tags.uint32_tag('caps', playing.playstatus) if playing.repeat is not None: body += tags.uint8_tag('carp', playing.repeat) body += tags.uint8_tag('cash', playing.shuffle) body += tags.uint32_tag('cmsr', playing.revision + 1) return web.Response(body=tags.container_tag('cmst', body), status=200)
async def handle_request(self, request): """Respond to request if PIN is correct.""" service_name = request.rel_url.query["servicename"] received_code = request.rel_url.query["pairingcode"].lower() _LOGGER.info("Got pairing request from %s with code %s", service_name, received_code) if self._verify_pin(received_code): cmpg = tags.uint64_tag("cmpg", int(self._pairing_guid, 16)) cmnm = tags.string_tag("cmnm", self._name) cmty = tags.string_tag("cmty", "iPhone") response = tags.container_tag("cmpa", cmpg + cmnm + cmty) self._has_paired = True return web.Response(body=response) # Code did not match, generate an error return web.Response(status=500)
def handle_request(self, request): """Respond to request if PIN is correct.""" service_name = request.rel_url.query['servicename'] received_code = request.rel_url.query['pairingcode'].lower() _LOGGER.info('Got pairing request from %s with code %s', service_name, received_code) if self._verify_pin(received_code): cmpg = tags.uint64_tag('cmpg', int(self.pairing_guid, 16)) cmnm = tags.string_tag('cmnm', self._name) cmty = tags.string_tag('cmty', 'ipod') response = tags.container_tag('cmpa', cmpg + cmnm + cmty) self._has_paired = True return web.Response(body=response) # Code did not match, generate an error return web.Response(status=500)
async def set_metadata( self, rtpseq: int, rtptime: int, metadata: AudioMetadata, ) -> HttpResponse: """Change metadata for what is playing.""" payload = b"" if metadata.title: payload += tags.string_tag("minm", metadata.title) if metadata.album: payload += tags.string_tag("asal", metadata.album) if metadata.artist: payload += tags.string_tag("asar", metadata.artist) return await self.exchange( "SET_PARAMETER", content_type="application/x-dmap-tagged", headers={ "Session": self.context.rtsp_session, "RTP-Info": f"seq={rtpseq};rtptime={rtptime}", }, body=tags.container_tag("mlit", payload), )
async def handle_playstatus(self, request): """Handle playstatus (currently playing) requests.""" self._verify_auth_parameters(request) body = b"" playing = self._get_response("playing") # Check if connection should be closed to trigger error on client side if playing.force_close: await request.transport.close() # Make sure revision matches revision = int(request.rel_url.query["revision-number"]) if playing.revision != revision: # Not a valid response as a real device, just to make tests fail return web.Response(status=500) if playing.playback_rate is not None: # TODO : Magic constants if math.isclose(playing.playback_rate, 0.0): playstatus = 3 elif math.isclose(playing.playback_rate, 1.0): playstatus = 4 elif playing.playback_rate > 0.0: playstatus = 6 else: playstatus = 5 body += tags.uint32_tag("caps", playstatus) elif playing.paused is not None: body += tags.uint32_tag("caps", 3 if playing.paused else 4) elif playing.playstatus is not None: body += tags.uint32_tag("caps", playing.playstatus) if playing.title is not None: body += tags.string_tag("cann", playing.title) if playing.artist is not None: body += tags.string_tag("cana", playing.artist) if playing.album is not None: body += tags.string_tag("canl", playing.album) if playing.genre is not None: body += tags.string_tag("cang", playing.genre) if playing.total_time is not None: total_time = playing.total_time * 1000 # sec -> ms body += tags.uint32_tag("cast", total_time) if playing.position is not None: pos = playing.total_time - playing.position print(playing.total_time, playing.position, pos * 1000) body += tags.uint32_tag("cant", pos * 1000) # sec -> ms if playing.mediakind is not None: body += tags.uint32_tag("cmmk", playing.mediakind) if playing.repeat is not None: body += tags.uint8_tag("carp", playing.repeat.value) if playing.shuffle is not None: body += tags.uint8_tag("cash", playing.shuffle.value) body += tags.uint32_tag("cmsr", playing.revision + 1) return web.Response(body=tags.container_tag("cmst", body), status=200)
def _move(direction, time, point1, point2): data = "touch{0}&time={1}&point={2},{3}".format( direction, time, point1, point2) return tags.uint8_tag("cmcc", 0x30) + tags.string_tag("cmbe", data)
def controlprompt_cmd(self, cmd): """Perform a "controlpromptentry" command.""" data = tags.string_tag("cmbe", cmd) + tags.uint8_tag("cmcc", 0) return self.daap.post(_CTRL_PROMPT_CMD, data=data)
def _move(direction, time, point1, point2): data = 'touch{0}&time={1}&point={2},{3}'.format( direction, time, point1, point2) return tags.uint8_tag('cmcc', 0x30) + tags.string_tag('cmbe', data)