ALwrity Version 0.5.1 (Fastapi + React)

This commit is contained in:
ajaysi
2025-08-06 16:29:49 +05:30
parent dbf761c31f
commit 2579c12ba4
331 changed files with 0 additions and 22 deletions

View File

@@ -0,0 +1,145 @@
# Facebook Reel Generator
## Overview
The Facebook Reel Generator is a powerful AI-powered tool designed to help content creators, marketers, and businesses create engaging Facebook Reels content. This tool leverages advanced AI to generate creative scripts, visual concepts, and content strategies optimized for Facebook's short-form video platform.
## Features
### Current Features
#### 1. Reel Content Generation
- **Script Generation**: Create complete scripts for Facebook Reels with hooks, main content, and calls-to-action
- **Content Structure**: Automatically formats content with proper pacing for short-form video
- **Brand Voice Customization**: Adapt content to match your brand's tone and style
- **Target Audience Optimization**: Tailor content specifically for your target demographic
- **Purpose-Driven Content**: Generate content aligned with specific marketing goals (awareness, engagement, conversion, etc.)
#### 2. Visual Elements
- **Image Generation**: Create custom images for your Reels using AI image generation
- **Visual Style Options**: Choose from various visual styles (modern, minimalist, bold, etc.)
- **Aspect Ratio Optimization**: Generate images in the optimal 9:16 aspect ratio for Reels
- **Image Quality Settings**: Control the quality and detail level of generated images
#### 3. Advanced Options
- **Content Length Control**: Specify preferred length for your Reel content
- **Language Style Selection**: Choose from formal, casual, humorous, or other language styles
- **AI Provider Selection**: Choose between different AI providers for content generation
- **Hashtag Suggestions**: Get relevant hashtag recommendations for your Reels
### Coming Soon Features
#### 1. Music Integration
- **Trending Music Suggestions**: Get recommendations for popular music tracks
- **Music Mood Matching**: Find music that matches your content's emotional tone
- **Copyright-Safe Options**: Access royalty-free music suggestions
#### 2. Video Script Generation
- **Shot-by-Shot Breakdown**: Get detailed visual direction for each segment
- **Transition Suggestions**: Receive creative transition ideas between scenes
- **Visual Effects Recommendations**: Get ideas for filters and effects to enhance your Reel
#### 3. Performance Optimization
- **Trend Analysis**: Identify current trends in your niche for Reel content
- **Engagement Prediction**: Get insights on potential performance of your content
- **A/B Testing Suggestions**: Receive variations of content to test different approaches
## How to Use
### Step 1: Access the Reel Generator
1. Navigate to the Facebook AI Writer dashboard
2. Select the "FB Reel Generator" card
3. Click "Use FB Reel Generator"
### Step 2: Configure Your Reel Content
1. Fill in the basic information:
- Business type
- Target audience
- Reel purpose
- Brand voice
- Key message
- Call to action
2. Select content preferences:
- Include hashtags
- Include hooks
- Include trending topics
3. Click "Generate Reel Content"
### Step 3: Customize Visual Elements
1. Once your content is generated, navigate to the "Visual Elements" tab
2. Select your preferred visual style
3. Choose the aspect ratio (9:16 recommended for Reels)
4. Adjust image quality settings
5. Click "Generate Images"
### Step 4: Fine-tune with Advanced Options
1. Navigate to the "Advanced Options" tab
2. Adjust content length preferences
3. Select language style
4. Choose your preferred AI provider
5. Click "Apply Advanced Settings"
## Best Practices
### Content Creation
- Keep your key message concise and focused
- Use action-oriented language in your call to action
- Be specific about your target audience to get more relevant content
- Experiment with different brand voices to find what resonates with your audience
### Visual Elements
- Use the 9:16 aspect ratio for optimal display on mobile devices
- Select visual styles that align with your brand identity
- Consider using higher quality settings for more professional-looking images
### Performance Optimization
- Regularly update your content based on performance data
- Test different hooks and openings to see what captures attention
- Use the suggested hashtags to increase discoverability
## Technical Requirements
- A modern web browser (Chrome, Firefox, Safari, or Edge)
- Internet connection
- API keys for AI providers (OpenAI, Google Gemini, etc.)
## Troubleshooting
### Common Issues
- **Content not generating**: Ensure all required fields are filled out
- **Images not appearing**: Check your internet connection and API key status
- **Error messages**: Verify that your API keys are valid and have sufficient credits
### Getting Help
If you encounter any issues not covered in this guide, please contact support or check our documentation for additional resources.
## Future Roadmap
### Phase 1 (Current)
- Basic content generation
- Image generation
- Advanced customization options
### Phase 2 (Coming Soon)
- Music integration
- Video script generation
- Performance analytics
### Phase 3 (Future)
- AI-powered video editing suggestions
- Audience sentiment analysis
- Competitor content analysis
- Automated content scheduling
- Multi-platform adaptation (Instagram Reels, TikTok)
## Contributing
We welcome feedback and contributions to improve the Facebook Reel Generator. If you have suggestions for new features or improvements, please reach out to our development team.
## License
This tool is part of the ALwrity AI Writer suite and is subject to the same licensing terms.
---
*Last updated: April 2025*

