From 728967327e1e738d2df5f7b3725b285c170d4c94 Mon Sep 17 00:00:00 2001 From: joyfuI Date: Sun, 15 Mar 2020 15:29:32 +0900 Subject: [PATCH] =?UTF-8?q?v1.3.4=20=ED=94=8C=EB=9F=AC=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=20=EA=B5=AC=EC=A1=B0=EB=A5=BC=20=EA=B0=80=EC=9D=B4=EB=93=9C?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EC=B6=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++ info.json | 2 +- logic.py | 149 ++++------------------------------------------- logic_normal.py | 121 ++++++++++++++++++++++++++++++++++++++ model.py | 89 +++++++++++++++++++++++++--- my_youtube_dl.py | 19 ++---- plugin.py | 101 ++++++++++++++++---------------- 7 files changed, 273 insertions(+), 212 deletions(-) create mode 100644 logic_normal.py diff --git a/README.md b/README.md index 4dcddc3..cffd634 100644 --- a/README.md +++ b/README.md @@ -131,6 +131,10 @@ API에선 직접 비트레이트를 설정할 수 있습니다. 물론 해당 정보가 없으면 null입니다. ## Changelog +v1.3.4 +* 플러그인 구조를 가이드에 맞춰 변경 + 플러그인 설정이 초기화됩니다. + v1.3.3 * API 변경 diff --git a/info.json b/info.json index 23571c9..05b0a7f 100644 --- a/info.json +++ b/info.json @@ -1 +1 @@ -{"description": "\uc720\ud29c\ube0c, \ub124\uc774\ubc84TV \ub4f1 \ub3d9\uc601\uc0c1 \uc0ac\uc774\ud2b8\uc5d0\uc11c \ub3d9\uc601\uc0c1 \ub2e4\uc6b4\ub85c\ub4dc", "name": "youtube-dl", "more": "", "version": "1.3.3", "home": "https://github.com/joyfuI/youtube-dl", "category_name": "vod", "developer": "joyfuI"} \ No newline at end of file +{"description": "\uc720\ud29c\ube0c, \ub124\uc774\ubc84TV \ub4f1 \ub3d9\uc601\uc0c1 \uc0ac\uc774\ud2b8\uc5d0\uc11c \ub3d9\uc601\uc0c1 \ub2e4\uc6b4\ub85c\ub4dc", "name": "youtube-dl", "more": "", "version": "1.3.4", "home": "https://github.com/joyfuI/youtube-dl", "category_name": "vod", "developer": "joyfuI"} \ No newline at end of file diff --git a/logic.py b/logic.py index 0520662..1c13952 100644 --- a/logic.py +++ b/logic.py @@ -5,10 +5,8 @@ import os import subprocess import traceback import platform -from datetime import datetime # third-party -from flask import jsonify # sjva 공용 from framework import db, path_data @@ -17,12 +15,11 @@ from framework.util import Util # 패키지 from .plugin import logger, package_name from .model import ModelSetting -from .my_youtube_dl import Status - ######################################################### class Logic(object): db_default = { + 'db_version': '1', 'temp_path': os.path.join(path_data, 'download_tmp'), 'save_path': os.path.join(path_data, 'download'), 'default_filename': '%(title)s-%(id)s.%(ext)s' @@ -35,6 +32,7 @@ class Logic(object): if db.session.query(ModelSetting).filter_by(key=key).count() == 0: db.session.add(ModelSetting(key, value)) db.session.commit() + # Logic.migration() except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) @@ -45,12 +43,20 @@ class Logic(object): logger.debug('%s plugin_load', package_name) Logic.db_init() # DB 초기화 - # youtube-dl 업데이트 - logger.debug('youtube-dl upgrade') if platform.system() == 'Windows': # 윈도우일 때 pip = 'pip.exe' else: pip = 'pip' + + try: + import glob2 + except Exception as e: + # glob2 설치 + logger.debug('glob2 install') + logger.debug(subprocess.check_output([pip, 'install', 'glob2'], universal_newlines=True)) + + # youtube-dl 업데이트 + logger.debug('youtube-dl upgrade') logger.debug(subprocess.check_output([pip, 'install', '--upgrade', 'youtube-dl'], universal_newlines=True)) # 편의를 위해 json 파일 생성 @@ -67,134 +73,3 @@ class Logic(object): except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) - - @staticmethod - def setting_save(req): - try: - for key, value in req.form.items(): - logger.debug('Key:%s Value:%s', key, value) - entity = db.session.query(ModelSetting).filter_by(key=key).with_for_update().first() - entity.value = value - db.session.commit() - return True - except Exception as e: - logger.error('Exception:%s', e) - logger.error(traceback.format_exc()) - return False - - @staticmethod - def get_setting_value(key): - try: - return db.session.query(ModelSetting).filter_by(key=key).first().value - except Exception as e: - logger.error('Exception:%s', e) - logger.error(traceback.format_exc()) - -######################################################### - - youtube_dl_list = [] - - @staticmethod - def get_preset_list(): - preset_list = [ - ['bestvideo+bestaudio/best', '최고 화질'], - ['bestvideo[height<=1080]+bestaudio/best[height<=1080]', '1080p'], - ['worstvideo+worstaudio/worst', '최저 화질'], - ['bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]', '최고 화질(mp4)'], - ['bestvideo[ext=mp4][height<=1080]+bestaudio[ext=m4a]/best[ext=mp4][height<=1080]', '1080p(mp4)'], - ['bestvideo[filesize<50M]+bestaudio/best[filesize<50M]', '50MB 미만'], - ['bestaudio/best', '오디오만'], - ['_custom', '사용자 정의'] - ] - return preset_list - - @staticmethod - def get_postprocessor_list(): - postprocessor_list = [ - ['', '후처리 안함', None], - ['mp4', 'MP4', '비디오 변환'], - ['flv', 'FLV', '비디오 변환'], - ['webm', 'WebM', '비디오 변환'], - ['ogg', 'Ogg', '비디오 변환'], - ['mkv', 'MKV', '비디오 변환'], - ['ts', 'TS', '비디오 변환'], - ['avi', 'AVI', '비디오 변환'], - ['wmv', 'WMV', '비디오 변환'], - ['mov', 'MOV', '비디오 변환'], - ['gif', 'GIF', '비디오 변환'], - ['mp3', 'MP3', '오디오 추출'], - ['aac', 'AAC', '오디오 추출'], - ['flac', 'FLAC', '오디오 추출'], - ['m4a', 'M4A', '오디오 추출'], - ['opus', 'Opus', '오디오 추출'], - ['vorbis', 'Vorbis', '오디오 추출'], - ['wav', 'WAV', '오디오 추출'] - ] - return postprocessor_list - - @staticmethod - def get_postprocessor(): - video_convertor = [] - extract_audio = [] - for i in Logic.get_postprocessor_list(): - if i[2] == '비디오 변환': - video_convertor.append(i[0]) - elif i[2] == '오디오 추출': - extract_audio.append(i[0]) - return video_convertor, extract_audio - - @staticmethod - def get_data(youtube_dl): - try: - data = { } - data['plugin'] = youtube_dl.plugin - data['url'] = youtube_dl.url - data['filename'] = youtube_dl.filename - data['temp_path'] = youtube_dl.temp_path - data['save_path'] = youtube_dl.save_path - data['index'] = youtube_dl.index - data['status_str'] = youtube_dl.status.name - data['status_ko'] = str(youtube_dl.status) - data['end_time'] = '' - data['extractor'] = youtube_dl.extractor if youtube_dl.extractor is not None else '' - data['title'] = youtube_dl.title if youtube_dl.title is not None else youtube_dl.url - data['uploader'] = youtube_dl.uploader if youtube_dl.uploader is not None else '' - data['uploader_url'] = youtube_dl.uploader_url if youtube_dl.uploader_url is not None else '' - data['downloaded_bytes_str'] = '' - data['total_bytes_str'] = '' - data['percent'] = '0' - data['eta'] = youtube_dl.eta if youtube_dl.eta is not None else '' - data['speed_str'] = Logic.human_readable_size(youtube_dl.speed, '/s') if youtube_dl.speed is not None else '' - if youtube_dl.status == Status.READY: # 다운로드 전 - data['start_time'] = '' - data['download_time'] = '' - else: - if youtube_dl.end_time is None: # 완료 전 - download_time = datetime.now() - youtube_dl.start_time - else: - download_time = youtube_dl.end_time - youtube_dl.start_time - data['end_time'] = youtube_dl.end_time.strftime('%m-%d %H:%M:%S') - if None not in (youtube_dl.downloaded_bytes, youtube_dl.total_bytes): # 둘 다 값이 있으면 - data['downloaded_bytes_str'] = Logic.human_readable_size(youtube_dl.downloaded_bytes) - data['total_bytes_str'] = Logic.human_readable_size(youtube_dl.total_bytes) - data['percent'] = '%.2f' % (float(youtube_dl.downloaded_bytes) / float(youtube_dl.total_bytes) * 100) - data['start_time'] = youtube_dl.start_time.strftime('%m-%d %H:%M:%S') - data['download_time'] = '%02d:%02d' % (download_time.seconds / 60, download_time.seconds % 60) - return data - except Exception as e: - logger.error('Exception:%s', e) - logger.error(traceback.format_exc()) - return None - - @staticmethod - def human_readable_size(size, suffix=''): - for unit in ['Bytes','KB','MB','GB','TB','PB','EB','ZB']: - if size < 1024.0: - return '%3.1f %s%s' % (size, unit, suffix) - size /= 1024.0 - return '%.1f %s%s' % (size, 'YB', suffix) - - @staticmethod - def abort(base, code): - base['errorCode'] = code - return jsonify(base) diff --git a/logic_normal.py b/logic_normal.py new file mode 100644 index 0000000..2cf486f --- /dev/null +++ b/logic_normal.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- +######################################################### +# python +import traceback +from datetime import datetime + +# third-party +from flask import jsonify + +# 패키지 +from .plugin import logger +from .my_youtube_dl import Status +######################################################### + +class LogicNormal(object): + youtube_dl_list = [] + + @staticmethod + def get_preset_list(): + preset_list = [ + ['bestvideo+bestaudio/best', '최고 화질'], + ['bestvideo[height<=1080]+bestaudio/best[height<=1080]', '1080p'], + ['worstvideo+worstaudio/worst', '최저 화질'], + ['bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]', '최고 화질(mp4)'], + ['bestvideo[ext=mp4][height<=1080]+bestaudio[ext=m4a]/best[ext=mp4][height<=1080]', '1080p(mp4)'], + ['bestvideo[filesize<50M]+bestaudio/best[filesize<50M]', '50MB 미만'], + ['bestaudio/best', '오디오만'], + ['_custom', '사용자 정의'] + ] + return preset_list + + @staticmethod + def get_postprocessor_list(): + postprocessor_list = [ + ['', '후처리 안함', None], + ['mp4', 'MP4', '비디오 변환'], + ['flv', 'FLV', '비디오 변환'], + ['webm', 'WebM', '비디오 변환'], + ['ogg', 'Ogg', '비디오 변환'], + ['mkv', 'MKV', '비디오 변환'], + ['ts', 'TS', '비디오 변환'], + ['avi', 'AVI', '비디오 변환'], + ['wmv', 'WMV', '비디오 변환'], + ['mov', 'MOV', '비디오 변환'], + ['gif', 'GIF', '비디오 변환'], + ['mp3', 'MP3', '오디오 추출'], + ['aac', 'AAC', '오디오 추출'], + ['flac', 'FLAC', '오디오 추출'], + ['m4a', 'M4A', '오디오 추출'], + ['opus', 'Opus', '오디오 추출'], + ['vorbis', 'Vorbis', '오디오 추출'], + ['wav', 'WAV', '오디오 추출'] + ] + return postprocessor_list + + @staticmethod + def get_postprocessor(): + video_convertor = [] + extract_audio = [] + for i in LogicNormal.get_postprocessor_list(): + if i[2] == '비디오 변환': + video_convertor.append(i[0]) + elif i[2] == '오디오 추출': + extract_audio.append(i[0]) + return video_convertor, extract_audio + + @staticmethod + def get_data(youtube_dl): + try: + data = {} + data['plugin'] = youtube_dl.plugin + data['url'] = youtube_dl.url + data['filename'] = youtube_dl.filename + data['temp_path'] = youtube_dl.temp_path + data['save_path'] = youtube_dl.save_path + data['index'] = youtube_dl.index + data['status_str'] = youtube_dl.status.name + data['status_ko'] = str(youtube_dl.status) + data['end_time'] = '' + data['extractor'] = youtube_dl.extractor if youtube_dl.extractor is not None else '' + data['title'] = youtube_dl.title if youtube_dl.title is not None else youtube_dl.url + data['uploader'] = youtube_dl.uploader if youtube_dl.uploader is not None else '' + data['uploader_url'] = youtube_dl.uploader_url if youtube_dl.uploader_url is not None else '' + data['downloaded_bytes_str'] = '' + data['total_bytes_str'] = '' + data['percent'] = '0' + data['eta'] = youtube_dl.eta if youtube_dl.eta is not None else '' + data['speed_str'] = LogicNormal.human_readable_size(youtube_dl.speed, '/s') if youtube_dl.speed is not None else '' + if youtube_dl.status == Status.READY: # 다운로드 전 + data['start_time'] = '' + data['download_time'] = '' + else: + if youtube_dl.end_time is None: # 완료 전 + download_time = datetime.now() - youtube_dl.start_time + else: + download_time = youtube_dl.end_time - youtube_dl.start_time + data['end_time'] = youtube_dl.end_time.strftime('%m-%d %H:%M:%S') + if None not in (youtube_dl.downloaded_bytes, youtube_dl.total_bytes): # 둘 다 값이 있으면 + data['downloaded_bytes_str'] = LogicNormal.human_readable_size(youtube_dl.downloaded_bytes) + data['total_bytes_str'] = LogicNormal.human_readable_size(youtube_dl.total_bytes) + data['percent'] = '%.2f' % (float(youtube_dl.downloaded_bytes) / float(youtube_dl.total_bytes) * 100) + data['start_time'] = youtube_dl.start_time.strftime('%m-%d %H:%M:%S') + data['download_time'] = '%02d:%02d' % (download_time.seconds / 60, download_time.seconds % 60) + return data + except Exception as e: + logger.error('Exception:%s', e) + logger.error(traceback.format_exc()) + return None + + @staticmethod + def human_readable_size(size, suffix=''): + for unit in ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB']: + if size < 1024.0: + return '%3.1f %s%s' % (size, unit, suffix) + size /= 1024.0 + return '%.1f %s%s' % (size, 'YB', suffix) + + @staticmethod + def abort(base, code): + base['errorCode'] = code + return jsonify(base) diff --git a/model.py b/model.py index d9af172..87d9daf 100644 --- a/model.py +++ b/model.py @@ -1,22 +1,24 @@ # -*- coding: utf-8 -*- ######################################################### # python +import traceback import os # third-party # sjva 공용 from framework import app, db, path_app_root +from framework.util import Util # 패키지 -from .plugin import package_name +from .plugin import logger, package_name -db_file = os.path.join(path_app_root, 'data', 'db', '%s.db' % package_name) -app.config['SQLALCHEMY_BINDS'][package_name] = 'sqlite:///%s' % db_file +app.config['SQLALCHEMY_BINDS'][package_name] = 'sqlite:///%s' % (os.path.join(path_app_root, 'data', 'db', '%s.db' % package_name)) +######################################################### class ModelSetting(db.Model): - __tablename__ = 'plugin_%s_setting' % package_name - __table_args__ = { 'mysql_collate': 'utf8_general_ci' } + __tablename__ = '%s_setting' % package_name + __table_args__ = {'mysql_collate': 'utf8_general_ci'} __bind_key__ = package_name id = db.Column(db.Integer, primary_key=True) @@ -31,6 +33,79 @@ class ModelSetting(db.Model): return repr(self.as_dict()) def as_dict(self): - return { x.name: getattr(self, x.name) for x in self.__table__.columns } + return {x.name: getattr(self, x.name) for x in self.__table__.columns} -######################################################### + @staticmethod + def get(key): + try: + return db.session.query(ModelSetting).filter_by(key=key).first().value.strip() + except Exception as e: + logger.error('Exception:%s %s', e, key) + logger.error(traceback.format_exc()) + + @staticmethod + def get_int(key): + try: + return int(ModelSetting.get(key)) + except Exception as e: + logger.error('Exception:%s %s', e, key) + logger.error(traceback.format_exc()) + + @staticmethod + def get_bool(key): + try: + return ModelSetting.get(key) == 'True' + except Exception as e: + logger.error('Exception:%s %s', e, key) + logger.error(traceback.format_exc()) + + @staticmethod + def set(key, value): + try: + item = db.session.query(ModelSetting).filter_by(key=key).with_for_update().first() + if item is not None: + item.value = value.strip() + db.session.commit() + else: + db.session.add(ModelSetting(key, value.strip())) + except Exception as e: + logger.error('Exception:%s', e) + logger.error(traceback.format_exc()) + logger.error('Error Key:%s Value:%s', key, value) + + @staticmethod + def to_dict(): + try: + return Util.db_list_to_dict(db.session.query(ModelSetting).all()) + except Exception as e: + logger.error('Exception:%s', e) + logger.error(traceback.format_exc()) + + @staticmethod + def setting_save(req): + try: + for key, value in req.form.items(): + if key in ['scheduler', 'is_running']: + continue + if key.startswith('tmp_'): + continue + logger.debug('Key:%s Value:%s', key, value) + entity = db.session.query(ModelSetting).filter_by(key=key).with_for_update().first() + entity.value = value + db.session.commit() + return True + except Exception as e: + logger.error('Exception:%s', e) + logger.error(traceback.format_exc()) + return False + + @staticmethod + def get_list(key): + try: + value = ModelSetting.get(key) + values = [x.strip().strip() for x in value.replace('\n', '|').split('|')] + values = Util.get_list_except_empty(values) + return values + except Exception as e: + logger.error('Exception:%s %s', e, key) + logger.error(traceback.format_exc()) diff --git a/my_youtube_dl.py b/my_youtube_dl.py index f70ff6c..0959b2c 100644 --- a/my_youtube_dl.py +++ b/my_youtube_dl.py @@ -5,7 +5,6 @@ from __future__ import unicode_literals import os import traceback import tempfile -# import glob2 from threading import Thread import json from datetime import datetime @@ -18,19 +17,6 @@ import youtube_dl import framework.common.celery as celery_shutil from .plugin import logger -try: - import glob2 -except Exception as e: - import subprocess - import platform - # glob2 설치 - logger.debug('glob2 install') - if platform.system() == 'Windows': # 윈도우일 때 - pip = 'pip.exe' - else: - pip = 'pip' - logger.debug(subprocess.check_output([pip, 'install', 'glob2'], universal_newlines=True)) - import glob2 class Status(Enum): READY = 0 @@ -53,6 +39,7 @@ class Status(Enum): ] return str_list[self.value] + class Youtube_dl(object): _index = 0 _last_msg = '' @@ -73,7 +60,7 @@ class Youtube_dl(object): Youtube_dl._index += 1 self.status = Status.READY self._thread = None - self._key = None + self.key = None self.start_time = None # 시작 시간 self.end_time = None # 종료 시간 # info_dict에서 얻는 정보 @@ -125,6 +112,7 @@ class Youtube_dl(object): with youtube_dl.YoutubeDL(ydl_opts) as ydl: ydl.download([self.url]) if self.status == Status.FINISHED: # 다운로드 성공 + import glob2 for i in glob2.glob(self.temp_path + '/**/*'): path = i.replace(self.temp_path, self.save_path, 1) if os.path.isdir(i): @@ -190,6 +178,7 @@ class Youtube_dl(object): self.thumbnail = info_dict['thumbnail'] return None + class MyLogger(object): def debug(self, msg): Youtube_dl._last_msg = msg diff --git a/plugin.py b/plugin.py index d91f3c5..3b53d40 100644 --- a/plugin.py +++ b/plugin.py @@ -11,14 +11,12 @@ from flask_login import login_required # sjva 공용 from framework.logger import get_logger from framework import db, check_api, socketio -from framework.util import Util - -# 로그 -package_name = __name__.split('.')[0] -logger = get_logger(package_name) # 패키지 +package_name = __name__.split('.')[0] +logger = get_logger(package_name) from .logic import Logic +from .logic_normal import LogicNormal from .model import ModelSetting from .my_youtube_dl import Youtube_dl @@ -36,7 +34,7 @@ menu = { } plugin_info = { - 'version': '1.3.3', + 'version': '1.3.4', 'name': 'youtube-dl', 'category_name': 'vod', 'developer': 'joyfuI', @@ -60,20 +58,19 @@ def home(): @blueprint.route('/') @login_required -def detail(sub): +def first_menu(sub): try: - arg = { 'package_name': package_name } + arg = {'package_name': package_name} if sub == 'setting': - setting_list = db.session.query(ModelSetting).all() - arg.update(Util.db_list_to_dict(setting_list)) + arg.update(ModelSetting.to_dict()) arg['youtube_dl_version'] = Youtube_dl.get_version() return render_template('%s_setting.html' % package_name, arg=arg) elif sub == 'download': - arg['file_name'] = Logic.get_setting_value('default_filename') - arg['preset_list'] = Logic.get_preset_list() - arg['postprocessor_list'] = Logic.get_postprocessor_list() + arg['file_name'] = ModelSetting.get('default_filename') + arg['preset_list'] = LogicNormal.get_preset_list() + arg['postprocessor_list'] = LogicNormal.get_postprocessor_list() return render_template('%s_download.html' % package_name, arg=arg) elif sub == 'list': @@ -95,17 +92,17 @@ def ajax(sub): logger.debug('AJAX %s %s', package_name, sub) try: if sub == 'setting_save': - ret = Logic.setting_save(request) + ret = ModelSetting.setting_save(request) return jsonify(ret) elif sub == 'download': url = request.form['url'] filename = request.form['filename'] - temp_path = Logic.get_setting_value('temp_path') - save_path = Logic.get_setting_value('save_path') + temp_path = ModelSetting.get('temp_path') + save_path = ModelSetting.get('save_path') format_code = request.form['format'] if request.form['format'] else None postprocessor = request.form['postprocessor'] if request.form['postprocessor'] else None - video_convertor, extract_audio = Logic.get_postprocessor() + video_convertor, extract_audio = LogicNormal.get_postprocessor() if postprocessor in video_convertor: postprocessor = [{ 'key': 'FFmpegVideoConvertor', @@ -118,21 +115,21 @@ def ajax(sub): 'preferredquality': '192' }] youtube_dl = Youtube_dl(package_name, url, filename, temp_path, save_path, format_code, postprocessor) - Logic.youtube_dl_list.append(youtube_dl) # 리스트 추가 + LogicNormal.youtube_dl_list.append(youtube_dl) # 리스트 추가 youtube_dl.start() return jsonify([]) elif sub == 'list': ret = [] - for i in Logic.youtube_dl_list: - data = Logic.get_data(i) + for i in LogicNormal.youtube_dl_list: + data = LogicNormal.get_data(i) if data is not None: ret.append(data) return jsonify(ret) elif sub == 'stop': index = int(request.form['index']) - Logic.youtube_dl_list[index].stop() + LogicNormal.youtube_dl_list[index].stop() return jsonify([]) except Exception as e: logger.error('Exception:%s', e) @@ -158,12 +155,12 @@ def api(sub): 'info_dict': None } if None == url: - return Logic.abort(ret, 1) # 필수 요청 변수가 없음 + return LogicNormal.abort(ret, 1) # 필수 요청 변수가 없음 if not url.startswith('http'): - return Logic.abort(ret, 2) # 잘못된 동영상 주소 + return LogicNormal.abort(ret, 2) # 잘못된 동영상 주소 info_dict = Youtube_dl.get_info_dict(url) if info_dict is None: - return Logic.abort(ret, 10) # 실패 + return LogicNormal.abort(ret, 10) # 실패 ret['info_dict'] = info_dict return jsonify(ret) @@ -171,9 +168,9 @@ def api(sub): elif sub == 'download': key = request.form.get('key') url = request.form.get('url') - filename = request.form.get('filename', Logic.get_setting_value('default_filename')) - temp_path = request.form.get('temp_path', Logic.get_setting_value('temp_path')) - save_path = request.form.get('save_path', Logic.get_setting_value('save_path')) + filename = request.form.get('filename', ModelSetting.get('default_filename')) + temp_path = request.form.get('temp_path', ModelSetting.get('temp_path')) + save_path = request.form.get('save_path', ModelSetting.get('save_path')) format_code = request.form.get('format_code', None) preferedformat = request.form.get('preferedformat', None) preferredcodec = request.form.get('preferredcodec', None) @@ -184,9 +181,9 @@ def api(sub): 'index': None } if None in (key, url): - return Logic.abort(ret, 1) # 필수 요청 변수가 없음 + return LogicNormal.abort(ret, 1) # 필수 요청 변수가 없음 if not url.startswith('http'): - return Logic.abort(ret, 2) # 잘못된 동영상 주소 + return LogicNormal.abort(ret, 2) # 잘못된 동영상 주소 postprocessor = [] if preferedformat is not None: postprocessor.append({ @@ -195,15 +192,15 @@ def api(sub): }) if preferredcodec is not None: if preferredcodec not in ('best', 'mp3', 'aac', 'flac', 'm4a', 'opus', 'vorbis', 'wav'): - return Logic.abort(ret, 5) # 허용되지 않은 값이 있음 + return LogicNormal.abort(ret, 5) # 허용되지 않은 값이 있음 postprocessor.append({ 'key': 'FFmpegExtractAudio', 'preferredcodec': preferredcodec, 'preferredquality': str(preferredquality) }) youtube_dl = Youtube_dl(plugin, url, filename, temp_path, save_path, format_code, postprocessor) - youtube_dl._key = key - Logic.youtube_dl_list.append(youtube_dl) # 리스트 추가 + youtube_dl.key = key + LogicNormal.youtube_dl_list.append(youtube_dl) # 리스트 추가 ret['index'] = youtube_dl.index if start: youtube_dl.start() @@ -218,16 +215,16 @@ def api(sub): 'status': None } if None in (index, key): - return Logic.abort(ret, 1) # 필수 요청 변수가 없음 + return LogicNormal.abort(ret, 1) # 필수 요청 변수가 없음 index = int(index) - if not (0 <= index and index < Youtube_dl._index): - return Logic.abort(ret, 3) # 인덱스 범위를 벗어남 - youtube_dl = Logic.youtube_dl_list[index] - if youtube_dl._key != key: - return Logic.abort(ret, 4) # 키가 일치하지 않음 + if not (0 <= index < len(LogicNormal.youtube_dl_list)): + return LogicNormal.abort(ret, 3) # 인덱스 범위를 벗어남 + youtube_dl = LogicNormal.youtube_dl_list[index] + if youtube_dl.key != key: + return LogicNormal.abort(ret, 4) # 키가 일치하지 않음 ret['status'] = youtube_dl.status.name if not youtube_dl.start(): - return Logic.abort(ret, 10) # 실패 + return LogicNormal.abort(ret, 10) # 실패 return jsonify(ret) # 다운로드 중지를 요청하는 API @@ -239,16 +236,16 @@ def api(sub): 'status': None } if None in (index, key): - return Logic.abort(ret, 1) # 필수 요청 변수가 없음 + return LogicNormal.abort(ret, 1) # 필수 요청 변수가 없음 index = int(index) - if not (0 <= index and index < Youtube_dl._index): - return Logic.abort(ret, 3) # 인덱스 범위를 벗어남 - youtube_dl = Logic.youtube_dl_list[index] - if youtube_dl._key != key: - return Logic.abort(ret, 4) # 키가 일치하지 않음 + if not (0 <= index < len(LogicNormal.youtube_dl_list)): + return LogicNormal.abort(ret, 3) # 인덱스 범위를 벗어남 + youtube_dl = LogicNormal.youtube_dl_list[index] + if youtube_dl.key != key: + return LogicNormal.abort(ret, 4) # 키가 일치하지 않음 ret['status'] = youtube_dl.status.name if not youtube_dl.stop(): - return Logic.abort(ret, 10) # 실패 + return LogicNormal.abort(ret, 10) # 실패 return jsonify(ret) # 현재 상태를 반환하는 API @@ -264,13 +261,13 @@ def api(sub): 'save_path': None } if None in (index, key): - return Logic.abort(ret, 1) # 필수 요청 변수가 없음 + return LogicNormal.abort(ret, 1) # 필수 요청 변수가 없음 index = int(index) - if not (0 <= index and index < Youtube_dl._index): - return Logic.abort(ret, 3) # 인덱스 범위를 벗어남 - youtube_dl = Logic.youtube_dl_list[index] - if youtube_dl._key != key: - return Logic.abort(ret, 4) # 키가 일치하지 않음 + if not (0 <= index < len(LogicNormal.youtube_dl_list)): + return LogicNormal.abort(ret, 3) # 인덱스 범위를 벗어남 + youtube_dl = LogicNormal.youtube_dl_list[index] + if youtube_dl.key != key: + return LogicNormal.abort(ret, 4) # 키가 일치하지 않음 ret['status'] = youtube_dl.status.name ret['start_time'] = youtube_dl.start_time.strftime('%Y %m %d %H %M %S') if youtube_dl.start_time is not None else None ret['end_time'] = youtube_dl.end_time.strftime('%Y %m %d %H %M %S') if youtube_dl.end_time is not None else None