143 lines
5.2 KiB
Python
Executable File
143 lines
5.2 KiB
Python
Executable File
import requests
|
|
from django.http import JsonResponse
|
|
from .models import VideoGeneration
|
|
from django.views.decorators.csrf import csrf_exempt
|
|
from django.utils.decorators import method_decorator
|
|
|
|
@method_decorator(csrf_exempt, name='dispatch')
|
|
def text_to_video(request):
|
|
"""
|
|
接口:根据文本描述生成视频
|
|
"""
|
|
if request.method == "POST":
|
|
try:
|
|
user = request.user
|
|
data = request.POST
|
|
|
|
# 生成视频ID
|
|
video_id = generate_video_id(user.id)
|
|
|
|
# 获取参数
|
|
text_prompt = data.get('text_prompt')
|
|
model = data.get('model', 'gen3')
|
|
width = int(data.get('width', 640))
|
|
height = int(data.get('height', 480))
|
|
motion = int(data.get('motion', 5))
|
|
seed = int(data.get('seed', 0))
|
|
upscale = data.get('upscale', 'false') == 'true'
|
|
interpolate = data.get('interpolate', 'false') == 'true'
|
|
callback_url = data.get('callback_url', '')
|
|
time_duration = int(data.get('time', 5))
|
|
|
|
# 准备POST请求数据
|
|
payload = {
|
|
"text_prompt": text_prompt,
|
|
"model": model,
|
|
"width": width,
|
|
"height": height,
|
|
"motion": motion,
|
|
"seed": seed,
|
|
"upscale": upscale,
|
|
"interpolate": interpolate,
|
|
"callback_url": callback_url,
|
|
"time": time_duration
|
|
}
|
|
|
|
# 发送请求到API
|
|
response = requests.post('https://api.aivideoapi.com/runway/generate/text', json=payload)
|
|
|
|
# 解析响应数据
|
|
if response.status_code == 200:
|
|
res_data = response.json()
|
|
uuid = res_data.get('uuid')
|
|
|
|
# 保存生成记录到数据库
|
|
video_generation = VideoGeneration.objects.create(
|
|
video_id=video_id,
|
|
user=user,
|
|
text=text_prompt,
|
|
status='in_progress',
|
|
pid=uuid,
|
|
ratio=f"{width}:{height}"
|
|
)
|
|
video_generation.save()
|
|
|
|
return JsonResponse({'code': 200, 'message': '请求成功', 'data': {'pid': uuid}})
|
|
|
|
else:
|
|
return JsonResponse({'code': response.status_code, 'message': 'API请求失败', 'data': {}})
|
|
|
|
except Exception as e:
|
|
return JsonResponse({'code': 500, 'message': f'内部错误: {str(e)}', 'data': {}})
|
|
|
|
return JsonResponse({'code': 405, 'message': '请求方法错误', 'data': {}})
|
|
|
|
|
|
@method_decorator(csrf_exempt, name='dispatch')
|
|
def image_to_video(request):
|
|
"""
|
|
接口:根据图片生成视频
|
|
"""
|
|
if request.method == "POST":
|
|
try:
|
|
user = request.user
|
|
data = request.POST
|
|
|
|
# 生成视频ID
|
|
video_id = generate_video_id(user.id)
|
|
|
|
# 获取参数
|
|
text_prompt = data.get('text_prompt')
|
|
model = data.get('model', 'gen3')
|
|
img_prompt = data.get('img_prompt')
|
|
image_as_end_frame = data.get('image_as_end_frame', 'false') == 'true'
|
|
motion = int(data.get('motion', 5))
|
|
seed = int(data.get('seed', 0))
|
|
upscale = data.get('upscale', 'false') == 'true'
|
|
interpolate = data.get('interpolate', 'false') == 'true'
|
|
callback_url = data.get('callback_url', '')
|
|
time_duration = int(data.get('time', 5))
|
|
|
|
# 准备POST请求数据
|
|
payload = {
|
|
"text_prompt": text_prompt,
|
|
"model": model,
|
|
"img_prompt": img_prompt,
|
|
"image_as_end_frame": image_as_end_frame,
|
|
"motion": motion,
|
|
"seed": seed,
|
|
"upscale": upscale,
|
|
"interpolate": interpolate,
|
|
"callback_url": callback_url,
|
|
"time": time_duration
|
|
}
|
|
|
|
# 发送请求到API
|
|
response = requests.post('https://api.aivideoapi.com/runway/generate/imageDescription', json=payload)
|
|
|
|
# 解析响应数据
|
|
if response.status_code == 200:
|
|
res_data = response.json()
|
|
uuid = res_data.get('uuid')
|
|
|
|
# 保存生成记录到数据库
|
|
video_generation = VideoGeneration.objects.create(
|
|
video_id=video_id,
|
|
user=user,
|
|
text=text_prompt,
|
|
status='in_progress',
|
|
pid=uuid,
|
|
ratio="auto"
|
|
)
|
|
video_generation.save()
|
|
|
|
return JsonResponse({'code': 200, 'message': '请求成功', 'data': {'pid': uuid}})
|
|
|
|
else:
|
|
return JsonResponse({'code': response.status_code, 'message': 'API请求失败', 'data': {}})
|
|
|
|
except Exception as e:
|
|
return JsonResponse({'code': 500, 'message': f'内部错误: {str(e)}', 'data': {}})
|
|
|
|
return JsonResponse({'code': 405, 'message': '请求方法错误', 'data': {}})
|