Files
biliup/biliup/engine/upload.py
T
Kataick de65732c80 增加上传对3gp、webm、mkv的格式支持(YouTube) (#472)
* 修复获取直播流失败后需要等delay触发

* 修复虎牙可能导致进程终止问题

* 修复虎牙可能导致进程终止问题

* Revert "修复虎牙可能导致进程终止问题"

This reverts commit 0ba058f8c5cea23642dc47b2673526fc992fabe1.

* 修复不会触发delay的问题
现在当获取流失败5次后 触发delay

* 修改报错等级与延迟时间

* 增加触发判断条件

* 增加上传对3gp、webm、mkv的格式支持(YouTube)
2023-06-15 11:32:34 +00:00

120 lines
4.4 KiB
Python

import logging
import os
import re
import shutil
import subprocess
from functools import reduce
from pathlib import Path
logger = logging.getLogger('biliup')
class UploadBase:
def __init__(self, principal, data, persistence_path=None, postprocessor=None):
self.principal = principal
self.persistence_path = persistence_path
self.data = data
self.post_processor = postprocessor
# @property
@staticmethod
def file_list(index):
file_list = []
for file_name in os.listdir('.'):
if index in file_name and os.path.isfile(file_name):
file_list.append(file_name)
file_list = sorted(file_list)
return file_list
@staticmethod
def remove_filelist(file_list):
for r in file_list:
os.remove(r)
logger.info('删除-' + r)
def filter_file(self, index):
media_extensions = ['.mp4', '.flv', '.3gp', '.webm', '.mkv', '.ts', '.flv.part']
file_list = UploadBase.file_list(index)
if len(file_list) == 0:
return False
for f in file_list:
if f.endswith('.part'):
new_name = os.path.splitext(f)[0]
shutil.move(f, new_name)
logger.info(f'{f}存在已更名为{new_name}')
for r in file_list:
name, ext = os.path.splitext(r)
if ext in ('.mp4', '.flv', '.ts'):
file_size = os.path.getsize(r) / 1024 / 1024
threshold = self.data.get('threshold',2)
if file_size <= threshold:
self.remove_file(r)
logger.info(f'过滤删除-{r}')
if ext == '.xml': #过滤不存在对应视频的xml弹幕文件
xml_file_name = name
# media_regex = re.compile(r'^{}(\.(mp4|flv|ts))?$'.format(
# re.escape(xml_file_name)
# ))
# if not any(media_regex.match(f'{xml_file_name}{ext2}') for ext2 in media_extensions for x in file_list):
# self.remove_file(r)
# logger.info(f'无视频,已过滤删除-{r}')
have_video = False
for video_ext in media_extensions:
if f"{xml_file_name}{video_ext}" in file_list: have_video = True
if not have_video:
self.remove_file(r)
logger.info(f'无视频,已过滤删除-{r}')
file_list = UploadBase.file_list(index)
if len(file_list) == 0:
logger.info('视频过滤后无文件可传')
return False
return True
def remove_file(self, file_path):
os.remove(file_path)
def upload(self, file_list):
raise NotImplementedError()
def start(self):
if self.filter_file(self.principal):
logger.info('准备上传' + self.data["format_title"])
needed2process = self.upload(UploadBase.file_list(self.principal))
if needed2process:
self.postprocessor(needed2process)
def postprocessor(self, data):
# data = file_list
if self.post_processor is None:
return self.remove_filelist(data)
for post_processor in self.post_processor:
if post_processor == 'rm':
self.remove_filelist(data)
continue
if post_processor.get('mv'):
for file in data:
path = Path(file)
dest = Path(post_processor['mv'])
if not dest.is_dir():
dest.mkdir(parents=True, exist_ok=True)
try:
shutil.move(path, dest / path.name)
except Exception as e:
logger.exception(e)
continue
logger.info(f"move to {(dest / path.name).absolute()}")
if post_processor.get('run'):
try:
process_output = subprocess.check_output(
post_processor['run'], shell=True,
input=reduce(lambda x, y: x + str(Path(y).absolute()) + '\n', data, ''),
stderr=subprocess.STDOUT, text=True)
logger.info(process_output.rstrip())
except subprocess.CalledProcessError as e:
logger.exception(e.output)
continue