예제 #1
0
 def scroble(self, id, season=None, episode=None, percent=0, action='stop'):
     data = {
         "action": action,
         "progress": float(percent),
         "parse": False,
     }
     if season is not None:
         # ep_info = self.get_episode_info(id, season, episode)
         data.update({
             "show": {
                 "ids": {
                     "trakt": id
                 }
             },
             "episode": {
                 "season": season,
                 "number": episode
             }
         })
     else:
         data.update({"movie": {"ids": {"trakt": id}}})
     with Trakt.configuration.oauth.from_response(self.authorization):
         with Trakt.configuration.http(retry=True):
             debug('scrobble obj: {}'.format(data))
             try:
                 result = Trakt['scrobble'].action(**data).json()
             except:
                 result = None
             return result
     pass
예제 #2
0
 def speedtest(self, isp, ident='15VFNFJrCKHn'):
     kr = Kraska()
     url = kr.resolve(ident)
     smin = 999999999
     smax = 0
     durmin = 999999999
     hosts = ['b01', 's01', 'v01']
     for h in hosts:
         u = re.sub(r':\/\/([^.]+)', '://{}'.format(h), url)
         debug('speedtest URL {}'.format(u))
         s, dur = self.calculate_speed(u)
         debug('speedtest host {} speed: {}'.format(h, convert_bitrate(s)))
         smin = min(s, smin)
         smax = max(s, smax)
         durmin = min(dur, durmin)
         isp.update({h: s})
     debug('min/max {}/{}'.format(convert_bitrate(smin),
                                  convert_bitrate(smax)))
     debug('res: {}'.format(isp))
     try:
         st = Sc.post('/Stats/speedtest', json=isp)
         debug('Speed stats: {}'.format(st))
     except:
         pass
     speed = smin
     settings.set_setting('stream.adv.speedtest', speed)
     settings.set_setting('stream.adv.speedtest.asn', isp.get('a', 'N/A'))
     settings.set_setting('stream.adv.speedtest.last', int(time.time()))
     return (smin, smax, durmin)
예제 #3
0
 def on_authenticated(self, token):
     self.authorization = token
     set_setting('trakt.authorization', dumps(self.authorization))
     debug('TRAKT Authentication complete: %r' % token)
     self.authDialog.close()
     dok('Trakt', 'Autorizacia uspesna')
     self.update_user()
예제 #4
0
    def login(self):
        with Trakt.configuration.http(timeout=90):
            code = Trakt['oauth/device'].code()

            if not code:
                debug('TRAKT Error can not reach trakt')
                dok('ERROR', 'Trakt.tv error')
            else:
                # Construct device authentication poller
                poller = Trakt['oauth/device'].poll(**code) \
                    .on('aborted', self.on_aborted) \
                    .on('authenticated', self.on_authenticated) \
                    .on('expired', self.on_expired) \
                    .on('poll', self.on_poll)

                debug(
                    'TRAKT Enter the code "%s" at %s to authenticate your account'
                    % (code.get('user_code'), code.get('verification_url')))

                self.authDialog = dprogress()
                self.authDialog.create(
                    'Trakt', '{} -> {}'.format(code.get('verification_url'),
                                               code.get('user_code')))

                self.authPollProgress = [
                    float(code.get('expires_in')),
                    float(code.get('interval')), 0
                ]

                # Start polling for authentication token
                poller.start(daemon=False)
예제 #5
0
 def onNotification(self, sender, method, data):
     try:
         self.wsapp.send(method)
     except:
         pass
     logger.debug('[WS] monitor onNotification {} {} {}'.format(
         decode(sender), decode(method), decode(data)))
 def action_csearch(self):
     self.succeeded = True
     self.end_of_directory()
     _id = self.args.get(SC.ITEM_ID)
     home_win.setProperty('SC.search', '{}'.format(_id))
     search = dinput('', '', xbmcgui.INPUT_TYPE_TEXT)
     home_win.clearProperty('SC.search')
     info('search string: {}'.format(search))
     if search == '':
         exec_build_in('Action(Back)')
         return
     query = {'search': search, SC.ITEM_ID: _id}
     if _id.startswith('search-people'):
         query.update({'ms': '1'})
     st = List(_id)
     st.add(search)
     debug('SEARCH: _ID "{}" search for "{}" people "{}"'.format(
         _id, search, 1 if 'ms' in query else 0))
     url = '/Search/{}?{}'.format(_id, urlencode(query))
     info('search url: {}'.format(url))
     self.url = url
     self.call_url()
     if 'msgERROR' in self.response.get('system', {}):
         self.msg_error()
         exec_build_in('Action(Back)')
         return
     plugin_url = create_plugin_url({'url': url})
     container_update(plugin_url)
     return
