Exemple #1
0
 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"))
Exemple #2
0
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")
Exemple #3
0
 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'))
Exemple #4
0
    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)
Exemple #5
0
    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)
Exemple #6
0
    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)
Exemple #7
0
    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),
        )
Exemple #8
0
    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)
Exemple #9
0
 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)
Exemple #10
0
 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)
Exemple #11
0
 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)