82 lines
2.0 KiB
Python
82 lines
2.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
# python
|
|
import os
|
|
from threading import Thread
|
|
import subprocess
|
|
import json
|
|
from datetime import datetime
|
|
from enum import Enum
|
|
|
|
# 패키지
|
|
from .plugin import logger
|
|
|
|
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 = [
|
|
'youtube-dl',
|
|
'--print-json',
|
|
'-o', self.temp_path + '/' + self.filename,
|
|
'--exec', 'mv {} ' + self.save_path + '/',
|
|
self.url
|
|
]
|
|
self._process = subprocess.Popen(command, stdout=subprocess.PIPE, universal_newlines=True) # youtube-dl 실행
|
|
data = json.loads(self._process.stdout.readline()) # 파일 정보
|
|
self.filename = data['_filename'].split('/')[-1]
|
|
self.duration = data['duration']
|
|
self.format = data['format']
|
|
self.status = Status.START
|
|
self.errorlevel = self._process.wait() # 실행 결과
|
|
self.end_time = datetime.now()
|
|
if self.errorlevel == 0: # 다운로드 성공
|
|
self.status = Status.SUCCESS
|
|
else: # 다운로드 실패
|
|
logger.debug('returncode %d', self.errorlevel)
|
|
if self.status != Status.STOP:
|
|
self.status = Status.FAILURE
|
|
logger.debug('rm -f ' + self.temp_path + '/' + ''.join(str.split('.')[:-1]) + '*')
|
|
os.system('rm -f ' + self.temp_path + '/' + ''.join(str.split('.')[:-1]) + '*') # 임시 파일 삭제
|
|
|
|
def stop(self):
|
|
self.status = Status.STOP
|
|
self._process.terminate()
|