View File

@@ -0,0 +1,902 @@
"""
Facebook Reel Generator Module
This module provides functionality to generate Facebook Reel content using AI.
It leverages text and image generation capabilities to create engaging reel content.
"""
import streamlit as st
import os
import sys
from loguru import logger
from typing import Dict, Any, List, Optional
from datetime import datetime
# Import text generation
from .....gpt_providers.text_generation.main_text_generation import llm_text_gen
# Import image generation
from .....gpt_providers.text_to_image_generation.main_generate_image_from_prompt import generate_image
# Configure logging
logger.remove()
logger.add(sys.stdout,
colorize=True,
format="<level>{level}</level>|<green>{file}:{line}:{function}</green>| {message}"
)
def write_fb_reel():
"""
Main function to render the Facebook Reel Generator UI and handle the generation process.
"""
# Add back to dashboard button with minimal top margin
st.markdown("""
<div style='margin-top: 1rem; margin-bottom: 1rem;'>
<a href="/" class="streamlit-button" style='text-decoration: none; color: white; background-color: #1877F2; padding: 0.5rem 1rem; border-radius: 0.5rem;'>← Back to Dashboard</a>
</div>
""", unsafe_allow_html=True)
# Main title card with improved spacing
st.markdown("""
<div style='background-color: #f0f2f6; padding: 1.5rem; border-radius: 5px; margin-bottom: 1.5rem;'>
<div style='display: flex; align-items: center; justify-content: center; margin-bottom: 0.5rem;'>
<span style='font-size: 2rem; margin-right: 0.5rem;'>🎥</span>
<h1 style='color: #1877F2; margin: 0;'>Facebook Reel Generator</h1>
</div>
<p style='text-align: center; margin: 0;'>Create engaging Facebook Reels with AI-powered content</p>
</div>
""", unsafe_allow_html=True)
# Create tabs for different sections
tab1, tab2, tab3 = st.tabs(["Reel Content", "Visual Elements", "Advanced Options"])
with tab1:
render_reel_content_tab()
with tab2:
render_visual_elements_tab()
with tab3:
render_advanced_options_tab()
def render_reel_content_tab():
"""Render the Reel Content tab with input fields and generation options."""
st.markdown("### Reel Content Settings")
# Create columns for input fields
col1, col2 = st.columns(2)
with col1:
business_type = st.text_input(
"Business/Industry Type",
placeholder="e.g., Fashion, Food, Fitness, Tech",
help="The type of business or industry you're creating content for"
)
target_audience = st.text_input(
"Target Audience",
placeholder="e.g., Young professionals, Parents, Fitness enthusiasts",
help="Who is your content aimed at?"
)
reel_purpose = st.selectbox(
"Reel Purpose",
options=[
"Product Showcase",
"Tutorial/How-to",
"Behind the Scenes",
"Customer Testimonials",
"Brand Story",
"Promotion/Offer",
"Educational Content",
"Entertainment"
],
help="What is the main purpose of your reel?"
)
with col2:
brand_voice = st.selectbox(
"Brand Voice/Tone",
options=[
"Professional",
"Casual/Friendly",
"Humorous",
"Inspirational",
"Educational",
"Luxury/Elegant",
"Energetic",
"Relaxed"
],
help="The tone and voice that represents your brand"
)
key_message = st.text_area(
"Key Message",
placeholder="What's the main message you want to convey in your reel?",
help="The primary message or takeaway for your audience"
)
call_to_action = st.selectbox(
"Call to Action",
options=[
"Follow Us",
"Shop Now",
"Learn More",
"Sign Up",
"Share",
"Comment",
"Save for Later",
"Custom"
],
help="What action do you want viewers to take after watching?"
)
if call_to_action == "Custom":
custom_cta = st.text_input(
"Custom Call to Action",
placeholder="Enter your custom call to action"
)
else:
custom_cta = ""
# Additional content options
st.markdown("### Content Preferences")
col1, col2 = st.columns(2)
with col1:
include_hashtags = st.checkbox("Include Hashtag Suggestions", value=True)
include_hook = st.checkbox("Include Hook/Opening", value=True)
include_transitions = st.checkbox("Include Transition Suggestions", value=True)
with col2:
include_text_overlays = st.checkbox("Include Text Overlay Suggestions", value=True)
include_engagement_tips = st.checkbox("Include Engagement Tips", value=True)
include_trending_topics = st.checkbox("Include Trending Topics", value=True)
# Generate button
if st.button("Generate Reel Content", type="primary"):
if not business_type or not target_audience or not key_message:
st.error("Please fill in the required fields: Business Type, Target Audience, and Key Message")
return
with st.spinner("Generating your Facebook Reel content..."):
# Generate the reel content
reel_content = generate_reel_content(
business_type=business_type,
target_audience=target_audience,
reel_purpose=reel_purpose,
brand_voice=brand_voice,
key_message=key_message,
call_to_action=call_to_action,
custom_cta=custom_cta,
include_hashtags=include_hashtags,
include_hook=include_hook,
include_transitions=include_transitions,
include_text_overlays=include_text_overlays,
include_engagement_tips=include_engagement_tips,
include_trending_topics=include_trending_topics
)
# Display the generated content
if reel_content:
st.markdown("### Generated Reel Content")
# Create a container with a nice background for the content
st.markdown("""
<div style='background-color: #f8f9fa; padding: 20px; border-radius: 10px; border-left: 5px solid #1877F2; margin-bottom: 20px;'>
<h4 style='color: #1877F2;'>Your Facebook Reel Script</h4>
</div>
""", unsafe_allow_html=True)
# Parse and display the content in a structured way
display_reel_content(reel_content)
# Add a download button for the content
st.download_button(
label="Download Reel Content",
data=reel_content,
file_name=f"facebook_reel_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt",
mime="text/plain"
)
# Store the content in session state for the visual elements tab
st.session_state['reel_content'] = reel_content
else:
st.error("Failed to generate reel content. Please try again.")
def render_visual_elements_tab():
"""Render the Visual Elements tab for generating images and visual content."""
st.markdown("### Visual Elements for Your Reel")
# Check if reel content has been generated
if 'reel_content' not in st.session_state:
st.info("Please generate reel content in the 'Reel Content' tab first.")
return
st.markdown("""
<div style='background-color: #f8f9fa; padding: 10px; border-radius: 5px; margin-bottom: 10px;'>
<p><strong>Note:</strong> This feature generates visual elements for your reel. Music and video elements are coming soon.</p>
</div>
""", unsafe_allow_html=True)
# Visual element options
st.markdown("#### Generate Visual Elements")
col1, col2 = st.columns(2)
with col1:
visual_style = st.selectbox(
"Visual Style",
options=[
"Modern and Clean",
"Bold and Vibrant",
"Minimalist",
"Playful and Fun",
"Professional",
"Lifestyle",
"Product-Focused",
"Custom"
],
help="The overall visual style for your reel"
)
if visual_style == "Custom":
custom_style = st.text_input(
"Custom Visual Style",
placeholder="Describe your desired visual style"
)
else:
custom_style = ""
num_images = st.slider(
"Number of Images to Generate",
min_value=1,
max_value=5,
value=3,
help="How many visual elements would you like to generate?"
)
with col2:
image_aspect_ratio = st.selectbox(
"Image Aspect Ratio",
options=[
"9:16 (Vertical - Reel)",
"1:1 (Square)",
"16:9 (Horizontal)",
"4:5 (Instagram Portrait)"
],
help="The aspect ratio for your visual elements"
)
image_quality = st.select_slider(
"Image Quality",
options=["Basic", "Standard", "High", "Premium"],
value="Standard",
help="The quality level for generated images"
)
# Image generation prompt customization
st.markdown("#### Customize Image Generation")
image_prompt_style = st.radio(
"Image Prompt Style",
options=["Automatic", "Custom"],
help="Choose how to generate the image prompts"
)
if image_prompt_style == "Custom":
custom_image_prompt = st.text_area(
"Custom Image Prompt",
placeholder="Enter a custom prompt for image generation",
help="Describe what you want the image to look like"
)
else:
custom_image_prompt = ""
# Generate images button
if st.button("Generate Visual Elements", type="primary"):
with st.spinner("Generating visual elements for your reel..."):
# Generate images based on the reel content
images = generate_reel_images(
reel_content=st.session_state['reel_content'],
visual_style=visual_style,
custom_style=custom_style if visual_style == "Custom" else None,
num_images=num_images,
image_aspect_ratio=image_aspect_ratio,
image_quality=image_quality,
custom_image_prompt=custom_image_prompt if image_prompt_style == "Custom" else None
)
# Display the generated images
if images:
st.markdown("### Generated Visual Elements")
# Display images in a grid
cols = st.columns(min(3, len(images)))
for i, image_path in enumerate(images):
with cols[i % len(cols)]:
st.image(image_path, use_container_width=True)
st.download_button(
label=f"Download Image {i+1}",
data=open(image_path, "rb").read(),
file_name=f"reel_image_{i+1}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.png",
mime="image/png"
)
else:
st.error("Failed to generate visual elements. Please try again.")
# Coming soon features
st.markdown("### Coming Soon Features")
col1, col2 = st.columns(2)
with col1:
st.markdown("""
<div style='background-color: #e9ecef; padding: 15px; border-radius: 5px; margin-bottom: 10px;'>
<h4>🎵 Music Suggestions</h4>
<p>AI-powered music recommendations that match your reel's mood and content.</p>
<span style='background-color: #6c757d; color: white; padding: 2px 8px; border-radius: 10px; font-size: 0.8em;'>Coming Soon</span>
</div>
""", unsafe_allow_html=True)
with col2:
st.markdown("""
<div style='background-color: #e9ecef; padding: 15px; border-radius: 5px; margin-bottom: 10px;'>
<h4>🎬 Video Elements</h4>
<p>Generate video clips, transitions, and effects to enhance your reel.</p>
<span style='background-color: #6c757d; color: white; padding: 2px 8px; border-radius: 10px; font-size: 0.8em;'>Coming Soon</span>
</div>
""", unsafe_allow_html=True)
def render_advanced_options_tab():
"""Render the Advanced Options tab for additional customization."""
st.markdown("### Advanced Options")
# Check if reel content has been generated
if 'reel_content' not in st.session_state:
st.info("Please generate reel content in the 'Reel Content' tab first.")
return
st.markdown("""
<div style='background-color: #f8f9fa; padding: 10px; border-radius: 5px; margin-bottom: 10px;'>
<p><strong>Note:</strong> These advanced options allow for more customization of your reel content.</p>
</div>
""", unsafe_allow_html=True)
# Advanced content options
st.markdown("#### Content Customization")
col1, col2 = st.columns(2)
with col1:
content_length = st.select_slider(
"Content Length",
options=["Short (15s)", "Medium (30s)", "Long (60s)"],
value="Medium (30s)",
help="The target length for your reel content"
)
language_style = st.selectbox(
"Language Style",
options=[
"Simple and Clear",
"Professional",
"Casual",
"Technical",
"Persuasive",
"Storytelling"
],
help="The language style for your content"
)
with col2:
include_stats = st.checkbox("Include Statistics/Facts", value=False)
include_quotes = st.checkbox("Include Quote Suggestions", value=False)
include_emoji = st.checkbox("Include Emoji Suggestions", value=True)
# AI model options
st.markdown("#### AI Model Options")
col1, col2 = st.columns(2)
with col1:
creativity_level = st.select_slider(
"Creativity Level",
options=["Conservative", "Balanced", "Creative", "Very Creative"],
value="Balanced",
help="How creative should the AI be in generating content"
)
with col2:
ai_provider = st.selectbox(
"AI Provider",
options=["Auto-Select", "OpenAI", "Google Gemini", "Anthropic Claude"],
help="Which AI provider to use for content generation"
)
# Generate with advanced options button
if st.button("Regenerate with Advanced Options", type="primary"):
with st.spinner("Regenerating your Facebook Reel content with advanced options..."):
# Get the original content parameters from session state
original_params = st.session_state.get('reel_params', {})
# Update with advanced options
advanced_params = {
**original_params,
'content_length': content_length,
'language_style': language_style,
'include_stats': include_stats,
'include_quotes': include_quotes,
'include_emoji': include_emoji,
'creativity_level': creativity_level,
'ai_provider': ai_provider
}
# Generate the reel content with advanced options
reel_content = generate_reel_content_advanced(advanced_params)
# Display the generated content
if reel_content:
st.markdown("### Regenerated Reel Content")
# Create a container with a nice background for the content
st.markdown("""
<div style='background-color: #f8f9fa; padding: 20px; border-radius: 10px; border-left: 5px solid #1877F2; margin-bottom: 20px;'>
<h4 style='color: #1877F2;'>Your Facebook Reel Script</h4>
</div>
""", unsafe_allow_html=True)
# Parse and display the content in a structured way
display_reel_content(reel_content)
# Add a download button for the content
st.download_button(
label="Download Reel Content",
data=reel_content,
file_name=f"facebook_reel_advanced_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt",
mime="text/plain"
)
# Update the content in session state
st.session_state['reel_content'] = reel_content
else:
st.error("Failed to regenerate reel content. Please try again.")
def generate_reel_content(
business_type: str,
target_audience: str,
reel_purpose: str,
brand_voice: str,
key_message: str,
call_to_action: str,
custom_cta: str = "",
include_hashtags: bool = True,
include_hook: bool = True,
include_transitions: bool = True,
include_text_overlays: bool = True,
include_engagement_tips: bool = True,
include_trending_topics: bool = True
) -> str:
"""
Generate Facebook Reel content based on user inputs.
Args:
business_type: The type of business or industry
target_audience: The target audience for the reel
reel_purpose: The purpose of the reel
brand_voice: The brand voice or tone
key_message: The key message to convey
call_to_action: The call to action
custom_cta: Custom call to action text if "Custom" is selected
include_hashtags: Whether to include hashtag suggestions
include_hook: Whether to include a hook/opening
include_transitions: Whether to include transition suggestions
include_text_overlays: Whether to include text overlay suggestions
include_engagement_tips: Whether to include engagement tips
include_trending_topics: Whether to include trending topics
Returns:
str: The generated reel content
"""
try:
# Store parameters in session state for advanced options
st.session_state['reel_params'] = {
'business_type': business_type,
'target_audience': target_audience,
'reel_purpose': reel_purpose,
'brand_voice': brand_voice,
'key_message': key_message,
'call_to_action': call_to_action,
'custom_cta': custom_cta,
'include_hashtags': include_hashtags,
'include_hook': include_hook,
'include_transitions': include_transitions,
'include_text_overlays': include_text_overlays,
'include_engagement_tips': include_engagement_tips,
'include_trending_topics': include_trending_topics
}
# Construct the prompt for the AI
prompt = f"""
Create a detailed Facebook Reel script for a {business_type} business targeting {target_audience}.
The purpose of this reel is: {reel_purpose}
The brand voice/tone should be: {brand_voice}
The key message to convey is: {key_message}
The call to action should be: {call_to_action}{f" - {custom_cta}" if custom_cta else ""}
Please provide a complete Facebook Reel script with the following elements:
1. A hook (first 3 seconds) that grabs attention
2. Main content (15-30 seconds) that delivers the key message
3. A strong call-to-action at the end
Additional elements to include:
{f"- Hashtag suggestions relevant to the content and industry" if include_hashtags else ""}
{f"- Text overlay suggestions for key points" if include_text_overlays else ""}
{f"- Transition suggestions between scenes" if include_transitions else ""}
{f"- Engagement tips to encourage interaction" if include_engagement_tips else ""}
{f"- Trending topics that could be incorporated" if include_trending_topics else ""}
Format the output as a structured script with clear sections and timing suggestions.
"""
# Generate the content using the AI
logger.info(f"[generate_reel_content] Generating reel content for {business_type}")
response = llm_text_gen(prompt)
if response:
logger.info(f"[generate_reel_content] Successfully generated reel content")
return response
else:
logger.error(f"[generate_reel_content] Failed to generate reel content")
return None
except Exception as e:
logger.error(f"[generate_reel_content] Error generating reel content: {str(e)}")
return None
def generate_reel_content_advanced(params: Dict[str, Any]) -> str:
"""
Generate Facebook Reel content with advanced options.
Args:
params: Dictionary of parameters for content generation
Returns:
str: The generated reel content
"""
try:
# Extract parameters
business_type = params.get('business_type', '')
target_audience = params.get('target_audience', '')
reel_purpose = params.get('reel_purpose', '')
brand_voice = params.get('brand_voice', '')
key_message = params.get('key_message', '')
call_to_action = params.get('call_to_action', '')
custom_cta = params.get('custom_cta', '')
content_length = params.get('content_length', 'Medium (30s)')
language_style = params.get('language_style', 'Simple and Clear')
include_stats = params.get('include_stats', False)
include_quotes = params.get('include_quotes', False)
include_emoji = params.get('include_emoji', True)
creativity_level = params.get('creativity_level', 'Balanced')
ai_provider = params.get('ai_provider', 'Auto-Select')
# Construct the advanced prompt
prompt = f"""
Create a detailed Facebook Reel script for a {business_type} business targeting {target_audience}.
The purpose of this reel is: {reel_purpose}
The brand voice/tone should be: {brand_voice}
The key message to convey is: {key_message}
The call to action should be: {call_to_action}{f" - {custom_cta}" if custom_cta else ""}
Advanced requirements:
- Content length: {content_length}
- Language style: {language_style}
- Creativity level: {creativity_level}
{f"- Include relevant statistics or facts to support the message" if include_stats else ""}
{f"- Include quote suggestions that could be used in the reel" if include_quotes else ""}
{f"- Include emoji suggestions for text overlays" if include_emoji else ""}
Please provide a complete Facebook Reel script with the following elements:
1. A hook (first 3 seconds) that grabs attention
2. Main content that delivers the key message
3. A strong call-to-action at the end
Format the output as a structured script with clear sections and timing suggestions.
"""
# Generate the content using the AI
logger.info(f"[generate_reel_content_advanced] Generating advanced reel content for {business_type}")
response = llm_text_gen(prompt)
if response:
logger.info(f"[generate_reel_content_advanced] Successfully generated advanced reel content")
return response
else:
logger.error(f"[generate_reel_content_advanced] Failed to generate advanced reel content")
return None
except Exception as e:
logger.error(f"[generate_reel_content_advanced] Error generating advanced reel content: {str(e)}")
return None
def generate_reel_images(
reel_content: str,
visual_style: str,
custom_style: Optional[str] = None,
num_images: int = 3,
image_aspect_ratio: str = "9:16 (Vertical - Reel)",
image_quality: str = "Standard",
custom_image_prompt: Optional[str] = None
) -> List[str]:
"""
Generate images for a Facebook Reel based on the content.
Args:
reel_content: The generated reel content
visual_style: The visual style for the images
custom_style: Custom style description if "Custom" is selected
num_images: Number of images to generate
image_aspect_ratio: The aspect ratio for the images
image_quality: The quality level for the images
custom_image_prompt: Custom prompt for image generation
Returns:
List[str]: List of paths to the generated images
"""
try:
logger.info(f"[generate_reel_images] Generating {num_images} images for reel")
# Extract key elements from the reel content
prompt = f"""
Based on the following Facebook Reel content, extract {num_images} key visual elements or scenes that would make compelling images.
For each element, provide a detailed description that would work well for AI image generation.
Reel Content:
{reel_content}
For each visual element, provide:
1. A descriptive title
2. A detailed image generation prompt that includes:
- The main subject
- The setting/background
- The mood/atmosphere
- The style ({visual_style}{f" - {custom_style}" if custom_style else ""})
- The aspect ratio ({image_aspect_ratio})
- The quality level ({image_quality})
Format each element as:
TITLE: [title]
PROMPT: [detailed prompt]
Generate exactly {num_images} elements.
"""
# Generate the image prompts using the AI
logger.info(f"[generate_reel_images] Generating image prompts")
response = llm_text_gen(prompt)
if not response:
logger.error(f"[generate_reel_images] Failed to generate image prompts")
return []
# Parse the response to extract the image prompts
image_prompts = []
current_title = ""
current_prompt = ""
for line in response.split('\n'):
if line.startswith("TITLE:"):
if current_title and current_prompt:
image_prompts.append((current_title, current_prompt))
current_title = line.replace("TITLE:", "").strip()
current_prompt = ""
elif line.startswith("PROMPT:"):
current_prompt = line.replace("PROMPT:", "").strip()
elif current_prompt and line.strip():
current_prompt += " " + line.strip()
# Add the last prompt if there is one
if current_title and current_prompt:
image_prompts.append((current_title, current_prompt))
# If we don't have enough prompts, generate generic ones
while len(image_prompts) < num_images:
image_prompts.append((f"Generic Image {len(image_prompts)+1}",
f"A visually appealing image related to {visual_style} style for a Facebook Reel"))
# Generate the images
image_paths = []
for i, (title, prompt) in enumerate(image_prompts[:num_images]):
# Use custom prompt if provided
if custom_image_prompt and i == 0:
prompt = custom_image_prompt
logger.info(f"[generate_reel_images] Generating image {i+1}: {title}")
image_path = generate_image(prompt)
if image_path:
image_paths.append(image_path)
logger.info(f"[generate_reel_images] Successfully generated image {i+1}")
else:
logger.error(f"[generate_reel_images] Failed to generate image {i+1}")
return image_paths
except Exception as e:
logger.error(f"[generate_reel_images] Error generating reel images: {str(e)}")
return []
def display_reel_content(content: str):
"""
Display the reel content in a structured and visually appealing way.
Args:
content: The generated reel content
"""
# Check if the content contains markdown code blocks
if "```markdown" in content:
# Extract the content from the markdown code block
try:
# Find the start and end of the markdown block
start_idx = content.find("```markdown") + len("```markdown")
end_idx = content.find("```", start_idx)
if end_idx == -1: # If no closing markdown block found
end_idx = len(content)
# Extract the markdown content
markdown_content = content[start_idx:end_idx].strip()
# Split the content into sections
sections = markdown_content.split('\n\n')
# Create tabs for different sections
if len(sections) > 1:
tabs = st.tabs(["Full Script", "Hook", "Main Content", "Call to Action", "Additional Elements"])
with tabs[0]: # Full Script
st.markdown(markdown_content)
# Try to identify and display other sections
hook_section = ""
main_content = ""
cta_section = ""
additional_elements = ""
for section in sections:
section_lower = section.lower()
if "hook" in section_lower or "opening" in section_lower or "first 3 seconds" in section_lower or "0-3 seconds" in section_lower:
hook_section = section
elif "main content" in section_lower or "key message" in section_lower or "15-30 seconds" in section_lower:
main_content = section
elif "call to action" in section_lower or "cta" in section_lower or "end" in section_lower:
cta_section = section
elif "hashtag" in section_lower or "text overlay" in section_lower or "transition" in section_lower or "engagement" in section_lower or "trending" in section_lower or "additional" in section_lower:
additional_elements += section + "\n\n"
with tabs[1]: # Hook
if hook_section:
st.markdown(hook_section)
else:
st.info("No specific hook section identified in the content.")
with tabs[2]: # Main Content
if main_content:
st.markdown(main_content)
else:
st.info("No specific main content section identified in the content.")
with tabs[3]: # Call to Action
if cta_section:
st.markdown(cta_section)
else:
st.info("No specific call to action section identified in the content.")
with tabs[4]: # Additional Elements
if additional_elements:
st.markdown(additional_elements)
else:
st.info("No additional elements identified in the content.")
else:
# If we can't split into sections, just display the content
st.markdown(markdown_content)
except Exception as e:
logger.error(f"Error processing markdown content: {str(e)}")
# Fallback to displaying the raw content
st.markdown(content)
else:
# If no markdown code block, use the original approach
# Split the content into sections
sections = content.split('\n\n')
# Create tabs for different sections
if len(sections) > 1:
tabs = st.tabs(["Full Script", "Hook", "Main Content", "Call to Action", "Additional Elements"])
with tabs[0]: # Full Script
# Replace newlines with HTML line breaks
formatted_content = content.replace('\n', '<br>')
st.markdown(f"""
<div style='background-color: white; padding: 15px; border-radius: 5px; border: 1px solid #e0e0e0;'>
{formatted_content}
</div>
""", unsafe_allow_html=True)
# Try to identify and display other sections
hook_section = ""
main_content = ""
cta_section = ""
additional_elements = ""
for section in sections:
section_lower = section.lower()
if "hook" in section_lower or "opening" in section_lower or "first 3 seconds" in section_lower or "0-3 seconds" in section_lower:
hook_section = section
elif "main content" in section_lower or "key message" in section_lower or "15-30 seconds" in section_lower:
main_content = section
elif "call to action" in section_lower or "cta" in section_lower or "end" in section_lower:
cta_section = section
elif "hashtag" in section_lower or "text overlay" in section_lower or "transition" in section_lower or "engagement" in section_lower or "trending" in section_lower or "additional" in section_lower:
additional_elements += section + "\n\n"
with tabs[1]: # Hook
if hook_section:
# Replace newlines with HTML line breaks
formatted_hook = hook_section.replace('\n', '<br>')
st.markdown(f"""
<div style='background-color: white; padding: 15px; border-radius: 5px; border: 1px solid #e0e0e0;'>
{formatted_hook}
</div>
""", unsafe_allow_html=True)
else:
st.info("No specific hook section identified in the content.")
with tabs[2]: # Main Content
if main_content:
# Replace newlines with HTML line breaks
formatted_main = main_content.replace('\n', '<br>')
st.markdown(f"""
<div style='background-color: white; padding: 15px; border-radius: 5px; border: 1px solid #e0e0e0;'>
{formatted_main}
</div>
""", unsafe_allow_html=True)
else:
st.info("No specific main content section identified in the content.")
with tabs[3]: # Call to Action
if cta_section:
# Replace newlines with HTML line breaks
formatted_cta = cta_section.replace('\n', '<br>')
st.markdown(f"""
<div style='background-color: white; padding: 15px; border-radius: 5px; border: 1px solid #e0e0e0;'>
{formatted_cta}
</div>
""", unsafe_allow_html=True)
else:
st.info("No specific call to action section identified in the content.")
with tabs[4]: # Additional Elements
if additional_elements:
# Replace newlines with HTML line breaks
formatted_additional = additional_elements.replace('\n', '<br>')
st.markdown(f"""
<div style='background-color: white; padding: 15px; border-radius: 5px; border: 1px solid #e0e0e0;'>
{formatted_additional}
</div>
""", unsafe_allow_html=True)
else:
st.info("No additional elements identified in the content.")
else:
# If we can't split into sections, just display the content
# Replace newlines with HTML line breaks
formatted_content = content.replace('\n', '<br>')
st.markdown(f"""
<div style='background-color: white; padding: 15px; border-radius: 5px; border: 1px solid #e0e0e0;'>
{formatted_content}
</div>
""", unsafe_allow_html=True)