Files
youtube-dl/youtube_dl.py
joyfuI b26f25a413 v0.1.1 윈도우 환경 지원 추가
윈도우 환경 지원 추가
다운로드 실패 시 임시파일 삭제가 안 되는 문제 수정
2020-02-06 23:43:13 +09:00

89 lines
2.5 KiB
Python

# -*- coding: utf-8 -*-
# python
import os
import platform
from threading import Thread
import subprocess
import json
from datetime import datetime
from enum import Enum
# 패키지
from .plugin import logger
from .logic import Logic
class Status(Enum):
READY = 0
START = 1
STOP = 2
SUCCESS = 3
FAILURE = 4
def __str__(self):
str_list = [
'준비',
'다운로드중',
'중지',
'완료',
'실패'
]
return str_list[self.value]
class Youtube_dl(object):
_index = 0
def __init__(self, url, filename, temp_path, save_path):
self.url = url
self.filename = filename
self.temp_path = temp_path
self.save_path = save_path
self.index = Youtube_dl._index
Youtube_dl._index += 1
self.status = Status.READY
self._thread = None
self._process = None
self.start_time = None
self.end_time = None
self.duration = None
self.format = None
self.errorlevel = None
def start(self):
self._thread = Thread(target=self.run)
self.start_time = datetime.now()
self._thread.start()
def run(self):
command = [
Logic.youtube_dl_path,
'--print-json',
'-o', os.path.join(self.temp_path, self.filename),
'--exec', 'move /y {} ' + self.save_path + '\\' if platform.system() == 'Windows' else 'mv -f {} ' + self.save_path + '/',
self.url
]
logger.debug(command)
self._process = subprocess.Popen(command, stdout=subprocess.PIPE, universal_newlines=True) # youtube-dl 실행
data = json.loads(self._process.stdout.readline()) # 파일 정보
self.filename = os.path.basename(data['_filename'])
self.duration = data['duration']
self.format = data['format']
self.status = Status.START
self.errorlevel = self._process.wait() # 실행 결과
logger.debug('returncode %d', self.errorlevel)
self.end_time = datetime.now()
if self.errorlevel == 0: # 다운로드 성공
self.status = Status.SUCCESS
else: # 다운로드 실패
if self.status != Status.STOP:
self.status = Status.FAILURE
if platform.system() == 'Windows': # 윈도우일 때
logger.debug('del /q "' + self.temp_path + '\\' + ''.join(self.filename.split('.')[:-1]) + '"*')
os.system('del /q "' + self.temp_path + '\\' + ''.join(self.filename.split('.')[:-1]) + '"*') # 임시파일 삭제
else:
logger.debug('rm -f "' + self.temp_path + '/' + ''.join(self.filename.split('.')[:-1]) + '"*')
os.system('rm -f "' + self.temp_path + '/' + ''.join(self.filename.split('.')[:-1]) + '"*') # 임시파일 삭제
def stop(self):
self.status = Status.STOP
self._process.terminate()