osnarayana commited on
Commit
e2fc4a2
·
1 Parent(s): c78f8d1

Fix video_service.py

Browse files
Files changed (1) hide show
  1. app/services/video_service.py +10 -13
app/services/video_service.py CHANGED
@@ -45,16 +45,15 @@ def generate_video_file(script: str, duration: int = None) -> str:
45
  tts = gTTS(text=script, lang='en')
46
  tts.save(audio_path)
47
 
48
- # Get audio duration (fallback if 0)
49
  audio = MP3(audio_path)
50
- audio_duration = max(audio.info.length, 3.0) # ensure at least 3s
51
 
52
- # Step 2: Fetch Unsplash images
53
  images = fetch_unsplash_images(script, count=3)
54
  if not images:
55
  raise Exception("No images found from Unsplash for the prompt")
56
 
57
- # Step 3: Create slideshow clips
58
  clips = []
59
  per_image_duration = audio_duration / len(images)
60
  tmp_files = []
@@ -70,28 +69,26 @@ def generate_video_file(script: str, duration: int = None) -> str:
70
  clip = ImageClip(tmp_file).resize(height=720).set_duration(per_image_duration)
71
  clips.append(clip)
72
 
73
- # Step 4: Concatenate and set duration
74
- final_clip = concatenate_videoclips(clips, method="compose")
75
- final_clip = final_clip.set_duration(audio_duration)
76
-
77
- # Step 5: Add audio
78
  final_clip = final_clip.set_audio(AudioFileClip(audio_path))
79
 
80
- # Step 6: Export video
81
  final_clip.write_videofile(
82
  video_path,
83
  fps=24,
84
  codec="libx264",
85
  audio_codec="aac",
86
  threads=4,
87
- preset="ultrafast"
 
 
88
  )
89
 
90
- # Cleanup temp images
91
  for file in tmp_files:
92
  try:
93
  os.remove(file)
94
  except:
95
  pass
96
 
97
- return video_filename
 
45
  tts = gTTS(text=script, lang='en')
46
  tts.save(audio_path)
47
 
48
+ # Step 2: Get audio duration
49
  audio = MP3(audio_path)
50
+ audio_duration = max(audio.info.length, 3.0)
51
 
52
+ # Step 3: Fetch Unsplash images
53
  images = fetch_unsplash_images(script, count=3)
54
  if not images:
55
  raise Exception("No images found from Unsplash for the prompt")
56
 
 
57
  clips = []
58
  per_image_duration = audio_duration / len(images)
59
  tmp_files = []
 
69
  clip = ImageClip(tmp_file).resize(height=720).set_duration(per_image_duration)
70
  clips.append(clip)
71
 
72
+ final_clip = concatenate_videoclips(clips, method="compose").set_duration(audio_duration)
 
 
 
 
73
  final_clip = final_clip.set_audio(AudioFileClip(audio_path))
74
 
75
+ # Use /tmp temp audio to avoid "generated" folder
76
  final_clip.write_videofile(
77
  video_path,
78
  fps=24,
79
  codec="libx264",
80
  audio_codec="aac",
81
  threads=4,
82
+ preset="ultrafast",
83
+ temp_audiofile="/tmp/temp-audio.m4a",
84
+ remove_temp=True
85
  )
86
 
87
+ # Cleanup
88
  for file in tmp_files:
89
  try:
90
  os.remove(file)
91
  except:
92
  pass
93
 
94
+ return video_filename