From beaefbf64d151e16c976e62255460b821b30fb68 Mon Sep 17 00:00:00 2001 From: HisAtri Date: Tue, 30 Jan 2024 14:36:39 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=9F=A5=E7=9C=8B=E5=99=A8=EF=BC=88=E5=AE=9E=E9=AA=8C=E6=80=A7?= =?UTF-8?q?=EF=BC=89=E3=80=81lrc=E8=A7=A3=E6=9E=90=E9=87=8D=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 48 +++++++++++++++++++++---- devtools/__init__.py | 43 +++++++++++++++++++++++ mod/lrc.py | 83 +++++++++++++++++++++++++++++++++++++++----- 3 files changed, 158 insertions(+), 16 deletions(-) create mode 100644 devtools/__init__.py diff --git a/app.py b/app.py index 1f456a4..dbf27c3 100644 --- a/app.py +++ b/app.py @@ -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} @@ -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/', 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 @@ -286,6 +295,31 @@ def serve_file(filename): abort(404) +@app.route('/file/') +@v1_bp.route('/file/') +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(): """ diff --git a/devtools/__init__.py b/devtools/__init__.py new file mode 100644 index 0000000..3333032 --- /dev/null +++ b/devtools/__init__.py @@ -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 \ No newline at end of file diff --git a/mod/lrc.py b/mod/lrc.py index 6367e3d..e99c693 100644 --- a/mod/lrc.py +++ b/mod/lrc.py @@ -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 @@ -30,6 +45,56 @@ 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]最后你深深藏在我的歌声里""" + from devtools import Benchmark + b = Benchmark(threads=1, rounds=10000) + print(b.run(parse_lrc, lrc)) + print(parse_lrc(lrc)) From ecde311c93b47b473fa8bf98640bc9cf52c90ab2 Mon Sep 17 00:00:00 2001 From: HisAtri Date: Tue, 30 Jan 2024 20:25:06 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbenchmark=E5=BC=95?= =?UTF-8?q?=E7=94=A8=E9=94=99=E8=AF=AF=E5=AF=B9=E8=B1=A1=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mod/lrc.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mod/lrc.py b/mod/lrc.py index e99c693..17cadd7 100644 --- a/mod/lrc.py +++ b/mod/lrc.py @@ -94,7 +94,8 @@ def is_valid(lrc_text: str): [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(parse_lrc, lrc)) - print(parse_lrc(lrc)) + print(b.run(standard, lrc))