linkkf 로직수정중
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
from framework import logger
|
||||
|
||||
from .fp_entity_ktv import EntityKtv
|
||||
from .modal_command import ToolModalCommand
|
||||
from .notify import ToolNotify
|
||||
from .util import ToolUtil
|
||||
|
||||
391
lib/tool/fp_entity_ktv.py
Normal file
391
lib/tool/fp_entity_ktv.py
Normal file
@@ -0,0 +1,391 @@
|
||||
|
||||
import re
|
||||
import time
|
||||
import traceback
|
||||
from datetime import datetime
|
||||
|
||||
from support import SupportFile, SupportString
|
||||
|
||||
from . import logger
|
||||
|
||||
EXTENSION = 'mp4|avi|mkv|ts|wmv|m2ts|smi|srt|ass|m4v|flv|asf|mpg|ogm'
|
||||
|
||||
REGEXS = [
|
||||
r'^(?P<name>.*?)\.([sS](?P<sno>\d+))?[eE](?P<no>\d+)(\-E\d{1,4})?\.?(?P<a>.*?\.)?(?P<date>\d{6})\.(?P<etc>.*?)((?P<quality>\d+)[p|P])?(\-?(?P<release>.*?))?(\.(.*?))?$',
|
||||
r'^(?P<name>.*?)\s([sS](?P<sno>\d+))?[eE](?P<no>\d+)(\-E\d{1,4})?\.?(END\.)?(?P<date>\d{6})\.(?P<etc>.*?)(?P<quality>\d+)[p|P](?P<more>\..*?)(?P<ext>\.[\w|\d]{3})$',
|
||||
r'^(?P<name>.*?)\.([sS](?P<sno>\d+))?(E(?P<no>\d+)\.?)?(END\.)?(?P<date>\d{6})\.(?P<etc>.*?)(?P<quality>\d+)[p|P](\-?(?P<release>.*?))?(\.(.*?))?$',
|
||||
r'^(?P<name>.*?)([sS](?P<sno>\d+))?[eE](?P<no>\d+)', # 외국 릴
|
||||
r'^(?P<name>.*?)\.(Series\.(?P<sno>\d+)\.)?(?P<no>\d+)of', # 외국 릴
|
||||
r'^(?P<name>.*?)[\s\(](?P<no>\d+)[회화]',
|
||||
]
|
||||
|
||||
#합본처리 제외
|
||||
#_REGEX_FILENAME_RENAME = r'(?P<title>.*?)[\s\.]E?(?P<no>\d{1,2})[\-\~\s\.]?E?\d{1,2}'
|
||||
|
||||
class EntityKtv(object):
|
||||
meta_cache = {}
|
||||
def __init__(self, filename, dirname=None, meta=False, is_title=False, config=None):
|
||||
self.data = {
|
||||
'filename' : {
|
||||
'original' : filename,
|
||||
'dirname' : dirname,
|
||||
'is_matched' : False,
|
||||
'match_index' : -1,
|
||||
'name' : '',
|
||||
'original_name': '',
|
||||
},
|
||||
'meta' : {
|
||||
'find':False,
|
||||
},
|
||||
'process_info' : {
|
||||
'rebuild':'',
|
||||
'status':''
|
||||
}
|
||||
}
|
||||
if is_title == False:
|
||||
self.analyze(config=config)
|
||||
self.data['filename']['original_name'] = self.data['filename']['name']
|
||||
if self.data['filename']['name'] != '' and config is not None:
|
||||
rule = config.get('검색어 변경', None)
|
||||
if rule is not None:
|
||||
self.change_name(rule)
|
||||
else:
|
||||
self.data['filename']['name'] = filename
|
||||
self.data['filename']['is_matched'] = True
|
||||
self.data['filename']['match_index'] = -1
|
||||
self.data['filename']['date'] = ''
|
||||
|
||||
|
||||
search_try = False
|
||||
if meta and self.data['filename']['is_matched']:
|
||||
if self.data['filename']['match_index'] in [3, 4]:
|
||||
|
||||
info = SupportString.language_info(self.data['filename']['name'])
|
||||
if info[0] == 0:
|
||||
search_try = True
|
||||
self.find_meta_tmdb()
|
||||
|
||||
if search_try == False:
|
||||
self.find_meta()
|
||||
|
||||
if self.data['meta']['find']:
|
||||
self.find_meta_season()
|
||||
try:
|
||||
#logger.warning(f"찾은 메타 : {self.data['meta']['info']['title']} {self.data['meta']['info']['code']}")
|
||||
if self.data['filename']['date'] == '':
|
||||
self.data['process_info']['status'] = 'no_date'
|
||||
else:
|
||||
self.check_episode_no()
|
||||
except Exception as e:
|
||||
logger.debug(f"Exception:{str(e)}")
|
||||
logger.debug(traceback.format_exc())
|
||||
|
||||
|
||||
def analyze(self, config=None):
|
||||
def get(md, field):
|
||||
if field in md and md[field] is not None:
|
||||
return md[field]
|
||||
return ''
|
||||
|
||||
for idx, regex in enumerate(REGEXS):
|
||||
match = re.compile(regex).match(self.data['filename']['original'])
|
||||
if not match:
|
||||
continue
|
||||
md = match.groupdict()
|
||||
self.data['filename']['is_matched'] = True
|
||||
self.data['filename']['match_index'] = idx
|
||||
self.data['filename']['name'] = get(md, 'name').replace('.', ' ').strip()
|
||||
tmp = get(md, 'sno')
|
||||
self.data['filename']['sno'] = int(tmp) if tmp != '' else 1
|
||||
tmp = get(md, 'no')
|
||||
try:
|
||||
self.data['filename']['no'] = int(tmp) if tmp != '' else -1
|
||||
if self.data['filename']['no'] == 0:
|
||||
raise Exception('0')
|
||||
except:
|
||||
self.data['process_info']['rebuild'] += 'remove_episode'
|
||||
self.data['filename']['no'] = -1
|
||||
|
||||
self.data['filename']['date'] = get(md, 'date')
|
||||
self.data['filename']['etc'] = get(md, 'etc')
|
||||
self.data['filename']['quality'] = get(md, 'quality')
|
||||
self.data['filename']['release'] = get(md, 'release')
|
||||
self.data['filename']['more'] = get(md, 'more')
|
||||
self.data['filename']['day_delta'] = 0
|
||||
if self.data['filename']['date'] != '':
|
||||
today = datetime.now()
|
||||
try:
|
||||
tmp = str(self.data['filename']['date'])
|
||||
if tmp[0] in ['8', '9']:
|
||||
tmp = '19' + tmp
|
||||
else:
|
||||
tmp = '20' + tmp
|
||||
max_date = datetime.strptime(tmp, '%Y%m%d')
|
||||
except:
|
||||
max_date = today
|
||||
self.data['filename']['day_delta'] = (today - max_date).days
|
||||
|
||||
|
||||
#logger.warning(d(self.data['filename']))
|
||||
break
|
||||
|
||||
if config is not None:
|
||||
rule = config.get('에피소드 번호 삭제 목록', [])
|
||||
if self.data['filename']['name'] in rule:
|
||||
self.data['process_info']['rebuild'] += 'remove_episode_by_rule'
|
||||
self.data['filename']['no'] = -1
|
||||
|
||||
|
||||
def change_name(self, rules):
|
||||
name = self.data['filename']['name']
|
||||
for rule in rules:
|
||||
try:
|
||||
name = re.sub(rule['source'], rule['target'], name, flags=re.I).strip()
|
||||
except Exception as e:
|
||||
logger.error(f"Exception:{e}")
|
||||
logger.error(traceback.format_exc())
|
||||
self.data['filename']['name'] = name
|
||||
|
||||
|
||||
|
||||
def check_episode_no(self):
|
||||
if self.data['filename']['no'] > 0 and self.data['filename']['no'] in self.data['meta']['info']['extra_info']['episodes']:
|
||||
#logger.warning(f"에피소드 정보 있음")
|
||||
#logger.warning(self.data['meta']['info']['extra_info']['episodes'][self.data['filename']['no']])
|
||||
tmp = self.data['meta']['info']['extra_info']['episodes'][self.data['filename']['no']]
|
||||
# daum만 체크
|
||||
if 'daum' in tmp:
|
||||
value = tmp['daum']
|
||||
tmp2 = value['premiered']
|
||||
if self.data['filename']['date'] == tmp2.replace('-', '')[2:]:
|
||||
self.data['process_info']['status'] = 'number_and_date_match'
|
||||
self.data['process_info']['episode'] = value
|
||||
self.data['process_info']['episode']['no'] = self.data['filename']['no']
|
||||
return
|
||||
else:
|
||||
#하루차이는 매칭시킴
|
||||
if abs(int(self.data['filename']['date']) - int(tmp2.replace('-', '')[2:])) in [1, 70, 71, 72, 73, 8870]:
|
||||
self.data['process_info']['status'] = 'number_and_date_match'
|
||||
self.data['process_info']['rebuild'] += 'change_date'
|
||||
self.data['process_info']['change_date'] = tmp2.replace('-', '')[2:]
|
||||
self.data['process_info']['episode'] = value
|
||||
self.data['process_info']['episode']['no'] = self.data['filename']['no']
|
||||
return
|
||||
|
||||
# 맞는 에피소드 몾찾음
|
||||
if len(self.data['meta']['info']['extra_info']['episodes']) == 0:
|
||||
# 메타검색은 했지만 에피소드 목록이 없음.
|
||||
self.data['process_info']['status'] = 'meta_epi_empty'
|
||||
return
|
||||
|
||||
# 방송일에 맞는 에피 번호 찾기
|
||||
#logger.warning(f"에피소드 목록")
|
||||
|
||||
for epi_no, value in self.data['meta']['info']['extra_info']['episodes'].items():
|
||||
if 'daum' in value:
|
||||
site_info = value['daum']
|
||||
tmp2 = site_info['premiered']
|
||||
if self.data['filename']['date'] == tmp2.replace('-', '')[2:]:
|
||||
self.data['process_info']['status'] = 'number_and_date_match'
|
||||
self.data['process_info']['rebuild'] += 'change_epi_number'
|
||||
self.data['process_info']['change_epi_number'] = epi_no
|
||||
self.data['process_info']['episode'] = value['daum']
|
||||
self.data['process_info']['episode']['no'] = epi_no
|
||||
return
|
||||
|
||||
# 다음에서 몾찾았지만 티빙 웨이브에 있다면 그대로 유지해야함.
|
||||
# 굳이 찾을 필요없이 릴리즈로 맞다고 넘김
|
||||
# 근데 받을때는 에피번호가 없고 나중에 메타가 생기는 경우가 잇는 것 같음
|
||||
if self.data['filename']['no'] != -1:
|
||||
if self.data['filename']['release'] in ['ST', 'SW', 'SWQ', 'STQ', 'ODK']:
|
||||
self.data['process_info']['status'] = 'number_and_date_match_by_release'
|
||||
return
|
||||
else:
|
||||
for epi_no, value in self.data['meta']['info']['extra_info']['episodes'].items():
|
||||
for site, site_info in value.items():
|
||||
if site == 'daum':
|
||||
continue
|
||||
tmp2 = site_info['premiered']
|
||||
if self.data['filename']['date'] == tmp2.replace('-', '')[2:]:
|
||||
self.data['process_info']['status'] = 'number_and_date_match_ott'
|
||||
self.data['process_info']['rebuild'] += 'change_epi_number'
|
||||
self.data['process_info']['change_epi_number'] = epi_no
|
||||
self.data['process_info']['episode'] = site_info
|
||||
self.data['process_info']['episode']['no'] = epi_no
|
||||
|
||||
return
|
||||
|
||||
|
||||
#logger.error("에피소드 목록이 있지만 맞는 메타를 찾지 못함")
|
||||
#logger.error(f"에피소드 번호 {epi_no}")
|
||||
#logger.error(f"에피소드 번호 {self.data['filename']['original']}")
|
||||
#logger.warning(d(self.data['meta']['info']['extra_info']['episodes']))
|
||||
#logger.debug("티빙, 웨이브에서 찾음")
|
||||
|
||||
if self.data['filename']['no'] > 0 and self.data['filename']['no'] in self.data['meta']['info']['extra_info']['episodes']:
|
||||
#logger.warning(f"에피소드 정보 있음 22")
|
||||
#logger.warning(self.data['meta']['info']['extra_info']['episodes'][self.data['filename']['no']])
|
||||
tmp = self.data['meta']['info']['extra_info']['episodes'][self.data['filename']['no']]
|
||||
# daum만 체크
|
||||
for site, value in tmp.items():
|
||||
if site == 'daum':
|
||||
continue
|
||||
tmp2 = value['premiered']
|
||||
if self.data['filename']['date'] == tmp2.replace('-', '')[2:]:
|
||||
self.data['process_info']['status'] = 'number_and_date_match'
|
||||
self.data['process_info']['episode'] = value
|
||||
self.data['process_info']['episode']['no'] = self.data['filename']['no']
|
||||
return
|
||||
else:
|
||||
#하루차이는 매칭시킴
|
||||
if abs(int(self.data['filename']['date']) - int(tmp2.replace('-', '')[2:])) in [1, 70, 71, 72, 73, 8870]:
|
||||
self.data['process_info']['status'] = 'number_and_date_match'
|
||||
self.data['process_info']['rebuild'] += 'change_date'
|
||||
self.data['process_info']['change_date'] = tmp2.replace('-', '')[2:]
|
||||
self.data['process_info']['episode'] = value
|
||||
self.data['process_info']['episode']['no'] = self.data['filename']['no']
|
||||
return
|
||||
|
||||
for epi_no, value in self.data['meta']['info']['extra_info']['episodes'].items():
|
||||
if epi_no == 0:
|
||||
continue
|
||||
for site, site_info in value.items():
|
||||
if site == 'daum':
|
||||
continue
|
||||
tmp2 = site_info['premiered']
|
||||
if self.data['filename']['date'] == tmp2.replace('-', '')[2:]:
|
||||
#logger.warning(f"2222 다음에서 새로운 에피소드 번호 찾음 : {epi_no}")
|
||||
#logger.warning(d(site_info))
|
||||
self.data['process_info']['status'] = 'number_and_date_match'
|
||||
self.data['process_info']['rebuild'] += 'change_epi_number'
|
||||
self.data['process_info']['change_epi_number'] = epi_no
|
||||
self.data['process_info']['episode'] = site_info
|
||||
self.data['process_info']['episode']['no'] = epi_no
|
||||
return
|
||||
|
||||
if epi_no < self.data['filename']['no']:
|
||||
self.data['process_info']['status'] = 'meta_epi_not_find'
|
||||
|
||||
self.data['process_info']['status'] = 'meta_epi_not_find'
|
||||
#for tmp in self.data['meta']['info']['extra_info']['episode']:
|
||||
# logger.debug((tmp))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def find_meta(self):
|
||||
from support_site import SiteDaumTv, SiteTvingTv, SiteWavveTv
|
||||
module_map = [('daum', SiteDaumTv), ('tving',SiteTvingTv), ('wavve',SiteWavveTv)]
|
||||
#if self.data['filename']['name'] in EntityKtv.meta_cache:
|
||||
# self.data['meta'] = EntityKtv.meta_cache[self.data['filename']['name']]
|
||||
# return
|
||||
#module_list = [SiteDaumTv, SiteTvingTv, SiteWavveTv]
|
||||
#module_list = [SiteDaumTv]
|
||||
|
||||
for site, site_class in module_map:
|
||||
try:
|
||||
if self.data['filename']['name'] in EntityKtv.meta_cache and site in EntityKtv.meta_cache[self.data['filename']['name']]:
|
||||
self.data['meta'] = EntityKtv.meta_cache[self.data['filename']['name']][site]
|
||||
# 없는 것도 저장하여 중복검색 방지
|
||||
if self.data['meta']['find']:
|
||||
return
|
||||
site_data = site_class.search(self.data['filename']['name'])
|
||||
#logger.warning(f"{site} {d(site_data)}")
|
||||
if site_data['ret'] == 'success':
|
||||
if site == 'daum':
|
||||
self.data['meta']['search'] = site_data['data']
|
||||
self.data['meta']['info'] = site_class.info(self.data['meta']['search']['code'], self.data['meta']['search']['title'])['data']
|
||||
# Daum이 미국드라마, 일본드라마 등의 외국 드라마 장르이면서 ST SW 릴이면 Daum보다는 OTT 메타를 사용하도록 함
|
||||
if self.data['meta']['info']['genre'][0] != '드라마' and self.data['meta']['info']['genre'][0].find('드라마') != -1 and self.data['filename'].get('release', '') in ['ST', 'SW']:
|
||||
continue
|
||||
|
||||
SiteTvingTv.apply_tv_by_search(self.data['meta']['info'], force_search_title=self.data['filename']['name'])
|
||||
SiteWavveTv.apply_tv_by_search(self.data['meta']['info'], force_search_title=self.data['filename']['name'])
|
||||
if self.data['meta']['info']['episode'] == -1:
|
||||
self.data['meta']['info']['episode'] = len(self.data['meta']['info']['extra_info']['episodes'].keys())
|
||||
self.data['meta']['find'] = True
|
||||
|
||||
else:
|
||||
if len(site_data['data']) > 0 and site_data['data'][0]['score'] > 90:
|
||||
self.data['meta']['search'] = site_data['data'][0]
|
||||
self.data['meta']['info'] = site_class.info(self.data['meta']['search']['code'])['data']
|
||||
self.data['meta']['find'] = True
|
||||
|
||||
if self.data['meta']['find']:
|
||||
if len(self.data['meta']['info']['genre']) == 0:
|
||||
self.data['meta']['info']['genre'].append('기타')
|
||||
if self.data['filename']['name'] not in EntityKtv.meta_cache:
|
||||
EntityKtv.meta_cache[self.data['filename']['name']] = {}
|
||||
EntityKtv.meta_cache[self.data['filename']['name']][site] = self.data['meta']
|
||||
return
|
||||
else:
|
||||
if self.data['filename']['name'] not in EntityKtv.meta_cache:
|
||||
EntityKtv.meta_cache[self.data['filename']['name']] = {}
|
||||
EntityKtv.meta_cache[self.data['filename']['name']][site] = self.data['meta']
|
||||
except Exception as e:
|
||||
logger.error(f"Exception:{str(e)}")
|
||||
logger.error(traceback.format_exc())
|
||||
|
||||
|
||||
def get_newfilename(self):
|
||||
if self.data['filename']['match_index'] == 2:
|
||||
self.data['process_info']['rebuild'] += f"match_{self.data['filename']['match_index']}"
|
||||
|
||||
if self.data['process_info']['rebuild'] in ['', 'match_2', 'meta_epi_not_find', 'match_3']:
|
||||
return self.data['filename']['original']
|
||||
|
||||
elif self.data['process_info']['rebuild'] == 'remove_episode' or self.data['process_info']['rebuild'].find('remove_episode_by_rule') != -1:
|
||||
return re.sub('\.[eE].*?\.', '.', self.data['filename']['original'])
|
||||
elif self.data['process_info']['rebuild'] == 'remove_episodechange_epi_number' and self.data['process_info']['change_epi_number'] == 0:
|
||||
return re.sub('\.[eE].*?\.', '.', self.data['filename']['original'])
|
||||
|
||||
elif self.data['process_info']['rebuild'] == 'change_epi_number':
|
||||
return re.sub('\.[eE].*?\.', f".E{str(self.data['process_info']['change_epi_number']).zfill(2)}.", self.data['filename']['original'])
|
||||
elif self.data['process_info']['rebuild'] == 'change_epi_numbermatch_2':
|
||||
# 날짜만 있는 원본 에피소드 삽입
|
||||
return self.data['filename']['original'].replace(f".{self.data['filename']['date']}.", f".E{str(self.data['process_info']['change_epi_number']).zfill(2)}.{self.data['filename']['date']}.")
|
||||
elif self.data['process_info']['rebuild'] == 'change_date':
|
||||
return self.data['filename']['original'].replace(f".{self.data['filename']['date']}.", f".{self.data['process_info']['change_date']}.")
|
||||
time.sleep(10)
|
||||
else:
|
||||
pass
|
||||
|
||||
|
||||
|
||||
def find_meta_tmdb(self):
|
||||
from support_site import SiteTmdbFtv
|
||||
module_map = [('tmdb', SiteTmdbFtv)]
|
||||
|
||||
for site, site_class in module_map:
|
||||
try:
|
||||
if self.data['filename']['name'] in EntityKtv.meta_cache and site in EntityKtv.meta_cache[self.data['filename']['name']]:
|
||||
self.data['meta'] = EntityKtv.meta_cache[self.data['filename']['name']][site]
|
||||
# 없는 것도 저장하여 중복검색 방지
|
||||
if self.data['meta']['find']:
|
||||
return
|
||||
site_data = site_class.search(self.data['filename']['name'])
|
||||
#logger.warning(f"{site} {d(site_data)}")
|
||||
if site_data['ret'] == 'success':
|
||||
if len(site_data['data']) > 0 and site_data['data'][0]['score'] >= 80:
|
||||
self.data['filename']['name'] = site_data['data'][0]['title']
|
||||
self.find_meta()
|
||||
if self.data['meta']['find'] == False:
|
||||
self.data['process_info']['status'] = 'ftv'
|
||||
self.data['process_info']['ftv_title'] = SupportFile.text_for_filename(site_data['data'][0]['title'])
|
||||
self.data['process_info']['ftv_year'] = site_data['data'][0]['year']
|
||||
return
|
||||
except Exception as e:
|
||||
logger.error(f"Exception:{str(e)}")
|
||||
logger.error(traceback.format_exc())
|
||||
|
||||
|
||||
def find_meta_season(self):
|
||||
if self.data['meta']['info']['code'][1] == 'D':
|
||||
for idx, season in enumerate(self.data['meta']['search']['series']):
|
||||
if self.data['meta']['info']['code'] == season['code']:
|
||||
self.data['meta']['info']['season'] = idx + 1
|
||||
return
|
||||
else:
|
||||
self.data['meta']['info']['season'] = -1
|
||||
|
||||
@@ -16,7 +16,7 @@ class ToolModalCommand(object):
|
||||
__wait = None
|
||||
__ss_process = None
|
||||
__abort = None
|
||||
|
||||
__return_log = None
|
||||
|
||||
@classmethod
|
||||
def start(cls, title, commands, clear=True, wait=False, show_modal=True):
|
||||
@@ -33,7 +33,9 @@ class ToolModalCommand(object):
|
||||
cls.__show_modal = show_modal
|
||||
cls.__thread = None
|
||||
cls.__abort = False
|
||||
cls.__start()
|
||||
cls.__return_log = ''
|
||||
return cls.__start()
|
||||
|
||||
|
||||
|
||||
@classmethod
|
||||
@@ -41,63 +43,66 @@ class ToolModalCommand(object):
|
||||
try:
|
||||
if cls.__show_modal:
|
||||
if cls.__clear:
|
||||
F.socketio.emit("command_modal_clear", None, namespace='/framework', broadcast=True)
|
||||
F.socketio.emit("command_modal_clear", None, namespace='/framework')
|
||||
cls.__thread = threading.Thread(target=cls.__execute_thread_function, args=())
|
||||
cls.__thread.setDaemon(True)
|
||||
cls.__thread.start()
|
||||
if cls.__wait:
|
||||
time.sleep(1)
|
||||
cls.__thread.join()
|
||||
except Exception as exception:
|
||||
F.logger.error('Exception:%s', exception)
|
||||
return cls.__return_log
|
||||
except Exception as e:
|
||||
F.logger.error(f"Exception:{str(e)}")
|
||||
F.logger.error(traceback.format_exc())
|
||||
|
||||
@classmethod
|
||||
def __execute_thread_function(cls):
|
||||
try:
|
||||
if cls.__show_modal:
|
||||
F.socketio.emit("command_modal_show", cls.__title, namespace='/framework', broadcast=True)
|
||||
F.socketio.emit("loading_hide", None, namespace='/framework', broadcast=True)
|
||||
F.socketio.emit("command_modal_show", cls.__title, namespace='/framework')
|
||||
F.socketio.emit("loading_hide", None, namespace='/framework')
|
||||
|
||||
for command in cls.__commands:
|
||||
if cls.__abort:
|
||||
return
|
||||
if command[0] == 'msg':
|
||||
if cls.__show_modal:
|
||||
F.socketio.emit("command_modal_add_text", '%s\n\n' % command[1], namespace='/framework', broadcast=True)
|
||||
F.socketio.emit("command_modal_add_text", '%s\n\n' % command[1], namespace='/framework')
|
||||
elif command[0] == 'system':
|
||||
if cls.__show_modal:
|
||||
F.socketio.emit("command_modal_add_text", '$ %s\n\n' % command[1], namespace='/framework', broadcast=True)
|
||||
F.socketio.emit("command_modal_add_text", '$ %s\n\n' % command[1], namespace='/framework')
|
||||
os.system(command[1])
|
||||
else:
|
||||
#show_command = True
|
||||
#if command[0] == 'hide':
|
||||
# show_command = False
|
||||
# command = command[1:]
|
||||
cls.__ss_process = SupportSubprocess(command, stdout_callback=cls.process_callback)
|
||||
cls.__ss_process = SupportSubprocess(command, stdout_callback=cls.process_callback, callback_line=False)
|
||||
cls.__ss_process.start()
|
||||
cls.__ss_process.process_close()
|
||||
cls.__ss_process = None
|
||||
time.sleep(1)
|
||||
except Exception as exception:
|
||||
if cls.__show_modal:
|
||||
F.socketio.emit("command_modal_show", cls.__title, namespace='/framework', broadcast=True)
|
||||
F.socketio.emit("command_modal_add_text", str(exception), namespace='/framework', broadcast=True)
|
||||
F.socketio.emit("command_modal_add_text", str(traceback.format_exc()), namespace='/framework', broadcast=True)
|
||||
F.socketio.emit("command_modal_show", cls.__title, namespace='/framework')
|
||||
F.socketio.emit("command_modal_add_text", str(exception), namespace='/framework')
|
||||
F.socketio.emit("command_modal_add_text", str(traceback.format_exc()), namespace='/framework')
|
||||
|
||||
@classmethod
|
||||
def process_callback(cls, mode, text):
|
||||
def process_callback(cls, call_id, mode, text):
|
||||
#F.logger.warning(text)
|
||||
if cls.__show_modal == False:
|
||||
return
|
||||
if mode == 'end':
|
||||
F.socketio.emit("command_modal_add_text", "\n\n<<프로세스 종료>>", namespace='/framework', broadcast=True)
|
||||
F.socketio.emit("command_modal_input_disable", "", namespace='/framework', broadcast=True)
|
||||
F.socketio.emit("command_modal_add_text", "\n\n<<프로세스 종료>>", namespace='/framework')
|
||||
F.socketio.emit("command_modal_input_disable", "", namespace='/framework')
|
||||
elif mode == 'thread_end':
|
||||
#F.socketio.emit("command_modal_add_text", "\n\n<<프로세스 종료>>", namespace='/framework', broadcast=True)
|
||||
F.socketio.emit("command_modal_input_disable", "", namespace='/framework', broadcast=True)
|
||||
#F.socketio.emit("command_modal_add_text", "\n\n<<프로세스 종료>>", namespace='/framework')
|
||||
F.socketio.emit("command_modal_input_disable", "", namespace='/framework')
|
||||
else:
|
||||
F.socketio.emit("command_modal_add_text", text, namespace='/framework', broadcast=True)
|
||||
if text != None:
|
||||
cls.__return_log += text
|
||||
F.socketio.emit("command_modal_add_text", text, namespace='/framework')
|
||||
|
||||
|
||||
@classmethod
|
||||
@@ -114,3 +119,7 @@ class ToolModalCommand(object):
|
||||
if cls.__ss_process != None:
|
||||
cls.__ss_process.input_command(cmd)
|
||||
|
||||
|
||||
@classmethod
|
||||
def send_message(cls, text):
|
||||
F.socketio.emit("command_modal_add_text", '%s\n\n' % text, namespace='/framework')
|
||||
|
||||
@@ -2,7 +2,7 @@ import traceback
|
||||
from datetime import datetime
|
||||
|
||||
from framework import F
|
||||
from support import SupportDiscord, SupportTelegram, SupportYaml
|
||||
from support import SupportDiscord, SupportTelegram, SupportYaml, SupportSlack
|
||||
|
||||
from . import logger
|
||||
|
||||
@@ -18,6 +18,8 @@ class ToolNotify(object):
|
||||
SupportTelegram.send_telegram_message(text, image_url=image_url, bot_token=F.SystemModelSetting.get('notify_telegram_token'), chat_id=F.SystemModelSetting.get('notify_telegram_chat_id'))
|
||||
if F.SystemModelSetting.get_bool('notify_discord_use'):
|
||||
SupportDiscord.send_discord_message(text, image_url=image_url, webhook_url=F.SystemModelSetting.get('notify_discord_webhook'))
|
||||
if F.SystemModelSetting.get_bool('notify_slack_use'):
|
||||
SupportSlack.send_slack_message(text, image_url=image_url, webhook_url=F.SystemModelSetting.get('notify_slack_webhook'))
|
||||
|
||||
|
||||
@classmethod
|
||||
@@ -40,9 +42,13 @@ class ToolNotify(object):
|
||||
elif item.get('type') == 'discord':
|
||||
if item.get('webhook', '') == '':
|
||||
continue
|
||||
SupportDiscord.send_discord_message(text, webhook_url=item.get('webhook'))
|
||||
SupportDiscord.send_discord_message(text, image_url=image_url, webhook_url=item.get('webhook'))
|
||||
elif item.get('type') == 'slack':
|
||||
if item.get('webhook', '') == '':
|
||||
continue
|
||||
SupportSlack.send_slack_message(text, image_url=image_url, webhook_url=item.get('webhook'))
|
||||
return True
|
||||
except Exception as exception:
|
||||
logger.error('Exception:%s', exception)
|
||||
except Exception as e:
|
||||
logger.error(f"Exception:{str(e)}")
|
||||
logger.error(traceback.format_exc())
|
||||
return False
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import traceback
|
||||
|
||||
from . import logger
|
||||
|
||||
|
||||
@@ -20,4 +22,16 @@ class ToolUtil(object):
|
||||
def make_path(cls, data):
|
||||
from framework import F
|
||||
return data.replace('{PATH_DATA}', F.config['path_data'])
|
||||
|
||||
|
||||
|
||||
@classmethod
|
||||
def run_system_command_by_id(cls, command_id):
|
||||
try:
|
||||
from system.setup import P as PP
|
||||
page_ins = PP.logic.get_module('tool').get_page('command')
|
||||
thread = page_ins.execute_thread_start(command_id)
|
||||
return thread
|
||||
except Exception as e:
|
||||
logger.error(f'Exception:{str(e)}')
|
||||
logger.error(traceback.format_exc())
|
||||
|
||||
|
||||
Reference in New Issue
Block a user