def action(self, data): if self.scid is None: return url = "%s/Stats" % (sctop.BASE_URL) data.update({'est': self.estimateFinishTime}) data.update({'se': self.se, 'ep': self.ep}) try: if self.itemDuration > 0: data.update({'dur': self.itemDuration}) except Exception: pass self.log("[SC] action: %s" % str(data)) util.post_json(url, data, {'X-UID': sctop.uid})
def resolve(url): m = _regex(url) if m: util.init_urllib() data = util.request(url) if data.find('Toto video neexistuje') > 0: util.error('Video bylo smazano ze serveru') return player = 'http://www.streamuj.tv/new-flash-player/mplugin4.swf' headers = {'User-Agent':'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0', 'Referer':'http://www.streamuj.tv/mediaplayer/player.swf', 'Cookie':','.join("%s=%s"%(c.name, c.value) for c in util._cookie_jar)} burl = b64decode('aHR0cDovL2Z1LWNlY2gucmhjbG91ZC5jb20vcGF1dGg=') key = util.request('http://www.streamuj.tv/_key.php?auth=3C27f5wk6qB3g7nZ5SDYf7P7k1572rFH1QxV0QQ') index = 0 result = [] qualities = re.search('rn\:[^\"]*\"([^\"]*)',data,re.IGNORECASE|re.DOTALL) langs = re.search('langs\:[^\"]*\"([^\"]+)',data,re.IGNORECASE|re.DOTALL) languages = [] if not langs: languages = [''] # pretend there is at least language so we read 1st stream info else: languages = langs.group(1).split(',') for lang in languages: streams = re.search('res'+str(index)+'\:[^\"]*\"([^\"]+)',data,re.IGNORECASE|re.DOTALL) subs = re.search('sub'+str(index)+'\:[^\"]*\"([^\"]+)',data,re.IGNORECASE|re.DOTALL) if subs: subs = re.search('[^>]+>([^$]+)',subs.group(1),re.IGNORECASE|re.DOTALL) if streams and qualities: streams = streams.group(1).split(',') rn = qualities.group(1).split(',') qindex = 0 for stream in streams: res = json.loads(util.post_json(burl,{'link':stream,'player':player,'key':key})) stream = res['link'] q = rn[qindex] if q == 'HD': q = '720p' else: q = 'SD' l = ' '+lang if subs: l += ' + subs' s = subs.group(1) s = json.loads(util.post_json(burl,{'link':s,'player':player, 'key':key})) result.append({'url':stream,'quality':q,'subs':s['link'],'headers':headers,'lang':l}) else: result.append({'url':stream,'quality':q,'headers':headers, 'lang':l}) qindex+=1 index+=1 return result
def sendStats(self, item, action, baseUrl, apiVer, deviceId): #send data to server about watching movie #sclog.logDebug('Stats start...') udata = self.userData() urlStats = baseUrl + '/Stats?ver='+apiVer+'&uid='+deviceId dur = float(item['duration']) brate = int(item['bitrate']) ep = '' se = '' if 'episode' in item: ep = str(item['episode']) if 'season' in item: se = str(item['season']) now = datetime.datetime.now() endIn = now + datetime.timedelta(seconds=int(dur)) endStr = endIn.strftime('%H:%M:%S') data = { 'vip':udata.isVip, 'vd': udata.vipDaysLeft, 'est':endStr, 'scid':str(item['id']), 'action': action, 'ws':udata.userId, 'dur':dur, 'bitrate':brate, 'ep':ep, 'se':se } #sclog.logDebug('data=%'%data) headers = {'Content-Type':'application/json', 'X-Uid':deviceId} response = util.post_json(urlStats, data, headers) sclog.logDebug('Stats(%s)=%s'%(item['id'], response)) return udata
def mark_as_watched(self, item): mediatype= self.getItemType(item) postdata = {} if mediatype==1: postdata = {"movies": [{"ids": self.getTraktIds(item)}]} if mediatype==2: postdata = {'shows':[{'ids':self.getTraktIds(item)}]} if mediatype==3: postdata = {'shows':[{'seasons':[{'number':int('%s'%item['season'])}], 'ids':self.getTraktIds(item)}]} if mediatype==4: postdata = {'shows':[{'seasons':[{'episodes':[{'number':int('%s'%item['episode'])}], 'number':int('%s'%item['season'])}], 'ids':self.getTraktIds(item)}]} self.log.logDebug("mark_as_watched postdata=%s"%postdata) data = json.loads(util.post_json(self.API+'/sync/history', data=postdata, headers={'Content-Type':'application/json', 'Authorization':'Bearer %s'%self.TOKEN, 'trakt-api-version':self.API_VERSION, 'trakt-api-key':self.CLIENT_ID})) self.log.logDebug("mark_as_watched response:\n%s"%data) if mediatype==1: if int(data['added']['movies'])!=1: raise Exception('Movie item not mark as watched.') if mediatype==2 or mediatype==3: if int(data['added']['episodes'])<1: raise Exception('TvShow (season) not mark as watched.') if mediatype==4: if int(data['added']['episodes'])!=1: raise Exception('TvShow episode not mark as watched.')
def remove_from_watchlist(self, item): mediatype = self.getItemType(item) postdata = {} if mediatype == 1: postdata = {"movies": [{"ids": self.getTraktIds(item)}]} # to watchlist can be added only whole tvseason if mediatype == 2 or mediatype == 3 or mediatype == 4: postdata = {'shows': [{'ids': self.getTraktIds(item)}]} data = json.loads( util.post_json(self.API + '/sync/watchlist/remove', data=postdata, headers={ 'Content-Type': 'application/json', 'Authorization': 'Bearer %s' % self.TOKEN, 'trakt-api-version': self.API_VERSION, 'trakt-api-key': self.CLIENT_ID })) self.log.logDebug("remove_from_watchlist response:\n%s" % data) if mediatype == 1: if int(data['deleted']['movies']) != 1: raise Exception('Movie item not removed from watchlist.') if mediatype == 2 or mediatype == 3 or mediatype == 4: if int(data['deleted']['shows']) != 1: raise Exception('TvShow item not removed from watchlist.')
def get_token(self, code): try: data = json.loads( util.post_json(self.API_AUTH + '/token', data={ 'code': code, 'client_id': self.CLIENT_ID, 'client_secret': self.CLIENT_SECRET }, headers={'Content-Type': 'application/json'})) self.TOKEN = data['access_token'] self.REFRESH_TOKEN = data['refresh_token'] expire = data['expires_in'] #seconds created = data['created_at'] self.EXPIRE = expire + created self.log.logDebug("Get token return token=%s, rtoken=%s, exp=%s" % (self.TOKEN, self.REFRESH_TOKEN, self.EXPIRE)) #update settings self.writeSetting('trakt_token', '%s' % self.TOKEN) self.writeSetting('trakt_refresh_token', '%s' % self.REFRESH_TOKEN) self.writeSetting('trakt_token_expire', '%s' % self.EXPIRE) except urllib2.HTTPError as err: return None return self.TOKEN
def refresh_token(self, redirect_uri='urn:ietf:wg:oauth:2.0:oob', grant_type='refresh_token'): data = json.loads( util.post_json(self.API + '/oauth/token', data={ 'refresh_token': self.REFRESH_TOKEN, 'client_id': self.CLIENT_ID, 'client_secret': self.CLIENT_SECRET, 'redirect_uri': redirect_uri, 'grant_type': grant_type }, headers={'Content-Type': 'application/json'})) self.TOKEN = data['access_token'] self.REFRESH_TOKEN = data['refresh_token'] expire = data['expires_in'] #seconds created = data['created_at'] self.EXPIRE = expire + created #update settings self.writeSetting('trakt_token', '%s' % self.TOKEN) self.writeSetting('trakt_refresh_token', '%s' % self.TOKEN) self.writeSetting('trakt_token_expire', '%s' % self.EXPIRE)
def list(self, url): if url.find("#fm#") == 0: return self.list_folder(url[5:]) url = self._url(url) page = util.request( url, headers={"X-Requested-With": "XMLHttpRequest", "Referer": url, "Cookie": "uloz-to-id=1561277170;"} ) script = util.substr(page, "var kn", "</script>") keymap = None key = None k = re.search('{([^\;]+)"', script, re.IGNORECASE | re.DOTALL) if k: keymap = json.loads("{" + k.group(1) + '"}') j = re.search('kapp\(kn\["([^"]+)"', script, re.IGNORECASE | re.DOTALL) if j: key = j.group(1) if not (j and k): self.error("error parsing page - unable to locate keys") return [] burl = b64decode("I2h0dHA6Ly9kZWNyLWNlY2gucmhjbG91ZC5jb20vZGVjcnlwdC8/a2V5PSVzJnZhbHVlPSVz") murl = b64decode("aHR0cDovL2RlY3ItY2VjaC5yaGNsb3VkLmNvbS9kZWNyeXB0Lw==") data = util.substr(page, '<ul class="chessFiles', "</ul>") result = [] req = {"seed": keymap[key], "values": keymap} decr = json.loads(util.post_json(murl, req)) for li in re.finditer('<li data-icon="(?P<key>[^"]+)', data, re.IGNORECASE | re.DOTALL): body = urllib.unquote(b64decode(decr[li.group("key")])) m = re.search( '<li>.+?<div data-icon="(?P<key>[^"]+)[^<]+<img(.+?)src="(?P<logo>[^"]+)(.+?)<div class="fileInfo(?P<info>.+?)</h4>', body, re.IGNORECASE | re.DOTALL, ) if not m: continue value = keymap[m.group("key")] info = m.group("info") iurl = burl % (keymap[key], value) item = self.video_item() item["title"] = ".. title not found.." title = re.search('<div class="fileName.+?<a[^>]+>(?P<title>[^<]+)', info, re.IGNORECASE | re.DOTALL) if title: item["title"] = title.group("title") size = re.search('<span class="fileSize[^>]+>(?P<size>[^<]+)', info, re.IGNORECASE | re.DOTALL) if size: item["size"] = size.group("size").strip() time = re.search('<span class="fileTime[^>]+>(?P<time>[^<]+)', info, re.IGNORECASE | re.DOTALL) if time: item["length"] = time.group("time") item["url"] = iurl item["img"] = m.group("logo") self._filter(result, item) # page navigation data = util.substr(page, '<div class="paginator', "</div") mnext = re.search('<a href="(?P<url>[^"]+)" class="next', data) if mnext: item = self.dir_item() item["type"] = "next" item["url"] = mnext.group("url") result.append(item) return result
def refresh_token(self, redirect_uri='urn:ietf:wg:oauth:2.0:oob', grant_type='refresh_token'): try: data = json.loads( util.post_json(self.API + '/oauth/token', data={ 'refresh_token': self.REFRESH_TOKEN, 'client_id': self.CLIENT_ID, 'client_secret': self.CLIENT_SECRET, 'redirect_uri': redirect_uri, 'grant_type': grant_type }, headers={'Content-Type': 'application/json'})) self.TOKEN = data['access_token'] self.REFRESH_TOKEN = data['refresh_token'] expire = data['expires_in'] #seconds created = data['created_at'] self.EXPIRE = expire + created #update settings self.writeSetting('trakt_token', '%s' % self.TOKEN) self.writeSetting('trakt_refresh_token', '%s' % self.REFRESH_TOKEN) self.writeSetting('trakt_token_expire', '%s' % self.EXPIRE) except urllib2.HTTPError as err: if err.code == 401: raise TraktRefreshException( 'Refresh trakt access token failed (reset settings).') raise err except: raise
def resolve(url): m = _regex(url) if m: data = util.request(url) if data.find('Toto video neexistuje') > 0: util.error('Video bylo smazano ze serveru') return player = 'http://www.streamuj.tv/new-flash-player/mplugin4.swf' headers = {'User-Agent':'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0', 'Referer':'http://www.streamuj.tv/mediaplayer/player.swf'} burl = b64decode('aHR0cDovL2Z1LWNlY2gucmhjbG91ZC5jb20vcGF1dGg=') key = util.request('http://www.streamuj.tv/_key.php?auth=3C27f5wk6qB3g7nZ5SDYf7P7k1572rFH1QxV0QQ') index = 0 result = [] qualities = re.search('rn\:[^\"]*\"([^\"]*)',data,re.IGNORECASE|re.DOTALL) langs = re.search('langs\:[^\"]*\"([^\"]+)',data,re.IGNORECASE|re.DOTALL) for lang in langs.group(1).split(','): streams = re.search('res'+str(index)+'\:[^\"]*\"([^\"]+)',data,re.IGNORECASE|re.DOTALL) subs = re.search('sub'+str(index)+'\:[^\"]*\"([^\"]+)',data,re.IGNORECASE|re.DOTALL) if subs: subs = re.search('[^>]+>([^$]+)',subs.group(1),re.IGNORECASE|re.DOTALL) if streams and qualities: streams = streams.group(1).split(',') rn = qualities.group(1).split(',') qindex = 0 for stream in streams: res = json.loads(util.post_json(burl,{'link':stream,'player':player,'key':key})) stream = res['link'] q = rn[qindex] if q == 'HD': q = '720p' else: q = 'SD' l = ' '+lang if subs: l += ' + subs' s = subs.group(1) s = json.loads(util.post_json(burl,{'link':s,'player':player, 'key':key})) result.append({'url':stream,'quality':q,'subs':s['link'],'headers':headers,'lang':l}) else: result.append({'url':stream,'quality':q,'headers':headers, 'lang':l}) qindex+=1 index+=1 return result
def list(self,url): if url.find('#fm#') == 0: return self.list_folder(url[5:]) url = self._url(url) page = util.request(url,headers={'X-Requested-With':'XMLHttpRequest','Referer':url,'Cookie':'uloz-to-id=1561277170;'}) script = util.substr(page,'var kn','</script>') keymap = None key = None k = re.search('{([^\;]+)"',script,re.IGNORECASE | re.DOTALL) if k: keymap = json.loads("{"+k.group(1)+"\"}") j = re.search('kapp\(kn\[\"([^\"]+)"',script,re.IGNORECASE | re.DOTALL) if j: key = j.group(1) if not (j and k): self.error('error parsing page - unable to locate keys') return [] burl = b64decode('I2h0dHA6Ly9jcnlwdG8uamV6em92by5uZXQvZGVjcnlwdC8/a2V5PSVzJnZhbHVlPSVzCg==') murl = b64decode('aHR0cDovL2NyeXB0by5qZXp6b3ZvLm5ldC9kZWNyeXB0Lwo=') murl = 'http://crypto.jezzovo.net/decrypt/' data = util.substr(page,'<ul class=\"chessFiles','</ul>') result = [] req = {'seed':keymap[key],'values':keymap} decr = json.loads(util.post_json(murl,req)) for li in re.finditer('<li data-icon=\"(?P<key>[^\"]+)',data, re.IGNORECASE | re.DOTALL): body = urllib.unquote(b64decode(decr[li.group('key')])) m = re.search('<li>.+?<div data-icon=\"(?P<key>[^\"]+)[^<]+<img(.+?)src=\"(?P<logo>[^\"]+)(.+?)<div class=\"fileInfo(?P<info>.+?)</h4>',body, re.IGNORECASE | re.DOTALL) if not m: continue value = keymap[m.group('key')] info = m.group('info') iurl = burl % (keymap[key],value) item = self.video_item() item['title'] = '.. title not found..' title = re.search('<div class=\"fileName.+?<a[^>]+>(?P<title>[^<]+)',info, re.IGNORECASE|re.DOTALL) if title: item['title'] = title.group('title') size = re.search('<span class=\"fileSize[^>]+>(?P<size>[^<]+)',info, re.IGNORECASE|re.DOTALL) if size: item['size'] = size.group('size').strip() time = re.search('<span class=\"fileTime[^>]+>(?P<time>[^<]+)',info, re.IGNORECASE|re.DOTALL) if time: item['length'] = time.group('time') item['url'] = iurl item['img'] = m.group('logo') self._filter(result,item) # page navigation data = util.substr(page,'<div class=\"paginator','</div') mnext = re.search('<a href=\"(?P<url>[^\"]+)\" class="next',data) if mnext: item = self.dir_item() item['type'] = 'next' item['url'] = mnext.group('url') result.append(item) return result
def getTrakt(url, post=None): try: url = urlparse.urljoin('http://api.trakt.tv', url) headers = {'trakt-api-key': sctop.trCL, 'trakt-api-version': '2'} if getTraktCredentialsInfo() == False: util.debug("[SC] gt 1 data: %s %s" % (str(url), str(post))) if post is not None: result = util.post_json(url, post, headers) else: result = util.request(url, headers) util.debug("[SC] gt 1 result: %s" % str(result)) return result headers['Authorization'] = 'Bearer %s' % sctop.getSetting( 'trakt.token') #util.debug('[SC] token %s' % sctop.getSetting('trakt.token')) if post is not None: result, code = sctop.post_json(url, post, headers, "extend") else: result, code = sctop.request(url, headers, "extend") #util.debug("[SC] trakt gt result: %s %s" % (str(result), str(code))) if not (code == 401 or code == 405): return result oauth = 'http://api.trakt.tv/oauth/token' opost = { 'client_id': sctop.trCL, 'client_secret': sctop.trSC, 'redirect_uri': 'urn:ietf:wg:oauth:2.0:oob', 'grant_type': 'refresh_token', 'refresh_token': sctop.getSetting('trakt.refresh') } result, code = sctop.post_json(oauth, opost, headers, "extend") if code == 401: authTrakt() result, code = sctop.post_json(oauth, opost, headers, "extend") result = json.loads(result) token, refresh = result['access_token'], result['refresh_token'] sctop.setSetting(id='trakt.token', value=token) sctop.setSetting(id='trakt.refresh', value=refresh) headers['Authorization'] = 'Bearer %s' % token util.debug('[SC] token: %s' % token) result = sctop.post_json(url, post, headers) return result except Exception as e: util.error(e) pass
def get_device_code(self): self.log.logDebug('get device URL='+self.API_AUTH+'/code') data = json.loads(util.post_json(self.API_AUTH+'/code', data={'client_id':self.CLIENT_ID}, headers={'Content-Type':'application/json'})) interval = data['interval'] #seconds expire = data['expires_in'] #seconds verUrl = data['verification_url'] devCode = data['device_code'] userCode = data['user_code'] tryies = expire/interval return devCode, verUrl, userCode, interval
def list(self,url): if url.find('#fm#') == 0: return self.list_folder(url[5:]) url = self._url(url) page = util.request(url,headers={'X-Requested-With':'XMLHttpRequest','Referer':url,'Cookie':'uloz-to-id=1561277170;'}).decode('string-escape') script = util.substr(page,'var kn','</script>') keymap = None key = None k = re.search(r'({.+?})',script) if k: keymap = util.json.loads(k.group(1)) j = re.search(r'ad.push\(\[kn, kn\["([^"]+)', script) if j: key = j.group(1) if not (j and k): self.error('error parsing page - unable to locate keys') return [] burl = b64decode('I2h0dHA6Ly9kZWNyLWNlY2gucmhjbG91ZC5jb20vZGVjcnlwdC8/a2V5PSVzJnZhbHVlPSVz') murl = b64decode('aHR0cDovL2RlY3ItY2VjaC5yaGNsb3VkLmNvbS9kZWNyeXB0Lw==') result = [] req = {'seed':keymap[key],'values':keymap} decr = json.loads(util.post_json(murl,req)) for li in re.finditer('<div data-icon=\"(?P<key>[^\"]+)',page, re.IGNORECASE | re.DOTALL): body = urllib.unquote(b64decode(decr[li.group('key')])) div_name = util.substr(body, '<div class="name"', '</div>') title_url_match = re.search(r'<a href="(?P<url>[^"]+)" title="(?P<title>[^"]+)', div_name) if not title_url_match: continue item = self.video_item() item['title'] = title_url_match.group('title') item['url'] = title_url_match.group('url') div_media = util.substr(body, 'div class="media"', '<div class="tools">') img_match = re.search(r'img src="([^"]+)', div_media) if img_match: item['img'] = "http:" + img_match.group(1) time_match = re.search(r'<span>Čas</span>(.+)', div_media) if time_match: item['length'] = time_match.group(1).strip() size_match = re.search(r'<span>Velikost</span>([^<]+)', div_media) if size_match: item['size'] = size_match.group(1).strip() self._filter(result,item) # page navigation data = util.substr(page,'<div class=\"paginator','</div') mnext = re.search('<a href=\"(?P<url>[^\"]+)\" class="next',data) if mnext: item = self.dir_item() item['type'] = 'next' item['url'] = util.decode_html(mnext.group('url')) result.append(item) return result
def mark_as_watched(self, item): mediatype = self.getItemType(item) postdata = {} if mediatype == 1: postdata = {"movies": [{"ids": self.getTraktIds(item)}]} if mediatype == 2: postdata = {'shows': [{'ids': self.getTraktIds(item)}]} if mediatype == 3: postdata = { 'shows': [{ 'seasons': [{ 'number': int('%s' % item['season']) }], 'ids': self.getTraktIds(item) }] } if mediatype == 4: postdata = { 'shows': [{ 'seasons': [{ 'episodes': [{ 'number': int('%s' % item['episode']) }], 'number': int('%s' % item['season']) }], 'ids': self.getTraktIds(item) }] } self.log.logDebug("mark_as_watched postdata=%s" % postdata) data = json.loads( util.post_json(self.API + '/sync/history', data=postdata, headers={ 'Content-Type': 'application/json', 'Authorization': 'Bearer %s' % self.TOKEN, 'trakt-api-version': self.API_VERSION, 'trakt-api-key': self.CLIENT_ID })) self.log.logDebug("mark_as_watched response:\n%s" % data) if mediatype == 1: if int(data['added']['movies']) != 1: raise Exception('Movie item not mark as watched.') if mediatype == 2 or mediatype == 3: if int(data['added']['episodes']) < 1: raise Exception('TvShow (season) not mark as watched.') if mediatype == 4: if int(data['added']['episodes']) != 1: raise Exception('TvShow episode not mark as watched.')
def get_device_code(self): self.log.logDebug('get device URL=' + self.API_AUTH + '/code') data = json.loads( util.post_json(self.API_AUTH + '/code', data={'client_id': self.CLIENT_ID}, headers={'Content-Type': 'application/json'})) interval = data['interval'] #seconds expire = data['expires_in'] #seconds verUrl = data['verification_url'] devCode = data['device_code'] userCode = data['user_code'] tryies = expire / interval return devCode, verUrl, userCode, interval
def remove_from_watchlist(self, item): mediatype= self.getItemType(item) postdata = {} if mediatype==1: postdata = {"movies": [{"ids": self.getTraktIds(item)}]} # to watchlist can be added only whole tvseason if mediatype==2 or mediatype==3 or mediatype==4: postdata = {'shows':[{'ids': self.getTraktIds(item)}]} data = json.loads(util.post_json(self.API+'/sync/watchlist/remove', data=postdata, headers={'Content-Type':'application/json', 'Authorization':'Bearer %s'%self.TOKEN, 'trakt-api-version':self.API_VERSION, 'trakt-api-key':self.CLIENT_ID})) self.log.logDebug("remove_from_watchlist response:\n%s"%data) if mediatype==1: if int(data['deleted']['movies'])!=1: raise Exception('Movie item not removed from watchlist.') if mediatype==2 or mediatype==3 or mediatype==4: if int(data['deleted']['shows'])!=1: raise Exception('TvShow item not removed from watchlist.')
def get_token(self, code): try: data = json.loads(util.post_json(self.API_AUTH+'/token', data={'code':code,'client_id':self.CLIENT_ID, 'client_secret':self.CLIENT_SECRET}, headers={'Content-Type':'application/json'})) self.TOKEN = data['access_token'] self.REFRESH_TOKEN = data['refresh_token'] expire = data['expires_in'] #seconds created = data['created_at'] self.EXPIRE = expire+created self.log.logDebug("Get token return token=%s, rtoken=%s, exp=%s"%(self.TOKEN, self.REFRESH_TOKEN, self.EXPIRE)) #update settings self.writeSetting('trakt_token', '%s'%self.TOKEN) self.writeSetting('trakt_refresh_token', '%s'%self.REFRESH_TOKEN) self.writeSetting('trakt_token_expire', '%s'%self.EXPIRE) except urllib2.HTTPError as err: return None return self.TOKEN
def refresh_token(self, redirect_uri='urn:ietf:wg:oauth:2.0:oob', grant_type='refresh_token'): try: data = json.loads(util.post_json(self.API+'/oauth/token', data={'refresh_token':self.REFRESH_TOKEN, 'client_id':self.CLIENT_ID, 'client_secret':self.CLIENT_SECRET, 'redirect_uri':redirect_uri, 'grant_type':grant_type}, headers={'Content-Type':'application/json'})) self.TOKEN = data['access_token'] self.REFRESH_TOKEN = data['refresh_token'] expire = data['expires_in'] #seconds created = data['created_at'] self.EXPIRE = expire+created #update settings self.writeSetting('trakt_token', '%s'%self.TOKEN) self.writeSetting('trakt_refresh_token', '%s'%self.REFRESH_TOKEN) self.writeSetting('trakt_token_expire', '%s'%self.EXPIRE) except urllib2.HTTPError as err: if err.code == 401: raise TraktRefreshException('Refresh trakt access token failed (reset settings).') raise err except: raise
def upload_meta(ctx, fname, version): """Upload metadata from a list of records in a json input file. If a record exists already is updated, otherwise creates a new one. If "version" option is passed, creates a new version for record. Parameters ---------- ctx: dict Click context obj including api information fname: str Input json filename containing records to upload version: bool, optional If True create a new version for any existing records in list Returns ------- """ token = ctx.obj['token'] zen_log = ctx.obj['log'] zen_log.info(f"Uploading metadata from {fname} to {ctx.obj['portal']}," + f" production: {ctx.obj['production']}") # read data from input json file and process plans in file data = read_json(fname) # process data for each plan and post records returned by process_plan() for plan in data: if ctx.obj['portal'] == 'zenodo': zen_log.info(plan['metadata']['title']) record = process_zenodo_plan(plan, ctx.obj['community_id']) else: zen_log.info(plan['title']) record = process_invenio_plan(plan) r = post_json(ctx.obj['url'], token, record, zen_log) zen_log.debug(f"Request: {r.request}") zen_log.debug(f"Request url: {r.url}") zen_log.info(r.status_code) return
def getTrakt(url, post=None, output='content', method=None): try: use_ssl = sctop.getSettingAsBool('UseSSL') url = urlparse.urljoin( 'http%s://api.trakt.tv' % ('s' if use_ssl else ''), url) headers = {'trakt-api-key': sctop.trCL, 'trakt-api-version': '2'} if getTraktCredentialsInfo() == False: util.debug("[SC] gt 1 data: %s %s" % (str(url), str(post))) if post is not None: result = util.post_json(url, post, headers) else: result = util.request(url, headers) util.debug("[SC] gt 1 result: %s" % str(result)) return result headers[ 'Authorization'] = 'Bearer %s' % sctop.getSetting('trakt.token') #util.debug('[SC] token %s' % sctop.getSetting('trakt.token')) if post is not None: result, code = sctop.post_json(url, post, headers, "extend") info = None else: result, code, info = sctop.request( url, headers, "info", method=method) #util.debug("[SC] trakt gt result: %s %s" % (str(result), str(code))) if not (code == 401 or code == 405): if output == "content": return result else: return (result, code, info) oauth = 'http%s://api.trakt.tv/oauth/token' % ('s' if use_ssl else '') opost = { 'client_id': sctop.trCL, 'client_secret': sctop.trSC, 'redirect_uri': 'urn:ietf:wg:oauth:2.0:oob', 'grant_type': 'refresh_token', 'refresh_token': sctop.getSetting('trakt.refresh') } result, code = sctop.post_json(oauth, opost, headers, "extend") if code == 401: authTrakt() result, code = sctop.post_json(oauth, opost, headers, "extend") result = json.loads(result) token, refresh = result['access_token'], result['refresh_token'] sctop.setSetting(setting='trakt.token', value=token) sctop.setSetting(setting='trakt.refresh', value=refresh) headers['Authorization'] = 'Bearer %s' % token util.debug('[SC] token: %s' % token) result = sctop.post_json(url, post, headers) return result except Exception as e: util.error(e) pass
def resolve(url): m = _regex(url) if m: cookies = cookielib.LWPCookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies)) player = 'http://www.streamuj.tv/new-flash-player/mplugin4.swf' headers = { 'User-Agent': util.UA, 'Referer': 'http://www.streamuj.tv/mediaplayer/player.swf' } data = request(opener, url, headers) if data.find('Toto video neexistuje') > 0: util.error('Video bylo smazano ze serveru') return burl = b64decode('aHR0cDovL2Z1LWNlY2gucmhjbG91ZC5jb20vcGF1dGg=') key = request( opener, 'http://www.streamuj.tv/_key.php?auth=3C27f5wk6qB3g7nZ5SDYf7P7k1572rFH1QxV0QQ', headers) index = 0 result = [] qualities = re.search('rn\:[^\"]*\"([^\"]*)', data, re.IGNORECASE | re.DOTALL) langs = re.search('langs\:[^\"]*\"([^\"]+)', data, re.IGNORECASE | re.DOTALL) languages = [] if not langs: languages = [ '' ] # pretend there is at least language so we read 1st stream info else: languages = langs.group(1).split(',') for lang in languages: streams = re.search('res' + str(index) + '\:[^\"]*\"([^\"]+)', data, re.IGNORECASE | re.DOTALL) subs = re.search('sub' + str(index) + '\:[^\"]*\"([^\"]+)', data, re.IGNORECASE | re.DOTALL) if subs: subs = re.search('[^>]+>([^,$]+)', subs.group(1), re.IGNORECASE | re.DOTALL) if streams and qualities: streams = streams.group(1).split(',') rn = qualities.group(1).split(',') qindex = 0 for stream in streams: res = json.loads( util.post_json(burl, { 'link': stream, 'player': player, 'key': key })) req = urllib2.Request(res['link'], headers=headers) print 'resolve - link = %s' % res['link'] try: resp = opener.open(req) #print "content-length = %s" %resp.info().getheader("Content-Length") #print "stream url = %s"% resp.geturl() if int(resp.info().getheader("Content-Length")) < 2000: stream = resp.read() else: stream = resp.geturl() except Exception as e: print 'skipping %s: %s' % (res['link'], e) continue #print 'resolve - final url = %s'% stream resp.close() q = rn[qindex] if q == 'HD': q = '720p' else: q = 'SD' l = ' ' + lang if subs: l += ' + subs' s = subs.group(1) s = json.loads( util.post_json(burl, { 'link': s, 'player': player, 'key': key })) cookie_header = ",".join("%s=%s" % (c.name, c.value) for c in cookies) subtitle_headers = {"Cookie": cookie_header} subtitle_headers.update(headers) result.append({ 'url': stream, 'quality': q, 'subs': s['link'], 'headers': subtitle_headers, 'lang': l }) else: result.append({ 'url': stream, 'quality': q, 'headers': headers, 'lang': l }) qindex += 1 index += 1 return result
terminate_process() p = None remove_dir(dir_path) post_state = cmd elif cmd.startswith('restart:'): if is_process_alive(): terminate_process() p = None if os.path.exists(dir_path): p = start_run_process() post_state = 'restart' elif cmd == '' and not is_process_alive(): post_state = 'stopped' if p is None and last_cmd != 't:': #Troy has just started if os.path.exists(dir_path): p = start_run_process() post_state = 'auto_restart' if cmd != '': last_cmd = cmd print 'beeping' if post_state == 'stopped' else post_state if post_state == 'beeping' and is_process_alive(): post_state = 'running' util.post_json(HTTP_SERVER + '/client', json.dumps({'client_name': client_name, 'state': post_state})) time.sleep(10) print "main process done"
def resolve(url): m = _regex(url) if m: util.init_urllib() data = util.request(url) if data.find('Toto video neexistuje') > 0: util.error('Video bylo smazano ze serveru') return player = 'http://www.streamuj.tv/new-flash-player/mplugin4.swf' headers = { 'User-Agent': util.UA, 'Referer': 'http://www.streamuj.tv/mediaplayer/player.swf', 'Cookie': ','.join("%s=%s" % (c.name, c.value) for c in util._cookie_jar) } burl = b64decode('aHR0cDovL2Z1LWNlY2gucmhjbG91ZC5jb20vcGF1dGg=') key = util.request( 'http://www.streamuj.tv/_key.php?auth=3C27f5wk6qB3g7nZ5SDYf7P7k1572rFH1QxV0QQ' ) index = 0 result = [] qualities = re.search(r'rn\:[^\"]*\"([^\"]*)', data, re.IGNORECASE | re.DOTALL) langs = re.search(r'langs\:[^\"]*\"([^\"]+)', data, re.IGNORECASE | re.DOTALL) languages = [ '' ] # pretend there is at least language so we read 1st stream info if langs: languages = langs.group(1).split(',') for language in languages: streams = re.search( r'res{index}\:[^\"]*\"([^\"]+)'.format(index=index), data, re.IGNORECASE | re.DOTALL) subs = re.search( r'sub{index}\:[^\"]*\"([^\"]+)'.format(index=index), data, re.IGNORECASE | re.DOTALL) if subs: subs = re.search(r'[^>]+>([^,$]+)', subs.group(1), re.IGNORECASE | re.DOTALL) else: subs = None if streams and qualities: streams = streams.group(1).split(',') rn = qualities.group(1).split(',') qindex = 0 for stream in streams: res = json.loads( util.post_json(burl, { 'link': stream, 'player': player, 'key': key })) stream = res['link'] q = rn[qindex] if q == 'HD': q = '720p' else: q = 'SD' item = { 'url': stream, 'quality': q, 'headers': headers, 'lang': language } if subs: link = subs.group(1) response = json.loads( util.post_json(burl, { 'link': link, 'player': player, 'key': key })) if 'link' in response: item['lang'] += ' + subs' item['subs'] = response[u'link'] else: util.error( "Could not fetch subtitles from '{}'".format( link)) util.error("Server response: {}".format(response)) result.append(item) qindex += 1 index += 1 return result
def list(self, url): if url.find('#fm#') == 0: return self.list_folder(url[5:]) url = self._url(url) page = util.request(url, headers={ 'X-Requested-With': 'XMLHttpRequest', 'Referer': url, 'Cookie': 'uloz-to-id=1561277170;' }) script = util.substr(page, 'var kn', '</script>') keymap = None key = None k = re.search('{([^\;]+)"', script, re.IGNORECASE | re.DOTALL) if k: keymap = json.loads("{" + k.group(1) + "\"}") j = re.search('kapp\(kn\[\"([^\"]+)"', script, re.IGNORECASE | re.DOTALL) if j: key = j.group(1) if not (j and k): self.error('error parsing page - unable to locate keys') return [] burl = b64decode( 'I2h0dHA6Ly9kZWNyLWNlY2gucmhjbG91ZC5jb20vZGVjcnlwdC8/a2V5PSVzJnZhbHVlPSVz' ) murl = b64decode( 'aHR0cDovL2RlY3ItY2VjaC5yaGNsb3VkLmNvbS9kZWNyeXB0Lw==') data = util.substr(page, '<ul class=\"chessFiles', 'var kn =') result = [] req = {'seed': keymap[key], 'values': keymap} decr = json.loads(util.post_json(murl, req)) for li in re.finditer('<li data-icon=\"(?P<key>[^\"]+)', data, re.IGNORECASE | re.DOTALL): body = urllib.unquote(b64decode(decr[li.group('key')])) m = re.search( '<li.+?<div data-icon=\"(?P<key>[^\"]+)[^<]+<img(.+?)src=\"(?P<logo>[^\"]+)(.+?)<i class=\"fa fa-download(?P<info>.+?)class="fileReset"', body, re.IGNORECASE | re.DOTALL) if not m: continue value = keymap[m.group('key')] info = m.group('info') iurl = burl % (keymap[key], value) item = self.video_item() item['title'] = '.. title not found..' title = re.search( '<div class=\"fileName.+?<a[^>]+>(?P<title>[^<]+)', info, re.IGNORECASE | re.DOTALL) if title: item['title'] = title.group('title') size = re.search('<span class=\"fileSize[^>]+>(?P<size>[^<]+)', info, re.IGNORECASE | re.DOTALL) if size: item['size'] = size.group('size').strip() time = re.search('<span class=\"fileTime[^>]+>(?P<time>[^<]+)', info, re.IGNORECASE | re.DOTALL) if time: item['length'] = time.group('time') item['url'] = iurl item['img'] = m.group('logo') self._filter(result, item) # page navigation data = util.substr(page, '<div class=\"paginator', '</div') mnext = re.search('<a href=\"(?P<url>[^\"]+)\" class="next', data) if mnext: item = self.dir_item() item['type'] = 'next' item['url'] = mnext.group('url') result.append(item) return result