예제 #7
0
    def add(self, item, remove_only=False):
        # debug('List add {} | {}'.format(item, remove_only))

        if item is None:
            debug('List ignore None item')
            return

        if self.sorted is True and item in self.data \
                or remove_only is True:
            # debug('--- remove {}'.format(item))
            try:
                self.data.remove(item)
            except:
                pass

        if remove_only is False \
                or (self.sorted is False and item not in self.data and remove_only is False):
            self.data.insert(0, item)
            # debug('List insert item')

        if self.max_items:
            remove = len(self.data) - self.max_items
            if remove > 0:
                # debug('List to remove {}'.format(remove))
                for i in range(remove):
                    self.data.pop()
        # debug('List end add {}'.format(self.data))
        self.set(self.data)
 def notify(self, filter):
     return
     try:
         plugin_url = 'plugin://{}/{}'.format(
             ADDON_ID, params.orig_args if params.orig_args else '')
         kv = KodiViewModeDb()
         sort = kv.get_sort(plugin_url)
         if sort is not None:
             j = dumps({
                 'm': sort[0],
                 'o': sort[1],
                 'u': plugin_url,
                 'f': filter
             }).encode()
         else:
             j = dumps({
                 'm': 0,
                 'o': 1,
                 'u': plugin_url,
                 'f': filter
             }).encode()
         from base64 import b64encode
         data = b64encode(j).decode()
         notify(sender=ADDON_ID, message='List.Sort', data=data)
     except:
         debug('notify List.Sort ERR: {}'.format(traceback.format_exc()))
         pass
def clean_textures():
    try:
        from resources.lib.common.storage import TexturesDb
        t = TexturesDb()
        t.clean()
    except:
        debug('player err: {}'.format(traceback.format_exc()))
def isp_ipinfo():
    from resources.lib.system import Http
    r = Http.get('https://ipinfo.io/widget', headers={'referer': 'https://ipinfo.io/'})
    d = r.json()
    debug('isp_ipinfo: {}'.format(r.text))
    asn = d.get('asn', {}).get('asn', 'N/A')
    return {'c': d.get('country', 'N/A'), 'a': asn.replace('AS', '')}
def container_update(url, replace=False):
    if replace:
        debug('containter replace {}'.format(url))
        exec_build_in('Container.Update({},replace)'.format(url))
    else:
        debug('containter update {}'.format(url))
        exec_build_in('Container.Update({})'.format(url))
예제 #12
0
 def __init__(self, args):
     self.args = args
     id = self.args.get(SC.ITEM_ID, ['search'])
     debug('ID: {}'.format(id))
     if id[0] == 'search':
         self.search()
     else:
         self.type()
예제 #13
0
 def set_i18n_art(self):
     i18n = self.data.get(SC.ITEM_I18N_ART)
     lang = SYSTEM_LANG_CODE
     if lang not in i18n:
         debug('jazyk {} nemame, tak nastavujem cs'.format(lang))
         lang = SC.DEFAULT_LANG
     # debug('jazyk {}'.format(lang))
     self.item.setArt(i18n.get(lang))
예제 #14
0
 def i18n_info(self, item_info={}):
     i18n = self.data.get(SC.ITEM_I18N_INFO)
     lang = SYSTEM_LANG_CODE
     if lang not in i18n:
         debug('jazyk {} nemame, tak nastavujem cs'.format(lang))
         lang = SC.DEFAULT_LANG
     item_info.update(i18n.get(lang))
     return item_info
예제 #15
0
    def save_cache(ret, key, ttl=None):
        ttl = 3600 if ttl is None else ttl

        if SC.ITEM_SYSTEM in ret and 'TTL' in ret[SC.ITEM_SYSTEM]:
            ttl = int(ret[SC.ITEM_SYSTEM]['TTL'])

        debug('SAVE TO CACHE {} / {}'.format(ttl, key))
        Sc.cache.set(key, ret, expiration=datetime.timedelta(seconds=ttl))
