This repository has been archived on 2022-05-30. You can view files and clone it, but cannot push or open issues or pull requests.
XiguaLiveDanmakuHelper/liveDownloader.py
2019-04-07 23:35:47 +08:00

155 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import shutil
import sys
import time
from datetime import datetime
import threading
from bilibili import *
from Common import *
import os
import requests
isEncode = False
isDownload = False
def download(url):
global isDownload, forceStopDownload
path = datetime.strftime(datetime.now(), "%Y%m%d_%H%M.flv")
p = requests.get(url, stream=True)
if p.status_code != 200:
appendDownloadStatus("Download [{}] Response 404 ,will stop looping".format(url))
return True
isDownload = True
appendDownloadStatus("Starting Download >{}<".format(path))
f = open(path, "wb")
try:
for t in p.iter_content(chunk_size=64 * 1024):
if t:
f.write(t)
_size = os.path.getsize(path)
modifyLastDownloadStatus("Download >{}< @ {:.2f}%".format(path, 100.0 * _size/config["p_s"]))
if _size > config["p_s"] or forceStopDownload:
break
modifyLastDownloadStatus("Finished Download >{}<".format(path))
except Exception as e:
appendError("Download >{}< With Exception {}".format(path, datetime.strftime(datetime.now(), "%y%m%d %H%M"),
e.__str__()))
f.close()
isDownload = False
if os.path.getsize(path) == 0:
os.remove(path)
return False
encodeQueue.put(path)
if forceStopDownload:
forceStopDownload = False
return
else:
download(url)
def encode():
global isEncode
while True:
i = encodeQueue.get()
if os.path.exists(i):
isEncode = True
appendEncodeStatus("Start Encoding >{}<".format(i))
os.system("ffmpeg -i {} -c:v copy -c:a copy -f mp4 {} -y".format(i, i[:13] + ".mp4"))
uploadQueue.put(i[:13] + ".mp4")
modifyLastEncodeStatus("Finished Encoding >{}<".format(i))
if config["mv"]:
shutil.move(i, config["mtd"])
elif config["del"]:
os.remove(i)
isEncode = False
def upload(date=datetime.strftime(datetime.now(), "%Y_%m_%d")):
i = uploadQueue.get()
while True:
if isinstance(i, bool):
if i is True:
b.finishUpload(config["t_t"].format(date), 17, config["tag"], config["des"],
source=config["src"], no_reprint=0)
b.clear()
break
if not os.path.exists(i):
appendError("Upload File Not Exist {}".format(i))
i = uploadQueue.get()
continue
try:
b.preUpload(VideoPart(i, os.path.basename(i)))
except Exception as e:
appendError(e.__str__())
continue
os.remove(i)
i = uploadQueue.get()
appendUploadStatus("Upload Daemon Quiting")
b = Bilibili()
b.login(config["b_u"], config["b_p"])
def run(name):
global isEncode, isDownload
api = downloader(name)
et = threading.Thread(target=encode, args=())
et.setDaemon(True)
et.start()
if not api.isValidRoom:
appendError("[{}]房间不存在".format(name))
return
d = None
t = threading.Thread(target=download)
ut = threading.Thread(target=upload, args=(d,))
_count = 0
_count_error = 0
while True:
if api.isLive:
if d is None:
d = datetime.strftime(datetime.now(), "%Y_%m_%d")
if not t.is_alive():
_count_error += 1
_preT = api.playlist
t = threading.Thread(target=download, args=(_preT,))
t.setDaemon(True)
t.start()
if not ut.is_alive():
ut = threading.Thread(target=upload, args=(d,))
ut.setDaemon(True)
ut.start()
if not et.is_alive():
et = threading.Thread(target=encode, args=())
et.setDaemon(True)
et.start()
if _count % 15 == 0:
try:
api.updRoomInfo()
_count = 0
_count_error = 0
except Exception as e:
appendError(e.__str__())
time.sleep(20)
_count_error += 1
continue
if _count_error > 15:
api.isLive = False
_count += 1
time.sleep(20)
else:
if d is not None:
d = None
if not isEncode and not isDownload:
uploadQueue.put(True)
isEncode = True
isDownload = True
# print("主播未开播等待1分钟后重试")
time.sleep(60)
try:
api.updRoomInfo()
_count_error = 0
except Exception as e:
appendError(e.__str__())