From c4c2e9f034ebf19a1c7e59b05017e0ad09682197 Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Thu, 21 Aug 2025 14:50:28 +0800 Subject: [PATCH] 'commit' --- dsLightRag/Routes/SunoRoute.py | 55 ++++++++++++++++-- .../__pycache__/SunoRoute.cpython-310.pyc | Bin 5101 -> 6168 bytes dsLightRag/static/Suno/index.html | 6 +- dsLightRag/static/Suno/music_progress.html | 31 +++++----- 4 files changed, 70 insertions(+), 22 deletions(-) diff --git a/dsLightRag/Routes/SunoRoute.py b/dsLightRag/Routes/SunoRoute.py index 583b580f..64dde133 100644 --- a/dsLightRag/Routes/SunoRoute.py +++ b/dsLightRag/Routes/SunoRoute.py @@ -3,6 +3,8 @@ import json import time import datetime import requests +import uuid # 新增:导入uuid模块 +import os # 新增:导入os模块 from typing import Optional import fastapi @@ -201,12 +203,53 @@ async def check_task_status(task_id: str = Query(..., description="音乐生成 task_info["audio_url"] = audio_url logger.info("音乐生成已完成!") logger.info(f"音频URL: {audio_url}") + + # 新增:下载音频文件并上传到OBS + try: + # 使用UUID生成唯一文件名 + unique_id = uuid.uuid4() + object_key = f"HuangHai/JiMeng/{unique_id}.mp3" + + # 临时文件保存路径 + temp_file_path = os.path.join(os.path.dirname(__file__), f"{unique_id}.mp3") + + # 下载URL内容到临时文件 + logger.info(f"开始下载URL内容: {audio_url}") + with requests.get(audio_url, stream=True, timeout=3600) as r: + r.raise_for_status() + with open(temp_file_path, 'wb') as f: + for chunk in r.iter_content(chunk_size=8192): + f.write(chunk) + logger.info(f"URL内容下载完成,保存至: {temp_file_path}") + + # 上传文件到OBS + from Util.ObsUtil import ObsUploader # 导入ObsUploader + obs_uploader = ObsUploader() + logger.info(f"开始上传文件到OBS: {temp_file_path}\n对象键: {object_key}") + + # 正确处理元组返回值 + success, response_info = obs_uploader.upload_file( + file_path=temp_file_path, + object_key=object_key + ) + + if success: + # 构造OBS URL + from Config.Config import OBS_SERVER, OBS_BUCKET + obs_url = f"https://{OBS_BUCKET}.{OBS_SERVER}/{object_key}" + logger.info(f"文件上传成功,OBS URL: {obs_url}") + task_info["obs_url"] = obs_url + task_info["object_key"] = object_key + else: + error_msg = f"上传失败: {str(response_info)}" + logger.error(error_msg) + finally: + # 清理临时文件 + if os.path.exists(temp_file_path): + os.remove(temp_file_path) + logger.info(f"临时文件已删除: {temp_file_path}") + # 新增结束 - # 下载音频文件 - file_name = f"suno_music_{int(time.time())}.mp3" - save_path = music_generator.base_path / file_name - if music_generator.download_audio(audio_url, str(save_path)): - task_info["local_path"] = str(save_path) else: logger.warning("音乐生成已完成,但未找到音频URL!") @@ -225,7 +268,7 @@ async def check_task_status(task_id: str = Query(..., description="音乐生成 "status": status, "title": title, "audio_url": audio_url if status == "complete" else None, - "local_path": task_info.get("local_path") if status == "complete" else None, + "obs_url": task_info.get("obs_url") if status == "complete" else None, # 新增:返回OBS URL "error_message": task_info.get("error_message") if status == "failed" else None } } diff --git a/dsLightRag/Routes/__pycache__/SunoRoute.cpython-310.pyc b/dsLightRag/Routes/__pycache__/SunoRoute.cpython-310.pyc index cb1589208487beb2fc80f0e1cc41630d0cc35bad..b4462c6fe34c00d8c7e69090c750e0833988ffef 100644 GIT binary patch delta 2192 zcmZ`&YiwM_6`q-W-(9coKKzKEOF|xwQyY^&TGu2r4-!HlX`F|+kghhK@#b#sy}R5; z-I&>KgacR!R!lE~Ac)wNXp4{tq>gB!234p+>d*e+&;9L96SY;PO8rwL!T1=M|NslXWJ)tE0SWs)zlS3*(Nnyk!8lll5rm+R0 zq#3GbShj(c4wfo)DqZ^!m1z7NIz;0vITuj6nasN8u(C!)N)JoddugJ9X&dXFCNxRg z&jlgY2mXF4H!w@k6iw620-44%%LV|`K|9Zd05iDMjW1!`yL6Sj8^Rmhr=x#s&%vqV zF#Za|Iu>%b#zq5Vc5I2oA~;UW2YF%-TEr)Q>pIfK$bY%Kh|Pbw@%a6<*}vQAdZvM@ zDY}-Y-avHS*9*Bq*L`-oA2p!e}K z;DSPYjdz#&d4{Ly*aCT)RM%8{_!?-=HAry3HlPnyd-Ytk53YSH?*r;K-V62tKS8+K z?MX{H4_!t6^M{c$XhyKt)1QhwMw%z-#A&if%%CVt9}-?3u1jy{+V%eeaHzm+pEqOn1K- zApWII`WH9ZI?^6dzEy?prNjPL8>Wx62*=SR+`qk{w6V0QG_*+0oW`g+h|#QgaBJy4 zKDgRs8`1rAAGCF_)m9ofmn%XE5YQlr{tZ!Z-MjevAKTi+@BU{Z4{mpuhVK z`hjoJ5ByO188r0R(r1Yvsm;p!oq|!^UrF8Gf&Z=P-b;llFu z3%5V|=;+~}H(z+ZdF94J!$HcW1P-g>MVQ0 z5y3CXtz6A3FWs77{LjsomTP~x+oe^nhp&=i|iHI}aw>{FgpK3QT@cK$Rw z0|5yr`N_S9kL^9&TJJi#`?1>IBeT&{wq3EtM@Kz8@_#()3_#LWo#pF(&H2UV`L{qV zB*?)@#&cezeA3E0re+=ltOLzJEok%YtGBQH4upyBEnmNO>$MN>D*n?SoAdQMufGkk z5s2M+Yiaq$;y+$-hueAoP}p1#K66NzM}*lY%n@OZxu3Le9QuBQCu!xWg61FAJO*f| z#~qV9+<^QP-s0xvQZ48>D)mCbZu3al@`8S2B2+bvg3i2XKJT|H?*+>hW_StJW@dh> zY}m}Oz0iyadoOX+R<#jvD=?dnLme;f_!s1py|&$DV_Geav?lYAko^l`QuhcuAqZji zYt^zXFKjZs{43@~W(uaE8bvpqn!q{tU}~=B80s?)%d6CHs+Y8xUTLZGHDlAm(_YAb zSuGI>{}S%L6fa^qQ&Y^cyf%|rm9k+$Dr36*H94Z6UW}P$+05%!(cCH2Wmk>+zf^Z* z7Isz;yV>*}EV)mn*Bv5(C`sVHfE-BUC{AD*Co%ba;B#_zU_}lk0%6>Vg8_mGmR71FHhHQPCise;oZY4v%7*5bz^1>2oeNGG9~sE9m$QGaW`QmT-lU+ zdl4t;DyGuQqt1YQJcxm5vGOzlV5<}l+&Fx>%L#tdqx9|)^}hCRw^ zvY6YCvYN4zA{+q>o%|*|i^3Fj;(w(KcFH7+KUg&X6zQjlIT5zkPBsz}B*1q=z-Z^fbdV3V7IXwA zn&{^t;8dA-gMrW<#OV$I@w8CIOW*ODj~P3J1E)-~yAsc~8E0M!tBSe3O)xPL9=xaKTJA zH@rs0-DuYCR<k>1nm zpNTau=thE?Yj;z9ldA36z7;h5ZsJ?3Y4>bQ6&stL)3C5&ZD6h8XP8%4+O&MH=2iVN zThTqE3{h#)7SNz9(>Ig-+$yFZ#E6{t<^I a4%az+&4EwsSLn<9rPyVb#tHp5U;Gc3i4}$b diff --git a/dsLightRag/static/Suno/index.html b/dsLightRag/static/Suno/index.html index 52cc3714..824f8bd9 100644 --- a/dsLightRag/static/Suno/index.html +++ b/dsLightRag/static/Suno/index.html @@ -441,11 +441,11 @@ generateMusicBtn.disabled = false; generateMusicBtn.innerHTML = ' 生成音乐'; - if (data.id) { + if (data.data && data.data.task_id) { // 跳转到进度页面 - window.location.href = `/static/Suno/music_progress.html?task_id=${data.id}`; + window.location.href = `/static/Suno/music_progress.html?task_id=${data.data.task_id}`; } else { - alert('生成音乐任务失败: ' + (data.error || '未知错误')); + alert('生成音乐任务失败: ' + (data.error || data.message || '未知错误')); } }) .catch(error => { diff --git a/dsLightRag/static/Suno/music_progress.html b/dsLightRag/static/Suno/music_progress.html index df236d1c..91d3fc03 100644 --- a/dsLightRag/static/Suno/music_progress.html +++ b/dsLightRag/static/Suno/music_progress.html @@ -76,9 +76,12 @@ const progressFill = document.getElementById('progressFill'); const progressText = document.getElementById('progressText'); - if (data.status === 'error') { + // 正确获取数据部分 + const responseData = data.data || data; + + if (responseData.status === 'error') { clearInterval(progressInterval); - statusMessage.innerHTML = ` 生成失败: ${data.error || '未知错误'}`; + statusMessage.innerHTML = ` 生成失败: ${responseData.error || responseData.error_message || '未知错误'}`; statusMessage.style.backgroundColor = '#ffebee'; statusMessage.style.borderColor = '#ef9a9a'; return; @@ -87,22 +90,24 @@ statusMessage.innerHTML = ` ${data.message || '正在生成音乐...'}`; // 更新进度条 - if (data.progress) { - progress = Math.min(data.progress, 100); - } else if (data.status === 'completed') { + if (responseData.progress) { + progress = Math.min(responseData.progress, 100); + } else if (responseData.status === 'completed') { progress = 100; - } else if (data.status === 'processing') { - // 如果没有具体进度,模拟进度增加 - if (progress < 90) { - progress += 1; + } else if (responseData.status === 'processing') { + // 改进模拟进度增加逻辑 + if (progress < 95) { + progress += 0.5; + } else if (progress < 100) { + progress += 0.1; } } progressFill.style.width = `${progress}%`; - progressText.textContent = `${progress}%`; + progressText.textContent = `${Math.round(progress)}%`; // 任务完成 - if (data.status === 'completed') { + if (responseData.status === 'completed') { clearInterval(progressInterval); statusMessage.innerHTML = ' 音乐生成完成!'; statusMessage.style.backgroundColor = '#e8f5e9'; @@ -113,9 +118,9 @@ playerContainer.style.display = 'block'; // 设置音乐标题和源 - document.getElementById('musicTitle').textContent = data.title || '生成的音乐'; + document.getElementById('musicTitle').textContent = responseData.title || '生成的音乐'; const audioSource = document.getElementById('audioSource'); - audioSource.src = data.audio_url || ''; + audioSource.src = responseData.audio_url || ''; document.getElementById('audioPlayer').load(); } })