def process_telegram_data(self, data, target=None): 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/%s/add_download?url=%s' % (SystemModelSetting.get('ddns'), package_name, self.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(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') self.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: logger.debug('receive data') logger.debug(data) type_list = ModelSetting.get('cache_save_type_list').split('|') type_list = Util.get_list_except_empty(type_list) if len(type_list) == 0 or data['t'] in type_list: ret = ModelOffcloud2Cache.add(data) if ret is not None: logger.debug('Offcloud2 %s append' % ret.name) if ModelSetting.get_bool( 'cache_receive_info_send_telegram'): msg = '😉 Offcloud2 캐쉬 정보 수신\n' msg += 'Type : %s\n' % data['t'] msg += '%s\n' % data['n'] from system.model import ModelSetting as SystemModelSetting ddns = SystemModelSetting.get('ddns') url = '%s/%s/api/cache_download?id=%s' % ( ddns, package_name, ret.id) if SystemModelSetting.get_bool('auth_use_apikey'): url += '&apikey=%s' % SystemModelSetting.get( 'auth_apikey') msg += '➕ 리모트 다운로드 추가\n<%s>' % url import framework.common.notify as Notify Notify.send_message( msg, message_id='offcloud2_cache_receive') except Exception as e: logger.error(e) logger.error(traceback.format_exc())
def process_telegram_data(self, data, target=None): 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/%s/add_download?id=%s' % (SystemModelSetting.get('ddns'), package_name, self.name, ret.id) if SystemModelSetting.get_bool('auth_use_apikey'): url += '&apikey=%s' % SystemModelSetting.get('auth_apikey') if app.config['config']['is_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 ToolBaseNotify.send_message(msg, image_url=poster, message_id='bot_downloader_av_receive') self.invoke() try: if app.config['config']['is_server']: from tool_expand import TorrentProcess TorrentProcess.receive_new_data(ret, package_name) except: pass except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def process_menu(self, sub, req): arg = P.ModelSetting.to_dict() arg['sub'] = self.name if sub == 'setting': arg['scheduler'] = str( scheduler.is_include(self.get_scheduler_name())) arg['is_running'] = str( scheduler.is_running(self.get_scheduler_name())) ddns = SystemModelSetting.get('ddns') arg['rss_api'] = '%s/%s/api/%s/rss' % (ddns, package_name, self.name) if SystemModelSetting.get_bool('auth_use_apikey'): arg['rss_api'] += '?apikey=%s' % SystemModelSetting.get( 'auth_apikey') return render_template( '{package_name}_{module_name}_{sub}.html'.format( package_name=package_name, module_name=self.name, sub=sub), arg=arg) elif sub == 'list': arg['is_torrent_info_installed'] = False try: import torrent_info arg['is_torrent_info_installed'] = True except: pass return render_template( '{package_name}_{module_name}_{sub}.html'.format( package_name=package_name, module_name=self.name, sub=sub), arg=arg) return render_template('sample.html', title='%s - %s' % (package_name, sub))
def first_menu(sub): #logger.debug('DETAIL %s %s', package_name, sub) try: arg = ModelSetting.to_dict() arg['package_name'] = package_name arg['ddns'] = SystemModelSetting.get('ddns') arg['auth_use_apikey'] = str(SystemModelSetting.get_bool('auth_use_apikey')) arg['auth_apikey'] = SystemModelSetting.get('auth_apikey') if sub == 'setting': arg['scheduler'] = str(scheduler.is_include(package_name)) arg['is_running'] = str(scheduler.is_running(package_name)) ddns = SystemModelSetting.get('ddns') arg['api_m3u'] = '{ddns}/{package_name}/api/m3u'.format(ddns=ddns, package_name=package_name) arg['api_m3utvh'] = '{ddns}/{package_name}/api/m3utvh'.format(ddns=ddns, package_name=package_name) arg['api_m3uall'] = '{ddns}/{package_name}/api/m3uall'.format(ddns=ddns, package_name=package_name) arg['xmltv'] = '{ddns}/epg/api/klive'.format(ddns=ddns) arg['plex_proxy'] = '{ddns}/{package_name}/proxy'.format(ddns=ddns, package_name=package_name) arg['wavve_vod'] = '{ddns}/{package_name}/wavve/api/m3u'.format(ddns=ddns, package_name=package_name) arg['tving_vod'] = '{ddns}/{package_name}/tving/api/m3u'.format(ddns=ddns, package_name=package_name) if SystemModelSetting.get_bool('auth_use_apikey'): apikey = SystemModelSetting.get('auth_apikey') for tmp in ['api_m3u', 'api_m3uall', 'api_m3utvh', 'xmltv', 'wavve_vod', 'tving_vod']: arg[tmp] += '?apikey={apikey}'.format(apikey=apikey) from .source_streamlink import SourceStreamlink arg['tmp_is_streamlink_installed'] = 'Installed' if SourceStreamlink.is_installed() else 'Not Installed' from .source_youtubedl import SourceYoutubedl arg['tmp_is_youtubedl_installed'] = 'Installed' if SourceYoutubedl.is_installed() else 'Not Installed' return render_template('{package_name}_{sub}.html'.format(package_name=package_name, sub=sub), arg=arg) elif sub == 'list': return render_template('{package_name}_{sub}.html'.format(package_name=package_name, sub=sub), arg=arg) elif sub == 'custom_create': return render_template('{package_name}_{sub}.html'.format(package_name=package_name, sub=sub), arg=arg) elif sub == 'custom_edit': return render_template('{package_name}_{sub}.html'.format(package_name=package_name, sub=sub), arg=arg) elif sub == 'proxy': return redirect('/klive/proxy/discover.json') 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 make_apikey(url): from framework import SystemModelSetting url = url.format(ddns=SystemModelSetting.get('ddns')) if SystemModelSetting.get_bool('auth_use_apikey'): if url.find('?') == -1: url += '?' else: url += '&' url += 'apikey=%s' % SystemModelSetting.get('auth_apikey') return url
def make_apikey_url(cls, url): from framework import SystemModelSetting if not url.startswith('http'): url = SystemModelSetting.get('ddns') + url if SystemModelSetting.get_bool('auth_use_apikey'): if url.find('?') == -1: url += '?' else: url += '&' url += 'apikey=%s' % SystemModelSetting.get('auth_apikey') return url
def make_vod_m3u(cls): try: from lxml import etree as ET from system.model import ModelSetting as SystemModelSetting data = "#EXTM3U\n" root = ET.Element('tv') root.set('generator-info-name', "wavve") form = '#EXTINF:-1 tvg-id="{contentid}" tvg-name="{title}" tvh-chno="{channel_number}" tvg-logo="" group-title="웨이브 최신 VOD",{title}\n{url}\n' ch_number = 1 for page in range(1, ModelSetting.get_int('wavve_vod_page') + 1): vod_list = Wavve.vod_newcontents(page=page)['list'] for info in vod_list: title = info['programtitle'] if info['episodenumber'] != '': title += ' (%s회)' % info['episodenumber'] tmp = info['episodetitle'].find('Quick VOD') if tmp != -1: title += info['episodetitle'][tmp - 2:] video_url = '%s/%s/wavve/api/streaming.m3u8?contentid=%s&type=%s' % ( SystemModelSetting.get('ddns'), package_name, info['contentid'], info['type']) if SystemModelSetting.get_bool('auth_use_apikey'): video_url += '&apikey=%s' % SystemModelSetting.get( 'auth_apikey') data += form.format(contentid=info['contentid'], title=title, channel_number=ch_number, logo='', url=video_url) channel_tag = ET.SubElement(root, 'channel') channel_tag.set('id', info['contentid']) #channel_tag.set('repeat-programs', 'true') display_name_tag = ET.SubElement(channel_tag, 'display-name') display_name_tag.text = '%s(%s)' % (title, ch_number) display_name_tag = ET.SubElement(channel_tag, 'display-number') display_name_tag.text = str(ch_number) ch_number += 1 tree = ET.ElementTree(root) ret = ET.tostring(root, pretty_print=True, xml_declaration=True, encoding="utf-8") return data, ret except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def process_menu(self, sub, req): arg = P.ModelSetting.to_dict() if sub == 'setting': arg['sample'] = '%s/%s/api/google/rss?remote=[구글리모트]&title=[제목]&desc=&image=&genre=' % ( SystemModelSetting.get('ddns'), package_name) if SystemModelSetting.get_bool('auth_use_apikey'): arg['sample'] += '&apikey=%s' % SystemModelSetting.get( 'auth_apikey') return render_template( '{package_name}_{module_name}_{sub}.html'.format( package_name=P.package_name, module_name=self.name, sub=sub), arg=arg) return render_template('sample.html', title='%s - %s' % (package_name, sub))
def process_menu(self, sub, req): arg = P.ModelSetting.to_dict() if sub == 'setting': arg['tmp_pb_api'] = '%s/%s/api/podbbang/%s' % ( SystemModelSetting.get('ddns'), package_name, '12548') if SystemModelSetting.get_bool('auth_use_apikey'): arg['tmp_pb_api'] += '?apikey=%s' % SystemModelSetting.get( 'auth_apikey') return render_template( '{package_name}_{module_name}_{sub}.html'.format( package_name=P.package_name, module_name=self.name, sub=sub), arg=arg) return render_template('sample.html', title='%s - %s' % (package_name, sub))
def change_redirect_data(cls, data, proxy=None): try: #logger.debug(data) from system.model import ModelSetting as SystemModelSetting tmp = re.compile(r'http(.*?)$', re.MULTILINE).finditer(data) for m in tmp: u = m.group(0) u2 = '{ddns}/{package_name}/api/redirect?url={url}'.format(ddns=SystemModelSetting.get('ddns'), package_name=package_name, url=urllib.quote(u)) if SystemModelSetting.get_bool('auth_use_apikey'): u2 += '&apikey={apikey}'.format(apikey=SystemModelSetting.get('auth_apikey')) if proxy is not None: u2 += '&proxy=%s' % proxy data = data.replace(u, u2) #logger.debug(data) return data except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
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/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 add_download_sub(db_id, index): try: import downloader item = ModelMovieItem.get_by_id(db_id) is_available_normal_download = downloader.Logic.is_available_normal_download() if is_available_normal_download and item.sub is not None: for idx, dummy in enumerate(item.sub): if index == -1 or idx == index: 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='movie_%s_%s_%s' % (item.server_id, item.file_count, item.total_size), magnet=item.magnet ) return True return False except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) return False
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_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()) ToolBaseNotify.send_message(msg, image_url=ret.daum_poster, message_id='bot_downloader_movie_receive') LogicNormal.invoke() try: if app.config['config']['is_server']: from tool_expand import TorrentProcess TorrentProcess.receive_new_data(ret, package_name) except: pass except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def make_klive(sub): try: from klive.logic_klive import LogicKlive from klive.model import ModelSetting as KliveModelSetting if LogicKlive.source_list is None: tmp = LogicKlive.channel_load_from_site() instance = LogicKlive.source_list['wavve'] from system.model import ModelSetting as SystemModelSetting tmp = builder.ElementMaker( nsmap={'itunes': 'http://www.itunes.com/dtds/podcast-1.0.dtd'}) root = tmp.rss(version="2.0") EE = builder.ElementMaker( namespace="http://www.itunes.com/dtds/podcast-1.0.dtd", nsmap={'itunes': 'http://www.itunes.com/dtds/podcast-1.0.dtd'}) channel_tag = (E.channel( E.title('KLive Radio'), E.link(), E.description('KLive Radio'), E.language('ko-kr'), E.copyright(''), EE.subtitle(), EE.author(), EE.summary('KLive Radio'), EE.category('Radio'), EE.image(), EE.explicit('no'), EE.keywords('Radio'), )) root.append(channel_tag) for idx, c in enumerate(instance.get_channel_list()): if not c.is_tv: logger.debug(c.title) logger.debug(c.current) logger.debug(c.source_id) logger.debug(c.source) url = '%s/klive/api/url.m3u8?m=url&s=%s&i=%s' % ( SystemModelSetting.get('ddns'), c.source, c.source_id) if SystemModelSetting.get_bool('auth_use_apikey'): url += '&apikey=%s' % SystemModelSetting.get( 'auth_apikey') channel_tag.append( E.item( E.title(c.title), EE.subtitle(c.current), EE.summary(c.current), E.guid(str(idx + 1)), E.pubDate(datetime.now().strftime( '%a, %d %b %Y %H:%M:%S') + ' +0900'), #EE.duration(), E.enclosure( url=url ), #, length=item['file_size'], type='audio/mp3'), E.description(c.current))) return app.response_class(ET.tostring(root, pretty_print=True, xml_declaration=True, encoding="utf-8"), mimetype='application/xml') except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def scheduler_function_torrent_check(): 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='movie_%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='movie_%s_%s_%s' % (item.server_id, item.file_count, item.total_size), magnet=item.magnet) 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 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): 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': #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"] # 2020-12-17 by 잠자 ffmpeg_command = [path_ffmpeg, "-loglevel", "quiet", "-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': logger.warning('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'), call=request.args.get('call')) 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')) elif sub == 'redirect': try: url = request.args.get('url') proxy = request.args.get('proxy') proxies = None if proxy is not None: proxy = py_urllib.unquote(proxy) proxies={"https": proxy, 'http':proxy} url = py_urllib.unquote(url) #logger.debug('REDIRECT:%s', url) #logger.warning(f"redirect : {url}") # 2021-06-03 """ res = requests.get(url, proxies=proxies) data = res.content return data, 200, {'Content-Type':res.headers['Content-Type']} """ headers = {'Connection' : 'keep-alive'} r = requests.get(url, headers=headers, stream=True, proxies=proxies) rv = Response(r.iter_content(chunk_size=1024), r.status_code, content_type=r.headers['Content-Type'], direct_passthrough=True) return rv except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) elif sub == 'url.mpd': try: mode = request.args.get('m') source = request.args.get('s') source_id = request.args.get('i') quality = request.args.get('q') return_format = 'json' data = LogicKlive.get_play_info(source, source_id, quality, mode=mode, return_format=return_format) return jsonify(data) except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) elif sub == 'url.strm': try: mode = request.args.get('m') source = request.args.get('s') source_id = request.args.get('i') quality = request.args.get('q') return_format = 'strm' data = LogicKlive.get_play_info(source, source_id, quality, mode=mode, return_format=return_format) #return data import framework.common.util as CommonUtil from .model import ModelCustom db_item = ModelCustom.get(source, source_id) if db_item is not None: basename = '%s.strm' % db_item.title else: basename = '%s.strm' % source_id filename = os.path.join(path_data, 'tmp', basename) CommonUtil.write_file(data, filename) return send_file(filename, as_attachment=True, attachment_filename=basename) #return data except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) elif sub == 'sinaplayer': data = LogicKlive.get_m3u_for_sinaplayer() return data
def get_proxy(): if SystemModelSetting.get_bool('site_wavve_use_proxy'): return SystemModelSetting.get('site_wavve_proxy_url')
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') and download_url.lower().find('magnet') != -1: 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') and download_url.lower().find('magnet') != -1: 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