예제 #1
0
    def test_basic(self):
        """
        """
        msg = remoting.Envelope(pyamf.AMF0)
        self.assertEqual(remoting.encode(msg).getvalue(), '\x00' * 6)

        msg = remoting.Envelope(pyamf.AMF3)
        self.assertEqual(
            remoting.encode(msg).getvalue(), '\x00\x03' + '\x00' * 4)
예제 #2
0
    def test_basic(self):
        """
        """
        msg = remoting.Envelope(pyamf.AMF0, pyamf.ClientTypes.Flash6)
        self.assertEquals(remoting.encode(msg).getvalue(), '\x00' * 6)

        msg = remoting.Envelope(pyamf.AMF3, pyamf.ClientTypes.FlashCom)
        self.assertEquals(
            remoting.encode(msg).getvalue(), '\x03\x01' + '\x00' * 4)
예제 #3
0
    def test_service_request(self):
        gw = gateway.BaseGateway({'test': TestService})
        envelope = remoting.Envelope()

        message = remoting.Request('spam', [], envelope=envelope)
        self.assertRaises(gateway.UnknownServiceError, gw.getServiceRequest,
                          message, 'spam')

        message = remoting.Request('test.spam', [], envelope=envelope)
        sr = gw.getServiceRequest(message, 'test.spam')

        self.assertTrue(isinstance(sr, gateway.ServiceRequest))
        self.assertEqual(sr.request, envelope)
        self.assertEqual(sr.service, TestService)
        self.assertEqual(sr.method, 'spam')

        message = remoting.Request('test')
        sr = gw.getServiceRequest(message, 'test')

        self.assertTrue(isinstance(sr, gateway.ServiceRequest))
        self.assertEqual(sr.request, None)
        self.assertEqual(sr.service, TestService)
        self.assertEqual(sr.method, None)

        gw = gateway.BaseGateway({'test': TestService})
        envelope = remoting.Envelope()
        message = remoting.Request('test')

        sr = gw.getServiceRequest(message, 'test')

        self.assertTrue(isinstance(sr, gateway.ServiceRequest))
        self.assertEqual(sr.request, None)
        self.assertEqual(sr.service, TestService)
        self.assertEqual(sr.method, None)

        # try to access an unknown service
        message = remoting.Request('spam')
        self.assertRaises(gateway.UnknownServiceError, gw.getServiceRequest,
                          message, 'spam')

        # check x.x calls
        message = remoting.Request('test.test')
        sr = gw.getServiceRequest(message, 'test.test')

        self.assertTrue(isinstance(sr, gateway.ServiceRequest))
        self.assertEqual(sr.request, None)
        self.assertEqual(sr.service, TestService)
        self.assertEqual(sr.method, 'test')
예제 #4
0
def playBrightCoveStream(bc_videoID):
    bc_playerID = 29323562001
    bc_publisherID = 293884104
    bc_const = "7aa45a3f2e7aadf8fa76da04bef79fb11f4a3fc2"
    conn = httplib.HTTPConnection("c.brightcove.com")
    envelope = remoting.Envelope(amfVersion=3)
    envelope.bodies.append(
        ("/1",
         remoting.Request(
             target=
             "com.brightcove.player.runtime.PlayerMediaFacade.findMediaById",
             body=[bc_const, bc_playerID, bc_videoID, bc_publisherID],
             envelope=envelope)))
    conn.request("POST",
                 "/services/messagebroker/amf?playerId=" + str(bc_playerID),
                 str(remoting.encode(envelope).read()),
                 {'content-type': 'application/x-amf'})
    response = conn.getresponse().read()
    response = remoting.decode(response).bodies[0][1].body
    streamUrl = ""
    for item in sorted(response['renditions'],
                       key=lambda item: item['encodingRate'],
                       reverse=False):
        encRate = item['encodingRate']
        if encRate < maxBitRate:
            streamUrl = item['defaultURL']
    if streamUrl == "":
        streamUrl = response['FLVFullLengthURL']
    if streamUrl != "":
        url = streamUrl[0:streamUrl.find("&")]
        playpath = streamUrl[streamUrl.find("&") + 1:]
        listItem = xbmcgui.ListItem(path=url + ' playpath=' + playpath)
        xbmcplugin.setResolvedUrl(pluginhandle, True, listItem)
