update
This commit is contained in:
@@ -32,7 +32,7 @@ $(window).on("load resize", function (event) {
|
||||
$.notify({
|
||||
// options
|
||||
icon: 'glyphicon glyphicon-ok',
|
||||
title: 'SJVA',
|
||||
title: 'APP',
|
||||
message: '',
|
||||
url: '',
|
||||
target: '_blank'
|
||||
|
||||
@@ -276,8 +276,17 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- SELECT Dummy
|
||||
option을 script로 넣을 때 사용
|
||||
예: 시스템 - 전체로그
|
||||
-->
|
||||
{% macro setting_select_empty(id, title, col='9', desc=None, value=None) %}
|
||||
{{ setting_top(title) }}
|
||||
<div class="input-group col-sm-{{col}}">
|
||||
<div id="{{id}}_div" name="{{id}}_div"></div>
|
||||
</div>
|
||||
{{ setting_bottom(desc) }}
|
||||
{% endmacro %}
|
||||
|
||||
|
||||
|
||||
@@ -619,13 +628,7 @@ macros.setting_button_with_info([['toggle_btn', 'Toggle', [{'key':'category', 'v
|
||||
{{ setting_bottom(desc) }}
|
||||
{% endmacro %}
|
||||
|
||||
{% macro setting_select_empty(id, title, col='9', desc=None, value=None) %}
|
||||
{{ setting_top(title) }}
|
||||
<div class="input-group col-sm-{{col}}">
|
||||
<div id="{{id}}_div" name="{{id}}_div"></div>
|
||||
</div>
|
||||
{{ setting_bottom(desc) }}
|
||||
{% endmacro %}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -6,17 +6,6 @@ from framework import F
|
||||
|
||||
|
||||
class Util(object):
|
||||
|
||||
|
||||
@staticmethod
|
||||
def db_list_to_dict(db_list):
|
||||
"""
|
||||
세팅DB에서 사용, (key, value) dict로 변환
|
||||
"""
|
||||
ret = {}
|
||||
for item in db_list:
|
||||
ret[item.key] = item.value
|
||||
return ret
|
||||
|
||||
@staticmethod
|
||||
def db_to_dict(db_list):
|
||||
|
||||
@@ -1,14 +1,11 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#########################################################
|
||||
# python
|
||||
import os, sys, traceback
|
||||
import threading, time
|
||||
from datetime import datetime
|
||||
import abc
|
||||
import os
|
||||
import queue
|
||||
import threading
|
||||
import time
|
||||
import traceback
|
||||
from datetime import datetime
|
||||
|
||||
# third-party
|
||||
# sjva 공용
|
||||
#########################################################
|
||||
|
||||
class FfmpegQueueEntity(abc.ABCMeta('ABC', (object,), {'__slots__': ()})):
|
||||
|
||||
@@ -78,12 +75,6 @@ class FfmpegQueueEntity(abc.ABCMeta('ABC', (object,), {'__slots__': ()})):
|
||||
|
||||
class FfmpegQueue(object):
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def __init__(self, P, max_ffmpeg_count):
|
||||
self.P = P
|
||||
self.static_index = 1
|
||||
@@ -136,6 +127,7 @@ class FfmpegQueue(object):
|
||||
continue
|
||||
|
||||
import ffmpeg
|
||||
|
||||
#max_pf_count = 0
|
||||
#save_path = ModelSetting.get('download_path')
|
||||
#if ModelSetting.get('auto_make_folder') == 'True':
|
||||
|
||||
@@ -79,7 +79,7 @@ class Logic(object):
|
||||
except Exception as e:
|
||||
self.P.logger.error(f'Exception:{str(e)}')
|
||||
self.P.logger.error(traceback.format_exc())
|
||||
self.P.logger.debug('%s plugin_unload', self.P.package_name)
|
||||
self.P.logger.debug(f'[{self.P.package_name}] plugin_unload end')
|
||||
except Exception as e:
|
||||
self.P.logger.error(f'Exception:{str(e)}')
|
||||
self.P.logger.error(traceback.format_exc())
|
||||
|
||||
@@ -1,17 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#########################################################
|
||||
# python
|
||||
import traceback
|
||||
from datetime import datetime
|
||||
|
||||
# third-party
|
||||
from framework import F
|
||||
|
||||
# sjva 공용
|
||||
from framework import db
|
||||
from framework.util import Util
|
||||
|
||||
#########################################################
|
||||
class ModelBase(db.Model):
|
||||
class ModelBase(F.db.Model):
|
||||
__abstract__ = True
|
||||
__table_args__ = {'mysql_collate': 'utf8_general_ci'}
|
||||
model_setting = None
|
||||
@@ -26,8 +19,8 @@ class ModelBase(db.Model):
|
||||
|
||||
def save(self):
|
||||
try:
|
||||
db.session.add(self)
|
||||
db.session.commit()
|
||||
F.db.session.add(self)
|
||||
F.db.session.commit()
|
||||
except Exception as e:
|
||||
self.logger.error(f'Exception:{str(e)}')
|
||||
self.logger.error(traceback.format_exc())
|
||||
@@ -60,7 +53,7 @@ class ModelBase(db.Model):
|
||||
@classmethod
|
||||
def get_by_id(cls, id):
|
||||
try:
|
||||
return db.session.query(cls).filter_by(id=id).first()
|
||||
return F.db.session.query(cls).filter_by(id=id).first()
|
||||
except Exception as e:
|
||||
cls.logger.error(f'Exception:{str(e)}')
|
||||
cls.logger.error(traceback.format_exc())
|
||||
@@ -69,7 +62,7 @@ class ModelBase(db.Model):
|
||||
@classmethod
|
||||
def get_list(cls, by_dict=False):
|
||||
try:
|
||||
tmp = db.session.query(cls).all()
|
||||
tmp = F.db.session.query(cls).all()
|
||||
if by_dict:
|
||||
tmp = [x.as_dict() for x in tmp]
|
||||
return tmp
|
||||
@@ -82,8 +75,8 @@ class ModelBase(db.Model):
|
||||
@classmethod
|
||||
def delete_by_id(cls, id):
|
||||
try:
|
||||
db.session.query(cls).filter_by(id=id).delete()
|
||||
db.session.commit()
|
||||
F.db.session.query(cls).filter_by(id=id).delete()
|
||||
F.db.session.commit()
|
||||
return True
|
||||
except Exception as e:
|
||||
cls.logger.error(f'Exception:{str(e)}')
|
||||
@@ -93,8 +86,8 @@ class ModelBase(db.Model):
|
||||
@classmethod
|
||||
def delete_all(cls):
|
||||
try:
|
||||
db.session.query(cls).delete()
|
||||
db.session.commit()
|
||||
F.db.session.query(cls).delete()
|
||||
F.db.session.commit()
|
||||
return True
|
||||
except Exception as e:
|
||||
cls.logger.error(f'Exception:{str(e)}')
|
||||
@@ -140,6 +133,6 @@ class ModelBase(db.Model):
|
||||
# 오버라이딩
|
||||
@classmethod
|
||||
def make_query(cls, order='desc', search='', option1='all', option2='all'):
|
||||
query = db.session.query(cls)
|
||||
query = F.db.session.query(cls)
|
||||
return query
|
||||
|
||||
@@ -1,25 +1,18 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#########################################################
|
||||
# python
|
||||
import os, traceback
|
||||
import traceback
|
||||
|
||||
# third-party
|
||||
from framework import F
|
||||
|
||||
# sjva 공용
|
||||
from framework import frame, db
|
||||
from framework.util import Util
|
||||
|
||||
#########################################################
|
||||
def get_model_setting(package_name, logger, table_name=None):
|
||||
|
||||
class ModelSetting(db.Model):
|
||||
class ModelSetting(F.db.Model):
|
||||
__tablename__ = '%s_setting' % package_name if table_name is None else table_name
|
||||
__table_args__ = {'mysql_collate': 'utf8_general_ci'}
|
||||
__bind_key__ = package_name
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
key = db.Column(db.String, unique=True, nullable=False)
|
||||
value = db.Column(db.String, nullable=False)
|
||||
id = F.db.Column(F.db.Integer, primary_key=True)
|
||||
key = F.db.Column(F.db.String, unique=True, nullable=False)
|
||||
value = F.db.Column(F.db.String, nullable=False)
|
||||
|
||||
def __init__(self, key, value):
|
||||
self.key = key
|
||||
@@ -34,7 +27,7 @@ def get_model_setting(package_name, logger, table_name=None):
|
||||
@staticmethod
|
||||
def get(key):
|
||||
try:
|
||||
ret = db.session.query(ModelSetting).filter_by(key=key).first()
|
||||
ret = F.db.session.query(ModelSetting).filter_by(key=key).first()
|
||||
if ret is not None:
|
||||
return ret.value.strip()
|
||||
return None
|
||||
@@ -44,7 +37,7 @@ def get_model_setting(package_name, logger, table_name=None):
|
||||
|
||||
@staticmethod
|
||||
def has_key(key):
|
||||
return (db.session.query(ModelSetting).filter_by(key=key).first() is not None)
|
||||
return (F.db.session.query(ModelSetting).filter_by(key=key).first() is not None)
|
||||
|
||||
@staticmethod
|
||||
def get_int(key):
|
||||
@@ -65,13 +58,13 @@ def get_model_setting(package_name, logger, table_name=None):
|
||||
@staticmethod
|
||||
def set(key, value):
|
||||
try:
|
||||
item = db.session.query(ModelSetting).filter_by(key=key).with_for_update().first()
|
||||
item = F.db.session.query(ModelSetting).filter_by(key=key).with_for_update().first()
|
||||
if item is not None:
|
||||
item.value = value.strip() if value is not None else value
|
||||
db.session.commit()
|
||||
F.db.session.commit()
|
||||
else:
|
||||
db.session.add(ModelSetting(key, value.strip()))
|
||||
db.session.commit()
|
||||
F.db.session.add(ModelSetting(key, value.strip()))
|
||||
F.db.session.commit()
|
||||
except Exception as exception:
|
||||
logger.error('Exception:%s %s', exception, key)
|
||||
logger.error(traceback.format_exc())
|
||||
@@ -79,7 +72,7 @@ def get_model_setting(package_name, logger, table_name=None):
|
||||
@staticmethod
|
||||
def to_dict():
|
||||
try:
|
||||
ret = Util.db_list_to_dict(db.session.query(ModelSetting).all())
|
||||
ret = ModelSetting.db_list_to_dict(F.db.session.query(ModelSetting).all())
|
||||
ret['package_name'] = package_name
|
||||
return ret
|
||||
except Exception as exception:
|
||||
@@ -99,9 +92,9 @@ def get_model_setting(package_name, logger, table_name=None):
|
||||
#logger.debug('Key:%s Value:%s', key, value)
|
||||
if ModelSetting.get(key) != value:
|
||||
change_list.append(key)
|
||||
entity = db.session.query(ModelSetting).filter_by(key=key).with_for_update().first()
|
||||
entity = F.db.session.query(ModelSetting).filter_by(key=key).with_for_update().first()
|
||||
entity.value = value
|
||||
db.session.commit()
|
||||
F.db.session.commit()
|
||||
return True, change_list
|
||||
except Exception as exception:
|
||||
logger.error('Exception:%s', exception)
|
||||
@@ -135,4 +128,11 @@ def get_model_setting(package_name, logger, table_name=None):
|
||||
tmp.append(_.strip())
|
||||
return tmp
|
||||
|
||||
return ModelSetting
|
||||
@staticmethod
|
||||
def db_list_to_dict(db_list):
|
||||
ret = {}
|
||||
for item in db_list:
|
||||
ret[item.key] = item.value
|
||||
return ret
|
||||
|
||||
return ModelSetting
|
||||
|
||||
@@ -1,10 +1,18 @@
|
||||
import os, io, traceback, time, random, requests
|
||||
import io
|
||||
import os
|
||||
import random
|
||||
import time
|
||||
import traceback
|
||||
|
||||
import requests
|
||||
|
||||
try:
|
||||
from discord_webhook import DiscordWebhook, DiscordEmbed
|
||||
from discord_webhook import DiscordEmbed, DiscordWebhook
|
||||
except:
|
||||
os.system('pip3 install discord-webhook')
|
||||
|
||||
from discord_webhook import DiscordWebhook, DiscordEmbed
|
||||
from discord_webhook import DiscordEmbed, DiscordWebhook
|
||||
|
||||
from . import logger
|
||||
|
||||
webhook_list = [
|
||||
@@ -176,7 +184,7 @@ class SupportDiscord(object):
|
||||
def discord_cdn(cls, byteio=None, filepath=None, filename=None, webhook_url=None, content='', retry=True):
|
||||
data = None
|
||||
if webhook_url is None:
|
||||
webhook_url = webhook_list[random.randint(0,9)] # sjva 채널
|
||||
webhook_url = webhook_list[random.randint(0,9)]
|
||||
|
||||
try:
|
||||
webhook = DiscordWebhook(url=webhook_url, content=content)
|
||||
|
||||
89
lib/system/mod_log.py
Normal file
89
lib/system/mod_log.py
Normal file
@@ -0,0 +1,89 @@
|
||||
import shutil
|
||||
|
||||
from support import SupportFile
|
||||
|
||||
from .setup import *
|
||||
|
||||
name = 'all_log'
|
||||
|
||||
class ModuleLog(PluginModuleBase):
|
||||
def __init__(self, P):
|
||||
super(ModuleLog, self).__init__(P, name=name, first_menu='list')
|
||||
|
||||
|
||||
def process_menu(self, page, req):
|
||||
try:
|
||||
arg = {}
|
||||
log_files = os.listdir(os.path.join(F.config['path_data'], 'log'))
|
||||
log_files.sort()
|
||||
log_list = []
|
||||
for x in log_files:
|
||||
if x.endswith('.log'):
|
||||
log_list.append(x)
|
||||
arg['log_list'] = '|'.join(log_list)
|
||||
arg['all_list'] = '|'.join(log_files)
|
||||
arg['filename'] = 'framework.log'
|
||||
if 'filename' in request.form:
|
||||
arg['filename'] = request.form['filename']
|
||||
return render_template(f'{__package__}_{name}.html', arg=arg)
|
||||
except Exception as e:
|
||||
P.logger.error(f'Exception:{str(e)}')
|
||||
P.logger.error(traceback.format_exc())
|
||||
return render_template('sample.html', title=f"{__package__}/{name}/{page}")
|
||||
|
||||
|
||||
def process_command(self, command, arg1, arg2, arg3, req):
|
||||
ret = {'ret':'success'}
|
||||
if command == 'plugin_install':
|
||||
ret = F.PluginManager.plugin_install(arg1)
|
||||
elif command == 'get_plugin_list':
|
||||
data = []
|
||||
"""
|
||||
for name, entity in F.PluginManager.plugin_list.items():
|
||||
if entity['version'] == '3':
|
||||
data.append({'package_name':name})
|
||||
else:
|
||||
data.append(entity['P'].plugin_info)
|
||||
"""
|
||||
for name, entity in F.PluginManager.all_package_list.items():
|
||||
try:
|
||||
if entity.get('version') == '3':
|
||||
#data.append(entity)
|
||||
data.append({'package_name':name})
|
||||
else:
|
||||
data.append(entity['P'].plugin_info)
|
||||
data[-1]['loading'] = entity.get('loading')
|
||||
data[-1]['status'] = entity.get('status')
|
||||
data[-1]['log'] = entity.get('log')
|
||||
except Exception as e:
|
||||
data.append({'package_name':name})
|
||||
P.logger.error(f'Exception:{str(e)}')
|
||||
P.logger.error(traceback.format_exc())
|
||||
ret['data'] = data
|
||||
#P.logger.debug(data)
|
||||
elif command == 'uninstall':
|
||||
info = F.PluginManager.all_package_list[arg1]
|
||||
if os.path.exists(info['path']):
|
||||
try:
|
||||
shutil.rmtree(info['path'])
|
||||
ret['msg'] = '삭제하였습니다.<br>재시작시 적용됩니다.'
|
||||
except Exception as e:
|
||||
P.logger.error(f'Exception:{str(e)}')
|
||||
P.logger.error(traceback.format_exc())
|
||||
ret['msg'] = info['path'] + "<br>삭제에 실패하였습니다.<br>" + str(e)
|
||||
ret['ret'] = 'danger'
|
||||
else:
|
||||
ret['msg'] = info['path'] + "<br>폴더가 없습니다."
|
||||
ret['ret'] = 'danger'
|
||||
return jsonify(ret)
|
||||
|
||||
|
||||
def plugin_load(self):
|
||||
try:
|
||||
pass
|
||||
except Exception as e:
|
||||
P.logger.error(f'Exception:{str(e)}')
|
||||
P.logger.error(traceback.format_exc())
|
||||
|
||||
|
||||
|
||||
@@ -117,6 +117,7 @@ class ModuleSetting(PluginModuleBase):
|
||||
|
||||
def plugin_load(self):
|
||||
try:
|
||||
F.logger.info(f"arg_repeat : {F.config['arg_repeat']}")
|
||||
if F.config['arg_repeat'] == 0 or SystemModelSetting.get('system_start_time') == '':
|
||||
SystemModelSetting.set('system_start_time', datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
|
||||
SystemModelSetting.set('repeat', str(F.config['arg_repeat']))
|
||||
|
||||
@@ -28,16 +28,16 @@ __menu = {
|
||||
'uri': 'tool',
|
||||
'name': '시스템 툴',
|
||||
'list': [
|
||||
{'uri': 'upload', 'name': '업로드'},
|
||||
{'uri': 'celery', 'name': 'celery 테스트'},
|
||||
{'uri': 'python', 'name': 'Python'},
|
||||
{'uri': 'db', 'name': 'DB'},
|
||||
{'uri': 'crypt', 'name': '암호화'},
|
||||
{'uri': 'upload', 'name': '업로드'},
|
||||
]
|
||||
},
|
||||
{
|
||||
'uri': 'log',
|
||||
'name': '로그'
|
||||
'uri': 'all_log',
|
||||
'name': '전체 로그'
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -72,11 +72,12 @@ try:
|
||||
|
||||
SystemModelSetting = P.ModelSetting
|
||||
from .mod_home import ModuleHome
|
||||
from .mod_log import ModuleLog
|
||||
from .mod_plugin import ModulePlugin
|
||||
from .mod_route import ModuleRoute
|
||||
from .mod_setting import ModuleSetting
|
||||
from .mod_tool import ModuleTool
|
||||
P.set_module_list([ModuleHome, ModuleRoute, ModuleSetting, ModulePlugin, ModuleTool])
|
||||
P.set_module_list([ModuleHome, ModuleRoute, ModuleSetting, ModulePlugin, ModuleTool, ModuleLog])
|
||||
|
||||
except Exception as e:
|
||||
P.logger.error(f'Exception:{str(e)}')
|
||||
|
||||
@@ -1,23 +1,9 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<style>
|
||||
.tab-pane {
|
||||
border-left: 1px solid #ddd;
|
||||
border-right: 1px solid #ddd;
|
||||
border-bottom: 1px solid #ddd;
|
||||
border-radius: 0px 0px 5px 5px;
|
||||
padding: 10px;
|
||||
}
|
||||
.nav-tabs { margin-bottom: 0; }
|
||||
</style>
|
||||
|
||||
<div>
|
||||
{{ macros.setting_top(left='로그 파일 선택') }}
|
||||
<div class="input-group col-sm-9">
|
||||
<div id='log_select1_div'></div>
|
||||
<div id='log_select2_div'></div>
|
||||
</div>
|
||||
{{ macros.setting_bottom() }}
|
||||
{{ macros.setting_select_empty('log_select1', '로그 파일 선택 (.log)') }}
|
||||
{{ macros.setting_select_empty('log_select2', '로그 파일 선택 (.logX)') }}
|
||||
<nav>
|
||||
{{ macros.m_tab_head_start() }}
|
||||
{{ macros.m_tab_head('이전', true) }}
|
||||
@@ -30,12 +16,10 @@
|
||||
<textarea id="log" class="col-md-12" rows="30" charswidth="23" disabled style="background-color:#ffffff;visibility:hidden"></textarea>
|
||||
</div>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
|
||||
{{ macros.m_tab_content_start('실시간', false) }}
|
||||
<div>
|
||||
<textarea id="add" class="col-md-12" rows="30" charswidth="23" disabled style="background-color:#ffffff;visibility:visible"></textarea>
|
||||
</div>
|
||||
|
||||
<div class="form-inline">
|
||||
<label class="form-check-label" for="auto_scroll">자동 스크롤</label>
|
||||
<input id="auto_scroll" name="auto_scroll" class="form-control form-control-sm" type="checkbox" data-toggle="toggle" checked>
|
||||
@@ -44,14 +28,10 @@
|
||||
</span>
|
||||
</div>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
var package_name = "{{arg['package_name']}}";
|
||||
var sub = "{{arg['sub']}}";
|
||||
var log_list = "{{arg['log_list']}}";
|
||||
var all_list = "{{arg['all_list']}}";
|
||||
|
||||
@@ -75,14 +55,14 @@ function make_form() {
|
||||
for(var i in data) {
|
||||
str += '<option value="' + data[i] + '">' + data[i] + '</option>';
|
||||
}
|
||||
document.getElementById("log_select1_div").innerHTML = str;
|
||||
$("#log_select1_div").html(str);
|
||||
|
||||
str = '<select id="log_select" name="log_select" class="form-control form-control-sm">';
|
||||
data = all_list.split('|')
|
||||
for(var i in data) {
|
||||
str += '<option value="' + data[i] + '">' + data[i] + '</option>';
|
||||
}
|
||||
document.getElementById("log_select2_div").innerHTML = str;
|
||||
$("#log_select2_div").html(str);
|
||||
}
|
||||
|
||||
$("body").on('change', '#log_select', function(e){
|
||||
@@ -90,14 +70,15 @@ $("body").on('change', '#log_select', function(e){
|
||||
filename = $(this)[0].value;
|
||||
current_filename = filename;
|
||||
$('#loading').show();
|
||||
$("#add").html('');
|
||||
socket.emit("start", {'filename':filename} );
|
||||
});
|
||||
|
||||
|
||||
function ResizeTextArea() {
|
||||
ClientHeight = window.innerHeight
|
||||
$("#log").height(ClientHeight-260);
|
||||
$("#add").height(ClientHeight-280);
|
||||
$("#log").height(ClientHeight-300);
|
||||
$("#add").height(ClientHeight-320);
|
||||
}
|
||||
|
||||
$(window).resize(function() {
|
||||
@@ -1,25 +1,17 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<style type="text/css">
|
||||
.my_hover:hover{
|
||||
background-color: #ffff00;
|
||||
transition: all 0.01s ease-in-out;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div>
|
||||
|
||||
{{ macros.m_hr_head_top() }}
|
||||
{{ macros.m_row_start('0') }}
|
||||
{{ macros.m_col_wide(1, macros.m_strong('Idx'), 'center') }}
|
||||
{{ macros.m_col_wide(2, macros.m_strong('Title')) }}
|
||||
{{ macros.m_col_wide(2, macros.m_strong('Package Name')) }}
|
||||
{{ macros.m_col_wide(1, macros.m_strong('Dev.')) }}
|
||||
{{ macros.m_col_wide(1, macros.m_strong('Version')) }}
|
||||
{{ macros.m_col_wide(5, macros.m_strong('Description')) }}
|
||||
{{ macros.m_row_end() }}
|
||||
{{ macros.m_hr_head_bottom() }}
|
||||
<div id="plugin_list_div"></div>
|
||||
{{ macros.m_hr_head_top() }}
|
||||
{{ macros.m_row_start('0') }}
|
||||
{{ macros.m_col_wide(1, macros.m_strong('Idx'), 'center') }}
|
||||
{{ macros.m_col_wide(2, macros.m_strong('Title')) }}
|
||||
{{ macros.m_col_wide(2, macros.m_strong('Package Name')) }}
|
||||
{{ macros.m_col_wide(1, macros.m_strong('Dev.')) }}
|
||||
{{ macros.m_col_wide(1, macros.m_strong('Version')) }}
|
||||
{{ macros.m_col_wide(5, macros.m_strong('Description')) }}
|
||||
{{ macros.m_row_end() }}
|
||||
{{ macros.m_hr_head_bottom() }}
|
||||
<div id="plugin_list_div"></div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
{{ macros.setting_checkbox('use_login', '로그인 사용', value=arg['use_login']) }}
|
||||
<div id="use_login_div" class="collapse">
|
||||
{{ macros.setting_input_text('web_id', '로그인 ID', value=arg['web_id'], desc=['초기값은 admin입니다.'], col='3') }}
|
||||
{{ macros.setting_input_text('web_pw', '로그인 암호', value=arg['web_pw'], col='3', type='password', desc=['초기값은 sjva입니다.']) }}
|
||||
{{ macros.setting_input_text('web_pw', '로그인 암호', value=arg['web_pw'], col='3', type='password', desc=['초기값은 admin입니다.']) }}
|
||||
</div>
|
||||
|
||||
{{ macros.m_hr() }}
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
|
||||
<div>
|
||||
{{ macros.m_button_group([['globalSettingSaveBtn', '설정 저장']])}}
|
||||
{{ macros.m_row_start('5') }}
|
||||
{{ macros.m_row_end() }}
|
||||
<nav>
|
||||
{{ macros.m_tab_head_start() }}
|
||||
{{ macros.m_tab_head2('memo', '메모', true) }}
|
||||
{{ macros.m_tab_head_end() }}
|
||||
</nav>
|
||||
<form id='setting' name='setting'>
|
||||
<div class="tab-content" id="nav-tabContent">
|
||||
{{ macros.m_tab_content_start('memo', true) }}
|
||||
<div>
|
||||
<textarea id="memo" name="memo" class="col-md-12" rows="30" charswidth="23" style="visibility:visible" value="">{{ arg['memo'] }}</textarea>
|
||||
</div>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
</div><!--tab-content-->
|
||||
</form>
|
||||
</div> <!--전체-->
|
||||
|
||||
<script type="text/javascript">
|
||||
var package_name = "{{arg['package_name']}}";
|
||||
var sub = "{{arg['sub'] }}";
|
||||
|
||||
$(document).ready(function(){
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
@@ -1,166 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
|
||||
<div>
|
||||
{{ macros.m_button_group([['globalSettingSaveBtn', '설정 저장']])}}
|
||||
{{ macros.m_row_start('5') }}
|
||||
{{ macros.m_row_end() }}
|
||||
<nav>
|
||||
{{ macros.m_tab_head_start() }}
|
||||
{{ macros.m_tab_head2('normal', '일반', true) }}
|
||||
{{ macros.m_tab_head2('test', '테스트', false) }}
|
||||
{{ macros.m_tab_head_end() }}
|
||||
</nav>
|
||||
<div class="tab-content" id="nav-tabContent">
|
||||
{{ macros.m_tab_content_start('normal', true) }}
|
||||
<form id='setting' name='setting'>
|
||||
{{ macros.setting_input_text_and_buttons('selenium_remote_url', 'Selenium Remote URL', [['selenium_go_btn', 'GO'], ['selenium_manual_go_btn', '매뉴얼']], value=arg['selenium_remote_url'], placeholder='예) http://127.0.0.1:4444/wd/hub', desc=['SJVA에서 Selenium이 필요한 경우 사용할 Remote URL', 'Docker 환경에서 필요하며, Native 환경에서는 실행파일이 SJVA Root/bin/플랫폼 안에 직접 넣어줘야합니다.', 'Native 환경에서도 이 값을 입력하는 경우는 이를 사용합니다.', 'Selenium 공식 Docker 이미지인 경우 /wd/hub를 붙여야합니다.']) }}
|
||||
{{ macros.setting_input_textarea('selenium_remote_default_option', '기본 크롬 옵션(Remote)', value=arg['selenium_remote_default_option'], row='3', desc=['구분자 | 또는 엔터']) }}
|
||||
{{ macros.setting_input_textarea('selenium_binary_default_option', '기본 크롬 옵션(Binary)', value=arg['selenium_binary_default_option'], row='3', desc=['구분자 | 또는 엔터']) }}
|
||||
</form>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
|
||||
{{ macros.m_tab_content_start('test', false) }}
|
||||
{{ macros.setting_input_text_and_buttons('tmp_go_url', '테스트 URL', [['selenium_test_btn', 'GO'], ['capture_btn', '화면표시'], ['cookie_btn', '쿠키정보']], value='https://search.daum.net/search?w=tv&q=%EB%82%98%EC%81%9C%20%EB%85%80%EC%84%9D%EB%93%A4%20%3A%20%EC%95%85%EC%9D%98%20%EB%8F%84%EC%8B%9C&irk=78543&irt=tv-program&DA=TVP') }}
|
||||
{{ macros.setting_input_text_and_buttons('tmp_daum_capcha', '다음 캡챠', [['tmp_daum_capcha_btn', '캡챠 풀기']], value='') }}
|
||||
<div id="image_div"></div>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
</div><!--tab-content-->
|
||||
</div> <!--전체-->
|
||||
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
var package_name = "{{arg['package_name']}}";
|
||||
var sub = "{{arg['sub'] }}";
|
||||
|
||||
$(document).ready(function(){
|
||||
});
|
||||
|
||||
$("body").on('click', '#selenium_manual_go_btn', function(e){
|
||||
e.preventDefault();
|
||||
url = "https://soju6jan.com/archives/1380"
|
||||
window.open(url, "_blank");
|
||||
});
|
||||
|
||||
$("body").on('click', '#selenium_go_btn', function(e){
|
||||
e.preventDefault();
|
||||
url = document.getElementById('selenium_remote_url').value
|
||||
window.open(url, "_blank");
|
||||
});
|
||||
|
||||
$("body").on('click', '#selenium_test_btn', function(e){
|
||||
e.preventDefault();
|
||||
url = document.getElementById('tmp_go_url').value
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/selenium_test_go',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {url:url},
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
if (ret == 'success') {
|
||||
$.notify('<strong>로딩하였습니다.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
$.notify('<strong>실패하였습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("body").on('click', '#capture_btn', function(e){
|
||||
e.preventDefault();
|
||||
url = document.getElementById('tmp_go_url').value
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/capture',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {url:url},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
if (data.ret == 'success') {
|
||||
tmp = '<img src="' + data.data + '" class="img-fluid">'
|
||||
document.getElementById("image_div").innerHTML = tmp;
|
||||
} else {
|
||||
$.notify('<strong>실패하였습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//, ['full_capture_btn', '전체 캡처 이미지 다운']
|
||||
$("body").on('click', '#full_capture_btn', function(e){
|
||||
e.preventDefault();
|
||||
url = document.getElementById('tmp_go_url').value
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/full_capture',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {url:url},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
if (data.ret == 'success') {
|
||||
console.log('xxx')
|
||||
tmp = '<img src="' + data.data + '" class="img-fluid">'
|
||||
document.getElementById("image_div").innerHTML = tmp;
|
||||
} else {
|
||||
$.notify('<strong>실패하였습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$("body").on('click', '#cookie_btn', function(e){
|
||||
e.preventDefault();
|
||||
url = document.getElementById('tmp_go_url').value
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/cookie',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {url:url},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
m_modal(data);
|
||||
return;
|
||||
if (data.ret == 'success') {
|
||||
m_modal(data);
|
||||
} else {
|
||||
$.notify('<strong>실패하였습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("body").on('click', '#tmp_daum_capcha_btn', function(e){
|
||||
e.preventDefault();
|
||||
daum_capcha = document.getElementById('tmp_daum_capcha').value
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/daum_capcha',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {daum_capcha:daum_capcha},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
if (data.ret == 'success') {
|
||||
$.notify('<strong>전달 하였습니다. 페이지 다시 로딩 & 쿠키 정보 확인하여 Site Daum에 입력하세요.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
@@ -1,179 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
|
||||
<div>
|
||||
{{ macros.m_button_group([['globalSettingSaveBtn', '설정 저장']])}}
|
||||
{{ macros.m_row_start('5') }}
|
||||
{{ macros.m_row_end() }}
|
||||
<nav>
|
||||
{{ macros.m_tab_head_start() }}
|
||||
{{ macros.m_tab_head2('daum', 'Daum', true) }}
|
||||
{{ macros.m_tab_head2('wavve', '웨이브', false) }}
|
||||
{{ macros.m_tab_head2('tving', '티빙', false) }}
|
||||
{{ macros.m_tab_head_end() }}
|
||||
</nav>
|
||||
<form id='setting' name='setting'>
|
||||
<div class="tab-content" id="nav-tabContent">
|
||||
{{ macros.m_tab_content_start('daum', true) }}
|
||||
<!--{{ macros.setting_input_text_and_buttons('site_daum_cookie', 'Cookie', [['site_daum_cookie_btn', 'Refresh']], value=arg['site_daum_cookie'], desc=['지금은 TIARA=값 만 입력하세요', 'Refresh는 Selenium 연결이 가능한 경우만 실행됩니다.']) }}-->
|
||||
{{ macros.setting_input_text('site_daum_cookie', 'Cookie', value=arg['site_daum_cookie'], desc=['TIARA=값 만 입력']) }}
|
||||
{{ macros.setting_input_text('site_daum_proxy', 'Proxy', value=arg['site_daum_proxy']) }}
|
||||
|
||||
{{ macros.m_hr() }}
|
||||
{{ macros.setting_input_text_and_buttons('site_daum_test', 'Test', [['site_daum_test_btn', 'Test']], value=arg['site_daum_test'], desc=['영화 or 방송제목']) }}
|
||||
<!--
|
||||
{{ macros.m_hr() }}
|
||||
{{ macros.info_text('', '자동', value='Cookie 값 자동으로 변경하는 스케쥴링입니다. Selenium 연결이 가능해야 합니다.') }}
|
||||
{{ macros.setting_scheduler_button(arg['scheduler'], arg['is_running']) }}
|
||||
{{ macros.setting_input_text('site_daum_interval', '스케쥴링 실행 정보', value=arg['site_daum_interval'], col='3', desc=['Inverval(minute 단위)이나 Cron 설정']) }}
|
||||
{{ macros.setting_checkbox('site_daum_auto_start', '시작시 자동실행', value=arg['site_daum_auto_start'], desc='On : 시작시 자동으로 스케쥴러에 등록됩니다.') }}
|
||||
-->
|
||||
<!--{{ macros.m_hr() }}
|
||||
{{ macros.info_text_go('site_get_daum_cookie_url', 'Daum Cookie API', value=arg['site_get_daum_cookie_url'], desc=['Plex의 SJ Daum Agent 설정에 이 값을 입력하면 검색 실패시 자동적으로 새로운 쿠키값을 가져옵니다.'] ) }}-->
|
||||
{{ macros.m_tab_content_end() }}
|
||||
{{ macros.m_tab_content_start('wavve', false) }}
|
||||
{{ macros.setting_input_textarea('site_wavve_credential', 'Credential', value=arg['site_wavve_credential'], row='3') }}
|
||||
{{ macros.setting_checkbox('site_wavve_use_proxy', 'Proxy 사용', value=arg['site_wavve_use_proxy'], desc=None) }}
|
||||
<div id="site_wavve_use_proxy_div" class="collapse">
|
||||
{{ macros.setting_input_text('site_wavve_proxy_url', 'Proxy URL', value=arg['site_wavve_proxy_url'], desc=None) }}
|
||||
</div>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
|
||||
{{ macros.m_tab_content_start('tving', false) }}
|
||||
{{ macros.setting_radio('site_tving_login_type', '로그인 타입', ['CJONE', 'TVING'], value=arg['site_tving_login_type']) }}
|
||||
{{ macros.setting_input_text('site_tving_id', 'ID', value=arg['site_tving_id'], col='3') }}
|
||||
{{ macros.setting_input_text_and_buttons('site_tving_pw', '암호', [['site_tving_login_btn', '토큰 가져오기']], value=arg['site_tving_pw'], col='6', type='password') }}
|
||||
{{ macros.setting_input_text_and_buttons('site_tving_token', '토큰', [['site_tving_deviceid_btn', 'DeviceID 목록 가져오기']], value=arg['site_tving_token'], col='8', desc=['계정 정보대신 이 값을 사용합니다.', '이 값을 수동으로 넣는 경우 계정정보를 입력할 필요가 없습니다.', '_tving_token=XXXXXX 형식']) }}
|
||||
{{ macros.setting_input_text('site_tving_deviceid', 'Device ID', value=arg['site_tving_deviceid'], col='3', desc=['model이 PC인 항목의 uuid 값 입력']) }}
|
||||
{{ macros.setting_input_text('site_tving_uuid', 'UUID', value=arg['site_tving_uuid'], col='3', desc=['uuid']) }}
|
||||
{{ macros.setting_checkbox('site_tving_use_proxy', 'Proxy 사용', value=arg['site_tving_use_proxy'], desc=None) }}
|
||||
<div id="site_tving_use_proxy_div" class="collapse">
|
||||
{{ macros.setting_input_text('site_tving_proxy_url', 'Proxy URL', value=arg['site_tving_proxy_url'], desc=None) }}
|
||||
</div>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
|
||||
</div><!--tab-content-->
|
||||
</form>
|
||||
</div> <!--전체-->
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
var package_name = "{{arg['package_name']}}";
|
||||
var sub = "{{arg['sub'] }}";
|
||||
|
||||
$(document).ready(function(){
|
||||
use_collapse("site_wavve_use_proxy");
|
||||
use_collapse("site_tving_use_proxy");
|
||||
});
|
||||
|
||||
$('#site_wavve_use_proxy').change(function() {
|
||||
use_collapse('site_wavve_use_proxy');
|
||||
});
|
||||
$('#site_tving_use_proxy').change(function() {
|
||||
use_collapse('site_tving_use_proxy');
|
||||
});
|
||||
|
||||
|
||||
$("body").on('click', '#site_daum_test_btn', function(e){
|
||||
e.preventDefault();
|
||||
site_daum_test = document.getElementById("site_daum_test").value;
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/site_daum_test',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data:{site_daum_test:site_daum_test},
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
m_modal(ret);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$("body").on('click', '#site_daum_cookie_btn', function(e){
|
||||
e.preventDefault();
|
||||
$.notify('<strong>잠시 기다려 주세요</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/site_daum_cookie_refresh',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data:{},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
if (data.ret) {
|
||||
document.getElementById("site_daum_cookie").value = data.data
|
||||
$.notify('<strong>갱신하였습니다. 저장버튼을 눌러야 적용됩니다.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
$.notify('<strong>갱신에 실패하였습니다. Selenium 설정을 확인하세요.<br>'+ret.log+'</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$("body").on('change', '#scheduler', function(e){
|
||||
var ret = $(this).prop('checked');
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/scheduler',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {scheduler : ret},
|
||||
dataType: "json",
|
||||
success: function (list) {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
// 티빙
|
||||
$("body").on('click', '#site_tving_login_btn', function(e) {
|
||||
e.preventDefault();
|
||||
tving_id = document.getElementById("site_tving_id").value;
|
||||
tving_pw = document.getElementById("site_tving_pw").value;
|
||||
tving_login_type = ($("#site_tving_login_type0").prop('checked')) ? '0' : '1';
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/' + sub + '/tving_login',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {tving_id:tving_id, tving_pw:tving_pw, tving_login_type:tving_login_type},
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
if (ret.ret) {
|
||||
notify("토큰값을 가져왔습니다.<br>저장버튼을 눌러야 값을 저장합니다.", "success");
|
||||
document.getElementById("site_tving_token").value = ret['token'];
|
||||
} else {
|
||||
notify("로그인에 실패하였습니다.", "warning");
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("body").on('click', '#site_tving_deviceid_btn', function(e) {
|
||||
e.preventDefault();
|
||||
tving_token = document.getElementById("site_tving_token").value;
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/' + sub + '/tving_deviceid',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {tving_token:tving_token},
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
if (ret.ret) {
|
||||
m_modal(ret.device_list, "Device ID");
|
||||
} else {
|
||||
notify("실패하였습니다.", "warning");
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
@@ -1,85 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
|
||||
<div>
|
||||
{{ macros.m_button_group([['globalSettingSaveBtn', '설정 저장']])}}
|
||||
{{ macros.m_row_start('5') }}
|
||||
{{ macros.m_row_end() }}
|
||||
<nav>
|
||||
{{ macros.m_tab_head_start() }}
|
||||
{{ macros.m_tab_head2('normal', '일반', true) }}
|
||||
{{ macros.m_tab_head_end() }}
|
||||
</nav>
|
||||
<form id='setting' name='setting'>
|
||||
<div class="tab-content" id="nav-tabContent">
|
||||
{{ macros.m_tab_content_start('normal', true) }}
|
||||
{{ macros.setting_scheduler_button(arg['scheduler'], arg['is_running']) }}
|
||||
{{ macros.setting_checkbox('telegram_bot_auto_start', '시작시 자동실행', value=arg['telegram_bot_auto_start'], desc='On : 시작시 자동으로 스케쥴러에 등록됩니다.') }}
|
||||
{{ macros.setting_input_text('telegram_bot_token', 'Bot Token', value=arg['telegram_bot_token']) }}
|
||||
|
||||
{{ macros.setting_checkbox('telegram_resend', '전달 사용', value=arg['telegram_resend'], desc=['On : 수신 받은 데이터를 전달합니다.']) }}
|
||||
<div id="telegram_resend_div" class="collapse">
|
||||
{{ macros.setting_input_textarea('telegram_resend_chat_id', '수신 받을 Chat ID', value=arg['telegram_resend_chat_id'], row='3', desc=['받은 메시지를 보낼 Chat ID', 'Chat ID 별 구분자 | 또는 엔터']) }}
|
||||
</div>
|
||||
<!--
|
||||
{{ macros.m_hr() }}
|
||||
{{ macros.setting_button([['open_url1_btn', 'BotFather'], ['open_url2_btn', 'SJVA Bot Channel'], ['open_url3_btn', 'SJVA Bot Channel 관리 봇']]) }}
|
||||
-->
|
||||
{{ macros.m_tab_content_end() }}
|
||||
</div><!--tab-content-->
|
||||
</form>
|
||||
</div> <!--전체-->
|
||||
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
var package_name = "{{arg['package_name']}}";
|
||||
var sub = "{{arg['sub'] }}";
|
||||
|
||||
|
||||
$(document).ready(function(){
|
||||
use_collapse("telegram_resend");
|
||||
});
|
||||
|
||||
$('#telegram_resend').change(function() {
|
||||
use_collapse('telegram_resend');
|
||||
});
|
||||
|
||||
$("body").on('change', '#scheduler', function(e){
|
||||
var ret = $(this).prop('checked');
|
||||
if (!ret) {
|
||||
$.notify('<strong>텔레그램 봇은 중단 할 수 없습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
$('#scheduler').bootstrapToggle('on')
|
||||
return
|
||||
}
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/scheduler',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {scheduler : ret},
|
||||
dataType: "json",
|
||||
success: function (list) {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("body").on('click', '#open_url1_btn', function(e){
|
||||
e.preventDefault();
|
||||
window.open("https://t.me/BotFather", "_blank");
|
||||
});
|
||||
|
||||
$("body").on('click', '#open_url2_btn', function(e){
|
||||
e.preventDefault();
|
||||
window.open("https://t.me/sjva_bot_channel", "_blank");
|
||||
});
|
||||
|
||||
$("body").on('click', '#open_url3_btn', function(e){
|
||||
e.preventDefault();
|
||||
window.open("https://t.me/sjva_admin_bot", "_blank");
|
||||
});
|
||||
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
@@ -1,135 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
{% block wide_menu %}
|
||||
<ul class="nav nav-pills bg-light shadow text-dark" >
|
||||
<li class="nav-item"><span class="nav-link">시스템</span></li>
|
||||
<li class="nav-item"><a class="nav-link " href="/system/setting">설정</a></li>
|
||||
<li class="nav-item"><a class="nav-link active" href="/system/telegram">텔레그램 봇</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="/system/plugin">저장된 TV</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="/system/common">로그 확인</a></li>
|
||||
</ul>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div>
|
||||
{{ macros.setting_scheduler_button(arg['is_include'], arg['is_running']) }}
|
||||
<form id='setting' name='setting'>
|
||||
{{ macros.setting_checkbox('telegram_auto_start', '시작시 자동실행', value=arg['auto_start'], desc='On : 시작시 자동으로 스케쥴러에 등록됩니다.') }}
|
||||
{{ macros.setting_checkbox('telegram_process_rss', '토렌트', value=arg['process_rss'], desc='On : 토렌트 데이터를 수신하여 저장') }}
|
||||
<div id="process_rss_div" class="collapse">
|
||||
{{ macros.setting_input_text('telegram_process_rss_type', '수신 타입', value=arg['process_rss_type'], desc=['all인 경우 모두 받음. 구분자 ,', 'TV : drama, ent, dacu, etc', '영화 : movie', 'AV : av_censored, av_uncensored, av_west', '기타 : music, user' ]) }}
|
||||
</div>
|
||||
{{ macros.setting_checkbox('telegram_send_notify', '수신정보 알림', value=arg['send_notify'], desc='On : On 상태인 데이터가 수신될 때 알림.') }}
|
||||
{{ macros.setting_checkbox('telegram_disable_notification', '알람 Disable', value=arg['disable_notification'], desc='On : 알람 소리 없이 메시지를 수신합니다.') }}
|
||||
{{ macros.m_hr() }}
|
||||
{{ macros.setting_input_text('telegram_bot_token', 'Bot Token', value=arg['bot_token']) }}
|
||||
{{ macros.setting_input_text_and_buttons('telegram_chat_id', 'My Chat ID', [['test_btn', '테스트']], value=arg['chat_id'], col='9', desc=['사용자가 먼저 봇과 대화를 시작하여야 합니다.', '(대화창이 있을 경우에만 알림 수신)']) }}
|
||||
{{ macros.setting_button([['globalSettingSaveBtn', '저장']]) }}
|
||||
</form>
|
||||
{{ macros.m_hr() }}
|
||||
{{ macros.setting_button([['open_url1_btn', 'BotFather'], ['open_url2_btn', 'SJVA Bot Channel'], ['open_url3_btn', 'SJVA Bot Channel 관리 봇']]) }}
|
||||
</div> <!--전체-->
|
||||
|
||||
<script type="text/javascript">
|
||||
var package_name = 'system';
|
||||
var current_data = null;
|
||||
|
||||
$(document).ready(function(){
|
||||
use_collapse("telegram_process_rss")
|
||||
});
|
||||
|
||||
|
||||
|
||||
$('#telegram_process_rss').change(function() {
|
||||
use_collapse('telegram_process_rss');
|
||||
});
|
||||
// 스케쥴링 on / off
|
||||
$('#scheduler').change(function() {
|
||||
var ret = $(this).prop('checked');
|
||||
if (!ret) {
|
||||
$.notify('<strong>텔레그램 봇은 중단 할 수 없습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
$('#scheduler').bootstrapToggle('on')
|
||||
return
|
||||
}
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/scheduler',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {scheduler : ret},
|
||||
dataType: "json",
|
||||
success: function (list) {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
// 서버 목록
|
||||
$("body").on('click', '#test_btn', function(e){
|
||||
e.preventDefault();
|
||||
bot_token = document.getElementById("bot_token").value;
|
||||
chat_id = document.getElementById("chat_id").value;
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/test',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data:{bot_token:bot_token, chat_id:chat_id},
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
if (ret == 'success') {
|
||||
$.notify('<strong>전송 하였습니다.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
$.notify('<strong>전송에 실패하였습니다.<br>'+ret+'</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//설정 저장
|
||||
$("#setting_save_btn").click(function(e) {
|
||||
e.preventDefault();
|
||||
var formData = get_formdata('#setting');
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/setting_save',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: formData,
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
if (ret) {
|
||||
$.notify('<strong>설정을 저장하였습니다.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
$.notify('<strong>설정 저장에 실패하였습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("body").on('click', '#open_url1_btn', function(e){
|
||||
e.preventDefault();
|
||||
window.open("https://t.me/BotFather", "_blank");
|
||||
});
|
||||
|
||||
$("body").on('click', '#open_url2_btn', function(e){
|
||||
e.preventDefault();
|
||||
window.open("{{arg['bot_channel_url']}}", "_blank");
|
||||
});
|
||||
|
||||
$("body").on('click', '#open_url3_btn', function(e){
|
||||
e.preventDefault();
|
||||
window.open("https://t.me/sjva_admin_bot", "_blank");
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
@@ -13,7 +13,7 @@
|
||||
<form id='setting' name='setting'>
|
||||
<div class="tab-content" id="nav-tabContent">
|
||||
{{ macros.m_tab_content_start('normal', true) }}
|
||||
{{ macros.setting_checkbox('tool_crypt_use_user_key', '암호화 키 본인키 사용', value=arg['tool_crypt_use_user_key'], desc=['On : 본인 키 사용', 'Off : SJVA 고정 키 사용']) }}
|
||||
{{ macros.setting_checkbox('tool_crypt_use_user_key', '암호화 키 본인키 사용', value=arg['tool_crypt_use_user_key'], desc=['On : 본인 키 사용', '주의) 변경 후 일반설정-인증-로그인 암호를 새로 저장해야 합니다.', 'Off : 앱 고정 키 사용']) }}
|
||||
<div id="tool_crypt_use_user_key_div" class="collapse">
|
||||
{{ macros.setting_input_text('tool_crypt_user_key', '암호화 키', value=arg['tool_crypt_user_key'], desc=['16진수(숫자, a~e)로 이루어진 32글자. 미만시 앞을 0으로 채움. 초과시 뒤에 무시']) }}
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user