This repository has been archived on 2026-08-27. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
RequestCounter/bin/__init__.py
T

121 lines
3.3 KiB
Python
Raw Normal View History

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} 开始下载')
2022-03-12 19:11:09 +08:00
res = requests.get(self.url, headers={'Range': f'Bytes={self.start_}-{self.end_}'}, timeout=10).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}')
2022-03-12 19:11:09 +08:00
file_size = int(requests.get(url, timeout=10).headers['Content-Length'])
if requests.get(url, timeout=10).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
2022-03-12 19:11:09 +08:00
@cost
def download(url: str) -> None:
"""
单线程下载资源
:param url:
:return:
"""
content = requests.get(url, timeout=10, stream=True).content
with open('./bin/db/data.db', 'wb') as fp:
fp.write(content)
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-12 19:11:09 +08:00
try:
main('https://themedatabase.vercel.app/assets', 'data.db', './bin/db/')
except requests.Timeout:
logger.critical('连接超时, 将使用单线程重新尝试下载')
try:
download('https://themedatabase.vercel.app/assets')
except requests.Timeout:
logger.critical('连接超时, 请自行前往此页面下载文件将文件命名为data.db并放置在 ./bin/db/ 文件夹内')
raise requests.Timeout