예제 #5
0
    def __BuildBrightCoveAmfRequest(self, playerKey, contentId, url, experienceId, seed):
        """ Builds a AMF request compatible with BrightCove

        Arguments:
        playerKey : string - Key identifying the current request
        contentId : int    - ID of the content to retrieve
        url       : string - Url of the page that calls the video SWF
        seed      : string - Constant which depends on the website

        Keyword Arguments:
        experienceId : id     - <unknown parameter>

        Returns a valid Brightcove request

        """

        if self.logger:
            self.logger.Debug("Creating BrightCover request for ContentId=%s, Key=%s, ExperienceId=%s, url=%s", contentId, playerKey, experienceId, url)
        else:
            print "Creating BrightCover request for ContentId=%s, Key=%s, ExperienceId=%s, url=%s" % (contentId, playerKey, experienceId, url)

        # const = '686a10e2a34ec3ea6af8f2f1c41788804e0480cb'
        pyamf.register_class(ViewerExperienceRequest, 'com.brightcove.experience.ViewerExperienceRequest')
        pyamf.register_class(ContentOverride, 'com.brightcove.experience.ContentOverride')

        contentOverrides = [ContentOverride(int(contentId))]
        viewerExperienceRequest = ViewerExperienceRequest(url, contentOverrides, int(experienceId), playerKey)

        envelope = remoting.Envelope(amfVersion=self.amfVersion)
        remotingRequest = remoting.Request(target="com.brightcove.experience.ExperienceRuntimeFacade.getDataForExperience", body=[seed, viewerExperienceRequest], envelope=envelope)
        envelope.bodies.append(("/1", remotingRequest))

        return envelope
예제 #6
0
    def _makeRequestBody(self, service, body, raw=False):
        if not raw:
            body = [body]

        e = remoting.Envelope(pyamf.AMF3)
        e['/1'] = remoting.Request(service, body=body)
        return remoting.encode(e)
예제 #7
0
    def BuildAmfRequest(self,
                        key,
                        url,
                        exp_id,
                        contentRefId=None,
                        contentId=None):
        self.log(u'ContentRefId:' + str(contentRefId) + u'contentId:' +
                 str(contentId) + u', ExperienceId:' + str(exp_id) +
                 u', URL:' + url)

        method = u"com.brightcove.experience.ExperienceRuntimeFacade.getDataForExperience"
        className = method[0:method.rfind('.')]
        hashValue = self.GetAmfClassHash(className)

        self.log(u'hashValue:' + str(hashValue))

        pyamf.register_class(
            ViewerExperienceRequest,
            u'com.brightcove.experience.ViewerExperienceRequest')
        pyamf.register_class(ContentOverride,
                             u'com.brightcove.experience.ContentOverride')
        content_override = ContentOverride(contentRefId=contentRefId,
                                           contentId=contentId)
        viewer_exp_req = ViewerExperienceRequest(url, [content_override],
                                                 int(exp_id), key)

        self.log(content_override.tostring())
        self.log(viewer_exp_req.tostring())

        env = remoting.Envelope(amfVersion=3)
        env.bodies.append(("/1",
                           remoting.Request(target=method,
                                            body=[hashValue, viewer_exp_req],
                                            envelope=env)))
        return env
예제 #8
0
    def BuildAmfRequest_FindRelated(self, key, exp_id, pubId, videoPlayer,
                                    pageSize, pageNumber, getItemCount):
        self.log(u'ExperienceId:' + str(exp_id))

        method = "com.brightcove.player.runtime.PlayerSearchFacade.findRelatedVideos"
        className = method[0:method.rfind('.')]
        hashValue = self.GetAmfClassHash(className)

        self.log(u'hashValue:' + str(hashValue))

        pageSize = 12
        pageNumber = 0
        getItemCount = False

        env = remoting.Envelope(amfVersion=3)
        env.bodies.append((
            "/1",
            remoting.Request(
                target=method,
                body=[
                    hashValue,
                    int(exp_id), pubId, videoPlayer, pageSize, pageNumber,
                    getItemCount
                ],
                #                body=[hashValue, "Nuacht", 1, 0, False, None, None, None, None, None],
                envelope=env)))
        return env
