From 7730d20b4e82a4f8a1b5c126f34b338dbff9a016 Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Thu, 21 Aug 2025 11:08:47 +0800 Subject: [PATCH] 'commit' --- dsLightRag/Routes/JiMengRoute.py | 74 ++++++++++++++++++ .../__pycache__/JiMengRoute.cpython-310.pyc | Bin 3663 -> 5464 bytes dsLightRag/static/JiMeng/video_preview.html | 52 ++++++++++-- 3 files changed, 120 insertions(+), 6 deletions(-) diff --git a/dsLightRag/Routes/JiMengRoute.py b/dsLightRag/Routes/JiMengRoute.py index 70e611bf..1e626714 100644 --- a/dsLightRag/Routes/JiMengRoute.py +++ b/dsLightRag/Routes/JiMengRoute.py @@ -7,6 +7,10 @@ from fastapi import HTTPException from JiMeng.Kit.FenJingTouGenerator import FenJingTouGenerator # 导入分镜头生成器 from JiMeng.Kit.JmImg2VideoUtil import JmImg2Video # 导入视频生成工具 from JiMeng.Kit.JmTxt2ImgUtil import JmTxt2Img +import os +import uuid +import requests +from Util.ObsUtil import ObsUploader # 创建路由路由器 router = APIRouter(prefix="/api/jimeng", tags=["即梦"]) @@ -145,3 +149,73 @@ async def query_video_task(request: fastapi.Request): logger.error(f"视频任务查询失败: {str(e)}") raise HTTPException(status_code=500, detail=f"视频任务查询失败: {str(e)}") + +@router.post("/upload_url_to_obs") +async def upload_url_to_obs(request: fastapi.Request): + try: + data = await request.json() + url = data.get("url") + + if not url: + raise HTTPException(status_code=400, detail="缺少URL参数") + + logger.info(f"收到URL上传请求,URL: {url}") + + # 使用UUID生成唯一文件名 + unique_id = uuid.uuid4() + object_key = f"HuangHai/JiMeng/{unique_id}.mp4" + + # 临时文件保存路径 + temp_file_path = os.path.join(os.path.dirname(__file__), f"{unique_id}.mp4") + + try: + # 下载URL内容到临时文件 + logger.info(f"开始下载URL内容: {url}") + with requests.get(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 + 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}") + return { + "code": 200, + "message": "成功", + "data": { + "obs_url": obs_url, + "object_key": object_key + } + } + else: + error_msg = f"上传失败: {str(response_info)}" + logger.error(error_msg) + raise HTTPException(status_code=500, detail=error_msg) + + finally: + # 清理临时文件 + if os.path.exists(temp_file_path): + os.remove(temp_file_path) + logger.info(f"临时文件已删除: {temp_file_path}") + + except HTTPException as e: + logger.error(f"请求参数错误: {str(e.detail)}") + raise e + except Exception as e: + logger.error(f"URL上传处理失败: {str(e)}") + raise HTTPException(status_code=500, detail=f"URL上传处理失败: {str(e)}") + diff --git a/dsLightRag/Routes/__pycache__/JiMengRoute.cpython-310.pyc b/dsLightRag/Routes/__pycache__/JiMengRoute.cpython-310.pyc index c341e1cb1345b30abb204a417611387331ddcc96..b8a887450cb63d7c3b55e52a9ce9c6648fc4c43a 100644 GIT binary patch delta 2721 zcma)8U2Ggz6`p%%_HXuYytdbWYiE;SU_-E>stCAgshV1iD6~@C)O4X*HojwfHr}1h zotZi@vuqNVHcD&7VaiXHMy#d&h=-<0UD^Z^c;Jx-o)9p+^ug=85>f?kRKn$)yXzmR zsbEL<%7>*(O<9~Jo>dk} zzFQ#4U5Lgy1dvtjCjPI0(6Jve$}{&o zV=&$1UqbhH35XvA;Je=U)Nhi5t5?)s5)>D_^??%zrPB}V1QxJg^Fk?UTKMnhUHR8I!Bhtg5XWI}<9(zK)f>STsV1|aD_?1>ImHz9IpV za04v1NH3*pAvah`;*MS-4@*ynYGF6j(A+TS*QHZWO-f8s;98W4R0)4ovQEx}VZ5G# z@hNm+H!A2P-M}`Tjzy^!5wjZ3vJO`POhKw{q?B?4uEJ7F^!v1?)}pRj=YPkdG1pn{ zs>RCPwK$Pjw;Kn=v>OB2Bh-VngfQ9bCbk?gC>w49j19a(S>_daQW6!xG-bpC`PWdS3;IyLK5P8KX< zL3gmAZR?}C`kgz?YcH-}SOywvzrWgi^A{V>ua0FMEU8;gk?i``b?dCh{KYzDP`n|WC7aAYF{3`IqchR!jeD%i0JFkt^vm9$~tEFJ3!Nt~sXFphe zuDvXq%iO)ofQGL)j=}r@%6olkTD~H(pp;Cb;)j^QE5)+zhYJOfp@JXgIutd_wtS7( zi-ra5#N>rmA@miqs#pA&Ve5RW>G^?qj{igGEZQ!4Xv>cuF)P!?%t-6T4`C!<$5lc7 zw1EzSTrZo?=&cqgs`5@B?7)ItZ#VF-pjO1G7{CmB5~kBn*m}9zVl5&f+$Yn1KzvX6 zn8X6U4K-k$HOWpCKQ#V2;I~aP$S{98h~lI(@j1Bo^$=)gYk2F_yfrGFp47} z^0DK#F*kz8B)IdC_q+JsIvzdX^_!OMhmN)0G9N~b11PZFa_n5f?5@*=IA@3igb$ZZ p=FI62;J&d&K!l|*L=2aZVTcyvO~|SomLc{57{f63!5D-<{|lV{);0hD delta 983 zcma)4&ubGw6wV~+Zgw}D-$_#&YMZ3$wy_5R79t1Q$+aqJ zv4&$?V^k9vngRd^GzJBTyzBKypP%%EjeHPC zc5Upae;UlK|4Thc7!y#6Uh5EgvnXG4QvXHXEoHh-hgunin~00l=|P=y2V;d;#+E n1IL;U?p!5BBr4jF4|oFJAQHdCkWcpod@&T56l+$jYzqAbMRC*f diff --git a/dsLightRag/static/JiMeng/video_preview.html b/dsLightRag/static/JiMeng/video_preview.html index 81a745f1..02844f1b 100644 --- a/dsLightRag/static/JiMeng/video_preview.html +++ b/dsLightRag/static/JiMeng/video_preview.html @@ -48,7 +48,8 @@ } .video-player { max-width: 100%; - max-height: 600px; + max-height: 800px; /* 增加最大高度 */ + width: 100%; /* 宽度充满容器 */ border-radius: 6px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); display: none; @@ -186,12 +187,51 @@ // 视频生成完成 loading.style.display = 'none'; progress.style.width = '100%'; - progressText.textContent = '生成完成'; + progressText.textContent = '生成完成,正在保存到OBS...'; - // 设置视频源 - videoPlayer.src = statusInfo.video_url; - videoPlayer.style.display = 'block'; - downloadBtn.style.display = 'inline-block'; + // 调用接口将视频保存到OBS + fetch('/api/jimeng/upload_url_to_obs', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + url: statusInfo.video_url, + object_key_prefix: 'jimeng_videos/' + }) + }) + .then(response => { + if (!response.ok) { + throw new Error('保存到OBS失败'); + } + return response.json(); + }) + .then(obsData => { + if (obsData.code === 200) { + // 获取OBS下载URL + const obsVideoUrl = obsData.data.obs_url; + progressText.textContent = '已保存到OBS'; + + // 设置视频源为OBS URL + videoPlayer.src = obsVideoUrl; + videoPlayer.style.display = 'block'; + downloadBtn.style.display = 'inline-block'; + } else { + progressText.textContent = '保存到OBS失败: ' + obsData.message; + // 仍然使用原始URL播放 + videoPlayer.src = statusInfo.video_url; + videoPlayer.style.display = 'block'; + downloadBtn.style.display = 'inline-block'; + } + }) + .catch(error => { + console.error('保存到OBS时出错:', error); + progressText.textContent = '保存到OBS出错: ' + error.message; + // 仍然使用原始URL播放 + videoPlayer.src = statusInfo.video_url; + videoPlayer.style.display = 'block'; + downloadBtn.style.display = 'inline-block'; + }); } else if (statusInfo.status === 'failed') { // 视频生成失败 loading.textContent = '视频生成失败: ' + statusInfo.error_msg;