SJVA3 대응

This commit is contained in:
joyfuI
2021-05-02 00:36:04 +09:00
parent 01042a7748
commit 446d39eb31
10 changed files with 45 additions and 74 deletions

1
.gitignore vendored
View File

@@ -1,5 +1,4 @@
.idea/ .idea/
.venv/ .venv/
*.pyo
__pycache__/ __pycache__/
test/ test/

View File

@@ -199,6 +199,10 @@ API를 제공합니다. 다른 플러그인에서 동영상 정보나 다운로
물론 해당 정보가 없으면 null입니다. 물론 해당 정보가 없으면 null입니다.
## Changelog ## Changelog
v3.0.0
* SJVA3 대응
* SJVA에 flask_cors가 내장됨에 따라 항상 CORS 허용
v2.4.0 v2.4.0
* API에 playlist 키 추가 * API에 playlist 키 추가
플레이리스트 다운로드 시 범위나 순서를 지정할 수 있습니다. 플레이리스트 다운로드 시 범위나 순서를 지정할 수 있습니다.

View File

@@ -1,2 +1 @@
# -*- coding: utf-8 -*- from .plugin import blueprint, menu, plugin_info, plugin_load, plugin_unload
from .plugin import blueprint, menu, plugin_load, plugin_unload, plugin_info

View File

@@ -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"} {"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": ""}

View File

@@ -1,23 +1,20 @@
# -*- coding: utf-8 -*-
# python
import os import os
import sys import sys
import platform import platform
import subprocess
import traceback import traceback
import subprocess
import sqlite3 import sqlite3
# third-party
# sjva 공용
from framework import db, path_app_root, path_data from framework import db, path_app_root, path_data
from framework.logger import get_logger
from framework.util import Util from framework.util import Util
# 패키지
from .plugin import logger, package_name
from .logic_normal import LogicNormal from .logic_normal import LogicNormal
from .model import ModelSetting from .model import ModelSetting
package_name = __name__.split('.')[0]
logger = get_logger(package_name)
class Logic(object): class Logic(object):
db_default = { db_default = {
@@ -28,8 +25,7 @@ class Logic(object):
'temp_path': os.path.join(path_data, 'download_tmp'), 'temp_path': os.path.join(path_data, 'download_tmp'),
'save_path': os.path.join(path_data, 'download'), 'save_path': os.path.join(path_data, 'download'),
'default_filename': '', 'default_filename': '',
'proxy': '', 'proxy': ''
'activate_cors': False
} }
@staticmethod @staticmethod
@@ -50,14 +46,6 @@ class Logic(object):
logger.debug('%s plugin_load', package_name) logger.debug('%s plugin_load', package_name)
Logic.db_init() 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 업데이트
youtube_dl = LogicNormal.get_youtube_dl_package(ModelSetting.get('youtube_dl_package')) youtube_dl = LogicNormal.get_youtube_dl_package(ModelSetting.get('youtube_dl_package'))
logger.debug('%s upgrade' % youtube_dl) logger.debug('%s upgrade' % youtube_dl)

View File

@@ -1,15 +1,15 @@
# -*- coding: utf-8 -*-
# python
import traceback import traceback
from datetime import datetime from datetime import datetime
# third-party
from flask import jsonify from flask import jsonify
# 패키지 from framework.logger import get_logger
from .plugin import logger
from .my_youtube_dl import MyYoutubeDL, Status from .my_youtube_dl import MyYoutubeDL, Status
package_name = __name__.split('.')[0]
logger = get_logger(package_name)
class LogicNormal(object): class LogicNormal(object):
youtube_dl_list = [] youtube_dl_list = []

View File

@@ -1,17 +1,12 @@
# -*- coding: utf-8 -*-
# python
import traceback
import os import os
import traceback
# third-party
# sjva 공용
from framework import app, db, path_data from framework import app, db, path_data
from framework.logger import get_logger
from framework.util import Util from framework.util import Util
# 패키지 package_name = __name__.split('.')[0]
from .plugin import logger, package_name logger = get_logger(package_name)
app.config['SQLALCHEMY_BINDS'][package_name] = 'sqlite:///%s' % (os.path.join(path_data, 'db', '%s.db' % package_name)) app.config['SQLALCHEMY_BINDS'][package_name] = 'sqlite:///%s' % (os.path.join(path_data, 'db', '%s.db' % package_name))

View File