def get_app_name():
    try:
        data = jsonrpc(method='Application.GetProperties', params=dict(properties=["name"]))
        if "result" in data and "name" in data["result"]:
            return data["result"]["name"]
    except:
        debug('ERR app name: {}'.format(traceback.format_exc()))
        pass
    return "EKodi"
예제 #17
0
 def onAVStarted(self):
     debug('player onAVStarted')
     for i in range(0, 500):
         if self.isPlayback():
             break
         else:
             debug('not playing')
             sleep(1000)
     self.set_item()
 def set_watched_path(self, path, times):
     res = self.get_watched_path(path)
     if res and res[0]:
         # debug('MAME PATH: {}'.find(path))
         sql = 'update files set playcount=? where idfile=?'
         self._db.execute(sql, times, res[0])
     else:
         debug('Nemame PATH: {}'.format(path))
         pass
예제 #19
0
 def on_poll(self, callback):
     debug('TRAKT poll')
     if self.authDialog.iscanceled():
         callback(False)
     else:
         self.authPollProgress[2] += self.authPollProgress[1]
         exp, _, current = self.authPollProgress
         self.authDialog.update(int(current / exp * 100))
         callback(True)
예제 #20
0
 def trakt2sc(self, items, typ):
     debug('items {}'.format(len(items)))
     res = Sc.post('/Ftrakt2sc',
                   data={
                       'trakt': dumps(list(items.keys())),
                       't': typ
                   })
     debug('res: {}'.format(len(res)))
     return res, items
예제 #21
0
 def post(path, **kwargs):
     sorted_values, url = Sc.prepare(path=path, params={})
     start = time.time()
     res = Http.post(url,
                     params=sorted_values,
                     headers=Sc.headers(),
                     **kwargs)
     end = time.time()
     debug('POST took {0:.2f}ms'.format((end - start) * 1000))
     return res.json()
 def call_url(self):
     try:
         if self.payload is not None:
             debug('POST DATA: {}'.format(self.payload))
             self.response = Sc.post(self.url, data=self.payload)
         else:
             self.response = Sc.get(self.url)
     except:
         debug('CALL URL ERR: {}'.format(traceback.format_exc()))
         self.response = {}
 def clean(self):
     zoznam = self.to_clean()
     total = len(zoznam)
     d = dprogressgb()
     d.create('mazanie', 'mazem')
     for pos, i in enumerate(zoznam):
         p = int(pos/total*100)
         debug('item: {}/{} {}'.format(pos, total, TexturesDb.file_name(i)))
         self.remove_item(i)
         d.update(p, 'mazanie', 'mazem {}'.format(i[1]))
     d.close()
예제 #24
0
 def read(self, sock, read_callback, check_callback):
     while self.app.keep_running and not monitor.abortRequested():
         logger.debug('[WS] loop')
         r, w, e = select.select((self.app.sock.sock, ), (), (),
                                 self.ping_timeout)
         if r:
             if not read_callback():
                 break
         check_callback()
     logger.debug('[WS] Koncim....')
     self.app.close(status=websocket.STATUS_PROTOCOL_ERROR)
    def get(self):
        tmp = {}
        for k in self.list._data.items():
            if k[1]['t'] is not None:
                tmp.update({k[0]: k[1]})
            else:
                debug('ERR ITEM: {}'.format(k))

        debug('GET NEXT EP: {}'.format(tmp))
        ret = [k[0] for k in sorted(tmp.items(), key=lambda x: x[1]['t'], reverse=True)]
        return ret
예제 #26
0
def _remove_settings_file():
    try:
        fn = make_legal_filename(
            translate_path(
                "special://profile/addon_data/{}/settings.xml".format(
                    ADDON_ID)))
        debug('REMOVE SETTINGS FILE: {} -> {}'.format(fn, xbmcvfs.exists(fn)))
        if xbmcvfs.exists(fn):
            xbmcvfs.delete(fn)
    except:
        pass
def get_isp():
    for fn in [isp_ipinfo, isp_ipapi, isp_dbip, isp_ipgeolocationioapi]:
        try:
            isp = fn()
            if isp.get('a') is not None:
                debug('*************************************************** ISP: {}'.format(isp))
                return isp
        except:
            debug('ERRO ISP: {}'.format(traceback.format_exc()))

    return None
