From ede9a1fd356e2fb7e3ca16a93aef0c5179b32ba7 Mon Sep 17 00:00:00 2001 From: holwell <45387795+holwell@users.noreply.github.com> Date: Fri, 14 Feb 2025 15:55:24 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=B7=B3?= =?UTF-8?q?=E8=BF=87=E5=B7=B2=E4=B8=8A=E4=BC=A0=E6=AD=8C=E6=9B=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 上传音乐前,检测是否已上传 --- main.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index 74de983..2d4c7ed 100644 --- a/main.py +++ b/main.py @@ -66,6 +66,21 @@ def get_song_details(song_ids): print("响应内容无法解析为JSON:", response.text) return [] +# 判断歌曲是否已上传云盘 +def has_uploaded(song_id, cookie): + url = f"http://localhost:3000/user/cloud/detail?id={song_id}&cookie={cookie}" + response = requests.get(url) + try: + response_data = response.json() + if response_data.get('code') == 200 and len(response_data['data']) != 0: + return True + else: + print("获取云盘歌曲详情失败:", response_data.get("message")) + return False + except json.JSONDecodeError: + print("获取云盘歌曲信息失败,响应内容无法解析为JSON:", response.text) + return False + # 执行 import 请求 def import_song(song_info, cookie): song_id = song_info['id'] @@ -100,7 +115,12 @@ def process_songs(song_info_list, cookie): for song_info in song_info_list: song_id = song_info['id'] print(f"正在导入歌曲ID: {song_id}") - + + # 已上传则跳过 + if has_uploaded(song_id, cookie): + print('该歌曲已上传,跳过!') + continue + # 查询歌曲的详细信息 song_details = get_song_details([song_id]) if song_details: From 43cfe4e85b8b22a59ab3ae292b6a8c8fc5b56a56 Mon Sep 17 00:00:00 2001 From: holwell Date: Fri, 14 Feb 2025 16:17:59 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E9=83=A8=E5=88=86=E6=AD=8C=E6=9B=B2?= =?UTF-8?q?=E6=B2=A1=E6=9C=89artist=E4=BF=A1=E6=81=AF=E7=AD=89=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E7=A8=B3=E5=81=A5=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 6 ++++++ main.py | 51 +++++++++++++++++++++++++++++---------------------- 2 files changed, 35 insertions(+), 22 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..203732c --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +__pycache__/ +.history/ +neteasecloudmusicapi/ +cookies.txt +failed_ids.txt +*.json \ No newline at end of file diff --git a/main.py b/main.py index 2d4c7ed..07425eb 100644 --- a/main.py +++ b/main.py @@ -131,30 +131,37 @@ def process_songs(song_info_list, cookie): # 更新 song_info 添加 artist 和 album 信息 song_info['artist'] = song_artist song_info['album'] = song_album + try: + try_to_upload_song(song_info, cookie) + except Exception as e: + print(f'上传过程异常,跳过该歌曲:{e}') + save_failed_id(song_id) + +def try_to_upload_song(song_info, cookie): + song_id = song_info['id'] + attempts = 0 + while attempts < 3: + result = import_song(song_info, cookie) - attempts = 0 - while attempts < 3: - result = import_song(song_info, cookie) + if result: + success_songs = result.get('data', {}).get('successSongs', []) + failed = result.get('data', {}).get('failed', []) - if result: - success_songs = result.get('data', {}).get('successSongs', []) - failed = result.get('data', {}).get('failed', []) - - if success_songs: - print(f"歌曲 {song_id} 导入成功!") - break # 成功则跳出循环 - else: - print(f"歌曲 {song_id} 导入失败,失败原因:{failed}") - if all(f['code'] == -100 for f in failed): # 文件已存在的错误码 - print(f"歌曲 {song_id} 文件已存在,跳过") - save_failed_id(song_id) # 保存失败的 ID - break - time.sleep(5) # 请求失败后等待 5 秒重新请求 - attempts += 1 - - if attempts == 3: # 如果失败三次,则跳过此 ID - print(f"歌曲 {song_id} 失败三次,跳过该歌曲。") - save_failed_id(song_id) # 保存失败的 ID + if success_songs: + print(f"歌曲 {song_id} 导入成功!") + break # 成功则跳出循环 + else: + print(f"歌曲 {song_id} 导入失败,失败原因:{failed}") + if all(f['code'] == -100 for f in failed): # 文件已存在的错误码 + print(f"歌曲 {song_id} 文件已存在,跳过") + save_failed_id(song_id) # 保存失败的 ID + break + time.sleep(5) # 请求失败后等待 5 秒重新请求 + attempts += 1 + + if attempts == 3: # 如果失败三次,则跳过此 ID + print(f"歌曲 {song_id} 失败三次,跳过该歌曲。") + save_failed_id(song_id) # 保存失败的 ID # 主函数 def main(): From f33bf31420a3da91f99e4a2964f781632db98c94 Mon Sep 17 00:00:00 2001 From: holwell Date: Fri, 14 Feb 2025 16:38:21 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=AD=E7=82=B9?= =?UTF-8?q?=E7=BB=AD=E4=BC=A0=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BB=8E=E6=9C=80?= =?UTF-8?q?=E5=90=8E=E4=B8=80=E6=AC=A1=E4=B8=8A=E4=BC=A0=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E7=9A=84=E4=BD=8D=E7=BD=AE=E7=BB=A7=E7=BB=AD=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/main.py b/main.py index 07425eb..36fed8c 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,6 @@ import os import json +from typing import Union import requests import time @@ -108,6 +109,14 @@ def import_song(song_info, cookie): def save_failed_id(song_id): with open("failed_ids.txt", "a") as f: f.write(f"{song_id}\n") + +# 获取最后一个上传的异常 id +def get_last_failed_id() -> Union[int, None]: + if not os.path.exists("failed_ids.txt"): + return None + with open("failed_ids.txt", "r") as f: + ids = [line.strip() for line in f] + return int(ids[-1]) # 处理歌曲导入请求 def process_songs(song_info_list, cookie): @@ -162,6 +171,16 @@ def try_to_upload_song(song_info, cookie): if attempts == 3: # 如果失败三次,则跳过此 ID print(f"歌曲 {song_id} 失败三次,跳过该歌曲。") save_failed_id(song_id) # 保存失败的 ID + +def get_resume_song_info_list(song_info_list) -> list: + last_failed_id = get_last_failed_id() + if last_failed_id is None: + print("暂无上传失败记录,从头开始上传") + return + for index, song_info in enumerate(song_info_list): + if int(song_info['id']) == last_failed_id: + print(f"当前已上传: {index + 1},最后上传失败的 id: {song_info['id']}") + return song_info_list[index + 1:] # 主函数 def main(): @@ -192,6 +211,9 @@ def main(): song_info_list = get_all_song_info(songs_data) #print(f"所有歌曲信息: {song_info_list}") + # 从上次失败的歌曲开始上传 + song_info_list = get_resume_song_info_list(song_info_list) + # 执行歌曲导入请求 process_songs(song_info_list, cookie) else: