ALwrity Version 0.5.1 (Fastapi + React)
This commit is contained in:
31
ToBeMigrated/ai_writers/ai_story_video_generator/README.md
Normal file
31
ToBeMigrated/ai_writers/ai_story_video_generator/README.md
Normal file
@@ -0,0 +1,31 @@
|
||||
# AI Story Video Generator
|
||||
|
||||
This module allows users to generate animated story videos using AI. It leverages Google's Gemini model to create stories and generate images for each scene, then combines them into a video.
|
||||
|
||||
## Features
|
||||
|
||||
- Generate complete stories based on user prompts
|
||||
- Create scene-by-scene storyboards
|
||||
- Generate images for each scene using Gemini
|
||||
- Compile images into an animated video
|
||||
- Add background music and text overlays
|
||||
- Export videos in MP4 format
|
||||
|
||||
## How It Works
|
||||
|
||||
1. User provides a story prompt and preferences
|
||||
2. AI generates a complete story with multiple scenes
|
||||
3. For each scene, an image is generated
|
||||
4. Images are compiled into a video with transitions
|
||||
5. Optional background music and text overlays are added
|
||||
6. The final video is available for download
|
||||
|
||||
## Requirements
|
||||
|
||||
- Google Gemini API key
|
||||
- FFmpeg for video processing
|
||||
- Python libraries: moviepy, pillow, requests
|
||||
|
||||
## Usage
|
||||
|
||||
Access this tool through the Streamlit interface by selecting "AI Story Video Generator" from the main menu.
|
||||
@@ -0,0 +1,4 @@
|
||||
# AI Story Video Generator module
|
||||
from .story_video_generator import write_story_video_generator
|
||||
|
||||
__all__ = ["write_story_video_generator"]
|
||||
File diff suppressed because it is too large
Load Diff
64
ToBeMigrated/ai_writers/ai_story_video_generator/utils.py
Normal file
64
ToBeMigrated/ai_writers/ai_story_video_generator/utils.py
Normal file
@@ -0,0 +1,64 @@
|
||||
"""
|
||||
Utility functions for the AI Story Video Generator.
|
||||
"""
|
||||
|
||||
import os
|
||||
import tempfile
|
||||
import uuid
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
# Constants
|
||||
TEMP_DIR = Path(tempfile.gettempdir()) / "alwrity_story_generator"
|
||||
|
||||
def ensure_temp_dir() -> Path:
|
||||
"""Ensure the temporary directory exists and return its path."""
|
||||
os.makedirs(TEMP_DIR, exist_ok=True)
|
||||
return TEMP_DIR
|
||||
|
||||
def get_temp_filepath(prefix: str, extension: str) -> str:
|
||||
"""Generate a temporary file path with the given prefix and extension."""
|
||||
temp_dir = ensure_temp_dir()
|
||||
return str(temp_dir / f"{prefix}_{uuid.uuid4()}.{extension}")
|
||||
|
||||
def clean_temp_files(older_than_hours: int = 24) -> int:
|
||||
"""
|
||||
Clean temporary files older than the specified number of hours.
|
||||
|
||||
Args:
|
||||
older_than_hours: Remove files older than this many hours
|
||||
|
||||
Returns:
|
||||
Number of files removed
|
||||
"""
|
||||
import time
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
temp_dir = ensure_temp_dir()
|
||||
cutoff_time = time.time() - (older_than_hours * 3600)
|
||||
count = 0
|
||||
|
||||
for file_path in temp_dir.glob("*"):
|
||||
if file_path.is_file() and file_path.stat().st_mtime < cutoff_time:
|
||||
try:
|
||||
file_path.unlink()
|
||||
count += 1
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
return count
|
||||
|
||||
def format_duration(seconds: float) -> str:
|
||||
"""Format seconds into a MM:SS string."""
|
||||
minutes = int(seconds // 60)
|
||||
remaining_seconds = int(seconds % 60)
|
||||
return f"{minutes}:{remaining_seconds:02d}"
|
||||
|
||||
def sanitize_filename(filename: str) -> str:
|
||||
"""Sanitize a string to be used as a filename."""
|
||||
import re
|
||||
# Remove invalid characters
|
||||
sanitized = re.sub(r'[^\w\s-]', '', filename)
|
||||
# Replace spaces with underscores
|
||||
sanitized = sanitized.strip().replace(' ', '_')
|
||||
return sanitized
|
||||
Reference in New Issue
Block a user