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 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 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)) from system.model import ModelSetting as SystemModelSetting 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 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 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 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 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 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 proxy(sub): logger.debug('proxy %s %s', package_name, sub) # 설정 저장 if sub == 'discover.json': try: ddns = SystemModelSetting.get('ddns') data = { "FriendlyName": "HDHomeRun CONNECT", "ModelNumber": "HDHR4-2US", "FirmwareName": "hdhomerun4_atsc", "FirmwareVersion": "20190621", "DeviceID": "104E8010", "DeviceAuth": "UF4CFfWQh05c3jROcArmAZaf", "BaseURL": "%s/hdhomerun/proxy" % ddns, "LineupURL": "%s/hdhomerun/proxy/lineup.json" % ddns, "TunerCount": 20 } return jsonify(data) except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) elif sub == 'lineup_status.json': try: data = { "ScanInProgress": 0, "ScanPossible": 1, "Source": "Cable", "SourceList": ["Antenna", "Cable"] } return jsonify(data) except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) elif sub == 'lineup.json': try: lineup = [] channel_list = LogicHDHomerun.channel_list(only_use=True) ddns = SystemModelSetting.get('ddns') for c in channel_list: lineup.append({ 'GuideNumber': str(c.ch_number), 'GuideName': c.scan_name, 'URL': c.url }) return jsonify(lineup) except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def get_theme(): theme_list = { 'Default': 56, 'Cerulean': 56, 'Cosmo': 54, 'Cyborg': 54, 'Darkly': 70, 'Flatly': 70, 'Journal': 56, 'Litera': 57, 'Lumen': 56, 'Lux': 88, 'Materia': 80, 'Minty': 56, 'Morph': 56, 'Pulse': 75, 'Quartz': 92, 'Sandstone': 53, 'Simplex': 67, 'Sketchy': 56, 'Slate': 53, 'Solar': 56, 'Spacelab': 58, 'Superhero': 48, 'United': 56, 'Vapor': 56, 'Yeti': 54, 'Zephyr': 68, } from system.model import ModelSetting as SystemModelSetting theme = SystemModelSetting.get('theme') return [theme, theme_list[theme]]
def start(bot_token): try: if TelegramBot.message_loop is None: TelegramBot.bot = Bot(bot_token) me = TelegramBot.bot.getMe() logger.debug('TelegramBot bot : %s', me) TelegramBot.message_loop = MessageLoop( TelegramBot.bot, TelegramBot.receive_callback) TelegramBot.message_loop.run_as_thread() ToolBaseNotify.send_message('텔레그램 메시지 수신을 시작합니다. %s' % (datetime.datetime.now())) TelegramBot.SUPER_BOT = Bot(TelegramBot.SUPER_TOKEN) if SystemModelSetting.get( 'ddns') == app.config['DEFINE']['MAIN_SERVER_URL']: logger.warning('ADMIN_TOKEN : %s ', TelegramBot.ADMIN_TOKEN) logger.warning('ADMIN_TOKEN : %s ', TelegramBot.ADMIN_TOKEN) logger.warning('ADMIN_TOKEN : %s ', TelegramBot.ADMIN_TOKEN) TelegramBot.ADMIN_BOT = Bot(TelegramBot.ADMIN_TOKEN) MessageLoop( TelegramBot.ADMIN_BOT, TelegramBot.super_receive_callback).run_as_thread() #TelegramBotHandle.super_sendMessage('관리봇이 텔레그램 메시지 수신을 시작하였습니다.', encryped=False) pass while TelegramBot.message_loop is not None: time.sleep(60 * 60) except Exception as exception: logger.error('Exception:%s', exception) logger.error(traceback.format_exc())
def get_download_path(download_path, server_id, download_url, magnet=None): logger.debug('download_path:%s server_id:%s download_url:%s', download_path, server_id, download_url) try: if server_id is not None and ModelSetting.get_bool( 'use_share_upload'): if magnet is None: _hash = download_url[20:60].lower() else: _hash = magnet[20:60].lower() download_path = os.path.join( download_path, '%s_%s_%s' % (server_id, _hash, SystemModelSetting.get('sjva_me_user_id'))) rule = ModelSetting.get('use_share_upload_make_dir_rule') if rule == '': sjva_path = download_path else: rule = rule.split('|') sjva_path = download_path.replace(rule[0], rule[1]) if os.path.exists(os.path.dirname(sjva_path)): if not os.path.exists(sjva_path): os.makedirs(sjva_path) except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) finally: logger.debug('download_path2:%s server_id:%s', download_path, server_id) return download_path
def send_telegram_message(item): try: msg = '😉 봇 다운로드 - 영화 처리결과\n' msg += '제목 : %s (%s)\n' % (item.movie_title, item.movie_year) msg += '파일 : %s\n' % item.filename if item.download_status == 'true': status_str = '✔조건일치 - 요청' elif item.download_status == 'false': status_str = '⛔패스 ' elif item.download_status == 'no': status_str = '자동 다운로드 사용안함' elif item.download_status == 'true_only_status': status_str = '✔조건일치 - 상태만' elif item.download_status == 'false_only_status': status_str = '⛔조건불일치 - 상태만' msg += '결과 : %s\n' % status_str msg += '%s/%s/list\n' % (SystemModelSetting.get('ddns'), package_name) msg += '로그\n' + item.log import framework.common.notify as Notify Notify.send_message(msg, message_id='bot_downloader_movie_result') except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def func(): ret = RcloneTool.do_action(ModelSetting.get('rclone_path'), ModelSetting.get('rclone_info'), 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': SystemModelSetting.get('sjva_me_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)
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 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 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, folder_name, '', 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)) logger.debug('폴더ID:%s', ret['folder_id']) if board_type != 'share_private' and ret['folder_id'] != '': 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) else: msg = u'업로드한 폴더ID값을 가져올 수 없어서 사이트 등록에 실패하였습니다.\n관리자에게 등록 요청하세요.\n' socketio.emit("command_modal_add_text", str(msg), namespace='/framework', broadcast=True) 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 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 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 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 = 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 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 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 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 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