This commit is contained in:
@@ -509,6 +509,93 @@ def upload_audio(request):
|
||||
logger.error(f"Upload error: {e}")
|
||||
return JsonResponse({'success': False, 'message': str(e)})
|
||||
|
||||
@judge_required
|
||||
@csrf_exempt
|
||||
def upload_audio_url(request):
|
||||
"""
|
||||
处理 URL 上传音频的 API
|
||||
通过给定的音频 URL 直接进行处理,无需上传文件
|
||||
"""
|
||||
role = request.session.get('judge_role')
|
||||
if role not in ['judge', 'guest']:
|
||||
return JsonResponse({'success': False, 'message': 'Permission denied'})
|
||||
|
||||
if request.method != 'POST':
|
||||
return JsonResponse({'success': False, 'message': 'Method not allowed'})
|
||||
|
||||
import json
|
||||
try:
|
||||
data = json.loads(request.body)
|
||||
except json.JSONDecodeError:
|
||||
return JsonResponse({'success': False, 'message': 'Invalid JSON'})
|
||||
|
||||
audio_url = data.get('url')
|
||||
project_id = data.get('project_id')
|
||||
|
||||
if not audio_url or not project_id:
|
||||
return JsonResponse({'success': False, 'message': 'Missing url or project_id'})
|
||||
|
||||
# 验证 URL 格式
|
||||
if not audio_url.startswith(('http://', 'https://')):
|
||||
return JsonResponse({'success': False, 'message': 'Invalid URL format'})
|
||||
|
||||
judge_id = request.session['judge_id']
|
||||
|
||||
try:
|
||||
# 验证权限
|
||||
user = WeChatUser.objects.get(id=judge_id)
|
||||
project = Project.objects.get(id=project_id)
|
||||
|
||||
enrollment = CompetitionEnrollment.objects.filter(
|
||||
user=user,
|
||||
role=role,
|
||||
competition=project.competition
|
||||
).first()
|
||||
|
||||
if not enrollment:
|
||||
return JsonResponse({'success': False, 'message': 'No permission for this project'})
|
||||
|
||||
# 创建任务记录,使用 URL 作为 file_url
|
||||
service = AliyunTingwuService()
|
||||
|
||||
task = TranscriptionTask.objects.create(
|
||||
project=project,
|
||||
file_url=audio_url,
|
||||
status=TranscriptionTask.Status.PENDING
|
||||
)
|
||||
|
||||
# 调用 Tingwu 服务
|
||||
try:
|
||||
tingwu_response = service.create_transcription_task(audio_url)
|
||||
|
||||
if 'Data' in tingwu_response and isinstance(tingwu_response['Data'], dict):
|
||||
task_id = tingwu_response['Data'].get('TaskId')
|
||||
else:
|
||||
task_id = tingwu_response.get('TaskId')
|
||||
|
||||
if task_id:
|
||||
task.task_id = task_id
|
||||
task.status = TranscriptionTask.Status.PROCESSING
|
||||
task.save()
|
||||
|
||||
log_audit(request, 'UPLOAD_AUDIO_URL', f"Task {task.id}", 'SUCCESS')
|
||||
return JsonResponse({'success': True, 'task_id': task.id, 'file_url': audio_url})
|
||||
else:
|
||||
task.status = TranscriptionTask.Status.FAILED
|
||||
task.error_message = "No TaskId returned"
|
||||
task.save()
|
||||
return JsonResponse({'success': False, 'message': 'Failed to create Tingwu task'})
|
||||
|
||||
except Exception as e:
|
||||
task.status = TranscriptionTask.Status.FAILED
|
||||
task.error_message = str(e)
|
||||
task.save()
|
||||
return JsonResponse({'success': False, 'message': f'Tingwu Error: {e}'})
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Upload URL error: {e}")
|
||||
return JsonResponse({'success': False, 'message': str(e)})
|
||||
|
||||
@judge_required
|
||||
def ai_manage(request):
|
||||
# Contestants cannot access AI manage
|
||||
|
||||
Reference in New Issue
Block a user