Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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'])
Ejemplo n.º 3
0
    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