2022-02-18 19:30:54 +08:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
# -- coding:utf-8 --
|
|
|
|
|
# @Author: markushammered@gmail.com
|
|
|
|
|
# @Development Tool: PyCharm
|
|
|
|
|
# @Create Time: 2022/2/17
|
2022-02-18 19:36:09 +08:00
|
|
|
# @File Name: __init__.py
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import os
|
2022-03-04 18:14:34 +08:00
|
|
|
import time
|
2022-03-03 21:21:45 +08:00
|
|
|
import requests
|
|
|
|
|
import threading
|
2022-02-23 22:03:39 +08:00
|
|
|
from bin.utils.logger import logger
|
2022-02-18 19:36:09 +08:00
|
|
|
|
|
|
|
|
|
2022-03-03 21:21:45 +08:00
|
|
|
class Threaded(threading.Thread):
|
2022-03-04 18:14:34 +08:00
|
|
|
def __init__(self, s, e, id_, url, name):
|
2022-02-23 22:03:39 +08:00
|
|
|
"""
|
2022-03-03 21:21:45 +08:00
|
|
|
初始化类
|
|
|
|
|
:param s: 开始点
|
|
|
|
|
:param e: 结束点
|
|
|
|
|
:param id_: 线程id
|
|
|
|
|
:param url: 文件url
|
2022-03-04 18:14:34 +08:00
|
|
|
:param name: 文件名
|
2022-02-23 22:03:39 +08:00
|
|
|
"""
|
2022-03-04 18:14:34 +08:00
|
|
|
super(Threaded, self).__init__()
|
2022-03-03 21:21:45 +08:00
|
|
|
self.start_ = s
|
|
|
|
|
self.end_ = e
|
|
|
|
|
self.id = id_
|
2022-03-02 21:51:23 +08:00
|
|
|
self.url = url
|
2022-03-04 18:14:34 +08:00
|
|
|
self.name = name
|
2022-03-02 21:51:23 +08:00
|
|
|
|
2022-03-03 21:21:45 +08:00
|
|
|
def download(self):
|
2022-02-23 22:03:39 +08:00
|
|
|
"""
|
2022-03-03 21:21:45 +08:00
|
|
|
下载文件
|
|
|
|
|
写入文件
|
2022-02-23 22:03:39 +08:00
|
|
|
:return:
|
|
|
|
|
"""
|
2022-03-03 21:21:45 +08:00
|
|
|
logger.info(f'线程: {self.id} 开始下载')
|
|
|
|
|
res = requests.get(self.url, headers={'Range': f'Bytes={self.start_}-{self.end_}'}).content
|
2022-03-04 18:14:34 +08:00
|
|
|
with open(self.name, 'r+b') as fp:
|
|
|
|
|
fp.seek(self.start_)
|
|
|
|
|
fp.write(res)
|
2022-03-03 21:21:45 +08:00
|
|
|
logger.info(f'线程: {self.id} 结束下载')
|
2022-02-23 22:03:39 +08:00
|
|
|
|
2022-03-02 21:51:23 +08:00
|
|
|
def run(self):
|
2022-02-23 22:03:39 +08:00
|
|
|
"""
|
2022-03-03 21:21:45 +08:00
|
|
|
重写run()方法开始下载
|
2022-02-23 22:03:39 +08:00
|
|
|
:return:
|
|
|
|
|
"""
|
2022-03-03 21:21:45 +08:00
|
|
|
self.download()
|
|
|
|
|
|
|
|
|
|
|
2022-03-04 18:14:34 +08:00
|
|
|
def cost(func):
|
|
|
|
|
def wrapper(*args, **kwargs):
|
|
|
|
|
logger.info('文件开始开始下载')
|
|
|
|
|
s = time.time()
|
|
|
|
|
execute = func(*args, **kwargs)
|
|
|
|
|
e = time.time()
|
|
|
|
|
logger.info(f'下载结束, 用时: {round(e - s, 2)} s')
|
|
|
|
|
return execute
|
|
|
|
|
|
|
|
|
|
return wrapper
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@cost
|
|
|
|
|
def main(url: str, name: str, path: str = '.', workers: int = 4):
|
2022-03-03 21:21:45 +08:00
|
|
|
"""
|
|
|
|
|
主函数
|
|
|
|
|
:param url:
|
|
|
|
|
:param name:
|
|
|
|
|
:param path:
|
|
|
|
|
:param workers:
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
logger.info(f'本次下载使用线程数: {workers}')
|
|
|
|
|
file_size = int(requests.get(url).headers['Content-Length'])
|
2022-03-04 18:14:34 +08:00
|
|
|
if requests.get(url).status_code == 302:
|
2022-03-03 21:21:45 +08:00
|
|
|
url = requests.get(url).headers['Location']
|
|
|
|
|
logger.warning(f'下载地址已重定向到了: {url}')
|
|
|
|
|
logger.info(f'文件大小: {round(file_size / 1024 / 1024, 2)} Mb')
|
|
|
|
|
offset = int(file_size / workers)
|
|
|
|
|
start = 0
|
|
|
|
|
open(path + name, 'wb').close()
|
|
|
|
|
for i in range(workers):
|
|
|
|
|
if i == workers - 1:
|
|
|
|
|
end = file_size
|
|
|
|
|
elif i != 0:
|
|
|
|
|
end = i * offset
|
|
|
|
|
else:
|
|
|
|
|
end = offset
|
2022-03-04 18:14:34 +08:00
|
|
|
threads = Threaded(start, end, i, url, path + name)
|
2022-03-03 21:21:45 +08:00
|
|
|
threads.start()
|
|
|
|
|
threads.join()
|
|
|
|
|
start = end + 1
|
2022-02-23 22:03:39 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ != '__main__':
|
2022-03-02 21:51:23 +08:00
|
|
|
if not os.path.exists('./bin/db/data.db'):
|
2022-03-03 21:21:45 +08:00
|
|
|
logger.warning('数据库文件不存在, 即将开始下载')
|
2022-03-04 18:14:34 +08:00
|
|
|
main('https://themedatabase.vercel.app/assets', 'data.db', './bin/db/')
|