| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- # # Standard Library Imports
- import os
- import time
- # # Third-Party Library Imports
- import requests
- # # Django Imports
- from django.shortcuts import render
- from django.conf import settings
- from django.http import JsonResponse
- from django.views.decorators.csrf import csrf_exempt
- from django.core.files.storage import default_storage
- from django.core.files.base import ContentFile
- from .decorators import login_required
- @login_required
- def img_process(request):
- return render(request, 'img-upload.html')
- MINIMAX_API_KEY = settings.MINIMAX_API_KEY
- VIDEO_GEN_URL = "https://api.minimax.io/v1/video_generation"
- QUERY_URL = "https://api.minimax.io/v1/query/video_generation"
- FILES_URL = "https://api.minimax.io/v1/files/retrieve"
- POLL_INTERVAL = 5 # seconds
- @csrf_exempt
- def process_images(request):
- if request.method != "POST":
- return JsonResponse({"error": "Invalid request method."}, status=405)
- first_frame = request.FILES.get("first_frame")
- last_frame = request.FILES.get("last_frame")
- if not first_frame or not last_frame:
- return JsonResponse({"error": "Both first_frame and last_frame are required."}, status=400)
- try:
- # --- Save uploaded images locally ---
- first_path = default_storage.save(f"uploads/{first_frame.name}", first_frame)
- last_path = default_storage.save(f"uploads/{last_frame.name}", last_frame)
- first_filename = os.path.basename(first_path)
- last_filename = os.path.basename(last_path)
- # --- Build public URLs using ngrok ---
- # Replace this with your current ngrok URL
- NGROK_URL = "https://postcartilaginous-kyler-nonrun.ngrok-free.dev"
- first_url = f"{NGROK_URL}{settings.MEDIA_URL}{first_filename}"
- last_url = f"{NGROK_URL}{settings.MEDIA_URL}{last_filename}"
- # --- Call MiniMax API ---
- headers = {"Authorization": f"Bearer {MINIMAX_API_KEY}"}
- payload = {
- "prompt": "Generate a smooth transition between two frames.",
- "first_frame_image": first_url,
- "last_frame_image": last_url,
- "model": "MiniMax-Hailuo-02",
- "duration": 6,
- "resolution": "1080P"
- }
- response = requests.post(VIDEO_GEN_URL, headers=headers, json=payload)
- response.raise_for_status()
- print("Response", response.json())
- task_id = response.json().get("task_id")
- if not task_id:
- return JsonResponse({"error": "Failed to get task_id from MiniMax API."}, status=500)
- # --- Poll MiniMax until task completes ---
- file_id = None
- while not file_id:
- time.sleep(POLL_INTERVAL)
- status_resp = requests.get(QUERY_URL, headers=headers, params={"task_id": task_id})
- status_resp.raise_for_status()
- status_data = status_resp.json()
- status = status_data.get("status")
- if status == "Success":
- file_id = status_data.get("file_id")
- elif status == "Fail":
- return JsonResponse({"error": status_data.get("error_message", "Video generation failed")}, status=500)
- # --- Get final video download URL ---
- download_resp = requests.get(FILES_URL, headers=headers, params={"file_id": file_id})
- download_resp.raise_for_status()
- download_url = download_resp.json()["file"]["download_url"]
- return JsonResponse({"video_url": download_url})
- except Exception as e:
- return JsonResponse({"error": str(e)}, status=500)
|