def playLiveStream():
    bc_playerID = 3546024667001
    bc_publisherID = 3213846503001
    content = opener.open(urlMain + "/" + siteVersion + "/Live").read()
    match = re.compile('name="@videoPlayer" value="(.+?)"',
                       re.DOTALL).findall(content)
    bc_const = "AQ~~,AAAC7Egt3lk~,ef2hDIwZtHuA9aR9af3pB4XK5IWi-srn"
    conn = httplib.HTTPConnection("c.brightcove.com")
    envelope = remoting.Envelope(amfVersion=3)
    envelope.bodies.append(
        ("/1",
         remoting.Request(
             target=
             "com.brightcove.player.runtime.PlayerMediaFacade.findMediaById",
             body=[bc_const, bc_playerID, match[0], bc_publisherID],
             envelope=envelope)))
    conn.request("POST",
                 "/services/messagebroker/amf?playerId=" + str(bc_playerID),
                 str(remoting.encode(envelope).read()),
                 {'content-type': 'application/x-amf'})
    response = conn.getresponse().read()
    response = remoting.decode(response).bodies[0][1].body
    streamUrl = response['FLVFullLengthURL'].replace("/z/",
                                                     "/i/") + "/master.m3u8"
    content = opener.open(streamUrl).read()
    match = re.compile('RESOLUTION=(.+?)x(.+?),.*?\n(.+?)\n',
                       re.DOTALL).findall(content)
    for resX, resY, url in match:
        if int(resY) <= qualityLive:
            streamUrl = url
    if streamUrl:
        listitem = xbmcgui.ListItem(path=streamUrl)
        xbmcplugin.setResolvedUrl(pluginhandle, True, listitem)
예제 #10
0
    def getResponse(self, http_request, amf_request):
        """
        Processes the AMF request, returning an AMF L{Response}.

        @param http_request: The underlying HTTP Request
        @type http_request: C{twisted.web.http.Request}
        @param amf_request: The AMF Request.
        @type amf_request: L{Envelope<pyamf.remoting.Envelope>}
        """
        response = remoting.Envelope(amf_request.amfVersion, amf_request.clientType)
        dl = []

        def cb(body, name):
            response[name] = body

        for name, message in amf_request:
            processor = self.getProcessor(message)

            d = defer.maybeDeferred(processor, message, http_request=http_request)
            d.addCallback(cb, name)

            dl.append(d)

        def cb2(result):
            return response

        d = defer.DeferredList(dl)

        return d.addCallback(cb2)
예제 #11
0
    def test_response(self):
        """
        Test encoding of request body.
        """
        msg = remoting.Envelope(pyamf.AMF0)

        msg['/1'] = remoting.Response(body=[1, 2, 3])

        self.assertEqual(len(msg), 1)

        x = msg['/1']

        self.assertTrue(isinstance(x, remoting.Response))
        self.assertEqual(x.envelope, msg)
        self.assertEqual(x.body, [1, 2, 3])
        self.assertEqual(x.status, 0)
        self.assertEqual(x.headers, msg.headers)

        self.assertEqual(
            remoting.encode(msg).getvalue(),
            '\x00\x00\x00\x00'
            '\x00\x01\x00\x0b/1/onResult\x00\x04null\x00\x00\x00\x00\n\x00\x00'
            '\x00\x03\x00?\xf0\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00'
            '\x00\x00\x00\x00@\x08\x00\x00\x00\x00\x00\x00'
        )
예제 #12
0
 def get_data(self):
     data = {
         "clientId": None,
         "destination": "GenericDestination",
         "correlationId": None,
         "source":
         "com.backendless.services.persistence.PersistenceService",
         "operation": "first",
         "messageRefType": None,
         "headers": {
             "application-type": "ANDROID",
             "api-version": "1.0"
         },
         "timestamp": 0,
         "body": ["ConfigCharlie"],
         "timeToLive": 0,
         "messageId": None,
     }
     msg = messaging.RemotingMessage(**data)
     req = remoting.Request(target="null", body=[msg])
     ev = remoting.Envelope(pyamf.AMF3)
     ev["null"] = req
     resp = requests.post(self.url,
                          data=remoting.encode(ev).getvalue(),
                          headers={"Content-Type": "application/x-amf"})
     resp_msg = remoting.decode(resp.content)
     config = json.dumps(resp_msg.bodies[0][1].body.body,
                         default=lambda obj: repr(obj))
     return json.loads(config)
