def proxy(sub): logger.debug('proxy %s %s', package_name, sub) try: from system.model import ModelSetting as SystemModelSetting if sub == 'discover.json': ddns = SystemModelSetting.get('ddns') data = { "FriendlyName": "HDHomeRun CONNECT", "ModelNumber": "HDHR4-2US", "FirmwareName": "hdhomerun4_atsc", "FirmwareVersion": "20190621", "DeviceID": "104E8010", "DeviceAuth": "UF4CFfWQh05c3jROcArmAZaf", "BaseURL": "%s/klive/proxy" % ddns, "LineupURL": "%s/klive/proxy/lineup.json" % ddns, "TunerCount": 20 } return jsonify(data) elif sub == 'lineup_status.json': data = { "ScanInProgress": 0, "ScanPossible": 1, "Source": "Cable", "SourceList": ["Antenna", "Cable"] } return jsonify(data) elif sub == 'lineup.json': lineup = [] custom_list = LogicKlive.get_saved_custom_instance() ddns = SystemModelSetting.get('ddns') apikey = None if SystemModelSetting.get_bool('auth_use_apikey'): apikey = SystemModelSetting.get('auth_apikey') for c in custom_list: tmp = c.get_m3u8(ddns, 'plex', apikey) lineup.append({ 'GuideNumber': str(c.number), 'GuideName': c.title, 'URL': tmp }) return jsonify(lineup) except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def get_actor_info(entity, retry=True): try: from . import Vars url = 'https://hentaku.co/starsearch.php' data = {'name' : entity['name']} page = _session.post(url, headers=_headers, data=data) page.encoding = 'utf-8' data = page.text data = '<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">' + data tree = html.fromstring(data) nodes = tree.xpath('//img') if nodes: entity['img'] = nodes[0].attrib['src'].strip() from system.model import ModelSetting as SystemModelSetting entity['img'] = '%s/av_agent/api/image_proxy?url=%s' % (SystemModelSetting.get('ddns'), entity['img']) if SystemModelSetting.get_bool('auth_use_apikey'): entity['img'] += '&apikey=%s' % SystemModelSetting.get('auth_apikey') nodes = tree.xpath('//div[@class="avstar_info_b"]') tmps = nodes[0].text_content().split('/') entity['name_kor'] = tmps[0].strip() entity['name_eng'] = tmps[1].strip() else: entity['img'] = 'xxxx' entity['name_kor'] = '' entity['name_eng'] = '' return entity except ValueError: # 2020-06-01 # 단시간에 많은 요청시시 Error발생 if retry: logger.debug(u'단시간 많은 요청으로 재요청') time.sleep(1) return get_actor_info(entity, retry=False) else: logger.debug(u'잠시후 다시 요청') entity['img'] = 'xxxx' entity['name_kor'] = '' entity['name_eng'] = '' return entity except Exception as exception: logger.error('Exception:%s', exception) logger.error(traceback.format_exc())
def do_action(req): try: logger.debug(req.form) #return folder_id = req.form['folder_id'] my_remote_path = req.form['my_remote_path'] # 게시판 board_type = req.form['board_type'] category_type = req.form['category_type'] board_title = req.form['board_title'] board_content = req.form['board_content'] board_daum_url = req.form['board_daum_url'] folder_name = req.form['folder_name'] size = int(req.form['size']) daum_info = req.form['daum_info'] action = req.form['action'] user_id = SystemModelSetting.get('sjva_me_user_id') if board_content.startswith('ID:'): user_id = board_content.split('\n')[0].split(':')[1].strip() board_content = board_content[board_content.find('\n'):] def func(): ret = RcloneTool.do_action(ModelSetting.get('rclone_path'), ModelSetting.get('rclone_config_path'), action, 'category', folder_id, '', '', my_remote_path, 'real', folder_id_encrypted=True, listener=None) msg = u'Percent : %s\n' % ret['percent'] socketio.emit("command_modal_add_text", str(msg), namespace='/framework', broadcast=True) #msg = u'폴더ID : %s\n' % ret['folder_id'] #socketio.emit("command_modal_add_text", str(msg), namespace='/framework', broadcast=True) if ret['percent'] == 100: msg = u'업로드 크기 적용..\n' socketio.emit("command_modal_add_text", str(msg), namespace='/framework', broadcast=True) tmp = ModelSetting.get_int('size_upload') tmp += size ModelSetting.set('size_upload', str(tmp)) if board_type != 'share_private': msg = u'게시물 등록중...\n' socketio.emit("command_modal_add_text", str(msg), namespace='/framework', broadcast=True) data = {'board_type' : board_type, 'category_type':category_type, 'board_title':board_title, 'board_content':board_content, 'board_daum_url' : board_daum_url, 'folder_name':folder_name, 'size':size, 'daum_info':daum_info, 'folder_id':ret['folder_id'], 'user_id':user_id, 'lsjson' : json.dumps(ret['lsjson'])} LogicUser.site_append(data) msg = u'모두 완료되었습니다.\n' socketio.emit("command_modal_add_text", str(msg), namespace='/framework', broadcast=True) thread = threading.Thread(target=func, args=()) thread.setDaemon(True) thread.start() return '' except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def first_menu(sub): try: if sub == 'setting': arg = ModelSetting.to_dict() arg['package_name'] = package_name arg['scheduler'] = str(scheduler.is_include(package_name)) arg['is_running'] = str(scheduler.is_running(package_name)) arg['is_test_server'] = (SystemModelSetting.get('ddns').find( 'https://sjva-dev.soju6jan.com') != -1) return render_template('%s_%s.html' % (package_name, sub), arg=arg) elif sub in ['site', 'scheduler', 'group']: arg = {'package_name': package_name} return render_template('%s_%s.html' % (package_name, sub), arg=arg) elif sub == 'search': arg = {} arg = {'package_name': package_name} arg['ddns'] = SystemModelSetting.get('ddns') try: import downloader arg['is_available_normal_download'] = downloader.Logic.is_available_normal_download( ) except: arg['is_available_normal_download'] = False arg["search_word"] = request.args.get('search_word') arg['is_torrent_info_installed'] = False try: import torrent_info arg['is_torrent_info_installed'] = True except Exception as e: pass arg['apikey'] = '' if SystemModelSetting.get_bool('auth_use_apikey'): arg['apikey'] = SystemModelSetting.get('auth_apikey') return render_template('%s_%s.html' % (package_name, sub), arg=arg) elif sub == 'log': return render_template('log.html', package=package_name) return render_template('sample.html', title='%s - %s' % (package_name, sub)) except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def process_telegram_data(data): try: ret = ModelBotDownloaderKtvItem.process_telegram_data(data) #logger.debug(ret) if ret is not None: if ModelSetting.get_bool('receive_info_send_telegram'): msg = '😉 TV 정보 수신\n' msg += '제목 : %s\n' % data['filename'] if ret is None: msg += '중복 마그넷입니다.' #TelegramHandle.sendMessage(msg) else: url = '%s/%s/api/add_download?url=%s' % ( SystemModelSetting.get('ddns'), package_name, ret.magnet) if SystemModelSetting.get_bool('auth_use_apikey'): url += '&apikey=%s' % SystemModelSetting.get( 'auth_apikey') if app.config['config']['is_sjva_server']: msg += '\n' + ret.magnet + '\n' else: msg += '\n➕ 다운로드 추가\n<%s>\n' % url try: if ret.daum_id is not None: #url = 'https://search.daum.net/search?w=tv&q=%s&irk=%s&irt=tv-program&DA=TVP' % (urllib.quote(daum_tv.Logic.get_search_name_from_original(ret.file_name).encode('utf8')), ret.daum_id) url = 'https://search.daum.net/search?w=tv&q=%s&irk=%s&irt=tv-program&DA=TVP' % ( urllib.quote( ret.daum_title.encode('utf8')), ret.daum_id) msg += '\n● Daum 정보\n%s' % url except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) import framework.common.notify as Notify Notify.send_message( msg, image_url=ret.daum_poster_url, message_id='bot_downloader_ktv_receive') LogicNormal.invoke() TorrentProcess.receive_new_data(ret, package_name) except Exception, e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def process_telegram_data(data): try: ret = ModelMovieItem.process_telegram_data(data) #logger.debug('telegram bot receive. is exist : %s', ret) if ret is not None: if ModelSetting.get_bool('receive_info_send_telegram'): msg = '😉 영화 정보 수신\n' msg += '제목 : %s (%s)\n' % (ret.movie_title, ret.movie_year) msg += '파일 : %s\n' % ret.filename url = '%s/%s/api/add_download?id=%s' % ( SystemModelSetting.get('ddns'), package_name, ret.id) if SystemModelSetting.get_bool('auth_use_apikey'): url += '&apikey=%s' % SystemModelSetting.get( 'auth_apikey') if app.config['config']['is_sjva_server']: msg += '\n' + ret.magnet + '\n' else: msg += '\n➕ 다운로드 추가\n<%s>\n' % url #msg += '\n➕ 다운로드 추가\n<%s>\n' % url try: if ret.movie_title is not None: if ret.movie_target == 'imdb': url = 'https://www.imdb.com/title/%s' % ret.movie_id msg += '\n● IMDB 정보\n%s' % url else: url = 'https://movie.daum.net/moviedb/main?movieId=%s' % ( ret.movie_id) msg += '\n● Daum 정보\n%s' % url except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) import framework.common.notify as Notify Notify.send_message( msg, image_url=ret.daum_poster, message_id='bot_downloader_movie_receive') LogicNormal.invoke() TorrentProcess.receive_new_data(ret, package_name) except Exception, e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def get_m3uall(): try: from system.model import ModelSetting as SystemModelSetting apikey = None if SystemModelSetting.get_bool('auth_use_apikey'): apikey = SystemModelSetting.get('auth_apikey') m3u = '#EXTM3U\n' idx = 1 for c in LogicKlive.get_channel_list(): url = '{ddns}/{package_name}/api/url.m3u8?m=url&s={source}&i={source_id}'.format(ddns=SystemModelSetting.get('ddns'), package_name=package_name, source=c.source, source_id=c.source_id) if apikey is not None: url += '&apikey=%s' % apikey if c.is_tv: m3u += M3U_FORMAT % (c.source+'|' + c.source_id, c.title, c.icon, c.source, idx, idx, c.source + ' ' + c.title, url) else: m3u += M3U_RADIO_FORMAT % (c.source+'|'+c.source_id, c.title, c.icon, c.source, idx, idx, c.source + ' ' + c.title, url) idx += 1 return m3u except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def first_menu(sub): logger.debug('DETAIL %s %s', package_name, sub) if sub == 'setting': arg = ModelSetting.to_dict() arg['package_name'] = package_name arg['scheduler'] = str(scheduler.is_include(package_name)) arg['is_running'] = str(scheduler.is_running(package_name)) ddns = SystemModelSetting.get('ddns') arg['rss_api'] = '%s/%s/api/rss' % (ddns, package_name) if SystemModelSetting.get_bool('auth_use_apikey'): arg['rss_api'] += '?apikey=%s' % SystemModelSetting.get('auth_apikey') return render_template('%s_setting.html' % package_name, sub=sub, arg=arg) elif sub == 'list': arg = {'package_name' : package_name} arg['is_torrent_info_installed'] = False try: import torrent_info arg['is_torrent_info_installed'] = True except Exception as e: pass arg['is_available_normal_download'] = False try: import downloader arg['is_available_normal_download'] = downloader.Logic.is_available_normal_download() except Exception as e: pass arg['apikey'] = '' if SystemModelSetting.get_bool('auth_use_apikey'): arg['apikey'] = SystemModelSetting.get('auth_apikey') arg['ddns'] = SystemModelSetting.get('ddns') arg['show_log'] = ModelSetting.get('show_log') return render_template('%s_list.html' % package_name, arg=arg) elif sub == 'log': return render_template('log.html', package=package_name) return render_template('sample.html', title='%s - %s' % (package_name, sub))
def first_menu(sub): if sub == 'setting': arg = ModelSetting.to_dict() arg['package_name'] = package_name arg['agent_server'] = SystemModelSetting.get( 'ddns') + '/%s/api' % package_name return render_template('%s_setting.html' % package_name, sub=sub, arg=arg) elif sub == 'log': return render_template('log.html', package=package_name) return render_template('sample.html', title='%s - %s' % (package_name, sub))
def process_menu(self, sub, req): arg = ModelSetting.to_dict() arg["package_name"] = package_name if sub == "setting": arg["trackers"] = "\n".join(json.loads(arg["trackers"])) arg["tracker_update_from_list"] = [ [x, f"https://ngosang.github.io/trackerslist/trackers_{x}.txt"] for x in self.tracker_update_from_list ] arg["plugin_ver"] = plugin_info["version"] from system.model import ModelSetting as SystemModelSetting ddns = SystemModelSetting.get("ddns") arg["json_api"] = f"{ddns}/{package_name}/api/json" arg["m2t_api"] = f"{ddns}/{package_name}/api/m2t" if SystemModelSetting.get_bool("auth_use_apikey"): arg["json_api"] += f"?apikey={SystemModelSetting.get('auth_apikey')}" arg["m2t_api"] += f"?apikey={SystemModelSetting.get('auth_apikey')}" return render_template(f"{package_name}_{sub}.html", sub=sub, arg=arg) if sub == "search": arg["cache_size"] = len(self.torrent_cache) return render_template(f"{package_name}_{sub}.html", arg=arg) return render_template("sample.html", title=f"{package_name} - {sub}")
def get_m3u_for_sinaplayer(): try: from system.model import ModelSetting as SystemModelSetting apikey = None if SystemModelSetting.get_bool('auth_use_apikey'): apikey = SystemModelSetting.get('auth_apikey') ddns = SystemModelSetting.get('ddns') m3u = '#EXTM3U\n' query = db.session.query(ModelCustom) query = query.order_by(ModelCustom.number) query = query.order_by(ModelCustom.epg_id) saved_channeld_list = query.all() for c in saved_channeld_list: if c.is_drm_channel: play_info = LogicKlive.get_play_info( c.source, c.source_id, c.quality) play_info = json.dumps(play_info) else: play_info = '%s/%s/api/url.m3u8?m=url&s=%s&i=%s&q=%s' % ( ddns, package_name, c.source, c.source_id, c.quality) if apikey is not None: play_info += '&apikey=%s' % apikey import epg ins = epg.ModelEpgMakerChannel.get_instance_by_name(c.epg_name) icon = '' if ins is None else ins.icon if icon is None: icon = c.icon tvg_name = c.title group_name = c.group m3u += M3U_FORMAT % (c.source + '|' + c.source_id, tvg_name, icon, group_name, c.number, c.number, c.title, play_info) return m3u except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def detail(sub): if sub == 'setting': arg = ModelSetting.to_dict() arg['scheduler'] = str(scheduler.is_include(package_name)) arg['is_running'] = str(scheduler.is_running(package_name)) from system.model import ModelSetting as SystemModelSetting ddns = SystemModelSetting.get('ddns') arg['ddns'] = ddns apikey = None if SystemModelSetting.get_bool('auth_use_apikey'): apikey = SystemModelSetting.get('auth_apikey') for tmp in ['tvheadend', 'klive', 'hdhomerun']: arg[tmp] = '{ddns}/{package_name}/api/{sub}'.format( ddns=ddns, package_name=package_name, sub=tmp) if apikey is not None: arg[tmp] += '?apikey=' + apikey return render_template('{package_name}_{sub}.html'.format( package_name=package_name, sub=sub), arg=arg) elif sub == 'log': return render_template('log.html', package=package_name) return render_template('sample.html', title='%s - %s' % (package_name, sub))
def detail(sub): if sub == 'setting': arg = ModelSetting.to_dict() arg['trackers'] = '\n'.join(json.loads(arg['trackers'])) arg['plugin_ver'] = plugin_info['version'] from system.model import ModelSetting as SystemModelSetting ddns = SystemModelSetting.get('ddns') arg['api_url_base'] = '%s/%s/api' % (ddns, package_name) return render_template('%s_setting.html' % package_name, sub=sub, arg=arg) elif sub == 'search': arg = ModelSetting.to_dict() return render_template('%s_search.html' % package_name, arg=arg) elif sub == 'log': return render_template('log.html', package=package_name) return render_template('sample.html', title='%s - %s' % (package_name, sub))
def add_copy_force(self, item_id): try: item = ModelShareItem.get_by_id(item_id) logger.debug(f'복사 재요청!!!!! {item_id}') ret = {'ret':'fail', 'remote_path':item.remote_path, 'server_response':None} can_use_share_flag = RcloneTool2.can_use_share(ModelSetting.get('rclone_path'), ModelSetting.get('rclone_config_path'), ret['remote_path']) if not can_use_share_flag: ret['ret'] = 'cannot_access' return ret data = item.as_dict() data['ddns'] = SystemModelSetting.get('ddns') data['sjva_me_id'] = SystemModelSetting.get('sjva_me_user_id') data['version'] = version url = P.SERVER_URL + '/gd_share_server/noapi/user/request' res = requests.post(url, data={'data':json.dumps(data)}) ret['server_response'] = res.json() if ret['server_response']['ret'] == 'enqueue': if 'db_id' in ret['server_response'] and ret['server_response']['queue_name'] is not None: item.status = 'request' item.request_time = datetime.now() item.save() ret['ret'] = 'success' else: item.status = ret['server_response']['ret'] ret['ret'] = ret['server_response']['ret'] except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) ret['ret'] = 'fail' ret['log'] = str(e) logger.debug(ret) return ret
def process_telegram_data(data): try: ret = ModelItem.process_telegram_data(data) logger.debug(data) #ret = None if ret is not None: if ModelSetting.get_bool('receive_send_notify'): msg = '😉 AV 정보 수신\n' msg += '제목 : [%s] %s (%s)\n' % (ret.code, ret.title, ret.date) msg += '파일 : %s\n' % ret.filename msg += '폴더 : %s\n' % ret.dirname msg += '크기 : %s\n' % Util.sizeof_fmt(ret.total_size) url = '%s/%s/api/add_download?id=%s' % ( SystemModelSetting.get('ddns'), package_name, ret.id) if SystemModelSetting.get_bool('auth_use_apikey'): url += '&apikey=%s' % SystemModelSetting.get( 'auth_apikey') if app.config['config']['is_sjva_server']: msg += '\n' + ret.magnet + '\n' else: msg += '\n➕ 다운로드 추가\n<%s>\n' % url #msg += '\n➕ 다운로드 추가\n<%s>\n' % url poster = ret.poster if ModelSetting.get_bool( 'show_poster_notify') else None import framework.common.notify as Notify Notify.send_message(msg, image_url=poster, message_id='bot_downloader_av_receive') LogicNormal.invoke() TorrentProcess.receive_new_data(ret, package_name) except Exception, e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def process_ajax(sub, req): try: if sub == 'selenium_test_go': driver = SystemLogicSelenium.get_driver() driver.get(req.form['url']) return jsonify('success') elif sub == 'capture': driver = SystemLogicSelenium.get_driver() img = Image.open(BytesIO((driver.get_screenshot_as_png()))) timestamp = time.time() timestamp = str(timestamp).split('.')[0] tmp = os.path.join(path_data, 'tmp', '%s.png' % timestamp) img.save(tmp) from system.model import ModelSetting as SystemModelSetting ddns = SystemModelSetting.get('ddns') url = '%s/open_file%s' % (ddns, tmp) logger.debug(url) ret = {} ret['ret'] = 'success' ret['data'] = url return jsonify(ret) elif sub == 'full_capture': driver = SystemLogicSelenium.get_driver() img = SystemLogicSelenium.full_screenshot(driver) timestamp = time.time() timestamp = str(timestamp).split('.')[0] tmp = os.path.join(path_data, 'tmp', '%s.png' % timestamp) img.save(tmp) return send_file(tmp, mimetype='image/png') elif sub == 'cookie': driver = SystemLogicSelenium.get_driver() data = driver.get_cookies() return jsonify(data) elif sub == 'daum_capcha': daum_capcha = req.form['daum_capcha'] driver = SystemLogicSelenium.get_driver() #driver.find_element_by_xpath('//div[@class="secret_viewer"]/p/img').screenshot("captcha.png") driver.find_element_by_xpath( '//input[@id="answer"]').send_keys(daum_capcha) driver.find_element_by_xpath('//input[@value="%s"]' % u'확인').click() return jsonify({'ret': 'success'}) except Exception as exception: logger.error('Exception:%s', exception) logger.error(traceback.format_exc()) return jsonify('exception')
def get_logger(name): logger = logging.getLogger(name) if not logger.handlers: #global system_loading global level_unset_logger_list global logger_list level = logging.DEBUG from framework import flag_system_loading try: if flag_system_loading: try: from system.model import ModelSetting as SystemModelSetting level = SystemModelSetting.get('log_level') level = int(level) except: level = logging.DEBUG if level_unset_logger_list is not None: for item in level_unset_logger_list: item.setLevel(level) level_unset_logger_list = None else: level_unset_logger_list.append(logger) except: pass logger.setLevel(level) formatter = logging.Formatter(u'[%(asctime)s|%(levelname)s|%(filename)s:%(lineno)s] %(message)s') def customTime(*args): utc_dt = utc.localize(datetime.utcnow()) my_tz = timezone("Asia/Seoul") converted = utc_dt.astimezone(my_tz) return converted.timetuple() formatter.converter = customTime file_max_bytes = 1 * 1024 * 1024 fileHandler = logging.handlers.RotatingFileHandler(filename=os.path.join(path_data, 'log', '%s.log' % name), maxBytes=file_max_bytes, backupCount=5, encoding='utf8', delay=True) streamHandler = logging.StreamHandler() # handler에 fommater 세팅 fileHandler.setFormatter(formatter) streamHandler.setFormatter(CustomFormatter()) # Handler를 logging에 추가 logger.addHandler(fileHandler) logger.addHandler(streamHandler) return logger
def get_list_by_api(req, is_site, arg, site=None, board_id=None): try: #default_torrent_mode = db.session.query(ModelSetting).filter_by(key='default_torrent_mode').first().value default_torrent_mode = 'magnet' torrent_mode = req.args.get('torrent_mode') search_word = req.args.get('search') if search_word is not None and search_word != '': search_word = search_word.replace(' ', '+') if torrent_mode is not None: default_torrent_mode = torrent_mode if is_site: if site is None: sched_entity = db.session.query(ModelScheduler2).filter_by( id=arg).first() else: sched_entity = db.session.query(ModelScheduler2).filter_by( sitename=site).filter_by(board_id=board_id).first() items = LogicSearchSelf.get_list( call='api', sitename=sched_entity.sitename, board=sched_entity.board_id, search_word=search_word) title = 'SITE : %s BOARD : %s' % (sched_entity.sitename, sched_entity.board_id) else: groupname = arg group_entity = db.session.query(ModelGroup2).filter_by( groupname=arg).first() items = LogicSearchSelf.get_list(call='api', group=group_entity.groupname, search_word=search_word) title = 'GROUP : %s' % (group_entity.groupname) #from .torrent_site_base import TorrentSite xml = LogicSearchSelf.make_rss(title, items, default_torrent_mode, SystemModelSetting.get('ddns')) return xml except Exception as e: logger.debug('Exception:%s', e) logger.debug(traceback.format_exc()) logger.debug( 'get_list_by_api is_site:%s, arg:%s, site:%s, board_id:%s', is_site, arg, site, board_id)
def proxy(sub): logger.debug('proxy %s %s', package_name, sub) try: if sub == 'discover.json': ddns = SystemModelSetting.get('ddns') data = { "FriendlyName": "HDHomeRun CONNECT", "ModelNumber": "HDHR4-2US", "FirmwareName": "hdhomerun4_atsc", "FirmwareVersion": "20190621", "DeviceID": "104E8010", "DeviceAuth": "UF4CFfWQh05c3jROcArmAZaf", "BaseURL": "%s/tvheadend/proxy" % ddns, "LineupURL": "%s/tvheadend/proxy/lineup.json" % ddns, "TunerCount": 2 } return jsonify(data) elif sub == 'lineup_status.json': data = { "ScanInProgress": 0, "ScanPossible": 1, "Source": "Cable", "SourceList": ["Antenna", "Cable"] } return jsonify(data) elif sub == 'lineup.json': tvh_url = ModelSetting.get('tvh_url') tvh_auth = ModelSetting.get('tvh_auth') profile = ModelSetting.get('plex_profile') r = LogicNormal.get_response( '/api/channel/grid?start=0&limit=99999') channels = r.json()['entries'] lineup = [] for c in channels: if c['enabled']: url = '%s/stream/channel/%s?auth=%s&profile=%s' % ( tvh_url, c['uuid'], tvh_auth, profile) lineup.append({ 'GuideNumber': str(c['number']), 'GuideName': c['name'], 'URL': url }) return jsonify(lineup) except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def send_discord_message(cls, text, image_url=None, webhook_url=None): from system.model import ModelSetting as SystemModelSetting try: if webhook_url is None: webhook_url = SystemModelSetting.get('notify_discord_webhook') webhook = DiscordWebhook(url=webhook_url, content=text) if image_url is not None: embed = DiscordEmbed() embed.set_timestamp() embed.set_image(url=image_url) webhook.add_embed(embed) response = webhook.execute() return True except Exception as exception: logger.error('Exception:%s', exception) logger.error(traceback.format_exc()) return False
def do_action(self, req): try: upload_folderid = '16Wcqs0W60m0OaX9WU2ePPEy__O35wuYR' my_remote_path = req.form['my_remote_path'].strip() # 게시판 board_type = req.form['board_type'].strip() category_type = req.form['category_type'].strip() board_title = req.form['board_title'].strip() board_content = req.form['board_content'].strip() board_daum_url = req.form['board_daum_url'].strip() folder_name = req.form['folder_name'].strip() size = int(req.form['size'].strip()) daum_info = req.form['daum_info'].strip() action = req.form['action'].strip() user_id = SystemModelSetting.get('sjva_me_user_id') if board_content.startswith('ID:'): user_id = board_content.split('\n')[0].split(':')[1].strip() board_content = board_content[board_content.find('\n'):] def func(): ret = RcloneTool2.do_user_upload(ModelSetting.get('rclone_path'), ModelSetting.get('rclone_config_path'), my_remote_path, folder_name, upload_folderid, board_type, category_type, is_move=(action=='move')) if ret['completed']: if board_type != 'share_private' and ret['folder_id'] != '': msg = u'6. 게시물 등록중...\n' socketio.emit("command_modal_add_text", str(msg), namespace='/framework', broadcast=True) data = {'board_type' : board_type, 'category_type':category_type, 'board_title':board_title, 'board_content':board_content, 'board_daum_url' : board_daum_url, 'folder_name':folder_name, 'size':ret['size'], 'daum_info':daum_info, 'folder_id':ret['folder_id'], 'user_id':user_id, 'lsjson' : json.dumps(ret['lsjson'])} self.site_append(data) else: msg = u'업로드한 폴더ID값을 가져올 수 없어서 사이트 등록에 실패하였습니다.\n관리자에게 등록 요청하세요.\n' socketio.emit("command_modal_add_text", str(msg), namespace='/framework', broadcast=True) else: socketio.emit("command_modal_add_text", u'업로드가 완료되지 않아 게시글이 등록되지 않습니다.\n', namespace='/framework', broadcast=True) socketio.emit("command_modal_add_text", u'확인 후 다시 시도하세요.\n', namespace='/framework', broadcast=True) socketio.emit("command_modal_add_text", u'\n모두 완료되었습니다.\n', namespace='/framework', broadcast=True) thread = threading.Thread(target=func, args=()) thread.setDaemon(True) thread.start() return '' except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def detail(sub): if sub == 'setting': arg = ModelSetting.to_dict() arg['package_name'] = package_name arg['rule_size'] = len(ModelSetting.get_json('rules')) arg['ddns'] = SystemModelSetting.get('ddns').rstrip('/') arg['project_template_list'] = [ ['', '선택하면 설치 명령이 자동 완성됩니다.'], ['git|https://github.com/codedread/kthoom', 'https://github.com/codedread/kthoom'], ['git|https://github.com/daleharvey/pacman', 'https://github.com/daleharvey/pacman'], ['git|https://github.com/ziahamza/webui-aria2|docs', 'https://github.com/ziahamza/webui-aria2'], ['git|https://github.com/SauravKhare/speedtest', 'https://github.com/SauravKhare/speedtest'], ['tar|https://github.com/viliusle/miniPaint/archive/v4.2.4.tar.gz', 'https://github.com/viliusle/miniPaint'], ['zip|https://github.com/mayswind/AriaNg/releases/download/1.1.6/AriaNg-1.1.6.zip', 'https://github.com/mayswind/AriaNg'], ] return render_template('%s_setting.html' % package_name, sub=sub, arg=arg) elif sub == 'log': return render_template('log.html', package=package_name) return render_template('sample.html', title='%s - %s' % (package_name, sub))
def second_menu(sub, sub2): try: arg = ModelSetting.to_dict() arg['package_name'] = package_name if sub == 'direct': if sub2 == 'setting': return render_template('%s_%s_%s.html' % (package_name, sub, sub2), arg=arg) elif sub2 in ['request']: return render_template('%s_%s_%s.html' % (package_name, sub, sub2), arg=arg) elif sub == 'rss': if sub2 == 'setting': arg['sub'] = sub arg['scheduler'] = str(scheduler.is_include('%s_%s' % (package_name, sub))) arg['is_running'] = str(scheduler.is_running('%s_%s' % (package_name, sub))) from system.model import ModelSetting as SystemModelSetting ddns = SystemModelSetting.get('ddns') arg['rss_api'] = '%s/%s/api/%s' % (ddns, package_name, sub) if SystemModelSetting.get_bool('auth_use_apikey'): arg['rss_api'] += '?apikey=%s' % SystemModelSetting.get('auth_apikey') return render_template('%s_%s_%s.html' % (package_name, sub, sub2), arg=arg) elif sub2 in ['job', 'list']: arg['is_available_normal_download'] = False try: import downloader arg['is_available_normal_download'] = downloader.Logic.is_available_normal_download() except: pass if sub2 == 'list': arg['jobs'] = ModelOffcloud2Job.get_list(by_dict=True) return render_template('%s_%s_%s.html' % (package_name, sub, sub2), arg=arg) elif sub == 'cache': if sub2 == 'setting': arg['sub'] = sub from system.model import ModelSetting as SystemModelSetting ddns = SystemModelSetting.get('ddns') arg['rss_api'] = '%s/%s/api/%s' % (ddns, package_name, sub) if SystemModelSetting.get_bool('auth_use_apikey'): arg['rss_api'] += '?apikey=%s' % SystemModelSetting.get('auth_apikey') return render_template('%s_%s_%s.html' % (package_name, sub, sub2), arg=arg) elif sub2 == 'list': arg['type'] = ['KTV', 'KTV_ETC', 'MOVIE', 'MOVIE_ETC', 'MUSIC', 'SHOW', 'ANI', 'PROGRAM', 'JAV_CENSORED_DMM', 'JAV_CENSORED_JAVDB', 'JAV_CENSORED_ETC', 'JAV_UNCENSORED', 'AV_WEST', 'AV_EAST', 'ETC'] return render_template('%s_%s_%s.html' % (package_name, sub, sub2), arg=arg) return render_template('sample.html', title='%s - %s - %s' % (package_name, sub, sub2)) except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def get_channel_list(cls): try: stamp = str(datetime.datetime.today().strftime('%Y%m%d%H%M%S')) url = 'http://123.140.104.150/api/epg/v1/channel/virtual?access_key=C4A0697007C3548D389B&cp_id=S_LGU_HYUK0920&system_id=HDTV&SA_ID=500053434041&STB_MAC=v000.5343.4041&NSC_TYPE=LTE&BASE_GB=Y&BASE_CD=W172.017&YOUTH_YN=N&ORDER_GB=N&POOQ_YN=N&HDTV_VIEW_GB=R&SID=001010005638&CLIENT_IP=172.17.100.15&OS_INFO=android_4.4.2&NW_INFO=WIFI&APP_TYPE=ROSA&DEV_MODEL=SM-N935F&CARRIER_TYPE=E&UI_VER=04.38.04&NOW_PAGE=25&PRE_PAGE=&MENU_NM=&CONTS_GB=&TERM_BINVER=3.8.118.0106' ret = [] request = py_urllib2.Request(url) response = py_urllib2.urlopen(request) tree = ET.parse(response) root = tree.getroot() for item in root.findall('list'): #info = {} #info['id'] = item.findtext('service_id') #info['title'] = item.findtext('service_name').strip() #info['img'] = item.findtext('img_url') + item.findtext('img_file_name') #info['summary'] = item.findtext('description') #url = item.findtext('live_server1') + item.findtext('live_file_name1') #info['url'] = '%s?VOD_RequestID=v2M2-0101-1010-7272-5050-0000%s;LTE;480p;WIFI&APPNAME=hdtv&ALBUM_ID=%s&ma=D0:17:C2:CE:D7:A1' % (url, stamp, info['id']) #if item.findtext('live_file_name1') != '' and item.findtext('genre_name') != u'성인': # result.append(info) import system if item.findtext('service_id') in ['628', '629', '743']: if not SystemModelSetting.get_bool('videoportal_adult'): continue c = ModelChannel(cls.source_name, item.findtext('service_id'), item.findtext('service_name').strip(), item.findtext('img_url') + item.findtext('img_file_name'), True) c.current = item.findtext('description') ret.append(c) except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) return ret
def scheduler_function(): try: last_id = ModelSetting.get_int('last_id') flag_first = False if last_id == -1: flag_first = True # 최초 실행은 -1로 판단하고, 봇을 설정안했다면 0으로 query = db.session.query(ModelMovieItem) \ .filter(ModelMovieItem.created_time > datetime.datetime.now() + datetime.timedelta(days=-7)) items = query.all() else: query = db.session.query(ModelMovieItem) \ .filter(ModelMovieItem.id > last_id ) items = query.all() # 하나씩 판단.... logger.debug('New Feed.. last_id:%s count :%s', last_id, len(items)) for item in items: try: flag_download = False item.download_status = '' item.downloader_item_id = None item.log = '' option_auto_download = ModelSetting.get( 'option_auto_download') if option_auto_download == '0': item.download_status = 'no' else: flag_download = LogicNormal.check_option_meta(item) if flag_download: flag_download = LogicNormal.check_option_target( item) if flag_download: flag_download = LogicNormal.check_option_country_include( item) if flag_download: flag_download = LogicNormal.check_option_country_exclude( item) if flag_download: flag_download = LogicNormal.check_option_year(item) if flag_download: flag_download = LogicNormal.check_option_genre_include( item) if flag_download: flag_download = LogicNormal.check_option_genre_exclude( item) if flag_download: flag_download = LogicNormal.check_option_rate(item) if flag_download: flag_download = LogicNormal.check_option_keyword_include( item) if flag_download: flag_download = LogicNormal.check_option_keyword_exclude( item) if flag_download: flag_download = LogicNormal.check_option_quality( item) if flag_download: flag_download = LogicNormal.check_option_source( item) if flag_download: flag_download = LogicNormal.check_option_video_codec( item) if flag_download: flag_download = LogicNormal.check_option_audio_codec( item) if flag_download: flag_download = LogicNormal.check_option_sub(item) if flag_download: flag_download = LogicNormal.check_option_plex(item) if flag_download: flag_download = LogicNormal.check_option_size(item) if flag_download: flag_download = LogicNormal.check_option_server_id_mod( item) #다운로드 if flag_download: if option_auto_download == '1': import downloader downloader_item_id = downloader.Logic.add_download2( item.magnet, ModelSetting.get('torrent_program'), ModelSetting.get('path'), request_type=package_name, request_sub_type='', server_id='%s_%s_%s' % (item.server_id, item.file_count, item.total_size))['downloader_item_id'] item.downloader_item_id = downloader_item_id item.download_status = 'true' is_available_normal_download = downloader.Logic.is_available_normal_download( ) if is_available_normal_download and item.sub is not None: for idx, sub in enumerate(item.sub): url = '%s/%s/api/attach?id=%s_%s' % ( SystemModelSetting.get('ddns'), package_name, item.id, idx) if SystemModelSetting.get_bool( 'auth_use_apikey'): url += '&apikey=%s' % SystemModelSetting.get( 'auth_apikey') downloader.Logic.add_download2( url, ModelSetting.get( 'torrent_program'), ModelSetting.get('path'), request_type=package_name, request_sub_type='', server_id='%s_%s_%s' % (item.server_id, item.file_count, item.total_size)) else: item.download_status = 'true_only_status' else: if option_auto_download == '1': item.download_status = 'false' else: item.download_status = 'false_only_status' if ModelSetting.get_bool('download_start_send_telegram'): LogicNormal.send_telegram_message(item) item.download_check_time = datetime.datetime.now() db.session.add(item) except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) new_last_id = last_id if flag_first and len(items) == 0: new_last_id = '0' else: if len(items) > 0: new_last_id = '%s' % items[len(items) - 1].id if new_last_id != last_id: ModelSetting.set('last_id', str(new_last_id)) db.session.commit() except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def add_download2(download_url, default_torrent_program, download_path, request_type='web', request_sub_type='', server_id=None, magnet=None): try: ######################## add name to magnet if ModelSetting.get_bool('use_download_name'): if "&dn=" not in download_url: try: data = {'uri': download_url} url = '%s/torrent_info/api/json' % ( SystemModelSetting.get('ddns')) if SystemModelSetting.get_bool('auth_use_apikey'): url += '?apikey=%s' % SystemModelSetting.get( 'auth_apikey') raw_info = requests.get(url, data).json() if raw_info[u'success']: download_url += '&dn=' + raw_info[u'info'][u'name'] # else: # #logger.debug("log: %d", str(raw_info[u'log'])) except: pass ######################## torrent_tracker if ModelSetting.get_bool('use_tracker'): tracker_list = [] tracker_list += [ tracker.strip() for tracker in ModelSetting.get('tracker_list').split('\n') if len(tracker.strip()) != 0 ] tracker_list += [ tracker.strip() for tracker in ModelSetting.get( 'tracker_list_manual').split('\n') if len(tracker.strip()) != 0 ] for tracker in tracker_list: download_url += '&tr=' + tracker ######################## setting_list = db.session.query(ModelSetting).all() arg = Util.db_list_to_dict(setting_list) if default_torrent_program is None: default_torrent_program = arg['default_torrent_program'] if download_path is not None and download_path.strip() == '': download_path = None if default_torrent_program == '0': if download_path is None: download_path = arg['transmission_default_path'] download_path = LogicNormal.get_download_path(download_path, server_id, download_url, magnet=magnet) ret = LogicTransmission.add_download(download_url, download_path) elif default_torrent_program == '1': if download_path is None: download_path = arg['downloadstation_default_path'] download_path = LogicNormal.get_download_path(download_path, server_id, download_url, magnet=magnet) ret = LogicDownloadStation.add_download( download_url, download_path) elif default_torrent_program == '2': if download_path is None: download_path = arg['qbittorrnet_default_path'] download_path = LogicNormal.get_download_path(download_path, server_id, download_url, magnet=magnet) ret = LogicQbittorrent.add_download(download_url, download_path) elif default_torrent_program == '3': if download_path is None: download_path = arg['aria2_default_path'] download_path = LogicNormal.get_download_path(download_path, server_id, download_url, magnet=magnet) ret = LogicAria2.add_download(download_url, download_path) ret['default_torrent_program'] = default_torrent_program ret['downloader_item_id'] = ModelDownloaderItem.save( ret, request_type, request_sub_type) except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) ret = {'ret': 'error'} finally: return ret
def make_rss(title, rss_list, torrent_mode, ddns, is_bot=False, search_word=None): from framework.common.rss import RssUtil xml = '<rss xmlns:showrss="http://showrss.info/" version="2.0">\n' xml += '\t<channel>\n' xml += '\t\t<title>' + '%s</title>\n' % title xml += '\t\t<link></link>\n' xml += '\t\t<description></description>\n' magnet_flag = False for bbs in rss_list: _dict = bbs.as_dict() if bbs.torrent_info is None and 'magnet' in _dict and _dict[ 'magnet'] is not None: for magnet in _dict['magnet']: magnet_flag = True item_str = '\t\t<item>\n' tmp = '\t\t\t<title>%s</title>\n' % RssUtil.replace_xml( bbs.title) item_str += tmp item_str += '\t\t\t<link>%s</link>\n' % magnet date_str = bbs.created_time.strftime( '%a, %d %b %Y %H:%M:%S') + ' +0900' item_str += '\t\t\t<pubDate>%s</pubDate>\n' % date_str item_str += '\t\t</item>\n' xml += item_str else: if bbs.torrent_info is not None: for info in bbs.torrent_info: magnet_flag = True item_str = '\t\t<item>\n' if search_word is not None and search_word != '' and info[ 'name'].find(search_word) == -1: continue tmp = '\t\t\t<title>%s</title>\n' % RssUtil.replace_xml( info['name']) item_str += tmp item_str += '\t\t\t<link>magnet:?xt=urn:btih:%s</link>\n' % info[ 'info_hash'] date_str = bbs.created_time.strftime( '%a, %d %b %Y %H:%M:%S') + ' +0900' item_str += '\t\t\t<pubDate>%s</pubDate>\n' % date_str item_str += '\t\t</item>\n' xml += item_str if _dict['files']: for index, download in enumerate(_dict['files']): try: item_str = '\t\t<item>\n' if magnet_flag and download[1].lower().endswith( '.torrent'): continue item_str += '\t\t\t<title>%s</title>\n' % RssUtil.replace_xml( download[1]) url = '%s/%s/api/download/%s_%s' % (ddns, package_name, bbs.id, index) if SystemModelSetting.get_bool('auth_use_apikey'): url += '?apikey=%s' % SystemModelSetting.get( 'auth_apikey') item_str += '\t\t\t<link>%s</link>\n' % url date_str = bbs.created_time.strftime( '%a, %d %b %Y %H:%M:%S') + ' +0900' item_str += '\t\t\t<pubDate>%s</pubDate>\n' % date_str item_str += '\t\t</item>\n' xml += item_str except Exception as e: logger.debug('Exception:%s', e) logger.debug(traceback.format_exc()) xml += '\t</channel>\n' xml += '</rss>' return xml
def xmltv_php(source): url = '/%s/%s/api/epg' % (package_name, source) if SystemModelSetting.get_bool('auth_use_apikey'): url += '?apikey=%s' % SystemModelSetting.get('auth_apikey') return redirect(url)
def api(sub): try: if sub == 'add_download': db_id = request.args.get('id') ret1 = LogicNormal.add_download(db_id) ret2 = LogicNormal.add_download_sub(db_id, -1) return jsonify(ret1) elif sub == 'rss': ret = ModelMovieItem.api_list(request) data = [] for item in ret: entity = {} entity['title'] = item.filename entity['link'] = item.magnet entity['created_time'] = item.created_time data.append(entity) if item.sub is not None: for idx, sub in enumerate(item.sub): url = '%s/%s/api/attach?id=%s_%s' % ( SystemModelSetting.get('ddns'), package_name, item.id, idx) if SystemModelSetting.get_bool('auth_use_apikey'): url += '&apikey=%s' % SystemModelSetting.get( 'auth_apikey') entity = {} entity['title'] = sub[1] entity['link'] = url entity['created_time'] = item.created_time data.append(entity) from framework.common.rss import RssUtil xml = RssUtil.make_rss(package_name, data) return Response(xml, mimetype='application/xml') elif sub == 'attach': tmp = request.args.get('id').split('_') entity = ModelMovieItem.get_by_id(tmp[0]) if entity is not None: import requests import io session = requests.Session() if entity.sub[int(tmp[1])][2] != 'NONE': logger.debug('url : %s', entity.sub[int(tmp[1])][2]) page = get_html(session, entity.sub[int(tmp[1])][2], stream=True) else: logger.debug('url : %s', entity.url) logger.debug('url : %s', entity.sub[int(tmp[1])][0]) page = get_html(session, entity.url) page = get_html(session, entity.sub[int(tmp[1])][0], referer=entity.url, stream=True) byteio = io.BytesIO() for chunk in page.iter_content(1024): byteio.write(chunk) filedata = byteio.getvalue() logger.debug('LENGTH : %s', len(filedata)) attach_filename = entity.sub[int(tmp[1])][1] if ModelSetting.get_bool('sub_change_filename'): ext = os.path.splitext(attach_filename)[1].lower() if ext in ['.smi', '.srt', '.ass']: attach_filename = '%s%s' % (os.path.splitext( entity.filename)[0], ext) logger.debug('filename : %s', attach_filename) return send_file(io.BytesIO(filedata), mimetype='application/octet-stream', as_attachment=True, attachment_filename=attach_filename) except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def api(sub): if sub == 'url.m3u8': try: mode = request.args.get('m') source = request.args.get('s') source_id = request.args.get('i') quality = request.args.get('q') #logger.debug('m:%s, s:%s, i:%s', mode, source, source_id) action, ret = LogicKlive.get_url(source, source_id, quality, mode) #logger.debug('action:%s, url:%s', action, ret) if mode == 'plex': from system.model import ModelSetting as SystemModelSetting #new_url = '%s/klive/api/url.m3u8?m=web_play&s=%s&i=%s&q=%s' % (SystemModelSetting.get('ddns'), source, source_id, quality) new_url = '%s/klive/api/url.m3u8?m=url&s=%s&i=%s&q=%s' % ( SystemModelSetting.get('ddns'), source, source_id, quality) #logger.debug(SystemModelSetting.get_bool('auth_use_apikey')) if SystemModelSetting.get_bool('auth_use_apikey'): new_url += '&apikey=%s' % SystemModelSetting.get( 'auth_apikey') def generate(): startTime = time.time() buffer = [] sentBurst = False if platform.system() == 'Windows': path_ffmpeg = os.path.join(path_app_root, 'bin', platform.system(), 'ffmpeg.exe') else: path_ffmpeg = 'ffmpeg' #ffmpeg_command = [path_ffmpeg, "-i", new_url, "-c", "copy", "-f", "mpegts", "-tune", "zerolatency", "pipe:stdout"] ffmpeg_command = [ path_ffmpeg, "-i", new_url, "-c:v", "copy", "-c:a", "aac", "-b:a", "128k", "-f", "mpegts", "-tune", "zerolatency", "pipe:stdout" ] logger.debug('command : %s', ffmpeg_command) process = subprocess.Popen(ffmpeg_command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=-1) global process_list process_list.append(process) while True: line = process.stdout.read(1024) buffer.append(line) if sentBurst is False and time.time( ) > startTime + 1 and len(buffer) > 0: sentBurst = True for i in range(0, len(buffer) - 2): yield buffer.pop(0) elif time.time() > startTime + 1 and len(buffer) > 0: yield buffer.pop(0) process.poll() if isinstance(process.returncode, int): if process.returncode > 0: logger.debug('FFmpeg Error :%s', process.returncode) break return Response(stream_with_context(generate()), mimetype="video/MP2T") if action == 'redirect': return redirect(ret, code=302) elif action == 'return_after_read': data = LogicKlive.get_return_data(source, source_id, ret, mode) #logger.debug('Data len : %s', len(data)) return data, 200, { 'Content-Type': 'application/vnd.apple.mpegurl' } elif action == 'return': return ret if ret == None: return if mode == 'url.m3u8': return redirect(ret, code=302) elif mode == 'lc': return ret except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) elif sub == 'm3uall': return LogicKlive.get_m3uall() elif sub == 'm3u': data = LogicKlive.get_m3u(m3u_format=request.args.get('format'), group=request.args.get('group')) if request.args.get('file') == 'true': import framework.common.util as CommonUtil basename = 'klive_custom.m3u' filename = os.path.join(path_data, 'tmp', basename) CommonUtil.write_file(data, filename) return send_file(filename, as_attachment=True, attachment_filename=basename) else: return data elif sub == 'm3utvh': return LogicKlive.get_m3u(for_tvh=True, m3u_format=request.args.get('format'), group=request.args.get('group'), quality=request.args.get('quality')) elif sub == 'redirect': try: url = request.args.get('url') proxy = request.args.get('proxy') proxies = None if proxy is not None: proxy = urllib.unquote(proxy) proxies = {"https": proxy, 'http': proxy} url = urllib.unquote(url) #logger.debug('REDIRECT:%s', url) res = requests.get(url, proxies=proxies) data = res.content return data, 200, {'Content-Type': res.headers['Content-Type']} except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())