Spaces:
Build error
Build error
| import re | |
| class CaptionGenerator: | |
| def __init__(self): | |
| self.caption_styles = { | |
| 'Bold Yellow with Pop': { | |
| 'color': 'yellow', | |
| 'stroke_color': 'black', | |
| 'stroke_width': 3, | |
| 'fontsize': 70, | |
| 'animation': 'pop' | |
| }, | |
| 'Red Bold with Shake': { | |
| 'color': 'red', | |
| 'stroke_color': 'white', | |
| 'stroke_width': 3, | |
| 'fontsize': 75, | |
| 'animation': 'shake' | |
| }, | |
| 'White Bold with Glow': { | |
| 'color': 'white', | |
| 'stroke_color': 'black', | |
| 'stroke_width': 4, | |
| 'fontsize': 70, | |
| 'animation': 'glow' | |
| } | |
| } | |
| def generate(self, text, emotion): | |
| """Generate caption data for video""" | |
| # Split text into caption chunks (max 3-4 words per caption) | |
| words = text.split() | |
| captions = [] | |
| chunk_size = 4 | |
| duration_per_chunk = 2.0 | |
| for i in range(0, len(words), chunk_size): | |
| chunk = ' '.join(words[i:i+chunk_size]) | |
| captions.append({ | |
| 'text': chunk.upper(), | |
| 'start': i * duration_per_chunk / chunk_size, | |
| 'duration': duration_per_chunk | |
| }) | |
| style_name = self._get_style_for_emotion(emotion) | |
| style = self.caption_styles.get(style_name, self.caption_styles['White Bold with Glow']) | |
| return { | |
| 'captions': captions, | |
| 'style': style_name, | |
| **style | |
| } | |
| def _get_style_for_emotion(self, emotion): | |
| """Map emotion to caption style""" | |
| emotion_style_map = { | |
| 'joy': 'Bold Yellow with Pop', | |
| 'surprise': 'Red Bold with Shake', | |
| 'anger': 'Red Bold with Shake', | |
| 'neutral': 'White Bold with Glow' | |
| } | |
| return emotion_style_map.get(emotion, 'White Bold with Glow') | |
| def generate_description(self, text, hook): | |
| """Generate YouTube description with hashtags""" | |
| # Extract key themes | |
| text_lower = text.lower() | |
| # Base description | |
| description = f"{hook}\n\n" | |
| description += "💥 This moment is PURE GOLD! Watch until the end!\n\n" | |
| # Add call to action | |
| cta_options = [ | |
| "❤️ Drop a like if this amazed you!", | |
| "🔥 Comment your thoughts below!", | |
| "💬 Tag someone who needs to see this!", | |
| "⚡ Share this with your friends!" | |
| ] | |
| description += f"{cta_options[0]}\n\n" | |
| # Generate relevant hashtags | |
| hashtags = self._generate_hashtags(text_lower) | |
| description += ' '.join(hashtags) | |
| return description | |
| def _generate_hashtags(self, text): | |
| """Generate relevant hashtags based on content""" | |
| base_tags = ['#shorts', '#viral', '#trending', '#fyp'] | |
| content_tags = [] | |
| # Content-based tags | |
| if any(word in text for word in ['tip', 'how', 'tutorial', 'learn']): | |
| content_tags.extend(['#tutorial', '#howto', '#tips', '#educational']) | |
| if any(word in text for word in ['funny', 'laugh', 'hilarious', 'comedy']): | |
| content_tags.extend(['#funny', '#comedy', '#lol', '#humor']) | |
| if any(word in text for word in ['amazing', 'incredible', 'wow', 'unbelievable']): | |
| content_tags.extend(['#amazing', '#mindblowing', '#incredible']) | |
| if any(word in text for word in ['fail', 'mistake', 'wrong']): | |
| content_tags.extend(['#fail', '#fails', '#epicfail']) | |
| if any(word in text for word in ['game', 'gaming', 'play']): | |
| content_tags.extend(['#gaming', '#gamer', '#gameplay']) | |
| if not content_tags: | |
| content_tags = ['#content', '#video', '#watch'] | |
| # Combine and limit to 15 tags | |
| all_tags = base_tags + content_tags[:11] | |
| return all_tags[:15] |