Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

添加文件查看器(实验性)、lrc解析重写 #20

Merged
merged 2 commits into from
Jan 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 41 additions & 7 deletions app.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,6 @@ def lrc_json():


@app.route('/cover', methods=['GET'])
@v1_bp.route('/cover', methods=['GET'])
@cache.cached(timeout=86400, key_prefix=make_cache_key)
def cover_api():
req_args = {key: request.args.get(key) for key in request.args}
Expand All @@ -189,17 +188,27 @@ def cover_api():
return redirect(target_url, 302)


def validate_json_structure(data):
if not isinstance(data, dict):
return False
if "path" not in data:
return False
return True
@v1_bp.route('/cover/<path:s_type>', methods=['GET'])
@cache.cached(timeout=86400, key_prefix=make_cache_key)
def cover_new(s_type):
__endpoints__ = ["music", "album", "artist"]
if s_type not in __endpoints__:
abort(404)
req_args = {key: request.args.get(key) for key in request.args}
target_url = f'http://api.lrc.cx/cover/{s_type}/' + '&'.join([f"{key}={req_args[key]}" for key in req_args])
return redirect(target_url, 302)


@app.route('/tag', methods=['GET', 'POST', 'PUT'])
@v1_bp.route('/tag', methods=['GET', 'POST', 'PUT'])
def setTag():
def validate_json_structure(data):
if not isinstance(data, dict):
return False
if "path" not in data:
return False
return True

match require_auth(request=request, permission='rw'):
case -1:
return render_template_string(webui.error()), 403
Expand Down Expand Up @@ -286,6 +295,31 @@ def serve_file(filename):
abort(404)


@app.route('/file/<path:filename>')
@v1_bp.route('/file/<path:filename>')
def file_viewer(filename):
"""
文件查看器
:param filename:
:return:
"""
# 需要权限
match require_auth(request=request):
case -1:
return render_template_string(webui.error()), 403
case -2:
return render_template_string(webui.error()), 421
# 拓展名白名单
ALLOWED_EXTENSIONS = ('.mp3', '.flac', '.wav', '.ape', '.ogg', '.m4a', '.aac', '.wma', '.mp4', '.m4p', '.m4b',
'txt', 'lrc', 'webp', 'jpg', 'jpeg', 'png', 'bmp', 'gif', 'webp', 'svg', 'ico', 'mp4', 'webm',
'mkv', 'avi', 'mov', 'wmv', 'flv', 'f4v', 'f4p', 'f4a', 'f4b', 'm4v', 'm4r', 'm4p', 'm4b',)
if filename.lower().endswith(ALLOWED_EXTENSIONS):
try:
return send_from_directory(os.path.dirname(filename), os.path.basename(filename))
except FileNotFoundError:
abort(404)


