Пример #1
0
    def tune_to(self, service_id, kbps):
        """
        Tune to `service_id` and redirect to the running stream if possible.
        """
        if kbps < 320:
            kbps = 320
        elif kbps > 2000:
            kbps = 2000
        
        if self.lofi_version or Prefs[PREFS_CLIENT] == 'SAFARI':
            res = self.run_request(URL_TUNE_TO_SAFARI, kbps=kbps, service_id=service_id)
        else:
            res = self.run_request(URL_TUNE_TO_IDEV, kbps=kbps, service_id=service_id)
        
        if not res or not res['success']:
            d = MessageContainer(L('Internal error'), L('Failed to switch channels.'))
            return d
        else:
            # wait until ready
            stream_url = res['m3u8URL']
            res = {1:True}
            Thread.Sleep(1.5) # don't hurry EyeTV..
            while res:
                res = self.run_request(URL_READY)
                if not res:
                    d = MessageContainer(L('Internal error'), L('EyeTV failed to switch channels.'))
                    return d
                if res['isReadyToStream']:
                    if Prefs[PREFS_LAIKA]:
                        live_url = URL_STREAM_DIRECT % {
                                                'service_id' : service_id,
                                                'eyetv_live_host' : Prefs[PREFS_HOST], 
                                                'eyetv_live_port' : Prefs[PREFS_PORT],
                                                'stream_url' : stream_url
                                   }
                        Log.Debug('EyeTVLive: stream is ready, redirecting..: %s' % live_url)

                        # FIXME: Laika fails handling the relative http-livestream,
                        # FIXME: for now we support proxying these requests via
                        # FIXME: /video/eyetv-live/tune/{xxx} - this needs fixing!!
                        Response.Headers['Cache-Control'] = 'no-cache'
                        self.stream_base = '/'.join(stream_url.split('/')[:-1])
                        
                        return Redirect(live_url)
                    else:
                        server = TSStreamServer(False,
                                            URL_STREAM % { 
                                                'service_id' : service_id,
                                                'eyetv_live_host' : Prefs[PREFS_HOST],
                                                'eyetv_live_port' : Prefs[PREFS_PORT]
                                            }, stream_url)
                        if server.kickstart():
                            Response.Headers['Cache-Control'] = 'no-cache'
                            return Redirect('http://127.0.0.1:2171/stream.mpeg')
                        else:
                            d = MessageContainer(L('Internal error'), L('Failed to collect the stream.'))
                            return d
                else:
                    Log.Debug('EyeTVLive: buffering stream (%f/%f)..',
                              res['doneEncoding'], res['minEncodingToStartStreaming'])
                    Thread.Sleep(1)