Files
biliup/engine/handler.py
T
2021-01-13 19:22:29 +08:00

80 lines
2.5 KiB
Python

import common
from common import logger
from common.event import Event, event_manager
from engine.downloader import download, check_url
from engine.plugins.upload import UploadBase
from engine.uploader import upload
CHECK = 'check'
CHECK_UPLOAD = 'check_upload'
TO_MODIFY = 'to_modify'
DOWNLOAD = 'download'
BE_MODIFIED = 'be_modified'
UPLOAD = 'upload'
@event_manager.register(DOWNLOAD, block=True)
def process(name, url):
date = common.time_now()
try:
download(name, url)
finally:
return Event(UPLOAD, (name, url, date))
@event_manager.register(UPLOAD, block=True)
def process_upload(name, url, date):
yield Event(BE_MODIFIED, (url, 2))
try:
data = {"url": url, "date": date}
upload("bili_web", name, data)
finally:
yield Event(BE_MODIFIED, args=(url, 0))
@event_manager.server()
class KernelFunc:
def __init__(self, urls, url_status: dict, checker, inverted_index, streamer_url):
self.urls = urls
self.url_status = url_status
self.__raw_streamer_status = url_status.copy()
self.checker = checker
self.inverted_index = inverted_index
self.streamer_url = streamer_url
@event_manager.register(CHECK, block=True)
def singleton_check(self, platform):
plugin = self.checker[platform]
for url in check_url(plugin):
yield Event(TO_MODIFY, args=(url,))
@event_manager.register(TO_MODIFY)
def modify(self, url):
if not url:
return logger.debug('无人直播')
if self.url_status[url] == 1:
return logger.debug('已开播正在下载')
if self.url_status[url] == 2:
return logger.debug('正在上传稍后下载')
name = self.inverted_index[url]
logger.debug(f'{name}刚刚开播,去下载')
self.url_status[url] = 1
return Event(DOWNLOAD, args=(name, url))
@event_manager.register(CHECK_UPLOAD)
def free_upload(self):
for title, urls in self.streamer_url.items():
if self.free(urls) and UploadBase.filter_file(title):
yield Event(UPLOAD, args=(title, urls[0], common.time_now()))
@event_manager.register(BE_MODIFIED)
def revise(self, url, status):
if url:
# 更新字典
# url_status = {**url_status, **{url: 0}}
self.url_status.update({url: status})
def free(self, list_url):
status_num = list(map(lambda x: self.url_status.get(x), list_url))
return not (1 in status_num or 2 in status_num)