@app.route('/login')
def login_check():
"""
Expand Down
43 changes: 43 additions & 0 deletions devtools/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import time
import threading


class Benchmark:
def __init__(self, threads=1, rounds=1000):
# 初始化时指定线程数和测试轮数
# 总测试次数 = 线程数 * 轮数
self.threads = threads
self.rounds = rounds

def _work(self, func, *args, **kwargs):
# 单线程测试
for i in range(self.rounds):
func(*args, **kwargs)
return

def run(self, func, *args, **kwargs):
"""
多线程测试,每个线程测试指定轮数,返回平均耗时和总耗时
:param func:
:param args:
:param kwargs:
:return:
"""
# 创建多个线程
threads = []
for i in range(self.threads):
t = threading.Thread(target=self._work, args=(func, *args), kwargs=kwargs)
threads.append(t)
# 计时开始
start = time.time()
# 启动所有线程
for t in threads:
t.start()
# 等待所有线程结束
for t in threads:
t.join()
# 计时结束
end = time.time()
all_time = end - start
avg_time = all_time / (self.threads*self.rounds)
return all_time, avg_time
84 changes: 75 additions & 9 deletions mod/lrc.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,38 @@
import re


def standard(lrc_text: str):
def standard_line(lrc_text: str):
# 定义匹配时间标签的正则表达式
pattern = re.compile(r'\[(\d+:\d+\.\d{2})\]')

pattern = re.compile(r'\[(\d+:\d+[\.:]\d{2})\]')
# 使用正则表达式查找所有匹配的时间标签
matches = pattern.findall(lrc_text)

# 遍历匹配的时间标签,替换毫秒位
for match in matches:
old_time_label = match
minutes, seconds, millisecond = map(int, re.split(':|\.', old_time_label))
new_time_label = f"{minutes:02d}:{seconds:02d}.{millisecond:02d}0"
minutes, seconds, millisecond = map(int, re.split('[:.]', old_time_label))
minute_str = ('00'+str(minutes))[-2:] if minutes < 100 else str(minutes)
second_str = ('00'+str(seconds))[-2:]
millisecond_str = (str(millisecond)+'000')[:3]
new_time_label = f"{minute_str}:{second_str}.{millisecond_str}"
lrc_text = lrc_text.replace(old_time_label, new_time_label)

return lrc_text


def standard(lrc_text: str):
parse_string = ''
# 使用[分割字符串,得到每一行歌词
lines = lrc_text.split('[')
for line_index in range(len(lines)):
if line_index > 0:
line = '[' + lines[line_index]
else:
line = lines[line_index]
parse_string += standard_line(line)

return parse_string


def is_valid(lrc_text: str):
if type(lrc_text) is not str:
return False
Expand All @@ -30,6 +45,57 @@ def is_valid(lrc_text: str):


if __name__ == "__main__":
lrc = ""
result = is_valid(lrc)
print(result)
lrc = """
[00:02.05]愿得一人心
[00:08.64]词:胡小健 曲:罗俊霖
[00:11.14]演唱: 李行亮,雨宗林
[00:24.93]
[00:27.48]曾在我背包小小夹层里的那个人
[00:32.31]陪伴我漂洋过海经过每一段旅程
[00:37.38]隐形的稻草人 守护我的天真
[00:42.43]曾以为爱情能让未来只为一个人
[00:47.50]关了灯依旧在书桌角落的那个人
[00:52.68]变成我许多年来纪念爱情的标本
[00:57.57]消失的那个人 回不去的青春
[01:02.69]忘不了爱过的人才会对过往认真
[01:09.71]只愿得一人心 白首不分离
[01:14.71]这简单的话语 需要巨大的勇气
[01:19.73]没想过失去你 却是在骗自己
[01:25.34]最后你深深藏在我的歌声里
[00:02.05]愿得一人心
[00:08.64]词:胡小健 曲:罗俊霖
[00:11.14]演唱: 李行亮,雨宗林
[00:24.93]
[00:27.48]曾在我背包小小夹层里的那个人
[00:32.31]陪伴我漂洋过海经过每一段旅程
[00:37.38]隐形的稻草人 守护我的天真
[00:42.43]曾以为爱情能让未来只为一个人
[00:47.50]关了灯依旧在书桌角落的那个人
[00:52.68]变成我许多年来纪念爱情的标本
[00:57.57]消失的那个人 回不去的青春
[01:02.69]忘不了爱过的人才会对过往认真
[01:09.71]只愿得一人心 白首不分离
[01:14.71]这简单的话语 需要巨大的勇气
[01:19.73]没想过失去你 却是在骗自己
[01:25.34]最后你深深藏在我的歌声里
[00:02.05]愿得一人心
[00:08.64]词:胡小健 曲:罗俊霖
[00:11.14]演唱: 李行亮,雨宗林
[00:24.93]
[00:27.48]曾在我背包小小夹层里的那个人
[00:32.31]陪伴我漂洋过海经过每一段旅程
[00:37.38]隐形的稻草人 守护我的天真
[00:42.43]曾以为爱情能让未来只为一个人
[00:47.50]关了灯依旧在书桌角落的那个人
[00:52.68]变成我许多年来纪念爱情的标本
[00:57.57]消失的那个人 回不去的青春
[01:02.69]忘不了爱过的人才会对过往认真
[01:09.71]只愿得一人心 白首不分离
[01:14.71]这简单的话语 需要巨大的勇气
[01:19.73]没想过失去你 却是在骗自己
[01:25.34]最后你深深藏在我的歌声里"""
print(standard(lrc))

from devtools import Benchmark
b = Benchmark(threads=1, rounds=10000)
print(b.run(standard, lrc))
Loading