163cloud/main.py
2025-02-14 04:44:55 +08:00

175 lines
6.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
import json
import requests
import time
# 导入 login 函数
from login import login # 直接从 login.py 导入 login 函数
from get_cloud_info import get_cloud_info # 从 get_cloud_info.py 导入 get_cloud_info 函数
# 获取当前时间戳(秒)
def get_current_timestamp():
return int(time.time())
# 读取 cookies.txt 文件
def read_cookie():
if os.path.exists("cookies.txt"):
with open("cookies.txt", "r") as f:
cookie = f.read().strip()
if cookie:
return cookie
return None
# 读取歌曲.json 文件并返回数据
def read_songs_data():
if os.path.exists("歌曲.json"):
with open("歌曲.json", "r", encoding="utf-8") as f:
try:
data = json.load(f)
return data.get('data', [])
except json.JSONDecodeError:
print("歌曲.json 格式错误")
return []
else:
print("歌曲.json 文件不存在")
return []
# 提取所有歌曲的 id 和其他信息
def get_all_song_info(songs_data):
song_info_list = []
for song in songs_data:
song_info = {
'id': song.get("id"),
'size': song.get("size"),
'ext': song.get("ext"),
'bitrate': song.get("bitrate"),
'md5': song.get("md5")
}
song_info_list.append(song_info)
return song_info_list
# 查询歌曲详情
def get_song_details(song_ids):
ids = ",".join(map(str, song_ids)) # 将多个 id 拼接成一个以逗号分隔的字符串
timestamp = get_current_timestamp() # 获取当前时间戳
url = f"http://localhost:3000/song/detail?ids={ids}&time={timestamp}"
print(f"查询歌曲详情 URL: {url}")
response = requests.get(url)
try:
response_data = response.json()
if response_data.get('code') == 200:
return response_data.get('songs', [])
else:
print("获取歌曲详情失败:", response_data.get("message"))
return []
except json.JSONDecodeError:
print("响应内容无法解析为JSON:", response.text)
return []
# 执行 import 请求
def import_song(song_info, cookie):
song_id = song_info['id']
artist = song_info['artist']
album = song_info['album']
file_size = song_info['size']
bitrate = song_info['bitrate']
md5 = song_info['md5']
file_type = song_info['ext']
# 构造完整的请求URL和参数
timestamp = get_current_timestamp() # 获取当前时间戳
url = f"http://localhost:3000/cloud/import?id={song_id}&cookie={cookie}&artist={artist}&album={album}&fileSize={file_size}&bitrate={bitrate}&md5={md5}&fileType={file_type}&time={timestamp}"
#print(f"执行导入请求 URL: {url}")
response = requests.get(url)
try:
response_data = response.json()
return response_data
except json.JSONDecodeError:
print("响应内容无法解析为JSON:", response.text)
return None
# 保存失败的 id 到文件
def save_failed_id(song_id):
with open("failed_ids.txt", "a") as f:
f.write(f"{song_id}\n")
# 处理歌曲导入请求
def process_songs(song_info_list, cookie):
failed_attempts = {} # 记录每个 ID 失败的次数
for song_info in song_info_list:
song_id = song_info['id']
print(f"正在导入歌曲ID: {song_id}")
# 查询歌曲的详细信息
song_details = get_song_details([song_id])
if song_details:
song_name = song_details[0]['name']
song_artist = song_details[0]['ar'][0]['name']
song_album = song_details[0]['al']['name']
print(f"歌曲名: {song_name}, 演唱者: {song_artist}, 专辑: {song_album}")
# 更新 song_info 添加 artist 和 album 信息
song_info['artist'] = song_artist
song_info['album'] = song_album
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 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():
# 尝试读取已保存的 cookie
cookie = read_cookie()
if cookie:
#print(f"读取到已保存的 cookie: {cookie}")
# 获取并显示云盘信息
get_cloud_info(cookie)
else:
print("没有找到 cookie正在执行登录...")
# 执行 login 函数获取新 cookie
cookie = login()
if cookie:
print(f"登录成功cookie: {cookie}")
# 获取并显示云盘信息
get_cloud_info(cookie)
else:
print("登录失败")
return
# 读取歌曲数据
songs_data = read_songs_data()
if songs_data:
#print(f"共找到 {len(songs_data)} 首歌曲,提取歌曲 ID 和其他信息...")
song_info_list = get_all_song_info(songs_data)
#print(f"所有歌曲信息: {song_info_list}")
# 执行歌曲导入请求
process_songs(song_info_list, cookie)
else:
print("没有找到任何歌曲数据")
if __name__ == "__main__":
main()