예제 #13
0
    def test_expose_request(self):
        self.gw.expose_request = True
        self.executed = False

        env = remoting.Envelope(pyamf.AMF0, pyamf.ClientTypes.Flash9)
        request = remoting.Request('echo', body=['hello'])
        env['/1'] = request

        def echo(http_request, data):
            self.assertTrue(isinstance(http_request, http.Request))

            self.assertTrue(hasattr(http_request, 'amf_request'))
            amf_request = http_request.amf_request

            self.assertEquals(request.target, 'echo')
            self.assertEquals(request.body, ['hello'])
            self.executed = True

            return data

        self.gw.addService(echo)

        d = client.getPage("http://127.0.0.1:%d/" % (self.port, ),
                           method="POST",
                           postdata=remoting.encode(env).getvalue())

        return d.addCallback(lambda x: self.assertTrue(self.executed))
예제 #14
0
    def test_timezone(self):
        import datetime

        self.executed = False

        td = datetime.timedelta(hours=-5)
        now = datetime.datetime.utcnow()

        def echo(d):
            self.assertEquals(d, now + td)
            self.executed = True

            return d

        self.gw.addService(echo)
        self.gw.timezone_offset = -18000

        msg = remoting.Envelope(amfVersion=pyamf.AMF0, clientType=0)
        msg['/1'] = remoting.Request(target='echo', body=[now])

        stream = remoting.encode(msg)

        env = {
            'REQUEST_METHOD': 'POST',
            'CONTENT_LENGTH': str(len(stream)),
            'wsgi.input': stream
        }

        response = self.gw(env, lambda *args: None)
        envelope = remoting.decode(''.join(response))
        message = envelope['/1']

        self.assertEquals(message.body, now)
예제 #15
0
def build_amf_request(clip_name):
    env = remoting.Envelope(amfVersion=3)
    env.bodies.append(("/1",
                       remoting.Request(target="tele5.getContentPlayer",
                                        body=[clip_name],
                                        envelope=env)))
    return env
예제 #16
0
    def test_timezone(self):
        import datetime

        self.executed = False

        td = datetime.timedelta(hours=-5)
        now = datetime.datetime.utcnow()

        def echo(d):
            self.assertEqual(d, now + td)
            self.executed = True

            return d

        self.gw.addService(echo)
        self.gw.timezone_offset = -18000

        msg = remoting.Envelope(amfVersion=pyamf.AMF0)
        msg['/1'] = remoting.Request(target='echo', body=[now])

        stream = remoting.encode(msg)
        self.environ['wsgi.input'] = stream
        self.gw.post()

        envelope = remoting.decode(self.response.out.getvalue())
        message = envelope['/1']

        self.assertEqual(message.body, now)
        self.assertTrue(self.executed)
예제 #17
0
    def test_expose_request(self):
        self.gw.expose_request = True
        self.executed = False

        env = remoting.Envelope(pyamf.AMF0, pyamf.ClientTypes.Flash9)
        request = remoting.Request('echo', body=['hello'])
        env['/1'] = request

        request = remoting.encode(env)

        env = {
            'REQUEST_METHOD': 'POST',
            'CONTENT_LENGTH': str(len(request)),
            'wsgi.input': request
        }

        def echo(http_request, data):
            self.assertTrue('pyamf.request' in http_request)
            request = http_request['pyamf.request']

            self.assertTrue(isinstance(request, remoting.Request))

            self.assertEquals(request.target, 'echo')
            self.assertEquals(request.body, ['hello'])
            self.executed = True

            return data

        self.gw.addService(echo)

        response = self.gw(env, lambda *args: None)

        self.assertTrue(self.executed)
예제 #18
0
    def test_error_deferred_body(self):
        d = defer.Deferred()

        def echo(x):
            d2 = defer.Deferred()

            def cb(result):
                raise IndexError

            reactor.callLater(0, lambda: d2.callback(None))

            d2.addCallback(cb)
            return d2

        p = self.getProcessor({'echo': echo}, expose_request=False)

        request = remoting.Request('echo', envelope=remoting.Envelope())
        request.body = ['a']

        def cb(result):
            self.assertTrue(isinstance(result, remoting.Response))
            self.assertTrue(result.status, remoting.STATUS_ERROR)
            self.assertTrue(isinstance(result.body, remoting.ErrorFault))
            self.assertEqual(result.body.code, 'IndexError')

        return p(request).addCallback(cb).addErrback(lambda x: d.errback())
예제 #19
0
    def test_timezone(self):
        import datetime

        self.executed = False

        td = datetime.timedelta(hours=-5)
        now = datetime.datetime.utcnow()

        def echo(d):
            self.assertEqual(d, now + td)
            self.executed = True

            return d

        gw = django.DjangoGateway({'test.test': echo},
                                  timezone_offset=-18000,
                                  expose_request=False)

        msg = remoting.Envelope(amfVersion=pyamf.AMF0)
        msg['/1'] = remoting.Request(target='test.test', body=[now])

        http_request = make_http_request('POST',
                                         remoting.encode(msg).getvalue())

        res = remoting.decode(gw(http_request).content)
        self.assertTrue(self.executed)

        self.assertEqual(res['/1'].body, now)
예제 #20
0
    def test_deferred_service(self):
        def echo(data):
            x = defer.Deferred()
            reactor.callLater(0, x.callback, data)

            return x

        self.gw.addService(echo)

        env = remoting.Envelope(pyamf.AMF0, pyamf.ClientTypes.Flash9)
        request = remoting.Request('echo', body=['hello'])
        env['/1'] = request

        d = client.getPage("http://127.0.0.1:%d/" % (self.port, ),
                           method="POST",
                           postdata=remoting.encode(env).getvalue())

        def cb(result):
            response = remoting.decode(result)

            self.assertEquals(response.amfVersion, pyamf.AMF0)
            self.assertEquals(response.clientType, pyamf.ClientTypes.Flash9)

            self.assertTrue('/1' in response)
            body_response = response['/1']

            self.assertEquals(body_response.status, remoting.STATUS_OK)
            self.assertEquals(body_response.body, 'hello')

        return d.addCallback(cb)
예제 #21
0
    def test_timezone(self):
        import datetime

        self.executed = False

        td = datetime.timedelta(hours=-5)
        now = datetime.datetime.utcnow()

        def echo(d):
            self.assertEquals(d, now + td)
            self.executed = True

            return d

        self.gw.addService(echo)
        self.gw.timezone_offset = -18000

        msg = remoting.Envelope(amfVersion=pyamf.AMF0, clientType=0)
        msg['/1'] = remoting.Request(target='echo', body=[now])

        stream = remoting.encode(msg)

        d = client.getPage("http://127.0.0.1:%d/" % (self.port, ),
                           method="POST",
                           postdata=stream.getvalue())

        def cb(response):
            envelope = remoting.decode(''.join(response))
            message = envelope['/1']

            self.assertEquals(message.status, remoting.STATUS_OK)
            self.assertEquals(message.body, now)

        return d.addCallback(cb)
예제 #22
0
    def test_encoding_error(self):
        encode = _twisted.remoting.encode

        def force_error(amf_request, context=None):
            raise pyamf.EncodeError

        def echo(request, data):
            return data

        self.gw.addService(echo)

        env = remoting.Envelope(pyamf.AMF0, pyamf.ClientTypes.Flash9)
        request = remoting.Request('echo', body=['hello'])
        env['/1'] = request

        d = client.getPage("http://127.0.0.1:%d/" % (self.port, ),
                           method="POST",
                           postdata=remoting.encode(env).getvalue())

        _twisted.remoting.encode = force_error

        def switch(x):
            _twisted.remoting.encode = encode

        d = self.assertFailure(d, error.Error)

        def check(exc):
            self.assertEquals(int(exc.args[0]), http.INTERNAL_SERVER_ERROR)
            self.assertTrue(
                exc.args[1].startswith('500 Internal Server Error'))

        d.addCallback(check)

        return d.addBoth(switch)
