107 lines
4.3 KiB
Python
Executable File
107 lines
4.3 KiB
Python
Executable File
from django.shortcuts import get_object_or_404
|
||
from django.http import JsonResponse
|
||
import requests
|
||
from django.views.decorators.csrf import csrf_exempt
|
||
|
||
from .models import VideoGeneration
|
||
@csrf_exempt
|
||
def update_video_status(request, pid, query_type='revid'):
|
||
"""
|
||
查询视频生成状态接口,支持不同的生成接口查询:revid 或 runwayml
|
||
:param pid: 视频生成的 UUID (pid)
|
||
:param query_type: 'revid' 表示查询之前接口,'runwayml' 表示新的接口
|
||
"""
|
||
if query_type == 'revid':
|
||
url = f"https://www.revid.ai/api/public/v2/status?pid={pid}"
|
||
headers = {
|
||
"key": "c4c0f516-33c0-4f5c-9d29-3b1d4e6a93c3",
|
||
"Content-Type": "text/plain"
|
||
}
|
||
elif query_type == 'runwayml':
|
||
url = f"https://api.aivideoapi.com/status?uuid={pid}" # 假设 runwayml 的接口类似,实际接口需替换
|
||
headers = {
|
||
"Authorization": "12e76710fad2047db8c0cc6b25987e2a2", # 替换为你的真实授权密钥
|
||
"Content-Type": "application/json"
|
||
}
|
||
else:
|
||
return JsonResponse({'code': 400, 'message': '无效的查询类型'})
|
||
|
||
try:
|
||
response = requests.get(url, headers=headers)
|
||
response.raise_for_status() # Raises an HTTPError for bad responses
|
||
|
||
data = response.json()
|
||
print(f"查询类型: {query_type}")
|
||
print(f"API响应内容: {data}")
|
||
|
||
# 获取视频生成记录
|
||
video_generation = get_object_or_404(VideoGeneration, pid=pid)
|
||
|
||
if query_type == 'runwayml':
|
||
# RunwayML接口返回的数据
|
||
status = data.get('status')
|
||
progress = data.get('progress', None)
|
||
video_url = data.get('url', None)
|
||
gif_url = data.get('gif_url', None)
|
||
|
||
# 根据不同状态更新数据库
|
||
if status == 'success':
|
||
video_generation.status = 'completed'
|
||
video_generation.video_url = video_url # 更新视频 URL
|
||
elif status in ['in queue', 'submitted']:
|
||
video_generation.status = 'pending'
|
||
elif status == 'submitted' and progress is not None:
|
||
video_generation.status = 'in_progress'
|
||
else:
|
||
video_generation.status = 'failed'
|
||
video_generation.description = 'Video generation failed due to an error.'
|
||
|
||
# 如果视频的gif_url存在,可以记录下来
|
||
if gif_url:
|
||
video_generation.gif_url = gif_url
|
||
|
||
video_generation.save()
|
||
|
||
return JsonResponse({
|
||
'code': 200,
|
||
'message': 'RunwayML 状态更新成功',
|
||
'data': {
|
||
'status': video_generation.status,
|
||
'video_url': video_generation.video_url,
|
||
'progress': progress,
|
||
'gif_url': gif_url
|
||
}
|
||
})
|
||
|
||
else:
|
||
# Revid 接口的处理(保持原来的逻辑)
|
||
success = data.get('success')
|
||
status = data.get('status')
|
||
video_url = data.get('videoUrl', None)
|
||
error_message = data.get('error', '')
|
||
|
||
if video_generation.video_url and video_generation.status == 'completed':
|
||
return JsonResponse({'code': 200, 'message': '视频已生成,状态不需更新'})
|
||
|
||
if success == 1:
|
||
if status == 'ready':
|
||
video_generation.status = 'completed'
|
||
if video_url:
|
||
video_generation.video_url = video_url
|
||
elif status == 'building':
|
||
video_generation.status = 'pending'
|
||
elif status == 'error':
|
||
video_generation.status = 'failed'
|
||
video_generation.description = error_message
|
||
video_generation.save()
|
||
|
||
return JsonResponse({
|
||
'code': 200,
|
||
'message': '状态更新成功',
|
||
'data': {'status': video_generation.status, 'video_url': video_url}
|
||
})
|
||
|
||
except requests.exceptions.RequestException as e:
|
||
print(f"发生错误: {e}")
|
||
return JsonResponse({'code': 500, 'message': str(e)})
|