예제 #28
0
def intro(step=None, credentials_only=False):
    info('Step: {}'.format(step))
    auto_close = 60

    if step is None and get_setting('kraska.user') != '':
        info('Uz nieje treba intro....')
        return
    elif step is None:
        step = 1

    if step == 1:
        start = dyesno(Strings.txt(Strings.INTRO_STEP1_H1),
                       Strings.txt(Strings.INTRO_STEP1_L1),
                       autoclose=auto_close)
        info('RET: [{}] [{}]'.format(start, 'Ano' if start else 'Nie'))
        return intro(step + 1, credentials_only) if start == 1 else 0

    if step == 2:
        user = dinput(Strings.txt(Strings.INTRO_STEP2_H1),
                      get_setting('kraska.user'))
        info(Strings.INTRO_STEP1_H1)
        info(Strings.txt(Strings.INTRO_STEP1_H1))
        info('RET: {}'.format(user))
        settings.set_setting('kraska.user', user)
        if user != settings.get_setting('kraska.user'):
            _remove_settings_file()
            debug('Zmazanie nastaveni')
            return 0

        return intro(step + 1, credentials_only) if user != '' else 0

    if step == 3:
        password = dinput(Strings.txt(Strings.INTRO_STEP3_H1), '')
        info('RET: {}'.format(password))
        settings.set_setting('kraska.pass', password)
        if password != settings.get_setting('kraska.pass'):
            debug('skusam znova zapisat heslo...')
            settings.set_setting('kraska.pass', password)
        kr = Kraska(p=password)
        data = kr.user_info()
        return intro(step +
                     1, credentials_only) if data is False else intro(step + 2)

    if step == 4:
        dok(Strings.txt(Strings.INTRO_STEP4_H1),
            Strings.txt(Strings.INTRO_STEP4_L1))
        return intro(step - 2, credentials_only)

    if step == 5 and credentials_only is False:
        res = dyesno(Strings.txt(Strings.INTRO_STEP5_H1),
                     Strings.txt(Strings.INTRO_STEP5_L1))
        if res:
            open_settings('1.0')
예제 #29
0
    def set_stream_info(self):
        stream_info = self.data.get('stream_info')
        for k, v in enumerate(stream_info):
            self.item.addStreamInfo(
                v, stream_info.get(v)) if v in ['video', 'audio'] else ''

        if 'fvideo' in stream_info:
            debug('FVIDEO: {}'.format(stream_info['fvideo']))
            self.item.setProperty('video', stream_info['fvideo'])

        if 'faudio' in stream_info:
            self.item.setProperty('audio', stream_info['faudio'])
예제 #30
0
    def _set_info(self, item_info):
        if self.debug:
            debug('set_info {}'.format(item_info))
        self.info.update(item_info)
        try:
            if SC.ITEM_TITLE in item_info:
                title = '{}'.format(item_info.get(SC.ITEM_TITLE))
                self.item.setLabel(title)

            if self.data.get('play'):
                if 'otitle' in item_info:
                    item_info.update({SC.ITEM_TITLE: item_info['otitle']})
                    del item_info['otitle']

                if 'epname' in item_info:
                    item_info.update({SC.ITEM_TITLE: item_info['epname']})
                    del item_info['epname']
            else:
                if 'epname' in item_info:
                    del item_info['epname']

                if 'otitle' in item_info:
                    del item_info['otitle']

            for i, e in enumerate(item_info):
                # debug('set info {} {}'.format(i, e))
                self.item.setProperty(e, '{}'.format(item_info[e]))

            if item_info.get('mediatype',
                             '') == 'season' and item_info.get('episode'):
                item = SCKODIItem(self.data.get(SC.ITEM_ID))
                data = item.data
                total_episodes = item_info.get('episode')
                watched = len(
                    data.get('series:{}'.format(item_info.get('season')), {}))
                debug('Mame seriu {} s {}/{} epizodami'.format(
                    item_info.get('season'), watched, total_episodes))
                if watched >= total_episodes:
                    item_info.update({'playcount': '1'})

            self.item.setInfo('video', item_info)
            self.item.setProperty('original_title',
                                  item_info.get('originaltitle'))
            self.info_set = True
        except Exception as e:
            import traceback
            info(
                '-----------------------------------------------------------------'
            )
            info('set info error [{}]'.format(str(traceback.format_exc())))
            info(
                '-----------------------------------------------------------------'
            )