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)