@@ -1,18 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
# python
import os import os
import glob
import traceback import traceback
import tempfile import tempfile
from threading import Thread
import json import json
from datetime import datetime from datetime import datetime
from threading import Thread
from enum import Enum from enum import Enum
# sjva 공용, 패키지 from framework.logger import get_logger
import framework.common.celery as celery_shutil import framework.common.celery as celery_shutil
from .plugin import logger
package_name = __name__.split('.')[0]
logger = get_logger(package_name)
class Status(Enum): 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, def __init__(self, plugin, type_name, url, filename, temp_path, save_path=None, opts=None, dateafter=None,
datebefore=None): datebefore=None):
# from youtube_dl.utils import DateRange # from youtube_dl.utils import DateRange
from .plugin import YOUTUBE_DL_PACKAGE from .plugin import youtube_dl_package
DateRange = __import__('%s.utils' % YOUTUBE_DL_PACKAGE, fromlist=['DateRange']).DateRange DateRange = __import__('%s.utils' % youtube_dl_package, fromlist=['DateRange']).DateRange
if save_path is None: if save_path is None:
save_path = temp_path save_path = temp_path
@@ -102,9 +103,8 @@ class MyYoutubeDL(object):
def run(self): def run(self):
# import youtube_dl # import youtube_dl
from .plugin import YOUTUBE_DL_PACKAGE from .plugin import youtube_dl_package
youtube_dl = __import__('%s' % YOUTUBE_DL_PACKAGE) youtube_dl = __import__('%s' % youtube_dl_package)
import glob2
try: try:
self.start_time = datetime.now() self.start_time = datetime.now()
@@ -130,7 +130,7 @@ class MyYoutubeDL(object):
with youtube_dl.YoutubeDL(ydl_opts) as ydl: with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download([self.url]) ydl.download([self.url])
if self.status in (Status.START, Status.FINISHED): # 다운로드 성공 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) path = i.replace(self.temp_path, self.save_path, 1)
if os.path.isdir(i): if os.path.isdir(i):
if not os.path.isdir(path): if not os.path.isdir(path):
@@ -158,16 +158,16 @@ class MyYoutubeDL(object):
@staticmethod @staticmethod
def get_version(): def get_version():
# from youtube_dl.version import __version__ # from youtube_dl.version import __version__
from .plugin import YOUTUBE_DL_PACKAGE from .plugin import youtube_dl_package
__version__ = __import__('%s.version' % YOUTUBE_DL_PACKAGE, fromlist=['__version__']).__version__ __version__ = __import__('%s.version' % youtube_dl_package, fromlist=['__version__']).__version__
return __version__ return __version__
@staticmethod @staticmethod
def get_info_dict(url, proxy=None, cookiefile=None): def get_info_dict(url, proxy=None, cookiefile=None):
# import youtube_dl # import youtube_dl
from .plugin import YOUTUBE_DL_PACKAGE from .plugin import youtube_dl_package
youtube_dl = __import__('%s' % YOUTUBE_DL_PACKAGE) youtube_dl = __import__('%s' % youtube_dl_package)
try: try:
ydl_opts = { ydl_opts = {

View File

@@ -1,26 +1,23 @@
# -*- coding: utf-8 -*-
# python
import os import os
import sys
import traceback import traceback
import subprocess import subprocess
# third-party
from flask import Blueprint, request, render_template, redirect, jsonify, abort from flask import Blueprint, request, render_template, redirect, jsonify, abort
from flask_login import login_required 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 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 import Logic
from .logic_normal import LogicNormal from .logic_normal import LogicNormal
from .model import ModelSetting 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, blueprint = Blueprint(package_name, package_name, url_prefix='/%s' % package_name,
template_folder=os.path.join(os.path.dirname(__file__), 'templates'), template_folder=os.path.join(os.path.dirname(__file__), 'templates'),
static_folder=os.path.join(os.path.dirname(__file__), 'static')) 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 = { menu = {
'main': [package_name, 'youtube-dl'], 'main': [package_name, 'youtube-dl'],
@@ -48,7 +36,7 @@ menu = {
} }
plugin_info = { plugin_info = {
'version': '2.4.0', 'version': '3.0.0',
'name': 'youtube-dl', 'name': 'youtube-dl',
'category_name': 'vod', 'category_name': 'vod',
'developer': 'joyfuI', 'developer': 'joyfuI',
@@ -60,8 +48,6 @@ plugin_info = {
def plugin_load(): def plugin_load():
Logic.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(): def plugin_unload():
@@ -223,6 +209,7 @@ def ajax(sub):
######################################################### #########################################################
# API 명세는 https://github.com/joyfuI/youtube-dl#api # API 명세는 https://github.com/joyfuI/youtube-dl#api
@blueprint.route('/api/<sub>', methods=['GET', 'POST']) @blueprint.route('/api/<sub>', methods=['GET', 'POST'])
@cross_origin()
@check_api @check_api
def api(sub): def api(sub):
plugin = request.values.get('plugin') plugin = request.values.get('plugin')

View File

@@ -9,7 +9,6 @@
{{ macros.setting_input_text_and_buttons('save_path', '저장 폴더', [['save_path_btn', '경로 선택']], value=arg['save_path'], desc='정상적으로 완료된 파일이 이동할 폴더입니다.') }} {{ 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('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_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', '저장']]) }} {{ macros.setting_button([['global_setting_save_btn', '저장']]) }}
</form> </form>