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 show_menu(): from flask import request from system.model import ModelSetting as SystemModelSetting if SystemModelSetting.get_bool('hide_menu'): if request.full_path.find('/login') != -1: return False return True
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): try: if sub == 'setting': from system.model import ModelSetting as SystemModelSetting arg = ModelSetting.to_dict() arg['ddns'] = SystemModelSetting.get('ddns') arg['url_epg'] = '%s/epg/api/%s' % (arg['ddns'], package_name) arg['url_m3u'] = '%s/%s/api/m3u?profile=pass' % (arg['ddns'], package_name) apikey = SystemModelSetting.get('auth_apikey') if SystemModelSetting.get_bool('auth_use_apikey'): arg['url_epg'] += '?apikey=%s' % apikey arg['url_m3u'] += '&apikey=%s' % apikey return render_template('%s_%s.html' % (package_name, sub), arg=arg) elif sub == 'list': arg = ModelSetting.to_dict() return render_template('%s_%s.html' % (package_name, sub), arg=arg) elif sub == 'proxy': return redirect('/%s/proxy/discover.json' % package_name) 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 get_scheduler_list(): try: ret = [] items = ModelScheduler2.get_list() for item in items: last = item.get_last_bbs() tmp = item.as_dict() tmp['last'] = last.as_dict() if last is not None else None tmp['broad_url'] = LogicFromSite.get_board_url( item.site, item.board_id, 1) tmp['site'] = item.site.as_dict() tmp['api'] = '%s/%s/api/board/%s/%s' % (SystemModelSetting.get( 'ddns'), package_name, item.site.name, item.board_id) if SystemModelSetting.get_bool('auth_use_apikey'): tmp['api'] += '?apikey=%s' % SystemModelSetting.get( 'auth_apikey') if last is not None: tmp['one_day_more'] = (last.created_time < datetime.now() + timedelta(days=-1)) ret.append(tmp) return ret #return ModelScheduler2.get_list(by_dict=True) 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='%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 first_menu(sub): if sub == 'setting': try: arg = ModelSetting.to_dict() ddns = SystemModelSetting.get('ddns') arg['m3u'] = '%s/%s/api/m3u' % (ddns, package_name) arg['xmltv'] = '%s/epg/api/%s' % (ddns, package_name) arg['proxy'] = '%s/%s/proxy' % (ddns, package_name) if SystemModelSetting.get_bool('auth_use_apikey'): apikey = SystemModelSetting.get('auth_apikey') arg['m3u'] += '?apikey={apikey}'.format(apikey=apikey) arg['xmltv'] += '?apikey={apikey}'.format(apikey=apikey) return render_template('%s_%s.html' % (package_name, sub), arg=arg) except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) elif sub == 'channel': try: arg = {} return render_template('%s_%s.html' % (package_name, sub), arg=arg) except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) elif sub == 'log': return render_template('log.html', package=package_name) elif sub == 'proxy': return redirect('/%s/proxy/discover.json' % 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_m3u(for_tvh=False, m3u_format=None, group=None, quality=None): try: #logger.debug(m3u_format) 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 quality is None: quality = c.quality url = '%s/%s/api/url.m3u8?m=url&s=%s&i=%s&q=%s' % ( ddns, package_name, c.source, c.source_id, quality) if apikey is not None: url += '&apikey=%s' % apikey #if c.epg_entity.is_tv: if for_tvh: #pipe:///usr/bin/ffmpeg -loglevel fatal -i [RTSP주소] -vcodec copy -acodec copy -metadata service_provider=xxx -metadata service_name=yyy -f mpegts -tune zerolatency pipe:1 #url = 'pipe://%s -i "%s" -c copy -metadata service_provider=sjva_klive -metadata service_name="%s" -f mpegts -tune zerolatency pipe:1' % ('ffmpeg', url, c.title) url = 'pipe://%s -i "%s" -c copy -metadata service_provider=sjva_klive -metadata service_name="%s" -c:v copy -c:a aac -b:a 128k -f mpegts -tune zerolatency pipe:1' % ( 'ffmpeg', url, c.title) #m3u += M3U_FORMAT % (c.source+'|' + c.source_id, c.title, c.epg_entity.icon, c.source, c.source + ' ' + c.title, url) import epg ins = epg.ModelEpgMakerChannel.get_instance_by_name(c.epg_name) #m3u += M3U_FORMAT % (c.source+'|' + c.source_id, c.title, c.epg_entity.icon, c.source, c.title, url) icon = '' if ins is None else ins.icon if icon is None: icon = c.icon #if c.is_tv: # #m3u += M3U_FORMAT % (c.source+'|' + c.source_id, c.title, c.icon, c.group, idx, idx, c.source + ' ' + c.title, url) # m3u += M3U_FORMAT % (c.source+'|' + c.source_id, c.title, c.icon, c.group, c.number, c.number, c.title, url) #else: # m3u += M3U_RADIO_FORMAT % (c.source+'|'+c.source_id, c.title, c.icon, c.group, idx, idx, c.source + ' ' + c.title, url) #logger.debug(c.group) tvg_name = c.title if m3u_format == '1': tvg_name = '%s. %s' % (str(c.number).zfill(3), c.title) group_name = c.group if group is not None: group_name = '' if group == 'EMPTY' else group m3u += M3U_FORMAT % (c.source + '|' + c.source_id, tvg_name, icon, group_name, c.number, c.number, c.title, url) return m3u except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def first_menu(sub): if sub == 'setting': arg = ModelSetting.to_dict() arg['package_name'] = package_name 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}_{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 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 get_group_list(): try: lists = ModelGroup2.get_list(by_dict=True) for item in lists: item['rss'] = '%s/%s/api/group/%s' % (SystemModelSetting.get( 'ddns'), package_name, item['groupname']) if SystemModelSetting.get_bool('auth_use_apikey'): item['rss'] += '?apikey=%s' % SystemModelSetting.get( 'auth_apikey') return lists except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def get_m3u(for_tvh=False, m3u_format=None, group=None, call=None): try: #logger.debug(m3u_format) 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: url = '%s/%s/api/url.m3u8?m=url&s=%s&i=%s&q=%s' % ( ddns, package_name, c.source, c.source_id, c.quality) if c.is_drm_channel: if call == 'kodi': url = url.replace('url.m3u8', 'url.strm') else: url = url.replace('url.m3u8', 'url.mpd') if apikey is not None: url += '&apikey=%s' % apikey if for_tvh: url = 'pipe://%s -loglevel quiet -i "%s" -c copy -metadata service_provider=sjva_klive -metadata service_name="%s" -c:v copy -c:a aac -b:a 128k -f mpegts -tune zerolatency pipe:1' % ( 'ffmpeg', url, c.title) 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 if m3u_format == '1': tvg_name = '%s. %s' % (str(c.number).zfill(3), c.title) group_name = c.group if group is not None: group_name = '' if group == 'EMPTY' else group m3u += M3U_FORMAT % (c.source + '|' + c.source_id, tvg_name, icon, group_name, c.number, c.number, c.title, url) return m3u except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def receive_callback(msg): try: content_type, chat_type, chat_id = glance(msg) #logger.debug(chat_id) try: if content_type == 'text' and msg['text'][0] == '^': if SystemModelSetting.get_bool('telegram_resend'): chat_list = SystemModelSetting.get_list( 'telegram_resend_chat_id') #logger.debug(chat_list) if str(chat_id) not in chat_list: for c in chat_list: ToolBaseNotify.send_telegram_message( msg['text'], SystemModelSetting.get( 'telegram_bot_token'), chat_id=c) except Exception as exception: logger.error('Exception:%s', exception) logger.error(traceback.format_exc()) if content_type == 'text': text = msg['text'] if msg['text'] == '/bot': text = json.dumps(TelegramBot.bot.getMe(), indent=2) TelegramBot.bot.sendMessage(chat_id, text) elif msg['text'] == '/me': text = json.dumps(msg, indent=2) TelegramBot.bot.sendMessage(chat_id, text) elif msg['text'][0] == '^': TelegramBot.process_receive_data(msg['text'][1:]) elif msg['text'] == '/call': data = TelegramBot.bot.getMe() #logger.debug(data) from framework import version text = 'call : %s / %s / %s / %s / %s / %s' % ( data['username'], data['id'], data['first_name'], version, SystemModelSetting.get('sjva_me_user_id'), SystemModelSetting.get('sjva_id')) TelegramBot.bot.sendMessage(chat_id, text) elif msg['text'].startswith('call'): logger.debug(msg['text']) except Exception as exception: logger.error('Exception:%s', exception) logger.error(traceback.format_exc())
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 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 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 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 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 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 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())
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 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)