From b9a1e530dd39db0c8ae6558bbe8d23ea3cac6035 Mon Sep 17 00:00:00 2001 From: helloplhm-qwq Date: Sun, 4 Feb 2024 16:27:36 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20(localMusic)=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=E6=9C=AC=E5=9C=B0=E9=9F=B3=E4=B9=90meta?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=EF=BC=8C=E4=BF=AE=E5=A4=8D=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/localMusic.py | 17 ++++++++++++----- common/utils.py | 11 +++++++++-- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/common/localMusic.py b/common/localMusic.py index b91ac56..d3d9765 100644 --- a/common/localMusic.py +++ b/common/localMusic.py @@ -12,7 +12,7 @@ import sys from PIL import Image import aiohttp -from common.utils import createMD5, timeLengthFormat +from common.utils import createFileMD5, createMD5, timeLengthFormat from . import log, config import ujson as json import traceback @@ -211,6 +211,7 @@ def getAudioMeta(filepath): "lyrics": lyric[0], 'length': audio.info.length, 'format_length': timeLengthFormat(audio.info.length), + 'md5': createFileMD5(filepath), } except: logger.error(f"get audio meta error: {filepath}") @@ -238,7 +239,7 @@ def extractCover(audio_info, temp_path): f.write(audio_info['cover']) return path -def findAudios(): +def findAudios(cache): available_exts = [ 'mp3', @@ -253,6 +254,9 @@ def findAudios(): return [] audios = [] + _map = {} + for c in cache: + _map[c['filepath']] = c for file in files: if (not file.endswith(tuple(available_exts))): continue @@ -260,8 +264,11 @@ def findAudios(): if (not checkAudioValid(path)): continue logger.info(f"found audio: {path}") - meta = getAudioMeta(path) - audios = audios + [meta] + if (not (_map.get(path) and _map[path]['md5'] == createFileMD5(path))): + meta = getAudioMeta(path) + audios = audios + [meta] + else: + audios = audios + [_map[path]] return audios @@ -321,7 +328,7 @@ def initMain(): if (cache['file_list'] == os.listdir(AUDIO_PATH)): audios = cache['audios'] else: - audios = findAudios() + audios = findAudios(cache['audios']) writeLocalCache(audios) for a in audios: map[a['filepath']] = a diff --git a/common/utils.py b/common/utils.py index 778e6d4..28dda89 100644 --- a/common/utils.py +++ b/common/utils.py @@ -7,6 +7,7 @@ # ---------------------------------------- # This file is part of the "lx-music-api-server" project. +import hashlib import platform import binascii import builtins @@ -16,7 +17,6 @@ import re import xmltodict from urllib.parse import quote, unquote, urlparse -from hashlib import md5 as handleCreateMD5 def createBase64Encode(data_bytes): encoded_data = base64.b64encode(data_bytes) @@ -67,7 +67,14 @@ def filterFileName(filename): def createMD5(s: (str, bytes)): if (isinstance(s, str)): s = s.encode("utf-8") - return handleCreateMD5(s).hexdigest() + return hashlib.md5(s).hexdigest() + +def createFileMD5(path): + with open(path, 'rb') as f: + md5 = hashlib.md5() + for chunk in iter(lambda: f.read(4096), b""): + md5.update(chunk) + return md5.hexdigest() def readFile(path, mode = "text"): try: