diff --git a/.gitignore b/.gitignore index 6d0abba..c129fdf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ .idea/ .venv/ -*.pyo __pycache__/ test/ diff --git a/README.md b/README.md index 3ed8873..5294bde 100644 --- a/README.md +++ b/README.md @@ -199,6 +199,10 @@ API를 제공합니다. 다른 플러그인에서 동영상 정보나 다운로 물론 해당 정보가 없으면 null입니다. ## Changelog +v3.0.0 +* SJVA3 대응 +* SJVA에 flask_cors가 내장됨에 따라 항상 CORS 허용 + v2.4.0 * API에 playlist 키 추가 플레이리스트 다운로드 시 범위나 순서를 지정할 수 있습니다. diff --git a/__init__.py b/__init__.py index dd87e12..e962124 100644 --- a/__init__.py +++ b/__init__.py @@ -1,2 +1 @@ -# -*- coding: utf-8 -*- -from .plugin import blueprint, menu, plugin_load, plugin_unload, plugin_info +from .plugin import blueprint, menu, plugin_info, plugin_load, plugin_unload diff --git a/info.json b/info.json index aca2c25..c7bfcc8 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": "2.4.0", "home": "https://github.com/joyfuI/youtube-dl", "category_name": "vod", "developer": "joyfuI"} \ No newline at end of file +{"version": "3.0.0", "name": "youtube-dl", "category_name": "vod", "developer": "joyfuI", "description": "\uc720\ud29c\ube0c, \ub124\uc774\ubc84TV \ub4f1 \ub3d9\uc601\uc0c1 \uc0ac\uc774\ud2b8\uc5d0\uc11c \ub3d9\uc601\uc0c1 \ub2e4\uc6b4\ub85c\ub4dc", "home": "https://github.com/joyfuI/youtube-dl", "more": ""} \ No newline at end of file diff --git a/logic.py b/logic.py index 98fff17..d02f701 100644 --- a/logic.py +++ b/logic.py @@ -1,23 +1,20 @@ -# -*- coding: utf-8 -*- -# python import os import sys import platform -import subprocess import traceback +import subprocess import sqlite3 -# third-party - -# sjva 공용 from framework import db, path_app_root, path_data +from framework.logger import get_logger from framework.util import Util -# 패키지 -from .plugin import logger, package_name from .logic_normal import LogicNormal from .model import ModelSetting +package_name = __name__.split('.')[0] +logger = get_logger(package_name) + class Logic(object): db_default = { @@ -28,8 +25,7 @@ class Logic(object): 'temp_path': os.path.join(path_data, 'download_tmp'), 'save_path': os.path.join(path_data, 'download'), 'default_filename': '', - 'proxy': '', - 'activate_cors': False + 'proxy': '' } @staticmethod @@ -50,14 +46,6 @@ class Logic(object): logger.debug('%s plugin_load', package_name) Logic.db_init() - # 모듈 설치 - try: - import glob2 - except ImportError: - logger.debug('glob2 install') - logger.debug(subprocess.check_output([sys.executable, '-m', 'pip', 'install', 'glob2'], - universal_newlines=True)) - # youtube-dl 업데이트 youtube_dl = LogicNormal.get_youtube_dl_package(ModelSetting.get('youtube_dl_package')) logger.debug('%s upgrade' % youtube_dl) diff --git a/logic_normal.py b/logic_normal.py index a3f0376..4f997d1 100644 --- a/logic_normal.py +++ b/logic_normal.py @@ -1,15 +1,15 @@ -# -*- coding: utf-8 -*- -# python import traceback from datetime import datetime -# third-party from flask import jsonify -# 패키지 -from .plugin import logger +from framework.logger import get_logger + from .my_youtube_dl import MyYoutubeDL, Status +package_name = __name__.split('.')[0] +logger = get_logger(package_name) + class LogicNormal(object): youtube_dl_list = [] diff --git a/model.py b/model.py index 6abc713..022392f 100644 --- a/model.py +++ b/model.py @@ -1,17 +1,12 @@ -# -*- coding: utf-8 -*- -# python -import traceback import os +import traceback -# third-party - -# sjva 공용 from framework import app, db, path_data +from framework.logger import get_logger from framework.util import Util -# 패키지 -from .plugin import logger, package_name - +package_name = __name__.split('.')[0] +logger = get_logger(package_name) app.config['SQLALCHEMY_BINDS'][package_name] = 'sqlite:///%s' % (os.path.join(path_data, 'db', '%s.db' % package_name)) diff --git a/my_youtube_dl.py b/my_youtube_dl.py index c00fc31..d20deba 100644 --- a/my_youtube_dl.py +++ b/my_youtube_dl.py @@ -1,18 +1,19 @@ -# -*- coding: utf-8 -*- from __future__ import unicode_literals -# python import os +import glob import traceback import tempfile -from threading import Thread import json from datetime import datetime +from threading import Thread from enum import Enum -# sjva 공용, 패키지 +from framework.logger import get_logger import framework.common.celery as celery_shutil -from .plugin import logger + +package_name = __name__.split('.')[0] +logger = get_logger(package_name) class Status(Enum): @@ -46,8 +47,8 @@ class MyYoutubeDL(object): def __init__(self, plugin, type_name, url, filename, temp_path, save_path=None, opts=None, dateafter=None, datebefore=None): # from youtube_dl.utils import DateRange - from .plugin import YOUTUBE_DL_PACKAGE - DateRange = __import__('%s.utils' % YOUTUBE_DL_PACKAGE, fromlist=['DateRange']).DateRange + from .plugin import youtube_dl_package + DateRange = __import__('%s.utils' % youtube_dl_package, fromlist=['DateRange']).DateRange if save_path is None: save_path = temp_path @@ -102,9 +103,8 @@ class MyYoutubeDL(object): def run(self): # import youtube_dl - from .plugin import YOUTUBE_DL_PACKAGE - youtube_dl = __import__('%s' % YOUTUBE_DL_PACKAGE) - import glob2 + from .plugin import youtube_dl_package + youtube_dl = __import__('%s' % youtube_dl_package) try: self.start_time = datetime.now() @@ -130,7 +130,7 @@ class MyYoutubeDL(object): with youtube_dl.YoutubeDL(ydl_opts) as ydl: ydl.download([self.url]) if self.status in (Status.START, Status.FINISHED): # 다운로드 성공 - for i in glob2.glob(self.temp_path + '/**/*'): + for i in glob.glob(self.temp_path + '/**/*'): path = i.replace(self.temp_path, self.save_path, 1) if os.path.isdir(i): if not os.path.isdir(path): @@ -158,16 +158,16 @@ class MyYoutubeDL(object): @staticmethod def get_version(): # from youtube_dl.version import __version__ - from .plugin import YOUTUBE_DL_PACKAGE - __version__ = __import__('%s.version' % YOUTUBE_DL_PACKAGE, fromlist=['__version__']).__version__ + from .plugin import youtube_dl_package + __version__ = __import__('%s.version' % youtube_dl_package, fromlist=['__version__']).__version__ return __version__ @staticmethod def get_info_dict(url, proxy=None, cookiefile=None): # import youtube_dl - from .plugin import YOUTUBE_DL_PACKAGE - youtube_dl = __import__('%s' % YOUTUBE_DL_PACKAGE) + from .plugin import youtube_dl_package + youtube_dl = __import__('%s' % youtube_dl_package) try: ydl_opts = { diff --git a/plugin.py b/plugin.py index 6b2d959..760945c 100644 --- a/plugin.py +++ b/plugin.py @@ -1,26 +1,23 @@ -# -*- coding: utf-8 -*- -# python import os -import sys import traceback import subprocess -# third-party from flask import Blueprint, request, render_template, redirect, jsonify, abort from flask_login import login_required +from flask_cors import cross_origin -# sjva 공용 -from framework.logger import get_logger from framework import check_api, socketio +from framework.logger import get_logger -# 패키지 -package_name = __name__.split('.')[0] -logger = get_logger(package_name) from .logic import Logic from .logic_normal import LogicNormal from .model import ModelSetting -YOUTUBE_DL_PACKAGE = LogicNormal.get_youtube_dl_package(Logic.db_default['youtube_dl_package'], import_pkg=True) +package_name = __name__.split('.')[0] +logger = get_logger(package_name) +youtube_dl_package = LogicNormal.get_youtube_dl_package( + ModelSetting.get('youtube_dl_package') if ModelSetting.get('youtube_dl_package') else Logic.db_default[ + 'youtube_dl_package'], import_pkg=True) ######################################################### # 플러그인 공용 @@ -28,15 +25,6 @@ YOUTUBE_DL_PACKAGE = LogicNormal.get_youtube_dl_package(Logic.db_default['youtub blueprint = Blueprint(package_name, package_name, url_prefix='/%s' % package_name, template_folder=os.path.join(os.path.dirname(__file__), 'templates'), static_folder=os.path.join(os.path.dirname(__file__), 'static')) -if ModelSetting.get_bool('activate_cors'): - try: - from flask_cors import CORS - except ImportError: - logger.debug('flask-cors install') - logger.debug(subprocess.check_output([sys.executable, '-m', 'pip', 'install', 'flask-cors'], - universal_newlines=True)) - from flask_cors import CORS - CORS(blueprint, resources={r"/youtube-dl/api/*": {"origins": "*"}}) menu = { 'main': [package_name, 'youtube-dl'], @@ -48,7 +36,7 @@ menu = { } plugin_info = { - 'version': '2.4.0', + 'version': '3.0.0', 'name': 'youtube-dl', 'category_name': 'vod', 'developer': 'joyfuI', @@ -60,8 +48,6 @@ plugin_info = { def plugin_load(): Logic.plugin_load() - global YOUTUBE_DL_PACKAGE - YOUTUBE_DL_PACKAGE = LogicNormal.get_youtube_dl_package(ModelSetting.get('youtube_dl_package'), import_pkg=True) def plugin_unload(): @@ -223,6 +209,7 @@ def ajax(sub): ######################################################### # API 명세는 https://github.com/joyfuI/youtube-dl#api @blueprint.route('/api/', methods=['GET', 'POST']) +@cross_origin() @check_api def api(sub): plugin = request.values.get('plugin') diff --git a/templates/youtube-dl_setting.html b/templates/youtube-dl_setting.html index 4ab5140..f25f5d5 100644 --- a/templates/youtube-dl_setting.html +++ b/templates/youtube-dl_setting.html @@ -9,7 +9,6 @@ {{ macros.setting_input_text_and_buttons('save_path', '저장 폴더', [['save_path_btn', '경로 선택']], value=arg['save_path'], desc='정상적으로 완료된 파일이 이동할 폴더입니다.') }} {{ macros.setting_input_text('default_filename', '기본 파일명', value=arg['default_filename'], placeholder=arg['DEFAULT_FILENAME'], desc='템플릿 규칙은 https://github.com/ytdl-org/youtube-dl/#output-template 참고') }} {{ macros.setting_input_text('proxy', '프록시', value=arg['proxy'], desc=['HTTP/HTTPS/SOCKS를 지원합니다. 예) socks5://127.0.0.1:1080/', '빈칸으로 두면 프록시를 사용하지 않습니다.']) }} - {{ macros.setting_checkbox('activate_cors', 'CORS 허용', value=arg['activate_cors'], desc='API로의 크로스 도메인 요청을 허용합니다. 설정 저장 후 재시작이 필요합니다.') }} {{ macros.setting_button([['global_setting_save_btn', '저장']]) }}