diff --git a/README.md b/README.md index 13cec2f..cc94f47 100644 --- a/README.md +++ b/README.md @@ -132,6 +132,8 @@ API에선 직접 비트레이트를 설정할 수 있습니다. 물론 해당 정보가 없으면 null입니다. ## Changelog +v1.5.1 + v1.5.0 * 프록시 설정 추가 * API에 archive 추가 diff --git a/info.json b/info.json index db851b6..b7973ba 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.5.0", "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.5.1", "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 995910a..c5a8d1a 100644 --- a/logic.py +++ b/logic.py @@ -47,13 +47,13 @@ class Logic(object): try: import glob2 - except Exception as e: + except ImportError: # glob2 설치 logger.debug('glob2 install') logger.debug(subprocess.check_output([sys.executable, '-m', 'pip', 'install', 'glob2'], universal_newlines=True)) try: import flask_cors - except Exception as e: + except ImportError: # flask-cors 설치 logger.debug('flask-cors install') logger.debug(subprocess.check_output([sys.executable, '-m', 'pip', 'install', 'flask-cors'], universal_newlines=True)) diff --git a/logic_normal.py b/logic_normal.py index 89c98f5..bf200df 100644 --- a/logic_normal.py +++ b/logic_normal.py @@ -77,15 +77,15 @@ class LogicNormal(object): 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['extractor'] = youtube_dl.info_dict['extractor'] if youtube_dl.info_dict['extractor'] is not None else '' + data['title'] = youtube_dl.info_dict['title'] if youtube_dl.info_dict['title'] is not None else youtube_dl.url + data['uploader'] = youtube_dl.info_dict['uploader'] if youtube_dl.info_dict['uploader'] is not None else '' + data['uploader_url'] = youtube_dl.info_dict['uploader_url'] if youtube_dl.info_dict['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 '' + data['eta'] = youtube_dl.progress_hooks['eta'] if youtube_dl.progress_hooks['eta'] is not None else '' + data['speed_str'] = LogicNormal.human_readable_size(youtube_dl.progress_hooks['speed'], '/s') if youtube_dl.progress_hooks['speed'] is not None else '' if youtube_dl.status == Status.READY: # 다운로드 전 data['start_time'] = '' data['download_time'] = '' @@ -95,10 +95,10 @@ class LogicNormal(object): 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) + if None not in (youtube_dl.progress_hooks['downloaded_bytes'], youtube_dl.progress_hooks['total_bytes']): # 둘 다 값이 있으면 + data['downloaded_bytes_str'] = LogicNormal.human_readable_size(youtube_dl.progress_hooks['downloaded_bytes']) + data['total_bytes_str'] = LogicNormal.human_readable_size(youtube_dl.progress_hooks['total_bytes']) + data['percent'] = '%.2f' % (float(youtube_dl.progress_hooks['downloaded_bytes']) / float(youtube_dl.progress_hooks['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 diff --git a/my_youtube_dl.py b/my_youtube_dl.py index bcc10a7..759c42d 100644 --- a/my_youtube_dl.py +++ b/my_youtube_dl.py @@ -43,7 +43,7 @@ class Youtube_dl(object): _index = 0 _last_msg = '' - def __init__(self, plugin, url, filename, temp_path, save_path, format_code=None, postprocessor=None, proxy='', archive=None): + def __init__(self, plugin, url, filename, temp_path, save_path, opts): self.plugin = plugin self.url = url self.filename = filename @@ -53,10 +53,7 @@ class Youtube_dl(object): if not os.path.isdir(save_path): os.makedirs(save_path) self.save_path = save_path - self.format_code = format_code - self.postprocessor = postprocessor - self.proxy = proxy - self.archive = archive + self.opts = opts self.index = Youtube_dl._index Youtube_dl._index += 1 self._status = Status.READY @@ -64,21 +61,23 @@ class Youtube_dl(object): self.key = None self.start_time = None # 시작 시간 self.end_time = None # 종료 시간 - # info_dict에서 얻는 정보 - self.extractor = None # 타입 - self.title = None # 제목 - self.uploader = None # 업로더 - self.uploader_url = None # 업로더 주소 + self.info_dict = { # info_dict에서 얻는 정보 + 'extractor': None, # 타입 + 'title': None, # 제목 + 'uploader': None, # 업로더 + 'uploader_url': None # 업로더 주소 + } # info_dict에서 얻는 정보(entries) - # self.playlist_index = None - # self.duration = None # 길이 - # self.format = None # 포맷 - # self.thumbnail = None # 썸네일 - # progress_hooks에서 얻는 정보 - self.downloaded_bytes = None # 다운로드한 크기 - self.total_bytes = None # 전체 크기 - self.eta = None # 예상 시간(s) - self.speed = None # 다운로드 속도(bytes/s) + # self.info_dict['playlist_index'] = None + # self.info_dict['duration'] = None # 길이 + # self.info_dict['format'] = None # 포맷 + # self.info_dict['thumbnail'] = None # 썸네일 + self.progress_hooks = { # progress_hooks에서 얻는 정보 + 'downloaded_bytes': None, # 다운로드한 크기 + 'total_bytes': None, # 전체 크기 + 'eta': None, # 예상 시간(s) + 'speed': None # 다운로드 속도(bytes/s) + } def start(self): if self.status != Status.READY: @@ -97,10 +96,10 @@ class Youtube_dl(object): if info_dict is None: # 가져오기 실패 self.status = Status.ERROR return - self.extractor = info_dict['extractor'] - self.title = info_dict['title'] - self.uploader = info_dict['uploader'] - self.uploader_url = info_dict['uploader_url'] + self.info_dict['extractor'] = info_dict['extractor'] + self.info_dict['title'] = info_dict['title'] + self.info_dict['uploader'] = info_dict['uploader'] + self.info_dict['uploader_url'] = info_dict['uploader_url'] ydl_opts = { 'logger': MyLogger(), 'progress_hooks': [self.my_hook], @@ -109,14 +108,14 @@ class Youtube_dl(object): 'ignoreerrors': True, 'cachedir': False } - if self.format_code is not None: - ydl_opts['format'] = self.format_code - if self.postprocessor is not None: - ydl_opts['postprocessors'] = self.postprocessor - if not self.proxy: - ydl_opts['proxy'] = self.proxy - if self.archive is not None: - ydl_opts['download_archive'] = self.archive + if 'format' in self.opts: + ydl_opts['format'] = self.opts['format'] + if 'postprocessors' in self.opts: + ydl_opts['postprocessors'] = self.opts['postprocessors'] + if 'proxy' in self.opts: + ydl_opts['proxy'] = self.opts['proxy'] + if 'download_archive' in self.opts: + ydl_opts['download_archive'] = self.opts['download_archive'] with youtube_dl.YoutubeDL(ydl_opts) as ydl: ydl.download([self.url]) if self.status == Status.FINISHED: # 다운로드 성공 @@ -134,7 +133,8 @@ class Youtube_dl(object): logger.error(traceback.format_exc()) finally: celery_shutil.rmtree(self.temp_path) # 임시폴더 삭제 - self.end_time = datetime.now() + if self.status != Status.STOP: + self.end_time = datetime.now() def stop(self): if self.status in (Status.ERROR, Status.STOP, Status.COMPLETED): @@ -175,16 +175,16 @@ class Youtube_dl(object): }[d['status']] if d['status'] != 'error': self.filename = os.path.basename(d.get('filename')) - self.downloaded_bytes = d.get('downloaded_bytes') - self.total_bytes = d.get('total_bytes') - self.eta = d.get('eta') - self.speed = d.get('speed') + self.progress_hooks['downloaded_bytes'] = d.get('downloaded_bytes') + self.progress_hooks['total_bytes'] = d.get('total_bytes') + self.progress_hooks['eta'] = d.get('eta') + self.progress_hooks['speed'] = d.get('speed') def match_filter_func(self, info_dict): - self.playlist_index = info_dict['playlist_index'] - self.duration = info_dict['duration'] - self.format = info_dict['format'] - self.thumbnail = info_dict['thumbnail'] + self.info_dict['playlist_index'] = info_dict['playlist_index'] + self.info_dict['duration'] = info_dict['duration'] + self.info_dict['format'] = info_dict['format'] + self.info_dict['thumbnail'] = info_dict['thumbnail'] return None @property diff --git a/plugin.py b/plugin.py index ca48c47..ea501aa 100644 --- a/plugin.py +++ b/plugin.py @@ -34,7 +34,7 @@ menu = { } plugin_info = { - 'version': '1.5.0', + 'version': '1.5.1', 'name': 'youtube-dl', 'category_name': 'vod', 'developer': 'joyfuI', @@ -94,10 +94,12 @@ def first_menu(sub): def ajax(sub): logger.debug('AJAX %s %s', package_name, sub) try: + # 공통 요청 if sub == 'setting_save': ret = ModelSetting.setting_save(request) return jsonify(ret) + # UI 요청 elif sub == 'download': url = request.form['url'] filename = request.form['filename'] @@ -105,7 +107,6 @@ def ajax(sub): 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 - proxy = ModelSetting.get('proxy') video_convertor, extract_audio = LogicNormal.get_postprocessor() if postprocessor in video_convertor: postprocessor = [{ @@ -118,7 +119,12 @@ def ajax(sub): 'preferredcodec': postprocessor, 'preferredquality': '192' }] - youtube_dl = Youtube_dl(package_name, url, filename, temp_path, save_path, format_code, postprocessor, proxy) + opts = { + 'format': format_code, + 'postprocessors': postprocessor, + 'proxy': ModelSetting.get('proxy') + } + youtube_dl = Youtube_dl(package_name, url, filename, temp_path, save_path, opts) LogicNormal.youtube_dl_list.append(youtube_dl) # 리스트 추가 youtube_dl.start() socketio_emit('add', youtube_dl) @@ -204,8 +210,13 @@ def api(sub): 'preferredcodec': preferredcodec, 'preferredquality': str(preferredquality) }) - proxy = ModelSetting.get('proxy') - youtube_dl = Youtube_dl(plugin, url, filename, temp_path, save_path, format_code, postprocessor, proxy, archive) + opts = { + 'format': format_code, + 'postprocessors': postprocessor, + 'proxy': ModelSetting.get('proxy'), + 'download_archive': archive + } + youtube_dl = Youtube_dl(plugin, url, filename, temp_path, save_path, opts) youtube_dl.key = key LogicNormal.youtube_dl_list.append(youtube_dl) # 리스트 추가 ret['index'] = youtube_dl.index @@ -260,14 +271,7 @@ def api(sub): elif sub == 'status': index = request.form.get('index') key = request.form.get('key') - ret = { - 'errorCode': 0, - 'status': None, - 'start_time': None, - 'end_time': None, - 'temp_path': None, - 'save_path': None - } + ret = {'errorCode': 0} if None in (index, key): return LogicNormal.abort(ret, 1) # 필수 요청 변수가 없음 index = int(index) diff --git a/templates/youtube-dl_list.html b/templates/youtube-dl_list.html index 27dc1e2..67c8c08 100644 --- a/templates/youtube-dl_list.html +++ b/templates/youtube-dl_list.html @@ -4,7 +4,7 @@