freeai-app commited on
Commit
13263d1
·
verified ·
1 Parent(s): 3198ce3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +17 -27
app.py CHANGED
@@ -22,11 +22,11 @@ def slugify(text):
22
  return text.strip("_")
23
 
24
  def get_next_file(base_name):
25
- """Auto-increment file names: journal_001.mp4, 002, etc."""
26
  existing = glob.glob(f"{base_name}_*.mp4")
27
  if not existing:
28
  return f"{base_name}_001.mp4"
29
- nums = [int(re.search(r"_(\d+).mp4", f).group(1)) for f in existing if re.search(r"_(\d+).mp4", f)]
30
  next_num = max(nums) + 1 if nums else 1
31
  return f"{base_name}_{next_num:03d}.mp4"
32
 
@@ -53,7 +53,7 @@ def generate_image(prompt):
53
  def create_video(prompt, journal_text, duration, bg_music, user_music, add_voice, owner_token):
54
  status = "🚀 Starting video generation..."
55
 
56
- # -------- Access Rules ----------
57
  if owner_token != OWNER_TOKEN:
58
  journal_text = "" # hide journal for public
59
  if duration > 10:
@@ -63,46 +63,36 @@ def create_video(prompt, journal_text, duration, bg_music, user_music, add_voice
63
  return None, None, "⚠️ Owner limit is 600s (10 minutes). Reduce duration."
64
 
65
  try:
66
- # -------- Generate image ----------
67
  status = "🖼️ Generating image..."
68
  image_path = generate_image(prompt)
69
 
70
- # -------- Create video clip ----------
71
  status = "🎬 Creating video clip..."
72
  clip = ImageClip(image_path, duration=duration)
73
 
74
  # Force 1080p, 30fps
75
  clip = clip.resize(height=1080).set_fps(30)
76
 
77
- # -------- Background music ----------
78
  audio_clips = []
79
  if user_music is not None:
80
  audio_clips.append(AudioFileClip(user_music))
81
- elif bg_music != "none":
82
- bg_path = f"music/{bg_music}.mp3"
83
- if os.path.exists(bg_path):
84
- audio_clips.append(AudioFileClip(bg_path).volumex(0.5))
85
-
86
- # -------- Optional voice narration (owner only) ----------
87
- if add_voice and owner_token == OWNER_TOKEN and journal_text.strip():
88
- narration_path = "narration.txt"
89
- with open(narration_path, "w") as f:
90
- f.write(journal_text)
91
- # Placeholder for TTS model (can be added later)
92
- # audio_clips.append(AudioFileClip(narration_path))
93
-
94
- # -------- Combine audio ----------
95
  if audio_clips:
96
- final_audio = audio_clips[0]
97
- for ac in audio_clips[1:]:
98
- final_audio = CompositeAudioClip([final_audio, ac])
99
  clip = clip.set_audio(final_audio)
100
 
101
- # -------- Export video ----------
102
- out_path = get_next_file("journal")
103
- clip.write_videofile(out_path, codec="libx264", audio_codec="aac", fps=30)
104
 
105
- return out_path, image_path, "✅ Video generated successfully!"
106
 
107
  except Exception as e:
108
  return None, None, f"❌ Error: {str(e)}"
 
22
  return text.strip("_")
23
 
24
  def get_next_file(base_name):
25
+ """Increment file names: journal_001.mp4, 002, etc."""
26
  existing = glob.glob(f"{base_name}_*.mp4")
27
  if not existing:
28
  return f"{base_name}_001.mp4"
29
+ nums = [int(re.search(r'(\d+).mp4', f).group(1)) for f in existing if re.search(r'(\d+).mp4', f)]
30
  next_num = max(nums) + 1 if nums else 1
31
  return f"{base_name}_{next_num:03d}.mp4"
32
 
 
53
  def create_video(prompt, journal_text, duration, bg_music, user_music, add_voice, owner_token):
54
  status = "🚀 Starting video generation..."
55
 
56
+ # -------- Access Rules --------
57
  if owner_token != OWNER_TOKEN:
58
  journal_text = "" # hide journal for public
59
  if duration > 10:
 
63
  return None, None, "⚠️ Owner limit is 600s (10 minutes). Reduce duration."
64
 
65
  try:
66
+ # -------- Generate image --------
67
  status = "🖼️ Generating image..."
68
  image_path = generate_image(prompt)
69
 
70
+ # -------- Create video clip --------
71
  status = "🎬 Creating video clip..."
72
  clip = ImageClip(image_path, duration=duration)
73
 
74
  # Force 1080p, 30fps
75
  clip = clip.resize(height=1080).set_fps(30)
76
 
77
+ # -------- Background music --------
78
  audio_clips = []
79
  if user_music is not None:
80
  audio_clips.append(AudioFileClip(user_music))
81
+ if bg_music != "none":
82
+ try:
83
+ audio_clips.append(AudioFileClip(f"music/{bg_music}.mp3"))
84
+ except:
85
+ pass
86
+
 
 
 
 
 
 
 
 
87
  if audio_clips:
88
+ final_audio = CompositeAudioClip(audio_clips).set_duration(clip.duration)
 
 
89
  clip = clip.set_audio(final_audio)
90
 
91
+ # -------- Save video --------
92
+ out_file = get_next_file("journal")
93
+ clip.write_videofile(out_file, codec="libx264", audio_codec="aac")
94
 
95
+ return out_file, image_path, "✅ Video generation complete!"
96
 
97
  except Exception as e:
98
  return None, None, f"❌ Error: {str(e)}"