async def __run(self): try: while True: try: await self.__set_status('connection') self.__markets = await self.get_markets() await self._prepare_ws_connection() async with websockets.connect( self._ws_path, extra_headers=self._ws_headers, ) as websocket: self.__ws_socket = websocket self.__clear_channels() await self._ws_auth() await self._subscribe_channels() async for message in websocket: payload = await self._resolve_message(message) if payload is not None: await self.__set_status('connected') await self.__exchanges_buffer.push(payload) except Exception as e: self.__ws_socket = None Logger.log_error(e) finally: await self.__set_status('disconnected') await asyncio.sleep(1) except Exception as e: Logger.log_error(e)
def callBackDialogProgressBar(function_obj, function_args, heading, failure_message=None, line1='Please wait...', line2='Retrieved $current_index of $total_it items', line3='To go back, press the Cancel button'): total_iteration = len(function_args) current_index = 0 ProgressDisplayer().end() pDialog = None if not SUPPRESS_DIALOG_MSG: pDialog = xbmcgui.DialogProgress() pDialog.create(heading, line1, line2.replace('$total_it', str(total_iteration)).replace('$current_index', str(current_index)), line3) pDialog.update(1) Logger.logDebug('Total Iterations = ' + str(total_iteration)) function_returns = [] isCanceled = False for arg in function_args: try: returnedObj = function_obj(arg) if returnedObj is not None and type(returnedObj) is list: function_returns.extend(returnedObj) elif returnedObj is not None: function_returns.append(returnedObj) if not SUPPRESS_DIALOG_MSG and pDialog is not None: current_index = current_index + 1 percent = (current_index * 100) / total_iteration pDialog.update(percent, line1, line2.replace('$total_it', str(total_iteration)).replace('$current_index', str(current_index)), line3) if (pDialog.iscanceled()): isCanceled = True break except Exception, e: if not SUPPRESS_DIALOG_MSG and pDialog is not None and failure_message is not None: pDialog.close() dialog = xbmcgui.Dialog() dialog.ok('[B][COLOR red]FAILED: [/COLOR][/B]Info Retrieval Process', failure_message, 'You may like to try again later or use other source if available') Logger.logFatal(e) raise Exception(ExceptionHandler.DONOT_DISPLAY_ERROR, '') if isCanceled: raise Exception(ExceptionHandler.PROCESS_STOPPED, 'It looks like you don\'t want wait more|Process was stopped in between')
def __assume_tick(self, tick_data): tick = None try: market = self._get_markets().loc[tick_data['params']['symbol']] tick = pd.Series( data=[ self.name, int( datetime.datetime.strptime( tick_data['params']['timestamp'].split('.')[0], '%Y-%m-%dT%H:%M:%S', ).timestamp() * 1000), '_'.join([market.at['base'].lower(), market.at['quot']]), tick_data['params']['last'], ], index=formats.tick, name=datetime.datetime.now(), ) except Exception as e: Logger.log_info(tick_data['params']['timestamp'].split('.')[0]) Logger.log_error(e) finally: return tick
def retieveTrailerStream(request_obj, response_obj): soup = None title = request_obj.get_data()['movieTitle'] if request_obj.get_data().has_key('movieInfo'): soup = BeautifulSoup.BeautifulSoup(request_obj.get_data()['movieInfo']) elif request_obj.get_data().has_key('moviePageUrl'): contentDiv = BeautifulSoup.SoupStrainer('div', {'dir': 'ltr'}) soup = HttpUtils.HttpClient().getBeautifulSoup( url=request_obj.get_data()['moviePageUrl'], parseOnlyThese=contentDiv) if soup is None: return videoLink = None Logger.logDebug(soup.prettify()) frameTag = soup.findChild('iframe', recursive=True) if frameTag is not None: videoLink = frameTag['src'] else: paramTag = soup.findChild('param', attrs={'name': 'movie'}, recursive=True) if paramTag is not None: videoLink = paramTag['value'] else: videoLink = soup.findChild('embed', recursive=True)['src'] request_obj.set_data({'videoLink': videoLink, 'videoTitle': title})
def __assume_tick(self, message): tick = None try: current_date = datetime.datetime.now() tick = pd.Series( data=[ self.name, int(time.mktime(current_date.timetuple())) * 1000, '_'.join([ message['data']['symbol1'].lower(), message['data']['symbol2'].lower(), ]), message['data']['price'], ], index=formats.tick, name=current_date, ) Logger.log_info(tick) except Exception as e: Logger.log_error(e) finally: return tick
async def get_markets(self): markets = pd.DataFrame(data=[], columns=formats.market) try: request_url = 'currency_limits' stock_data = await self.rest_send(request_url) for market_data in stock_data['data']['pairs']: markets = markets.append( pd.Series( data=[ self.name, market_data['symbol1'], market_data['symbol2'], market_data['minLotSize'], market_data['maxLotSize'], ], index=formats.market, name='_'.join( [market_data['symbol1'], market_data['symbol2']]), )) except Exception as e: Logger.log_error(e) finally: return markets
def get_crawl_max_count(): config = MonitorConfig() crawl_max_count = config.get_value('appiumConfig', 'crawl_max_count') Logger.println(f"【crawl_max_count={crawl_max_count}】") if not crawl_max_count: return '100' return crawl_max_count
def retrieveVideoInfo(videoUrl): try: xbmcaddon.Addon('plugin.video.vevo') except: dialog = xbmcgui.Dialog() dialog.ok('[B][COLOR red]MISSING: [/COLOR][/B] VEVO add-on', '', 'Please install VEVO add-on created by BlueCop!', 'Available at http://code.google.com/p/bluecop-xbmc-repo/') raise video_info = VideoInfo() video_info.set_video_hosting_info(getVideoHostingInfo()) video_info.set_video_id(videoUrl) addon_url = 'plugin://plugin.video.vevo/?' vevo_id = videoUrl.split('/')[-1] if videoUrl.startswith('playlist'): url = urllib.quote_plus( 'http://api.vevo.com/mobile/v2/playlist/%s.json?' % vevo_id) addon_url += 'url=%s' % url addon_url += '&mode=playPlaylist' addon_url += '&duration=210' addon_url += '&page=1' video_info.add_video_link(XBMC_EXECUTE_PLUGIN, addon_url, addUserAgent=False, addReferer=False) video_info.set_video_image('') video_info.set_video_name(' ') else: url = 'http://videoplayer.vevo.com/VideoService/AuthenticateVideo?isrc=%s&extended=true' % vevo_id video = json.loads( HttpUtils.HttpClient().getHtmlContent(url=url))['video'] title = '' try: title = video['title'].encode('utf-8') except: title = '' video_image = video['imageUrl'] if len(video['featuredArtists']) > 0: feats = '' for featuredartist in video['featuredArtists']: # featuredartist_image = featuredartist['image_url'] featuredartist_name = featuredartist['artistName'].encode( 'utf-8') feats += featuredartist_name + ', ' feats = feats[:-2] title += ' (ft. ' + feats + ')' addon_url += 'url=%s' % vevo_id addon_url += '&mode=playVideo' addon_url += '&duration=210' video_info.add_video_link(VIDEO_QUAL_SD, addon_url, addUserAgent=False, addReferer=False) video_info.set_video_image(video_image) video_info.set_video_name(title) Logger.logDebug(addon_url) video_info.set_video_stopped(False) return video_info
async def get_markets(self): markets = pd.DataFrame(data=[], columns=formats.market) try: request_url = 'symbols_details' stock_data = await self.rest_send(request_url) for market_data in stock_data: markets = markets.append( pd.Series( data=[ self.name, market_data['pair'].lower()[:3], market_data['pair'].lower()[3:], market_data['minimum_order_size'], market_data['maximum_order_size'], ], index=formats.market, name=market_data['pair'].lower(), )) except Exception as e: Logger.log_error(e) finally: return markets
def retrieveVideoInfo(video_id): video_info = VideoInfo() video_info.set_video_hosting_info(getVideoHostingInfo()) video_info.set_video_id(video_id) try: video_info_link = 'http://movzap.com/' + str(video_id) html = HttpUtils.HttpClient().getHtmlContent(url=video_info_link) paramSet = re.compile("return p\}\(\'(.+?)\',(\d\d),(\d\d),\'(.+?)\'").findall(html) if len(paramSet) > 0: video_info_link = AddonUtils.parsePackedValue(paramSet[0][0], int(paramSet[0][1]), int(paramSet[0][2]), paramSet[0][3].split('|')).replace('\\', '').replace('"', '\'') img_data = re.compile(r"image:\'(.+?)\'").findall(video_info_link) if len(img_data) == 1: video_info.set_video_image(img_data[0]) video_link = re.compile(r"file:\'(.+?)\'").findall(video_info_link)[0] else: video_link = re.compile("'file': '(.+?)'").findall(html)[0] video_info.set_video_stopped(False) video_info.add_video_link(VIDEO_QUAL_SD, video_link) except Exception, e: Logger.logError(e) video_info.set_video_stopped(True)
def retrieveVideoInfo(video_id): video_info = VideoInfo() video_info.set_video_hosting_info(getVideoHostingInfo()) video_info.set_video_id(video_id) try: html = HttpUtils.HttpClient().getHtmlContent(url='http://vimeo.com/' + str(video_id)) referrerObj = re.compile('"timestamp":(.+?),"signature":"(.+?)"').findall(html)[0] req_sig_exp = referrerObj[0] req_sig = referrerObj[1] img_link = re.compile('itemprop="thumbnailUrl" content="(.+?)"').findall(html)[0] video_title = re.compile('"title":"(.+?)"').findall(html)[0] qual = 'sd' video_link = "http://player.vimeo.com/play_redirect?clip_id=%s&sig=%s&time=%s&quality=%s&codecs=H264,VP8,VP6&type=moogaloop_local&embed_location=" % (video_id, req_sig, req_sig_exp, qual) video_info.add_video_link(VIDEO_QUAL_SD, video_link) if(re.search('"hd":1', html)): qual = 'hd' video_link = "http://player.vimeo.com/play_redirect?clip_id=%s&sig=%s&time=%s&quality=%s&codecs=H264,VP8,VP6&type=moogaloop_local&embed_location=" % (video_id, req_sig, req_sig_exp, qual) video_info.add_video_link(VIDEO_QUAL_HD_720, video_link) video_info.set_video_stopped(False) video_info.set_video_image(img_link) video_info.set_video_name(video_title) except Exception, e: Logger.logError(e) video_info.set_video_stopped(True)
async def get_markets(self): markets = pd.DataFrame(data=[], columns=formats.market) try: request_url = 'markets' stock_data = await self.rest_send(request_url) for market_name in stock_data.keys(): markets = markets.append( pd.Series( data=[ self.name, market_name.split('_')[0], market_name.split('_')[1], None, None, ], index=formats.market, name=market_name.replace('_', ''), )) except Exception as e: Logger.log_error(e) finally: return markets
async def get_markets(self): markets = pd.DataFrame(data=[], columns=formats.market) try: request_url = 'products' stock_data = await self.rest_send(request_url) for market_data in stock_data: markets = markets.append( pd.Series( data=[ self.name, market_data['base_currency'].lower(), market_data['quote_currency'].lower(), market_data['min_market_funds'], market_data['max_market_funds'], ], index=formats.market, name=market_data['id'].lower(), )) except Exception as e: Logger.log_error(e) finally: return markets
async def get_ticks(self): ticks = pd.DataFrame(data=[], columns=formats.tick) try: request_url = 'tickerall' stock_data = await self.rest_send(request_url) current_date = datetime.datetime.now() for market_name in stock_data['data'].keys(): ticks = ticks.append( pd.Series( data=[ self.name, int(time.mktime(current_date.timetuple())) * 1000, market_name, stock_data['data'][market_name]['last'], ], index=formats.tick, name=current_date, )) Logger.log_info(ticks) except Exception as e: Logger.log_error(e) finally: return ticks
def parseSignature(s): ''' use decryption solution by Youtube-DL project ''' if len(s) == 93: return s[86:29:-1] + s[88] + s[28:5:-1] elif len(s) == 92: return s[25] + s[3:25] + s[0] + s[26:42] + s[79] + s[43:79] + s[91] + s[80:83] elif len(s) == 91: return s[84:27:-1] + s[86] + s[26:5:-1] elif len(s) == 90: return s[25] + s[3:25] + s[2] + s[26:40] + s[77] + s[41:77] + s[89] + s[78:81] elif len(s) == 89: return s[84:78:-1] + s[87] + s[77:60:-1] + s[0] + s[59:3:-1] elif len(s) == 88: return s[7:28] + s[87] + s[29:45] + s[55] + s[46:55] + s[2] + s[56:87] + s[28] elif len(s) == 87: return s[6:27] + s[4] + s[28:39] + s[27] + s[40:59] + s[2] + s[60:] elif len(s) == 86: return s[80:72:-1] + s[16] + s[71:39:-1] + s[72] + s[38:16:-1] + s[82] + s[15::-1] elif len(s) == 85: return s[3:11] + s[0] + s[12:55] + s[84] + s[56:84] elif len(s) == 84: return s[78:70:-1] + s[14] + s[69:37:-1] + s[70] + s[36:14:-1] + s[80] + s[:14][::-1] elif len(s) == 83: return s[80:63:-1] + s[0] + s[62:0:-1] + s[63] elif len(s) == 82: return s[80:37:-1] + s[7] + s[36:7:-1] + s[0] + s[6:0:-1] + s[37] elif len(s) == 81: return s[56] + s[79:56:-1] + s[41] + s[55:41:-1] + s[80] + s[40:34:-1] + s[0] + s[33:29:-1] + s[34] + s[28:9:-1] + s[29] + s[8:0:-1] + s[9] elif len(s) == 80: return s[1:19] + s[0] + s[20:68] + s[19] + s[69:80] elif len(s) == 79: return s[54] + s[77:54:-1] + s[39] + s[53:39:-1] + s[78] + s[38:34:-1] + s[0] + s[33:29:-1] + s[34] + s[28:9:-1] + s[29] + s[8:0:-1] + s[9] else: Logger.logFatal(u'Unable to decrypt signature, key length %d not supported; retrying might work' % (len(s))) return s
async def execute(self, action, *args, **kwargs): result = None try: nonce = utils.get_nonce() Logger.log_info('execute') Logger.log_info(nonce) self.__await_events[nonce] = asyncio.Event() await self.push({ 'type':'service', 'id': nonce, 'action':action, 'args':args, 'kwargs':kwargs,}) await self.__await_events[nonce].wait() Logger.log_info('executed') result = self.__events_results[nonce] Logger.log_info(result) del self.__events_results[nonce] del self.__await_events[nonce] except Exception as e: Logger.log_error(e) finally: return result
async def __process_request(self, full_url): try: request = pd.Series(data=[full_url], index=['request']) request.name = datetime.datetime.now() self.__timeline = self.__timeline.append(request) headers = { 'Accept': ('text/html,application/xhtml+xml' + ',application/xml;q=0.9,image/webp,' + 'image/apng,*/*;q=0.8'), 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'en-US,en;q=0.9', 'Cache-Control': 'max-age=0', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', 'User-Agent': ('Mozilla/5.0 (Macintosh;' + ' Intel Mac OS X 10_11_6) AppleWebKit/537.36 ' + '(KHTML, like Gecko) Chrome/66.0.3359.139' + ' Safari/537.36'), } async with aiohttp.ClientSession(headers=headers) as session: async with session.get(full_url) as resp: text = await resp.text() return utils.parse_data(text) except Exception as e: Logger.log_error(e)
async def get_ticks(self): ticks = pd.DataFrame(data=[], columns=formats.tick) try: request_url = 'ticker.do' stock_data = await self.rest_send(request_url, params={ 'symbol': 'all'}) current_date = datetime.datetime.now() for market in stock_data: ticks = ticks.append(pd.Series( data=[ self.name, int(time.mktime(current_date.timetuple()))*1000, market['symbol'], market['ticker']['latest'],], index=formats.tick, name=current_date,)) Logger.log_info(ticks) except Exception as e: Logger.log_error(e) finally: return ticks
async def get_ticks(self): ticks = pd.DataFrame(data=[], columns=formats.tick) try: request_url = 'public/Ticker' stock_data = await self.rest_send( request_url, params={'pair':','.join( self._get_markets().index.values.tolist())},) current_date = datetime.datetime.now() for market_name in stock_data['result'].keys(): market = self._get_markets().loc[market_name] ticks = ticks.append(pd.Series( data=[ self.name, int(time.mktime(current_date.timetuple()))*1000, '_'.join([market.at['base'], market.at['quot']]), stock_data['result'][market_name]['c'][0],], index=formats.tick, name=current_date,)) Logger.log_info(ticks) except Exception as e: Logger.log_error(e) finally: return ticks
async def get_ticks(self): ticks = pd.DataFrame(data=[], columns=formats.tick) try: request_url = 'pairs' stock_data = await self.rest_send(request_url) current_date = datetime.datetime.now() for market in stock_data['data']: if market['last_price'] is not None: ticks = ticks.append( pd.Series( data=[ self.name, int(time.mktime(current_date.timetuple())) * 1000, '_'.join([ market['base']['name'].lower(), market['quote']['name'].lower() ]), market['last_price'], ], index=formats.tick, name=current_date, )) Logger.log_info(ticks) except Exception as e: Logger.log_error(e) finally: return ticks
async def ws_send(self, message): try: if self.__ws_socket is not None: self.__request_counter += 1 await self.__ws_socket.send(json.dumps(message)) except Exception as e: Logger.log_error(e)
async def request(self, request_url, params=None, type_='get'): response = None try: full_url = self.__base_url + request_url if type_ == 'get' and params is not None: full_url += '?' + urllib.parse.urlencode(params) now = datetime.datetime.now() self.__timeline = self.__timeline.loc[now - datetime.timedelta( seconds=REQUEST_INTERVAL_SECONDS):now] if (self.__timeline.loc[:, "request"].count() > self.__request_limit): self.__queue.append(full_url) await asyncio.sleep(REQUEST_INTERVAL_SECONDS + len(self._queue) // self.__request_limit * REQUEST_INTERVAL_SECONDS) if type_ == 'get': response = await self.__process_request(full_url) else: response = await self.__post(full_url, params=params) return response except Exception as e: Logger.log_error(e) finally: return response
def retrieveVideoInfo(videoUrl): try: xbmcaddon.Addon('plugin.video.iplayer') except: dialog = xbmcgui.Dialog() dialog.ok('[B][COLOR red]MISSING: [/COLOR][/B] BBC IPlayer v2 add-on', '', 'Please install BBC IPlayer v2 add-on created by Hitcher!', 'Available at http://code.google.com/p/xbmc-iplayerv2/') raise video_info = VideoInfo() video_info.set_video_hosting_info(getVideoHostingInfo()) video_info.set_video_id(videoUrl) addon_url = 'plugin://plugin.video.iplayer/?' video_params = videoUrl.split('/') addon_url += 'pid=%s' % video_params[0] video_info.add_video_link(VIDEO_QUAL_SD, addon_url, addUserAgent=False, addReferer=False) video_info.set_video_image( 'http://www.bbc.co.uk/iplayer/images/episode/%s_512_288.jpg' % video_params[0]) video_info.set_video_name(video_params[1].replace('_', ' ')) Logger.logDebug(addon_url) video_info.set_video_stopped(False) return video_info
def get_addfriend_inte_seconds(): config = MonitorConfig() addfriend_inte_seconds = config.get_value('appiumConfig', 'addfriend_inte_seconds') Logger.println(f"【get_addfriend_inte_seconds={addfriend_inte_seconds}】") if not addfriend_inte_seconds: return '3600' return addfriend_inte_seconds
async def get_ticks(self): ticks = pd.DataFrame(data=[], columns=formats.tick) try: request_url = 'Api_Market/getPriceList' stock_data = await self.rest_send(request_url) current_date = datetime.datetime.now() for quot_name in stock_data.keys(): for market in stock_data[quot_name]: ticks = ticks.append( pd.Series( data=[ self.name, int(time.mktime(current_date.timetuple())) * 1000, '_'.join( [market['coin_from'], market['coin_to']]), market['current'], ], index=formats.tick, name=current_date, )) Logger.log_info(ticks) except Exception as e: Logger.log_error(e) finally: return ticks
def getAppiumConfig(): deviceId = '' deviceVersion = '' try: # 读取设备 id # 正则表达式匹配出 id 信息 deviceId = getDeviceid()[0] # readDeviceId = list(os.popen('adb devices').readlines()) # deviceId = re.findall(r'^\w*\b', readDeviceId[1])[0] # 读取设备系统版本号 deviceAndroidVersion = list( os.popen(f'adb -s {deviceId} shell getprop ro.build.version.release').readlines()) deviceVersion = re.findall(r'^\w*\b', deviceAndroidVersion[0])[0] except Exception as e: Logger.println(f"get deviceAndroidVersion Exception【e={e}】") appiumConfig = { "platformName": "Android", "deviceName": deviceId, "udid": deviceId, "platformVersion": deviceVersion, "appPackage": "com.tencent.mm", "appActivity": "com.tencent.mm.ui.LauncherUI", "noReset": "True", "unicodeKeyboard": "True", "resetKeyboard": "True" } Logger.println(f"【appium_config={appiumConfig}】") return appiumConfig
async def get_ticks(self): ticks = pd.DataFrame(data=[], columns=formats.tick) try: request_url = 'ticker_utc' stock_data = await self.rest_send(request_url, params={ 'currency': 'all', 'format': 'json', }) current_date = datetime.datetime.now() for market_name in stock_data.keys(): if isinstance(stock_data[market_name], dict): ticks = ticks.append( pd.Series( data=[ self.name, int(time.mktime(current_date.timetuple())) * 1000, '_'.join([market_name, 'krw']), stock_data[market_name]['last'], ], index=formats.tick, name=current_date, )) Logger.log_info(ticks) except Exception as e: Logger.log_error(e) finally: return ticks
async def on_command(update, store): # Отлично, мы снова готовы писать команду! # Итак давай скажем, что мы хотим проверить беседа ли это? if update.is_multichat: await store.reply("Вау, это сообщение пришло из беседы.") # В остальных случаях будет else # А что если мы хотим загрузить какое-нибудь изображение?????? # Значит, что мы можем предпринять? # Выход один, придётся вызывать метод photo = await store.upload_photo( "example/google-chan.png" ) # Давай загрузим смущающуюся Google-Chan из папки Example # ЗАМЕЧУ, что аргументом может быть bytes, тоесть io.Bytes тоже будет работать с его буффером, который зачастую используется для # сохранения из Pillow, и других модулей if photo: Logger.Slog( "Теперь у нас есть изображение на сервере ВК, давайте пока его оставим в покое." ) # А что если мы хотим загрузить документ???? Казалось бы цель опять не достигаема, но нам на помощь опять приходит метод # Всё как с загрузкой фото, только на этот раз загрузим текст из папки, но также можно использовать io.Bytes, bytes и т.д. doc = await store.upload_doc( "example/super_file.txt", filename="yui_bot_test_ex.txt" ) # Загрузим его на сервер с именем, yui_bot_test_ex.txt, по умолчанию будет file.png if doc: Logger.Slog("И снова шок, теперь у нас есть загруженный документ") # Так теперь давайте отправлять нашему пользователю, а то заждался наверное пока я тут пишу это. attachments = [photo, doc] # ИЛИ await store.reply("text", attachment=photo) return await store.reply("Спасибо за ожидание, меня вводили в курс дела", attachment=attachments)
async def get_markets(self): markets = pd.DataFrame(data=[], columns=formats.market) try: request_url = 'v1/mdata' stock_data = await self.rest_send( request_url, params={ 'cmd': 'pairList', }, ) for market in stock_data['result']: markets = markets.append( pd.Series(data=[ self.name, market['pair'].split('_')[0].lower(), market['pair'].split('_')[1].lower(), None, None, ], index=formats.market, name=market['id'])) except Exception as e: Logger.log_error(e) finally: return markets
def isVideoHostedByYou(self, video_url): isVideoHoster = False videoId = self.getVideoId(video_url) if videoId is not None: Logger.logDebug('Snapper selected = ' + self.getModuleName() + ' for video URL = ' + video_url) isVideoHoster = True return isVideoHoster
def __addMovieInfo_in_item(item): if item.get_next_action_name() == 'Movie_Streams': year = unicode(item.get_moving_data()['movieYear'], errors='ignore').encode('utf-8') title = unicode(item.get_moving_data()['movieTitle'], errors='ignore').encode('utf-8') meta = None try: global __metaget__ if __metaget__ is None: __metaget__ = metahandlers.MetaData() meta = __metaget__.get_meta('movie', title, year=year) except: Logger.logDebug('Failed to load metahandler module') xbmc_item = item.get_xbmc_list_item_obj() if(meta is not None): xbmc_item.setIconImage(meta['thumb_url']) xbmc_item.setThumbnailImage(meta['cover_url']) videoInfo = {'trailer_url':meta['trailer_url']} for key, value in meta.items(): if type(value) is str: value = unicode(value).encode('utf-8') videoInfo[key] = value xbmc_item.setInfo('video', videoInfo) xbmc_item.setProperty('fanart_image', meta['backdrop_url']) item.add_request_data('videoInfo', videoInfo) contextMenuItems = [] contextMenuItems.append(('Movie Information', 'XBMC.Action(Info)')) xbmc_item.addContextMenuItems(contextMenuItems, replaceItems=False) else: xbmc_item.setInfo('video', {'title':title, 'year':year}) item.add_request_data('videoInfo', {'title':title, 'year':year})
def getVideoInfo(self, video_url): videoInfo = None videoId = self.getVideoId(video_url) if videoId is not None: Logger.logDebug('Snapper selected = ' + self.getModuleName() + ' for video URL = ' + video_url) videoInfo = self.__getVideoInfo(videoId) return videoInfo
def __addMovieInfo_in_item(item): if item.get_next_action_name() == 'Movie_Streams': year = unicode(item.get_moving_data()['movieYear'], errors='ignore').encode('utf-8') title = unicode(item.get_moving_data()['movieTitle'], errors='ignore').encode('utf-8') meta = None try: global __metaget__ if __metaget__ is None: __metaget__ = metahandlers.MetaData() meta = __metaget__.get_meta('movie', title, year=year) except: Logger.logDebug('Failed to load metahandler module') xbmc_item = item.get_xbmc_list_item_obj() if (meta is not None): xbmc_item.setIconImage(meta['thumb_url']) xbmc_item.setThumbnailImage(meta['cover_url']) videoInfo = {'trailer_url': meta['trailer_url']} for key, value in meta.items(): if type(value) is str: value = unicode(value).encode('utf-8') videoInfo[key] = value xbmc_item.setInfo('video', videoInfo) xbmc_item.setProperty('fanart_image', meta['backdrop_url']) item.add_request_data('videoInfo', videoInfo) contextMenuItems = [] contextMenuItems.append(('Movie Information', 'XBMC.Action(Info)')) xbmc_item.addContextMenuItems(contextMenuItems, replaceItems=False) else: xbmc_item.setInfo('video', {'title': title, 'year': year}) item.add_request_data('videoInfo', {'title': title, 'year': year})
def retrieveVideoLinks(request_obj, response_obj): video_source_id = 1 video_source_img = None video_source_name = None video_part_index = 0 video_playlist_items = [] ignoreAllLinks = False content = BeautifulSoup.SoupStrainer('blockquote', {'class':re.compile(r'\bpostcontent\b')}) soup = HttpClient().getBeautifulSoup(url=request_obj.get_data()['episodeUrl'], parseOnlyThese=content) for e in soup.findAll('br'): e.extract() Logger.logDebug(soup) if soup.has_key('div'): soup = soup.findChild('div', recursive=False) prevChild = '' prevAFont = None for child in soup.findChildren(): if (child.name == 'img' or child.name == 'b' or (child.name == 'font' and not child.findChild('a'))): if (child.name == 'b' and prevChild == 'a') or (child.name == 'font' and child == prevAFont): continue else: if len(video_playlist_items) > 0: response_obj.addListItem(__preparePlayListItem__(video_source_id, video_source_img, video_source_name, video_playlist_items)) if video_source_img is not None: video_source_id = video_source_id + 1 video_source_img = None video_source_name = None video_part_index = 0 video_playlist_items = [] ignoreAllLinks = False elif not ignoreAllLinks and child.name == 'a' and not re.search('multi', str(child['href']), re.IGNORECASE): video_part_index = video_part_index + 1 video_link = {} video_link['videoTitle'] = 'Source #' + str(video_source_id) + ' | ' + 'Part #' + str(video_part_index) + ' | ' + child.getText() video_link['videoLink'] = str(child['href']) try: try: __prepareVideoLink__(video_link) except Exception, e: Logger.logFatal(e) video_hosting_info = SnapVideo.findVideoHostingInfo(video_link['videoLink']) if video_hosting_info is None or video_hosting_info.get_video_hosting_name() == 'UrlResolver by t0mm0': raise video_link['videoSourceImg'] = video_hosting_info.get_video_hosting_image() video_link['videoSourceName'] = video_hosting_info.get_video_hosting_name() video_playlist_items.append(video_link) video_source_img = video_link['videoSourceImg'] video_source_name = video_link['videoSourceName'] item = ListItem() item.add_request_data('videoLink', video_link['videoLink']) item.add_request_data('videoTitle', video_link['videoTitle']) item.set_next_action_name('SnapAndPlayVideo') xbmcListItem = xbmcgui.ListItem(label='Source #' + str(video_source_id) + ' | ' + 'Part #' + str(video_part_index) , iconImage=video_source_img, thumbnailImage=video_source_img) item.set_xbmc_list_item_obj(xbmcListItem) response_obj.addListItem(item) prevAFont = child.findChild('font') except:
def retrieveReloadedPlaylistVideoItems(playlistId): Logger.logFatal('YouTube Reloaded Playlist ID = ' + playlistId) soupXml = HttpUtils.HttpClient().getBeautifulSoup('http://gdata.youtube.com/feeds/api/playlists/' + playlistId) videoItemsList = [] for media in soupXml.findChildren('track'): videoUrl = media.findChild('location').getText() videoItemsList.append(videoUrl) return videoItemsList
def retrievePlaylistVideoItems(playlistId): Logger.logFatal('YouTube Playlist ID = ' + playlistId) soupXml = HttpUtils.HttpClient().getBeautifulSoup('http://gdata.youtube.com/feeds/api/playlists/' + playlistId + '?max-results=50') videoItemsList = [] for media in soupXml.findChildren('media:player'): videoUrl = str(media['url']) videoItemsList.append(videoUrl) return videoItemsList
def run_multi(func, args, name, i, repeat): log_name = os.path.join(log_dir, "%d.%s.log" % (i, name)) log = Logger(strm=open(log_name, "w")) for j in range(repeat): t = func(*args) t.start() t.join() log.log(t.get()) del log
def addVideoInfoInPlayableItems(request_obj, response_obj): items = response_obj.get_item_list() playable_items = [] for item in items: if item.get_next_action_name() == 'Play': playable_items.append(item) try: XBMCInterfaceUtils.callBackDialogProgressBar(getattr(sys.modules[__name__], '__addVideoInfo_in_item'), playable_items, 'Retrieving video info', failure_message=None) except Exception, e: Logger.logFatal(e)
def addEmbeddedVideoInfoInPlayableItems(request_obj, response_obj): items = response_obj.get_item_list() playable_items = [] for item in items: if item.get_next_action_name() == 'Play': playable_items.append(item) try: XBMCInterfaceUtils.callBackDialogProgressBar(getattr(sys.modules[__name__], '__addEmbeddedVideoInfo_in_item__'), playable_items, 'Retrieving video info', 'Failed to retrieve video information, please try again later') except Exception, e: Logger.logFatal(e)
def __retrieveChannelTVShows__(tvChannelObj): running_tvshows = [] finished_tvshows = [] try: running_tvshows = __retrieveTVShows__(tvChannelObj["running_tvshows_url"]) if(len(running_tvshows) == 0): running_tvshows.append({"name":"ENTER TO VIEW :: This is the only easy way to view!", "url":BASE_WSITE_URL + tvChannelObj["running_tvshows_url"]}) except Exception, e: Logger.logFatal(e) Logger.logDebug('Failed to load a channel... Continue retrieval of next tv show')
def performAction(self, actionId): ProgressDisplayer().start('Processing request...') while actionId is not None: Logger.logInfo('Action to be performed ::' + actionId) turtle_route = self.getTurtleRoute(actionId) for move in turtle_route.moves: self.moveTurtle(move) actionId = self.judgeTurtleNextAction(turtle_route) ProgressDisplayer().end()
def addPlaylistVideosInfoInPlayableItems(request_obj, response_obj): items = response_obj.get_item_list() try: for item in items: if item.get_next_action_name() == 'Play': videoItems = __processPlaylistAndAddVideoItem__(item) if videoItems is not None and len(videoItems) > 0: items.remove(item) items.extend(videoItems) except Exception, e: Logger.logFatal(e)
def __send_request_to_google_analytics(self, utm_url): ua = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3' import urllib2 try: if self.addon_context.addon.getSetting('ga_enabled') == 'true': #default is disabled req = urllib2.Request(utm_url, None, {'User-Agent':ua}) response = urllib2.urlopen(req) print response.read() response.close() except Exception, e: Logger.logError(e) Logger.logDebug ("GA fail: %s" % utm_url)
def run_multi(func, name, i): log_name = os.path.join(log_dir, '%d.%s.log' % (i, name)) log = Logger(strm=open(log_name, 'w')) li = [] for j in range(i): li.append(func(j)) for j in range(i): li[j].start() for j in range(i): li[j].join() log.log(li[j].get()) del log
def judgeTurtleNextAction(self, actionObj): ProgressDisplayer().displayMessage(80, line1='Preparing items for display or play', line2='Total items: ' + str(len(self.response_obj.get_item_list()))) if self.response_obj.get_redirect_action_name() is None: isAnyPlayableItem = False isItemsList = False playlist_type = None for item in self.response_obj.get_item_list(): nextActionId = actionObj.get_next_action_map()[item.get_next_action_name()] if nextActionId == '__play__': if item.get_moving_data().has_key('pluginUrl'): XBMCInterfaceUtils.executePlugin(item.get_moving_data()['pluginUrl']) else: if not isAnyPlayableItem and not XBMCInterfaceUtils.isPlaying(): XBMCInterfaceUtils.clearPlayList() # Clear playlist item only when at least one video item is found. playlist_type = XBMCInterfaceUtils.addPlayListItem(item) isAnyPlayableItem = True elif nextActionId == '__service_response__': # Do Nothing , get response object from container for parameters to be returned pass elif nextActionId == '__download__': downloadPath = self.addon_context.addon.getSetting('downloadPath') if downloadPath is None or downloadPath == '': XBMCInterfaceUtils.displayDialogMessage("Download path not provided", "Please provide download path in add-on settings.", "The download path should be a local directory.") self.addon_context.addon.openSettings(sys.argv[ 0 ]) downloadPath = self.addon_context.addon.getSetting('downloadPath') if downloadPath is not None and downloadPath != '': XBMCInterfaceUtils.downloadVideo(item, downloadPath) elif nextActionId == '__resolved__': XBMCInterfaceUtils.setResolvedMediaUrl(item) else: isItemsList = True is_Folder = self.addon_context.isNextActionFolder(actionObj.get_action_id(), item.get_next_action_name()) downloadAction = self.addon_context.getDownloadActionIfDownloadable(actionObj.get_action_id(), item.get_next_action_name()) if(downloadAction is not None): XBMCInterfaceUtils.addContextMenuItem(item, 'Download Video', downloadAction) XBMCInterfaceUtils.addFolderItem(item, nextActionId, is_Folder) del item # deletes item if isAnyPlayableItem == True: ProgressDisplayer().end() try: if playlist_type is not None: XBMCInterfaceUtils.play(list_type=playlist_type) else: XBMCInterfaceUtils.play() except Exception, e: Logger.logFatal(e) elif isItemsList: if self.response_obj.get_xbmc_sort_method() is not None: XBMCInterfaceUtils.sortMethod(self.response_obj.get_xbmc_sort_method()) if self.response_obj.get_xbmc_content_type() is not None: XBMCInterfaceUtils.setContentType(self.response_obj.get_xbmc_content_type()) XBMCInterfaceUtils.setSortMethods()
def __initializeSnappers(): snapper_filepath = AddonUtils.getCompleteFilePath(Container().getAddonContext().addonPath, 'snapvideo', 'snappers.xml') if not AddonUtils.doesFileExist(snapper_filepath): snapper_filepath = AddonUtils.getCompleteFilePath(Container().getAddonContext().turtle_addonPath, 'lib/snapvideo', 'snappers.xml') global snappers if snappers is not None: return snappers snappers = [] Logger.logDebug('Loading snappers.xml from path... ' + snapper_filepath) snappers_xml = AddonUtils.getBeautifulSoupObj(snapper_filepath) for snapperTag in snappers_xml.findAll('snapper', attrs={'enabled':'true'}): snappers.append(Snapper(snapperTag)) return snappers
def start(addon_id, addon_ver=None): try: Logger.logDebug(sys.argv) global __addon_id__ __addon_id__ = addon_id __addon_ver__ = addon_ver containerObj = Container(addon_id=addon_id, addon_ver=addon_ver) action_id = containerObj.getTurtleRequest().get_action_id() containerObj.performAction(action_id) except urllib2.URLError, e: Logger.logFatal(e) XBMCInterfaceUtils.displayDialogMessage('Unable to connect', 'Please choose a different source if available in add-on.', 'Website used in add-on is down, try to access using web browser.', 'Please share logs with developer if problem keeps coming!')
def __init__(self, params=None): Logger.logDebug(params) self.set_action_id('__start__') if params is None: self.set_params({}) elif type(params) is str: self.set_params(HttpUtils.getUrlParams(params)) elif type(params) is dict: self.set_params(params) if self.get_params().has_key('actionId') and self.get_params()['actionId'] != '': self.set_action_id(self.get_params()['actionId']) if self.get_params().has_key('data') and self.get_params()['data'] != '': self.set_data(AddonUtils.decodeData(self.get_params()['data']))
def addFavouriteTVShow(request_obj, response_obj): addonContext = Container().getAddonContext() filepath = AddonUtils.getCompleteFilePath(baseDirPath=addonContext.addonProfile, extraDirPath=AddonUtils.ADDON_SRC_DATA_FOLDER, filename=FAV_TV_SHOWS_JSON_FILE, makeDirs=True) favTVShowsJsonObj = {} if AddonUtils.doesFileExist(filepath): try: favTVShowsJsonObj = AddonUtils.getJsonFileObj(filepath) except ValueError: AddonUtils.deleteFile(filepath) Logger.logError('CORRUPT FILE DELETED = ' + filepath) favTVShowsJsonObj[request_obj.get_data()['tvShowName']] = {"tvShowName":request_obj.get_data()['tvShowName'] , "tvShowUrl": request_obj.get_data()['tvShowUrl']} AddonUtils.saveObjToJsonFile(filepath, favTVShowsJsonObj) d = xbmcgui.Dialog() d.ok('TV Show favourite added successfully.', 'ENJOY!')
def getInstance(cls, *args, **kargs): '''Static method to have a reference to **THE UNIQUE** instance''' if cls.__instance is None: # Critical section start # cls.__lockObj.acquire() try: if cls.__instance is None: cls.__instance = object.__new__(cls) except Exception, e: Logger.logFatal('Error occurred while creating singleton obj') Logger.logFatal(e) raise # finally: # # Exit from critical section whatever happens # #cls.__lockObj.release() # # Critical section end # pass # Initialize **the unique** instance try: if cls.__instance is not None: cls.__instance.__initialize__(**kargs) except Exception, e: Logger.logFatal('Error occurred while initialization of singleton obj') Logger.logFatal(e) raise
def retrieveAudioInfo(audioUrl): url = 'https://api.soundcloud.com/' + audioUrl jObj = json.loads(HttpUtils.HttpClient().getHtmlContent(url=url)) video_info = VideoInfo() video_info.set_video_hosting_info(getVideoHostingInfo()) video_info.set_video_id(url) video_info.add_video_link(VIDEO_QUAL_SD, jObj['http_mp3_128_url'], addUserAgent=False, addReferer=False) video_info.set_video_image('') video_info.set_video_name('') Logger.logDebug(jObj['http_mp3_128_url']) video_info.set_video_stopped(False) return video_info
def playZappyVideo(request_obj, response_obj): Logger.logDebug(request_obj.get_data()); Container().ga_client.reportAction('zappyvideo') video_id = request_obj.get_data()['videoId'] port = request_obj.get_data()['port'] ipaddress = request_obj.get_data()['client_ip'] video_url = "http://" + ipaddress + ":" + str(port) + "/?videoId=" + video_id item = ListItem() item.get_moving_data()['videoStreamUrl'] = video_url item.set_next_action_name('Play') xbmcListItem = xbmcgui.ListItem(label='Streaming Video') item.set_xbmc_list_item_obj(xbmcListItem) response_obj.addListItem(item) response_obj.addServiceResponseParam("status", "success") response_obj.addServiceResponseParam("message", "Enjoy the video!")
def __check_media_url(video_url): try: request = urllib2.Request(video_url, headers=HttpUtils.HEADERS) request.get_method = lambda : 'HEAD' response = urllib2.urlopen(request) content_type = response.info().gettype() try: if(APPLICATION_MEDIA_TYPES.index(content_type) >= 0): return 'application' except ValueError: if re.search('audio/', content_type): return 'audio' elif re.search('video/', content_type): return 'video' except urllib2.HTTPError, he: Logger.logError(he)
def retrieveVideoInfo(videoUrl): try: xbmcaddon.Addon('plugin.video.vevo') except: dialog = xbmcgui.Dialog() dialog.ok('[B][COLOR red]MISSING: [/COLOR][/B] VEVO add-on', '', 'Please install VEVO add-on created by BlueCop!', 'Available at http://code.google.com/p/bluecop-xbmc-repo/') raise video_info = VideoInfo() video_info.set_video_hosting_info(getVideoHostingInfo()) video_info.set_video_id(videoUrl) addon_url = 'plugin://plugin.video.vevo/?' vevo_id = videoUrl.split('/')[-1] if videoUrl.startswith('playlist'): url = urllib.quote_plus('http://api.vevo.com/mobile/v2/playlist/%s.json?' % vevo_id) addon_url += 'url=%s' % url addon_url += '&mode=playPlaylist' addon_url += '&duration=210' addon_url += '&page=1' video_info.add_video_link(XBMC_EXECUTE_PLUGIN, addon_url, addUserAgent=False, addReferer=False) video_info.set_video_image('') video_info.set_video_name(' ') else: url = 'http://videoplayer.vevo.com/VideoService/AuthenticateVideo?isrc=%s&extended=true' % vevo_id video = json.loads(HttpUtils.HttpClient().getHtmlContent(url=url))['video'] title = '' try:title = video['title'].encode('utf-8') except: title = '' video_image = video['imageUrl'] if len(video['featuredArtists']) > 0: feats = '' for featuredartist in video['featuredArtists']: # featuredartist_image = featuredartist['image_url'] featuredartist_name = featuredartist['artistName'].encode('utf-8') feats += featuredartist_name + ', ' feats = feats[:-2] title += ' (ft. ' + feats + ')' addon_url += 'url=%s' % vevo_id addon_url += '&mode=playVideo' addon_url += '&duration=210' video_info.add_video_link(VIDEO_QUAL_SD, addon_url, addUserAgent=False, addReferer=False) video_info.set_video_image(video_image) video_info.set_video_name(title) Logger.logDebug(addon_url) video_info.set_video_stopped(False) return video_info
def removeFavouriteTVShow(request_obj, response_obj): addonContext = Container().getAddonContext() filepath = AddonUtils.getCompleteFilePath(baseDirPath=addonContext.addonProfile, extraDirPath=AddonUtils.ADDON_SRC_DATA_FOLDER, filename=FAV_TV_SHOWS_JSON_FILE, makeDirs=True) favTVShowsJsonObj = {} if AddonUtils.doesFileExist(filepath): try: favTVShowsJsonObj = AddonUtils.getJsonFileObj(filepath) del favTVShowsJsonObj[request_obj.get_data()['tvShowName']] AddonUtils.saveObjToJsonFile(filepath, favTVShowsJsonObj) d = xbmcgui.Dialog() d.ok('TV Show removed favourite successfully.', 'You can add this TV Show again using same way.', 'ENJOY!') xbmc.executebuiltin("Container.Refresh()") except ValueError: AddonUtils.deleteFile(filepath) Logger.logError('CORRUPT FILE DELETED = ' + filepath) d = xbmcgui.Dialog() d.ok('Failed to remove TV Show favourite.', 'Please try again.')
def CreateSession (userID, displayName): SessionTimeout = int(Context.Config.getSession().getTimeOut()) CSRFTimeout = int(Context.Config.getCSRF().getTimeOut()) SessionToken = sha512(userID + Context.ip + str(time())).hexdigest() CurrentUser = Context.DB.find (dict(userid=userID), 'User') if len(CurrentUser) == 0: CurrentUser = Object( dict ( userId = userID, displayName=displayName, accessLevel='Participant', session = dict ( ip=Context.ip, expirytime=time() + SessionTimeout, token=SessionToken ), CSRF = dict ( CSRFToken = sha512(userID + Context.ip + str(time())).hexdigest(), ExpiryTime = time() + CSRFTimeout ) ) ) Context.DB.insert (CurrentUser, 'User') elif len(CurrentUser) == 1: CurrentUser = CurrentUser[0] CurrentUser.getSession().setIP (Context.ip); CurrentUser.getSession().setExpiryTime (time() + SessionTimeout); CurrentUser.getSession().setToken (SessionToken) CSRFExpiryTime = CurrentUser.getCSRF().getExpiryTime() if time() > CSRFExpiryTime: CurrentUser.getCSRF().setCSRFToken (sha512(userID + Context.ip + str(time())).hexdigest()) CurrentUser.getCSRF().setExpiryTime (time() + CSRFTimeout) MongoID = CurrentUser.getID() CurrentUser.delID() Context.DB.save (dict(_id=ObjectId(MongoID)), CurrentUser, 'User') else: Logger.critical ("More than one User records for User ID : %s" % userID) raise web.internalerror() Context.User.setAuthenticated(True) Context.User.setUserID(CurrentUser.getUserID()) Context.User.setDisplayName(CurrentUser.getDisplayName()) Context.User.setAccessLevel(CurrentUser.getAccessLevel()) Context.User.setSessionID(SessionToken) Context.User.setCSRFToken(CurrentUser.getCSRF().getCSRFToken()) Context.SetCookie ('Session', SessionToken)