File size: 3,689 Bytes
89193d4 508b017 89193d4 62d483c 77b90e5 0fd6348 e5ecc3a 6ec513d 5c45900 6ec513d 89193d4 3f6bd82 3bde6e5 9b19eb5 77f733f 21b11ab dc85dd8 e5ecc3a 36e3155 ebd1c2f e9902d8 8c36521 e9902d8 8c36521 ebd1c2f e9902d8 ebd1c2f e9902d8 ebd1c2f 8c36521 e9902d8 8c36521 ebd1c2f 8c36521 e9902d8 ebd1c2f e9902d8 77f733f e5ecc3a 8bacd57 924c7a9 0fd6348 8bacd57 0fd6348 508b017 0fd6348 35b33ac 6ec513d 3bde6e5 89193d4 3bde6e5 89193d4 3bde6e5 3f6bd82 0fd6348 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
from flask import Flask, request, jsonify, send_file
from moviepy.editor import ColorClip,ImageClip, concatenate_videoclips
import traceback
import uuid
import glob
import os
import asyncio
from image_fetcher import main
from video import create_text_image
app = Flask(__name__)
@app.route("/")
def home():
return "Flask Video Generator is Running"
@app.route("/generate", methods=["POST"])
def generate_video():
try:
data = request.get_json()
prompt = data.get("duration", '').strip()
prompts=prompt.replace("**","")
print(prompts)
if prompts == '':
return jsonify({"error": "prompts be must"}), 400
image_folder = "/tmp/images"
#line=prompts.splitlines()
#asyncio.run(main(line))
raw_lines = prompts.splitlines(keepends=False)
lines = []
i = 0
while i < len(raw_lines):
line = raw_lines[i].strip()
# Check if current line is a heading
if line.strip().startswith("#") and (line.endswith('?') or line.endswith(':')):
block = line # Start block with heading
i += 1
# Accumulate body lines until next heading or 5+ lines
paragraph_lines = []
while i < len(raw_lines):
next_line = raw_lines[i].strip()
# Stop if next line is a heading
if next_line.strip().startswith("#") and (next_line.endswith('?') or next_line.endswith(':')):
break
paragraph_lines.append(next_line)
i += 1
# If we've gathered enough lines for a slide, break to next
if len(paragraph_lines) >= 5:
break
# Combine heading + paragraph
if paragraph_lines:
block += '\n' + '\n'.join(paragraph_lines)
lines.append(block)
else:
# Group normal lines (not part of any heading)
block_lines = []
count = 0
while i < len(raw_lines) and count < 5:
next_line = raw_lines[i].strip()
# If this is a heading, break to handle it separately
if next_line.strip().startswith("#") and (next_line.endswith('?') or next_line.endswith(':')):
break
block_lines.append(next_line)
i += 1
count += 1
if block_lines:
lines.append('\n'.join(block_lines))
# Print or use lines as slides
image_olst=[]
for id in range(len(lines)):
create_text_image(lines[id],id,image_olst)
image_files = sorted(glob.glob(os.path.join(image_folder, "*.png")))
if not image_files:
raise ValueError("No images found in folder!")
clips = [ImageClip(m).set_duration(5) for m in image_files]
video = concatenate_videoclips(clips, method="compose")
video_path = f"/tmp/video_{uuid.uuid4().hex}.mp4"
video.write_videofile(video_path, fps=24)
for img in image_files:
os.remove(img)
return send_file(video_path, mimetype='video/mp4')
except Exception as e:
traceback.print_exc()
return jsonify({"error": str(e)}), 500
if __name__ == "__main__":
app.run(host="0.0.0.0", port=7860)
# Example call (remove or change in your actual app)
|