OPTIMIZED OPTION!!!!!!!!!!!!

SUPPORT MULTI-PROCESSING DECRYPTION
This commit is contained in:
1826013250 2023-04-04 00:43:04 +08:00
parent 2f4db4e11c
commit afd3e84a8e
2 changed files with 57 additions and 14 deletions

View File

@ -2,7 +2,7 @@
def rinput(string: str = ''):
"""当调用该函数时同input()一样,但是返回一个去除首空格并全部小写的str"""
"""当调用该函数时同input()一样,但是返回一个去除首空格并全部小写的str"""
return input(string).strip().lower()

View File

@ -3,7 +3,10 @@ import json
import os
import struct
from base64 import b64decode
from multiprocessing import Process, Queue
from queue import Empty
from progress.bar import Bar
from Cryptodome.Cipher import AES
from mutagen import File, flac
from mutagen.id3 import ID3, TPE1, APIC, COMM, TIT2, TALB
@ -152,6 +155,15 @@ def load_and_decrypt_from_ncm(file_path, targetdir): # nondanee的源代码,
return meta_data
def process_work(path, filename, target, q_err: Queue, q_info: Queue):
try:
result = load_and_decrypt_from_ncm(path, target)
except AssertionError:
q_err.put(f"\t- 文件 \"{filename}\" 破解失败!")
else:
q_info.put(result)
def get_lyric_from_folder(lyric_path: str):
clear()
path = cinput("请输入歌曲的保存文件夹(绝对路径):")
@ -204,21 +216,52 @@ def get_lyric_from_folder(lyric_path: str):
else:
print("输入无效!按回车继续...")
if target_path != "NOT_DECRYPT":
for i in range(0, len(ncm_files)):
print("破解进度: %d/%d ~ %s" % (i + 1, len(ncm_files), ncm_files[i]))
try:
result = load_and_decrypt_from_ncm(os.path.join(path, ncm_files[i]), target_path)
except AssertionError:
print(f"\t- 文件 \"{ncm_files[i]}\" 破解失败!\n\t 可能是文件不完整或者重命名了别的文件?跳过...")
fails += 1
continue
print("\t--> %s" % os.path.splitext(ncm_files[i])[0] + "." + result["format"])
musics.append({"id": result['musicId'], "name": result["musicName"], "artists": result["artist"]})
if target_path != "NOT_DECRYPT": # 开始进行逐个文件解密
errors = [] # 初始化变量
q_err = Queue() # 错误信息队列
q_info = Queue() # 返回信息队列
max_process = 20 # 最大进程数
current_process = 0 # 当前正在活动的进程数
passed = 0 # 总共结束的进程数
with Bar("正在破解", max=len(ncm_files)) as bar:
total = len(ncm_files)
finished = 0 # 已经分配的人物数量
while True: # 进入循环,执行 新建进程->检测队列->检测任务完成 的循环
if current_process <= max_process and finished < total: # 分配进程
Process(target=process_work,
args=(os.path.join(path, ncm_files[finished]),
ncm_files[finished],
target_path,
q_err,
q_info)).start()
finished += 1
while True: # 错误队列检测
try:
errors.append(q_err.get_nowait())
passed += 1 # 总任务完成数
current_process -= 1 # 检测到进程完毕将进程-1
bar.next() # 推动进度条
fails += 1 # 错误数量+1
except Empty:
break
while True: # 信息队列检测
try:
r = q_info.get_nowait()
musics.append({"id": r['musicId'], "name": r["musicName"], "artists": r["artist"]})
passed += 1
current_process -= 1
bar.next()
except Empty:
break
if passed >= len(ncm_files):
break
if errors:
print("解密过程中发现了以下错误:")
for i in errors:
print(i)
# 汇报索引结果
print(
f"\n索引完毕!共找到{fails + len(musics) + len(ncm_files)}个目标文件\n{len(musics)}个文件已载入\n{fails}个文件失败")
print(f"\n索引完毕!共找到{fails + len(musics) + len(ncm_files)}个目标文件\n{len(musics)}个文件已载入\n{fails}个文件失败")
if ncm_files:
if target_path == "NOT_DECRYPT":
print(f"{len(ncm_files)}个文件放弃加载")