将数据库合并并添加了配置文件

This commit is contained in:
MarkusJoe
2022-02-23 22:04:21 +08:00
parent 7f723ddc59
commit 8f369fca03
11 files changed
+313 -254

No files matched your search

+1 -130
View File
@@ -6,133 +6,4 @@
# @File Name: __init__.py
import os
import hashlib
import sys
import requests
import threading
from bin.utils.logger import logger
class MulThreadDownload(threading.Thread):
def __init__(self, url, startpos, endpos, f, name):
super(MulThreadDownload, self).__init__()
self.session = requests.Session()
self.session.trust_env = False
self.url = url # 资源Url
self.startpos = startpos
self.endpos = endpos
self.fd = f # 文件操作
self.name = name # 线程名称
def download(self):
"""
多线程下载
:return:
"""
logger.info(f'线程: Thread-{self.name} 开始下载')
headers = {"Range": "bytes=%s-%s" % (self.startpos, self.endpos)}
res = self.session.get(self.url, headers=headers)
self.fd.seek(self.startpos)
self.fd.write(res.content)
logger.info(f'线程: Thread-{self.name} 结束下载')
def run(self):
"""
此处启动
:return:
"""
self.download()
class Check:
"""检查md5是否相同和下载数据库"""
def __init__(self):
self.assets_url = 'https://themedatabases.vercel.app/assets'
self.remote_md5 = 'https://themedatabases.vercel.app/md5'
self.session = requests.Session()
self.session.trust_env = False
def check_md5(self):
"""
检验本地文件md5是否和远程md5相同
:return:
"""
with open('./bin/db/style.db', 'rb') as fp:
data = fp.read()
local_md5 = hashlib.md5(data).hexdigest()
remote_md5 = self.session.get(self.remote_md5).json()['data'][0]
logger.info(f'本地数据库md5: {local_md5}')
logger.info(f'远程数据库md5: {remote_md5}')
if local_md5 != remote_md5:
logger.error('下载错误: 本地数据库md5和远程数据库md5检验不通过, 即将开始重新下载\nI: 本次下载将使用单线程下载')
self.single_download()
else:
logger.info('md5检验已通过')
def download(self):
"""
开始下载
:return:
"""
filesize = int(self.session.get(self.assets_url).headers['Content-Length'])
threaded_count = 3
logger.info(f'数据库大小: {round(filesize / 1024 / 1024, 2)}Mb. 下载线程: {threaded_count}')
threading.BoundedSemaphore(threaded_count)
step = filesize // threaded_count
mtd_list = []
start = 0
end = -1
with open('./bin/db/style.db', 'w') as initial_file:
initial_file.close()
with open('./bin/db/style.db', 'rb+') as f:
name = 1
fileno = f.fileno()
while end < filesize - 1:
start = end + 1
end = start + step - 1
if end > filesize:
end = filesize
dup = os.dup(fileno)
fd = os.fdopen(dup, 'rb+', -1)
t = MulThreadDownload(self.assets_url, start, end, fd, name)
name += 1
t.start()
mtd_list.append(t)
for i in mtd_list:
i.join()
self.check_md5()
def single_download(self):
"""
单线程进行下载
:return:
"""
session = requests.Session()
session.trust_env = False
logger.info(f'正在使用单线程下载中')
resp = session.get(self.assets_url)
with open('./bin/db/style.db', 'wb') as fp:
fp.write(resp.content)
logger.info('下载完成 正在检验文件md5')
with open('./bin/db/style.db', 'rb') as fp:
data = fp.read()
local_md5 = hashlib.md5(data).hexdigest()
remote_md5 = session.get('https://themedatabases.vercel.app/md5').json()['data'][0]
logger.info(f'本地数据库md5: {local_md5}')
logger.info(f'远程数据库md5: {remote_md5}')
if local_md5 != remote_md5:
logger.error('md5检验未通过请手动前往 https://themedatabases.vercel.app/assets 下载文件并放入./bin/assets文件夹内')
sys.exit(-1)
else:
logger.info('md5检验已通过')
if __name__ != '__main__':
__all__ = ['error', 'logger', 'view']
if not os.path.exists('./bin/db/style.db'):
logger.error('没有检测到本地主题数据库即将开始下载')
Check().download()
__all__ = ['error', 'logger', 'packing_logs', 'view']
+4 -4
View File
@@ -9,7 +9,7 @@
from typing import Optional
from flask import jsonify
from flask import Response
from bin.db.sqlite import (update_data, fetch_table)
from bin.db.sqlite import Database
class ErrorProcess:
@@ -24,7 +24,7 @@ class ErrorProcess:
直接获取可选主题
:return:
"""
table_list = fetch_table()
table_list = Database().fetch_table()
self.msg_template['code'] = 200
self.msg_template['msg'] = '当前已保存到数据库的主题如下'
self.msg_template['data'] = table_list
@@ -36,7 +36,7 @@ class ErrorProcess:
:param theme:
:return:
"""
table_list = fetch_table()
table_list = Database().fetch_table()
self.msg_template['code'] = -2
self.msg_template['msg'] = f'错误的主题: {theme}. 以下是已保存的主题'
self.msg_template['data'] = table_list
@@ -59,7 +59,7 @@ class ErrorProcess:
:param name:
:return:
"""
update_data(name, 0)
Database().update_data(name, 0)
self.msg_template['code'] = 200
self.msg_template['msg'] = '当前长度已超过最大可计数范围. 已将此名称的计数器重置为零'
self.msg_template['data'] = None
+1 -1
View File
@@ -13,7 +13,7 @@ from colorlog import ColoredFormatter
class MakeLogger:
def __init__(self):
def __init__(self) -> None:
self.date_format = '%H:%M:%S'
self.format_console = '%(log_color)s[%(asctime)s] |%(filename)s[%(lineno)-3s] |%(levelname)-8s |%(message)s'
self.format_file = '[%(asctime)s] |%(filename)s[%(funcName)sline:%(lineno)d] |%(levelname)-8s |%(message)s'
+1 -1
View File
@@ -3,7 +3,7 @@
# @Author: markushammered@gmail.com
# @Development Tool: PyCharm
# @Create Time: 2022/2/18
# @File Name: packinglog.py
# @File Name: packing_logs.py
import os
+53 -1
View File
@@ -3,4 +3,56 @@
# @Author: markushammered@gmail.com
# @Development Tool: PyCharm
# @Create Time: 2022/2/23
# @File Name: settings.py
# @File Name: settings.py
import yaml
class Settings:
def __init__(self):
self.__setting_file = './bin/conf/config.yml'
with open(self.__setting_file, encoding='utf-8') as fp:
self.data = yaml.load(fp.read(), Loader=yaml.Loader)
self.__servers = self.data['servers']
self.__database = self.data['database']
@property
def host(self) -> str:
"""
应用地址
:return:
"""
return self.__servers['host']
@property
def port(self) -> str:
"""
应用端口
:return:
"""
return self.__servers['port']
@property
def type(self) -> str:
"""
数据库类型
:return:
"""
return self.__database['type']
@property
def path(self) -> str:
"""
数据库路径
:return:
"""
return self.__database['sqlite']['path']
@property
def name(self) -> str:
"""
数据库名称
:return:
"""
return self.__database['sqlite']['path'].split('/')[-1]
+3 -4
View File
@@ -7,8 +7,7 @@
from flask import render_template
from bin.db.sqlite import fetch_style_data
from bin.db.sqlite import fetch_table
from bin.db.sqlite import Database
def view_template(style: str, length: int, name: str, count: str) -> str or tuple[bool, str]:
@@ -20,9 +19,9 @@ def view_template(style: str, length: int, name: str, count: str) -> str or tupl
:param style:
:return:
"""
if style not in fetch_table():
if style not in Database().fetch_table():
return [False, 'BadLength']
origin_data = fetch_style_data(style) # 获取数据库内的文件
origin_data = Database().fetch_style_data(style) # 获取数据库内的文件
context = []
if count != '0000000000':
for i in count: # 通过elif语句依次判断数字