예제 #23
0
 def call(self, cmd, callback=None, error_callback=None, args=[]):
     req = remoting.Request(target=cmd, body=args)
     env = remoting.Envelope(pyamf.AMF0)
     env['/0'] = req
     req_data = remoting.encode(env).getvalue()
     resp = self._session.post(
         self.__url,
         data=req_data,
         headers={'Content-Type': 'application/x-amf'})
     if resp.status_code == 200:
         resp_msg = remoting.decode(resp.content)['/0']
         resp_status = resp_msg.status
         if resp_status == STATUS_OK:
             if callback != None:
                 callback(resp_msg.body)
             return (resp_status, resp_msg.body)
         elif resp_status == STATUS_ERROR:
             if error_callback != None:
                 error_callback(resp_msg.body)
             return (resp_status, resp_msg.body)
         elif resp_status == STATUS_DEBUG:
             print('Amf DEBUG response:')
             print(resp_msg.body)
             return (resp_status, resp_msg.body)
     return (-1, None)
예제 #24
0
    def test_request(self):
        msg = remoting.Envelope(pyamf.AMF0)

        msg['/1'] = remoting.Request('test.test', body=['hello'])

        self.assertEqual(remoting.encode(msg, strict=True).getvalue(),
            '\x00\x00\x00\x00\x00\x01\x00\ttest.test\x00\x02/1\x00\x00\x00'
            '\r\n\x00\x00\x00\x01\x02\x00\x05hello')
예제 #25
0
    def test_response(self):
        msg = remoting.Envelope(pyamf.AMF0)

        msg['/1'] = remoting.Response(['spam'])

        self.assertEqual(remoting.encode(msg, strict=True).getvalue(),
            '\x00\x00\x00\x00\x00\x01\x00\x0b/1/onResult\x00\x04null\x00\x00'
            '\x00\x0c\n\x00\x00\x00\x01\x02\x00\x04spam')
예제 #26
0
    def test_header(self):
        """
        Test encoding of header.
        """
        msg = remoting.Envelope(pyamf.AMF0)

        msg.headers['spam'] = (False, 'eggs')
        self.assertEqual(remoting.encode(msg).getvalue(),
            '\x00\x00\x00\x01\x00\x04spam\x00\x00\x00\x00\x00\n\x00\x00\x00\x02'
            '\x01\x00\x02\x00\x04eggs\x00\x00')

        msg = remoting.Envelope(pyamf.AMF0)

        msg.headers['spam'] = (True, ['a', 'b', 'c'])
        self.assertEqual(remoting.encode(msg).getvalue(),
            '\x00\x00\x00\x01\x00\x04spam\x00\x00\x00\x00\x00\n\x00\x00\x00\x02'
            '\x01\x01\n\x00\x00\x00\x03\x02\x00\x01a\x02\x00\x01b\x02\x00\x01c'
            '\x00\x00')
예제 #27
0
    def test_create(self):
        sw = gateway.ServiceWrapper(TestService)
        request = remoting.Envelope()

        x = gateway.ServiceRequest(request, sw, None)

        self.assertEqual(x.request, request)
        self.assertEqual(x.service, sw)
        self.assertEqual(x.method, None)
예제 #28
0
    def test_request(self):
        msg = remoting.Envelope(pyamf.AMF0, pyamf.ClientTypes.Flash6)

        msg['/1'] = remoting.Request('test.test', body='hello')

        self.assertEquals(
            remoting.encode(msg, strict=True).getvalue(),
            '\x00\x00\x00\x00\x00\x01\x00\ttest.test\x00\x02/1\x00\x00\x00\x08'
            '\x02\x00\x05hello')
예제 #29
0
    def test_stream_pos(self):
        """
        Ensure that the stream pointer is placed at the beginning.
        """
        msg = remoting.Envelope(pyamf.AMF0, pyamf.ClientTypes.Flash6)

        msg['/1'] = remoting.Response(body=[1, 2, 3])

        stream = remoting.encode(msg)
        self.assertEquals(stream.tell(), 0)
예제 #30
0
def build_amf_request(const, playerID, videoPlayer, publisherID):
    env = remoting.Envelope(amfVersion=3)
    env.bodies.append(
        ("/1",
         remoting.Request(
             target=
             "com.brightcove.player.runtime.PlayerMediaFacade.findMediaById",
             body=[const, playerID, videoPlayer, publisherID],
             envelope=env)))
    return env