def do_GET(self): url = self._get_url('GET') response = self._proxy_request('GET', url) manifest = self._session.get('manifest') if self._session.get('redirecting') or not self._session.get( 'type') or not manifest or int( response.headers.get('content-length', 0)) > 1000000: self._output_response(response) return parse = urlparse(self.path.lower()) try: if self._session.get('type') == 'm3u8' and ( url == manifest or parse.path.endswith('.m3u') or parse.path.endswith('.m3u8')): self._parse_m3u8(response) elif self._session.get('type') == 'mpd' and url == manifest: self._session[ 'manifest'] = None #unset manifest url so isn't parsed again self._parse_dash(response) except Exception as e: log.exception(e) if type(e) == Exit: response.status_code = 500 response.stream.content = str(e).encode('utf-8') failed_playback() elif url == manifest: gui.error(_.QUALITY_PARSE_ERROR) self._output_response(response)
def login(self, username, password): self.logout() self._create_session() data = { 'password': password, 'email': username, } data = self._session.post('proxy/login', data=data).json() if data['error']: raise APIError(_(_.LOGIN_ERROR, msg=data['error']['message'])) auth_token = data['result']['newAuthToken'] while True: selected = self._select_device(auth_token) if not selected: return data = { 'password': password, 'deviceId': selected['uniqueDeviceId'], 'email': username, } data = self._session.post('proxy/login', data=data).json() if data['error']: gui.error(data['error']['message']) else: break auth_token = data['result']['newAuthToken'] device_token = data['result']['deviceAuthToken'] userdata.set('device_token', device_token) data = { 'name': selected['name'], 'casDeviceId': selected['uniqueDeviceId'], 'type': selected['type'], } data = self._session.post('proxy/casAuth', data=data, headers={'X-AN-WebService-CustomerAuthToken': auth_token, 'X-AN-WebService-DeviceAuthToken': device_token}).json() if data['error']: raise APIError(data['error']['message']) self._set_auth(data['result']['newAuthToken']) mem_cache.delete('channels') if settings.getEnum('login_type', choices=LOGIN_TYPE, default=LOGIN_MULTI_IP) == LOGIN_PASSWORD: userdata.set('password', password) userdata.set('device_id', selected['uniqueDeviceId'])
def _select_device(self, token): data = self._session.post('proxy/casAvailableDevice', headers={'X-AN-WebService-CustomerAuthToken': token}).json() devices = data['result'].get('device', []) while True: if devices: options = [] values = [] for row in devices: options.append(_(_.DEVICE_LABEL, name=row['name'], last_login=arrow.get(row['lastLoginDate']).to('local').format('D MMMM YYYY'))) values.append(row) options.append(_.NEW_DEVICE) values.append('new') options.append(_.REMOVE_DEVICE) values.append('remove') index = gui.select(_.SELECT_DEVICE, options=options) if index == -1: return selected = values[index] else: selected = 'new' if selected == 'new': device_name = gui.input(_.DEVICE_NAME).strip() if not device_name or not gui.yes_no(_(_.NEW_CONFIRM, device_name=device_name)): if devices: continue else: return return { 'uniqueDeviceId': hash_6('{}{}'.format(int(time.time()), device_name), length=16), 'name': device_name, 'type': 'Android', } elif selected == 'remove': options = [] values = [] for row in devices: options.append(row['name']) values.append(row) to_remove = None while not to_remove: index = gui.select(_.SELECT_REMOVE_DEVICE, options=options) if index == -1: break if gui.yes_no(_(_.REMOVE_CONFIRM, device_name=values[index]['name'])): to_remove = values[index] if not to_remove: continue data = { 'casDeviceId': to_remove['uniqueDeviceId'], } data = self._session.post('proxy/casRemoveDevice', data=data, headers={'X-AN-WebService-CustomerAuthToken': token}).json() if data['error']: gui.error(data['error']['message']) continue return self._select_device(data['result']['newAuthToken']) else: return selected