diff --git a/factory_config.yaml b/factory_config.yaml new file mode 100644 index 0000000..bd34350 --- /dev/null +++ b/factory_config.yaml @@ -0,0 +1,75 @@ +# ═══════════════════════════════════════════════════════════════════════════════ +# YouTube Factory — 3-PC Distributed Faceless Video Pipeline Config +# ═══════════════════════════════════════════════════════════════════════════════ + +pcs: + amdllm: + host: "10.4.0.181" + ssh_user: "mark" + services: + llama_cpp: {port: 8002, model: "Qwen3.5-7B-GGUF"} + comfyui: {port: 8188} + + nvidiam: + host: "10.4.0.180" + ssh_user: "mark" + services: + comfyui: {port: 8188} + tts: {port: 8000, model: "kokoro"} + + intelllm: + host: "10.4.0.182" + ssh_user: "mark" + services: + kokoro_tts: {port: 8003, model: "kokoro"} + whisper: {port: 0} + ffmpeg: {port: 0} + +pipeline: + topic: "" + # Target Duration in seconds (7 to 12 minutes = 420s to 720s; default 540s = 9 mins) + duration_seconds: 540 + output_dir: "./output" + temp_dir: "./temp" + + # Visual Generation Strategy: + # - "hybrid": Dynamic mix of MiniMax H3 AI video clips + stock footage + SDXL images with Ken Burns motion + # - "all_ai": MiniMax H3 text-to-video prioritized for all segments with SDXL fallback + # - "stock_focused": High-definition stock b-roll prioritized with AI image fallback + visual_strategy: "hybrid" + + # MiniMax H3 clip canvas (multiples of 32, snaps to 17k+5 frame grid at 24 fps) + clip_width: 768 + clip_height: 432 + + # Voiceover configuration + # English: af_heart, am_adam, en-US-ChristopherNeural, en-US-AriaNeural + # Spanish: es-MX-JorgeNeural, es-MX-DaliaNeural, es-US-AlonsoNeural, es-ES-AlvaroNeural + voices: + en: "af_heart" + es: "es-MX-JorgeNeural" + + # A/B Testing Thumbnails (generates N visual concepts in EN, ES, and Clean) + thumbnail_count: 3 + + # Procedural Background Music + # Moods: "cinematic", "space", "mystery", "history" + music_mood: "cinematic" + + # Optional Stock Media API Keys (Wikimedia Commons is always enabled by default without keys) + pexels_api_key: "VvbdJlMjUXml8lMTrhTKbFmXjq3C9SbbwjomhthQJK3dI9Xl0mkv46eD" + pixabay_api_key: "57162345-44e7931fbd271a59fa5ffa111" + +# 24/7 Autonomous Daemon Configuration +daemon: + poll_interval_seconds: 30 + auto_trending_when_empty: true + trending_niche: "history, technology, science, tech, mysteries, ancient" # Leave empty for all niches, or specify: "history", "space", "science", "tech", "mysteries" + max_daily_videos: 12 + +# YouTube Data API v3 Upload Configuration +youtube: + client_secrets_file: "client_secrets.json" + token_file: "youtube_token.json" + default_privacy: "private" # "private", "unlisted", or "public" + auto_upload: false diff --git a/implementation_plan.md b/implementation_plan.md new file mode 100644 index 0000000..65011d9 --- /dev/null +++ b/implementation_plan.md @@ -0,0 +1,181 @@ +# YouTube Factory — Complete 24/7 Faceless Video Pipeline Implementation Plan + +Build a comprehensive, production-ready, distributed faceless video generation pipeline utilizing 3 self-hosted PCs (AMDLLM, NvidiaLLM, IntelLLM) capable of running autonomously 24/7. + +## Architecture Overview + +``` +┌────────────────────────────────────────────────────────────────────────────────────────┐ +│ ORCHESTRATOR & 24/7 ENGINE │ +│ • Topic Modes: Single (--topic), Batch (--batch), Live Trending (--trending) │ +│ • 24/7 Daemon Worker (--daemon) with Queue Manager & Fault-Tolerant Checkpoints │ +│ • YouTube Uploader Readiness (YouTube Data API v3 OAuth2 + Metadata + Captions) │ +└────────────────────────────────────────────────────────────────────────────────────────┘ + │ + ┌───────────────────────────┼───────────────────────────┐ + ▼ ▼ ▼ +┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ +│ AMDLLM (port 8002)│ │NvidiaLLM (port 8188│ │IntelLLM (port 8003│ +│ 10.4.0.181 │ │ 10.4.0.180 │ │ 10.4.0.182 │ +├──────────────────┤ ├──────────────────┤ ├──────────────────┤ +│ • llama.cpp LLM │ │ • ComfyUI │ │ • Kokoro TTS │ +│ • Qwen3.5-7B │ │ • MiniMax H3 T2V │ │ (EN & ES) │ +│ • Scriptwriting │ │ • z-image-turbo │ │ • faster-whisper │ +│ • Translation │ │ • SDXL Checkpoint│ │ subtitles │ +│ • SEO & Chapters │ │ • A/B Thumbnails │ │ • FFmpeg Engine │ +│ • Trending Ideas │ │ • Stock Media │ │ • Audio Ducking │ +└──────────────────┘ └──────────────────┘ └──────────────────┘ +``` + +--- + +## User Review Required + +> [!IMPORTANT] +> **Stock Media Sources**: The pipeline will fetch free stock videos & images from Wikimedia Commons / Open Archives by default without any API keys required. It will also support optional Pexels and Pixabay API keys if configured in `factory_config.yaml`. + +> [!IMPORTANT] +> **Kokoro Server Update on IntelLLM**: We will enhance `kokoro_server.py` on IntelLLM (:8003) to dynamically support both English (`lang_code='a'`) and Spanish (`lang_code='e'`) pipelines for native pronunciation across both language tracks. + +--- + +## Open Questions + +> [!NOTE] +> None blocking. The pipeline will support all 3 execution modes out-of-the-box: +> 1. User-supplied single topic (`--topic "..."`) +> 2. User-supplied batch list (`--batch "..." "..."`) +> 3. Autonomous 24/7 trending mode (`--daemon --auto-trending`) + +--- + +## Proposed Changes + +### Configuration & Core + +#### [MODIFY] [factory_config.yaml](file:///home/mark/Projects/GeminiVideoPipeline/factory_config.yaml) +- Add configurations for: + - `visual_strategy`: `hybrid` (MiniMax H3 + Stock Video + AI Image + Stock Image), `all_ai`, or `fast_stock` + - `stock_media`: Pexels/Pixabay API keys (optional), Wikimedia Commons enabled + - `music`: procedural cinematic soundtrack generator settings, mood/genre selection, ducking volume (-20dB) + - `trending`: Google Trends RSS / YouTube viral niche exploration settings + - `daemon`: 24/7 interval, queue auto-refill, maximum daily video quota + - `youtube_api`: client secrets path, privacy status (`private`, `unlisted`, `public`), auto-upload flag + +--- + +### Pipeline Modules (`pipeline/`) + +#### [NEW] [pipeline/script_gen.py](file:///home/mark/Projects/GeminiVideoPipeline/pipeline/script_gen.py) +- Generates structured documentary scripts via AMDLLM llama.cpp (Qwen3.5-7B). +- Generates 3+ high-CTR English titles & 3+ Spanish titles for A/B testing. +- Generates SEO descriptions with hashtags and structured chapter headings. +- Translates narration into natural Latin American Spanish. +- Extracts visual generation prompts and stock media search keywords for each scene. + +#### [NEW] [pipeline/tts_gen.py](file:///home/mark/Projects/GeminiVideoPipeline/pipeline/tts_gen.py) +- Generates voiceover audio for English (`af_heart`, `am_adam`) and Spanish (`ef_dora`, `em_alex`) via IntelLLM Kokoro :8003. +- Tracks per-segment exact duration and timestamps to compute precise chapter markers (`00:00 - Intro`, etc.). + +#### [NEW] [pipeline/visual_gen.py](file:///home/mark/Projects/GeminiVideoPipeline/pipeline/visual_gen.py) +- **ComfyUI MiniMax H3 Video Generator**: Sends text-to-video requests to NvidiaLLM. +- **ComfyUI z-image-turbo / SDXL Image Generator**: Fast high-resolution image rendering on NvidiaLLM. +- **Stock Media Downloader**: Queries Wikimedia Commons and Pexels/Pixabay for relevant HD video clips and images. +- **Ken Burns Motion FX**: Automatically animates still images with slow zoom/pan motion in FFmpeg. +- **Intelligent Fallback Hierarchy**: MiniMax H3 Video → Stock Video → AI Image → Stock Image. + +#### [NEW] [pipeline/music_gen.py](file:///home/mark/Projects/GeminiVideoPipeline/pipeline/music_gen.py) +- Generates mood-tailored cinematic background music matching the exact target duration. +- Supports procedural multi-layer ambient/cinematic audio synthesis (pads, harmonic chord progressions, sub-bass, atmospheric textures). +- Generates clean looped background music ready for dynamic audio ducking. + +#### [NEW] [pipeline/sub_gen.py](file:///home/mark/Projects/GeminiVideoPipeline/pipeline/sub_gen.py) +- Runs Faster-Whisper on IntelLLM to generate word-accurate `.srt` subtitles in English and Spanish. + +#### [NEW] [pipeline/thumb_gen.py](file:///home/mark/Projects/GeminiVideoPipeline/pipeline/thumb_gen.py) +- Generates 3 distinct thumbnail concepts (A, B, C) for A/B testing on NvidiaLLM. +- For each concept, renders: + 1. English title overlay (`thumb_A_en.png`) + 2. Spanish title overlay (`thumb_A_es.png`) + 3. Clean/raw background without text (`thumb_A_clean.png`) +- High-contrast typography with bold outline and dark backing box for maximum CTR. + +#### [NEW] [pipeline/assembler.py](file:///home/mark/Projects/GeminiVideoPipeline/pipeline/assembler.py) +- Orchestrates multi-track video assembly on IntelLLM FFmpeg: + - Video track (normalized 1080p/720p 25fps clips + Ken Burns transitions) + - Voiceover track + - Background music track with **active audio ducking** (`sidechaincompress`) + - Subtitle burning and embedding + - Embedded chapter metadata + +#### [NEW] [pipeline/trending.py](file:///home/mark/Projects/GeminiVideoPipeline/pipeline/trending.py) +- Real-time Google Trends RSS query & YouTube trending feed parser. +- AMDLLM LLM viral documentary topic ideation engine for automated 24/7 topic discovery across niches (Science, History, Tech, Space, Mysteries). + +#### [NEW] [pipeline/queue_manager.py](file:///home/mark/Projects/GeminiVideoPipeline/pipeline/queue_manager.py) +- Persistent SQLite/JSON queue manager for 24/7 autonomous scheduling. +- Tracks job statuses: `QUEUED`, `PROCESSING`, `COMPLETED`, `FAILED`. +- Resumable checkpointing: saves intermediate artifacts so interrupted jobs resume without repeating expensive AI generation steps. + +#### [NEW] [pipeline/youtube_uploader.py](file:///home/mark/Projects/GeminiVideoPipeline/pipeline/youtube_uploader.py) +- YouTube Data API v3 upload module: + - Google OAuth2 authentication flow (`client_secrets.json` / token storage). + - Video upload with Title, Description (including chapters), Tags, Category. + - Custom thumbnail assignment. + - Multi-language caption (`.srt`) uploading. + - Privacy status setting (`private`, `unlisted`, `public`). + +--- + +### Main Orchestrator & CLI + +#### [MODIFY] [youtube_factory.py](file:///home/mark/Projects/GeminiVideoPipeline/youtube_factory.py) +- Refactor into the unified master CLI connecting all pipeline components. +- CLI arguments: + - `--topic ""`: Single video pipeline + - `--batch "" ""` / `--batch-file `: Batch video processing + - `--trending [--niche ] [--count ]`: Auto-pull trending topics + - `--daemon`: 24/7 continuous autonomous worker + - `--queue-add`, `--queue-list`, `--queue-retry` + - `--health`: Check all 3 PCs & services + - `--upload `: YouTube API uploader + - `--dry-run`: Test script & metadata generation without heavy rendering + +#### [MODIFY] [README.md](file:///home/mark/Projects/GeminiVideoPipeline/README.md) +- Update documentation with 24/7 daemon usage, stock media options, trending topic commands, background music, chapter formatting, and YouTube API upload guide. + +--- + +## Verification Plan + +### Automated & Integration Tests +1. **Health Check**: + ```bash + python3 youtube_factory.py --health + ``` +2. **Trending Topic Discovery Test**: + ```bash + python3 -c "from pipeline.trending import TrendingFetcher; print(TrendingFetcher().get_trending_topics(count=3))" + ``` +3. **Procedural Background Music Generation Test**: + ```bash + python3 -c "from pipeline.music_gen import MusicGen; print(MusicGen().generate(30, '/tmp/test_music.wav'))" + ``` +4. **Stock Media Downloader Test**: + ```bash + python3 -c "from pipeline.visual_gen import StockMediaFetcher; print(StockMediaFetcher().search_and_download('Ancient Rome', '/tmp/test_stock.jpg'))" + ``` +5. **Dry Run End-to-End Pipeline Test**: + ```bash + python3 youtube_factory.py --topic "The Secrets of the Mariana Trench" --dry-run + ``` +6. **Full Video Generation Test (Single Topic)**: + ```bash + python3 youtube_factory.py --topic "The Lost Library of Alexandria" --duration 60 + ``` + - Verify output directory contains: + - `_en.mp4` & `_es.mp4` with audio ducking and subtitles + - `_thumb_A_en.png`, `_thumb_A_es.png`, `_thumb_B_en.png`, etc. + - `_meta.json` with chapters, SEO description, and tags + - `_upload.txt` with formatted YouTube Studio copy-paste bundle + - `_bundle.json` for automated YouTube API uploader diff --git a/minimaxh3.json b/minimaxh3.json new file mode 100644 index 0000000..bd9815d --- /dev/null +++ b/minimaxh3.json @@ -0,0 +1,245 @@ +{ + "92": { + "inputs": { + "filename_prefix": "video/MiniMax_H3", + "format": "auto", + "codec": "auto", + "video": [ + "105:91", + 0 + ] + }, + "class_type": "SaveVideo", + "_meta": { + "title": "Save Video" + } + }, + "115": { + "inputs": { + "aspect_ratio": "16:9 (Widescreen)", + "megapixels": 0.4, + "multiple": 32 + }, + "class_type": "ResolutionSelector", + "_meta": { + "title": "Resolution Selector" + } + }, + "105:11": { + "inputs": { + "vae_name": "minimax_h3_video_vae_fp16.safetensors" + }, + "class_type": "VAELoader", + "_meta": { + "title": "Load VAE" + } + }, + "105:24": { + "inputs": { + "vae_name": "minimax_h3_audio_vae_fp32.safetensors" + }, + "class_type": "VAELoader", + "_meta": { + "title": "Load VAE" + } + }, + "105:23": { + "inputs": { + "samples": [ + "105:14", + 0 + ], + "vae": [ + "105:24", + 0 + ] + }, + "class_type": "VAEDecodeAudio", + "_meta": { + "title": "VAE Decode Audio" + } + }, + "105:10": { + "inputs": { + "samples": [ + "105:14", + 0 + ], + "vae": [ + "105:11", + 0 + ] + }, + "class_type": "VAEDecode", + "_meta": { + "title": "VAE Decode" + } + }, + "105:17": { + "inputs": { + "sampler_name": "res_multistep" + }, + "class_type": "KSamplerSelect", + "_meta": { + "title": "KSamplerSelect" + } + }, + "105:9": { + "inputs": { + "scheduler": "simple", + "steps": 20, + "denoise": 1, + "model": [ + "105:6", + 0 + ] + }, + "class_type": "BasicScheduler", + "_meta": { + "title": "BasicScheduler" + } + }, + "105:14": { + "inputs": { + "noise": [ + "105:15", + 0 + ], + "guider": [ + "105:16", + 0 + ], + "sampler": [ + "105:17", + 0 + ], + "sigmas": [ + "105:9", + 0 + ], + "latent_image": [ + "105:104", + 1 + ] + }, + "class_type": "SamplerCustomAdvanced", + "_meta": { + "title": "SamplerCustomAdvanced" + } + }, + "105:16": { + "inputs": { + "model": [ + "105:6", + 0 + ], + "conditioning": [ + "105:104", + 0 + ] + }, + "class_type": "BasicGuider", + "_meta": { + "title": "Basic Guider" + } + }, + "105:6": { + "inputs": { + "unet_name": "minimax_h3_fl2va_pruned_int8_convrot.safetensors", + "weight_dtype": "default" + }, + "class_type": "UNETLoader", + "_meta": { + "title": "Load Diffusion Model" + } + }, + "105:13": { + "inputs": { + "clip_name": "qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors", + "type": "minimax", + "device": "default" + }, + "class_type": "CLIPLoader", + "_meta": { + "title": "Load CLIP" + } + }, + "105:15": { + "inputs": { + "noise_seed": 816797766160743 + }, + "class_type": "RandomNoise", + "_meta": { + "title": "RandomNoise" + } + }, + "105:91": { + "inputs": { + "fps": 24, + "bit_depth": 8, + "images": [ + "105:10", + 0 + ], + "audio": [ + "105:23", + 0 + ] + }, + "class_type": "CreateVideo", + "_meta": { + "title": "Create Video" + } + }, + "105:104": { + "inputs": { + "prompt": "Realistic cinematic, camera POV walks into an eclectic 90s coffeehouse with many alternatively dressed patrons, a hippie looking dude playing guitar in the back corner, and a welcoming owner behind the counter. The place is decorated with eclectc art and furniture that was purchased from thrift stores.", + "width": [ + "115", + 0 + ], + "height": [ + "115", + 1 + ], + "length": [ + "105:107", + 1 + ], + "clip": [ + "105:13", + 0 + ], + "vae": [ + "105:11", + 0 + ] + }, + "class_type": "MiniMaxH3ImageToVideo", + "_meta": { + "title": "MiniMax H3 Image to Video" + } + }, + "105:107": { + "inputs": { + "expression": "max(5, round(a * 24)) + (5 - (max(5, round(a * 24)) % 17)) % 17", + "values.a": [ + "105:111", + 0 + ] + }, + "class_type": "ComfyMathExpression", + "_meta": { + "title": "Math Expression" + } + }, + "105:111": { + "inputs": { + "value": 5 + }, + "class_type": "PrimitiveFloat", + "_meta": { + "title": "Float (duration)" + } + } +} \ No newline at end of file diff --git a/output/1786804388_History_of_ML_and_AI_thumbnail.png b/output/1786804388_History_of_ML_and_AI_thumbnail.png new file mode 100644 index 0000000..3227470 Binary files /dev/null and b/output/1786804388_History_of_ML_and_AI_thumbnail.png differ diff --git a/output/1786806569_History_of_ML_and_AI_thumbnail.png b/output/1786806569_History_of_ML_and_AI_thumbnail.png new file mode 100644 index 0000000..382b6a3 Binary files /dev/null and b/output/1786806569_History_of_ML_and_AI_thumbnail.png differ diff --git a/output/1786807021_History_of_ML_and_AI_thumbnail.png b/output/1786807021_History_of_ML_and_AI_thumbnail.png new file mode 100644 index 0000000..3227470 Binary files /dev/null and b/output/1786807021_History_of_ML_and_AI_thumbnail.png differ diff --git a/output/1786808009_History_of_ML_and_AI_thumbnail.png b/output/1786808009_History_of_ML_and_AI_thumbnail.png new file mode 100644 index 0000000..9f68987 Binary files /dev/null and b/output/1786808009_History_of_ML_and_AI_thumbnail.png differ diff --git a/output/1786872191_The_Secrets_of_the_Marian_en.mp4 b/output/1786872191_The_Secrets_of_the_Marian_en.mp4 new file mode 100644 index 0000000..6a9babd Binary files /dev/null and b/output/1786872191_The_Secrets_of_the_Marian_en.mp4 differ diff --git a/output/1786872191_The_Secrets_of_the_Marian_es.mp4 b/output/1786872191_The_Secrets_of_the_Marian_es.mp4 new file mode 100644 index 0000000..4811285 Binary files /dev/null and b/output/1786872191_The_Secrets_of_the_Marian_es.mp4 differ diff --git a/output/1786872191_The_Secrets_of_the_Marian_meta.json b/output/1786872191_The_Secrets_of_the_Marian_meta.json new file mode 100644 index 0000000..46e0038 --- /dev/null +++ b/output/1786872191_The_Secrets_of_the_Marian_meta.json @@ -0,0 +1,132 @@ +{ + "job_id": "1786872191_The_Secrets_of_the_Marian", + "topic": "The Secrets of the Mariana Trench", + "titles": [ + "Mysteries of the Deepest Sea", + "The Mariana Trench: Unveiling Secrets", + "Dive into the Dark Depths" + ], + "titles_es": [ + "Misterios del Mar Más Profundo", + "La Marea Mariana: Revelando Secretos", + "Sumérgete en las Profundidades Oscuras" + ], + "description": "Dive into the uncharted depths of the Mariana Trench, the deepest point on Earth. Discover the unique ecosystem, mysterious creatures, and scientific secrets hidden in its shadow. #Documentary #Science #Ocean\n\nTIMESTAMPS / CHAPTERS:\n00:00 - The Ancient Mystery\n00:12 - The Critical Discovery\n00:23 - Beneath the Surface\n00:33 - Unlocking Mysteries\n\n#Documentary #History #Science", + "description_es": "Sumérgete en las profundidades sin explorar del Trench Mariana, el punto más profundo de la Tierra. Descubre el ecosistema único, criaturas misteriosas y secretos científicos ocultos en su sombra. #Documentario #Ciencia #Océano\n\nCAPÍTULOS:\n00:00 - El Misterio Antiguo\n00:13 - El Descubrimiento Crítico\n00:23 - Bajo la Superficie\n00:34 - Desvelando Misterios\n\n#Documental #Historia #Ciencia", + "tags": [ + "documentary", + "oceanography", + "marine biology", + "deep sea", + "Mariana Trench", + "ocean floor", + "scientific exploration", + "underwater life", + "marine ecology", + "underwater mystery", + "deep sea discovery", + "sea exploration", + "ocean trenches" + ], + "chapters_en": [ + { + "index": 0, + "start": 0.0, + "end": 12.475, + "duration": 12.475, + "chapter_title": "The Ancient Mystery", + "text": "In the Mariana Trench, 36,000 feet below the surface, lies an ancient mystery. Explore the deepest point on Earth, a place untouched by sunlight, where life thrives in darkness.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786872191_The_Secrets_of_the_Marian/tts_en_000.wav" + }, + { + "index": 1, + "start": 12.475, + "end": 23.174999999999997, + "duration": 10.7, + "chapter_title": "The Critical Discovery", + "text": "In 1960, Swiss engineer Jacques Piccard descended into this abyss. His voyage marked the first and only human visit to the Challenger Deep. What did he find?", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786872191_The_Secrets_of_the_Marian/tts_en_001.wav" + }, + { + "index": 2, + "start": 23.174999999999997, + "end": 33.275, + "duration": 10.1, + "chapter_title": "Beneath the Surface", + "text": "Today, scientists continue to uncover the secrets of this dark realm. Strange creatures, unique ecosystems, and rare minerals await exploration.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786872191_The_Secrets_of_the_Marian/tts_en_002.wav" + }, + { + "index": 3, + "start": 33.275, + "end": 42.275, + "duration": 9.0, + "chapter_title": "Unlocking Mysteries", + "text": "The Mariana Trench holds more mysteries than we can imagine. As we delve deeper, the future of exploration and discovery unfolds.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786872191_The_Secrets_of_the_Marian/tts_en_003.wav" + } + ], + "chapters_es": [ + { + "index": 0, + "start": 0.0, + "end": 13.475, + "duration": 13.475, + "chapter_title": "El Misterio Antiguo", + "text": "En el Trench Mariana, a 36,000 pies bajo la superficie, se esconde un misterio antiguo. Explora el punto más profundo de la Tierra, un lugar que nunca ha visto la luz del sol, donde la vida sobrevive en la oscuridad.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786872191_The_Secrets_of_the_Marian/tts_es_000.wav" + }, + { + "index": 1, + "start": 13.475, + "end": 23.35, + "duration": 9.875, + "chapter_title": "El Descubrimiento Crítico", + "text": "En 1960, el ingeniero suizo Jacques Piccard descendió hasta este abismo. Su viaje marcó la primera y única visita humana al Challenger Deep. ¿Qué encontró?", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786872191_The_Secrets_of_the_Marian/tts_es_001.wav" + }, + { + "index": 2, + "start": 23.35, + "end": 34.375, + "duration": 11.025, + "chapter_title": "Bajo la Superficie", + "text": "Hoy en día, los científicos continúan desvelando los secretos de este reino oscuro. Criaturas extrañas, ecosistemas únicos y minerales raros esperan ser explorados.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786872191_The_Secrets_of_the_Marian/tts_es_002.wav" + }, + { + "index": 3, + "start": 34.375, + "end": 44.825, + "duration": 10.45, + "chapter_title": "Desvelando Misterios", + "text": "El Trench Mariana alberga más misterios de los que podemos imaginar. A medida que nos adentramos más, se despliega el futuro de la exploración y la descubrimiento.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786872191_The_Secrets_of_the_Marian/tts_es_003.wav" + } + ], + "files": { + "en": "./output/1786872191_The_Secrets_of_the_Marian_en.mp4", + "es": "./output/1786872191_The_Secrets_of_the_Marian_es.mp4" + }, + "subtitles": { + "en": "./output/1786872191_The_Secrets_of_the_Marian_subtitles_en.srt", + "es": "./output/1786872191_The_Secrets_of_the_Marian_subtitles_es.srt" + }, + "thumbnails": { + "en": [], + "es": [], + "clean": [] + }, + "timings": { + "SCRIPT": 90.9, + "TTS:EN": 18.7, + "TTS:ES": 18.8, + "MUSIC": 0.6, + "VISUAL": 9645.0, + "SUBS:EN": 11.4, + "SUBS:ES": 10.7, + "THUMBNAILS": 3610.3, + "ASSEMBLY": 34.7 + }, + "created_at": 1786885632.675395 +} \ No newline at end of file diff --git a/output/1786872191_The_Secrets_of_the_Marian_subtitles_en.srt b/output/1786872191_The_Secrets_of_the_Marian_subtitles_en.srt new file mode 100644 index 0000000..425b3ab --- /dev/null +++ b/output/1786872191_The_Secrets_of_the_Marian_subtitles_en.srt @@ -0,0 +1,68 @@ +1 +00:00:00,000 --> 00:00:02,780 +In the Mariana Trench, 36 ,000 + +2 +00:00:02,780 --> 00:00:04,700 +feet below the surface lies an + +3 +00:00:04,700 --> 00:00:07,500 +ancient mystery. Explore the deepest point + +4 +00:00:07,500 --> 00:00:09,440 +on Earth, a place untouched by + +5 +00:00:09,440 --> 00:00:11,760 +sunlight, where life thrives in darkness. + +6 +00:00:12,600 --> 00:00:15,640 +In 1960, Swiss engineer Jacques Pickard + +7 +00:00:15,640 --> 00:00:18,100 +descended into this abyss. His voyage + +8 +00:00:18,100 --> 00:00:19,920 +marked the first and only human + +9 +00:00:19,920 --> 00:00:22,000 +visit to the challenger deep. What + +10 +00:00:22,000 --> 00:00:25,020 +did he find? Today, scientists continue + +11 +00:00:25,020 --> 00:00:26,560 +to uncover the secrets of this + +12 +00:00:26,560 --> 00:00:30,080 +dark realm. Strange creatures, unique ecosystems, + +13 +00:00:30,680 --> 00:00:33,640 +and rare minerals await exploration. The + +14 +00:00:33,640 --> 00:00:35,960 +Mariana Trench holds more mysteries than + +15 +00:00:35,960 --> 00:00:38,000 +we can imagine. As we delve + +16 +00:00:38,000 --> 00:00:40,380 +deeper, the future of exploration and + +17 +00:00:40,380 --> 00:00:41,860 +discovery unfolds. + diff --git a/output/1786872191_The_Secrets_of_the_Marian_subtitles_es.srt b/output/1786872191_The_Secrets_of_the_Marian_subtitles_es.srt new file mode 100644 index 0000000..3e55333 --- /dev/null +++ b/output/1786872191_The_Secrets_of_the_Marian_subtitles_es.srt @@ -0,0 +1,72 @@ +1 +00:00:00,000 --> 00:00:01,900 +En el Trench Mariana, a 36 + +2 +00:00:01,900 --> 00:00:04,600 +,000 pies bajula superficie, se escandan + +3 +00:00:04,600 --> 00:00:06,920 +misterio ante guio. Explora el punto + +4 +00:00:06,920 --> 00:00:08,820 +más profundo de la tierra, un + +5 +00:00:08,820 --> 00:00:11,240 +lugar cuenancajavistula las del sol, don + +6 +00:00:11,240 --> 00:00:13,120 +la vida sobrevivía y la oscuridad. + +7 +00:00:13,520 --> 00:00:16,060 +En 1960, el ingeniero suizo Jack + +8 +00:00:16,060 --> 00:00:18,640 +Pickard descendió a Estabismo, su voyage + +9 +00:00:18,640 --> 00:00:20,520 +marcó la primer y única visita + +10 +00:00:20,520 --> 00:00:22,660 +humana al challenger deep. Cue en + +11 +00:00:22,660 --> 00:00:26,340 +control. Poyendaia, loscientificos continuan disvolando + +12 +00:00:26,340 --> 00:00:29,440 +los secretos de esterino oscuro. Criaturas + +13 +00:00:29,440 --> 00:00:32,680 +extrañas, ecosystemas unicos, why minerals, raros, + +14 +00:00:33,000 --> 00:00:35,400 +espurns, ser explorados. El Trench Mariana, + +15 +00:00:35,580 --> 00:00:37,800 +alberga mas misterios de los cuepadimos + +16 +00:00:37,800 --> 00:00:40,320 +imaginar. A medida que nos adentramos + +17 +00:00:40,320 --> 00:00:42,560 +mas, se despliegue el futuro de + +18 +00:00:42,560 --> 00:00:44,520 +la exploración y la descubrimiento. + diff --git a/output/1786872191_The_Secrets_of_the_Marian_upload_EN.txt b/output/1786872191_The_Secrets_of_the_Marian_upload_EN.txt new file mode 100644 index 0000000..b8221e7 --- /dev/null +++ b/output/1786872191_The_Secrets_of_the_Marian_upload_EN.txt @@ -0,0 +1,26 @@ +============================================================ +YOUTUBE UPLOAD BUNDLE — ENGLISH (Topic: The Secrets of the Mariana Trench) +============================================================ + +TITLES FOR A/B TESTING: + A. Mysteries of the Deepest Sea + B. The Mariana Trench: Unveiling Secrets + C. Dive into the Dark Depths + +DESCRIPTION & CHAPTERS: +Dive into the uncharted depths of the Mariana Trench, the deepest point on Earth. Discover the unique ecosystem, mysterious creatures, and scientific secrets hidden in its shadow. #Documentary #Science #Ocean + +TIMESTAMPS / CHAPTERS: +00:00 - The Ancient Mystery +00:12 - The Critical Discovery +00:23 - Beneath the Surface +00:33 - Unlocking Mysteries + +#Documentary #History #Science + +TAGS: +documentary, oceanography, marine biology, deep sea, Mariana Trench, ocean floor, scientific exploration, underwater life, marine ecology, underwater mystery, deep sea discovery, sea exploration, ocean trenches + +VIDEO FILE: ./output/1786872191_The_Secrets_of_the_Marian_en.mp4 +SUBTITLES: ./output/1786872191_The_Secrets_of_the_Marian_subtitles_en.srt +THUMBNAILS: diff --git a/output/1786872191_The_Secrets_of_the_Marian_upload_ES.txt b/output/1786872191_The_Secrets_of_the_Marian_upload_ES.txt new file mode 100644 index 0000000..e87baae --- /dev/null +++ b/output/1786872191_The_Secrets_of_the_Marian_upload_ES.txt @@ -0,0 +1,26 @@ +============================================================ +PAQUETE DE SUBIDA A YOUTUBE — ESPAÑOL (Tema: The Secrets of the Mariana Trench) +============================================================ + +TÍTULOS PARA PRUEBA A/B: + A. Misterios del Mar Más Profundo + B. La Marea Mariana: Revelando Secretos + C. Sumérgete en las Profundidades Oscuras + +DESCRIPCIÓN Y CAPÍTULOS: +Sumérgete en las profundidades sin explorar del Trench Mariana, el punto más profundo de la Tierra. Descubre el ecosistema único, criaturas misteriosas y secretos científicos ocultos en su sombra. #Documentario #Ciencia #Océano + +CAPÍTULOS: +00:00 - El Misterio Antiguo +00:13 - El Descubrimiento Crítico +00:23 - Bajo la Superficie +00:34 - Desvelando Misterios + +#Documental #Historia #Ciencia + +ETIQUETAS / TAGS: +documentary, oceanography, marine biology, deep sea, Mariana Trench, ocean floor, scientific exploration, underwater life, marine ecology, underwater mystery, deep sea discovery, sea exploration, ocean trenches + +ARCHIVO DE VIDEO: ./output/1786872191_The_Secrets_of_the_Marian_es.mp4 +SUBTÍTULOS: ./output/1786872191_The_Secrets_of_the_Marian_subtitles_es.srt +MINIATURAS: diff --git a/output/1786872908_The_Secrets_of_the_Marian_en.mp4 b/output/1786872908_The_Secrets_of_the_Marian_en.mp4 new file mode 100644 index 0000000..d619da5 Binary files /dev/null and b/output/1786872908_The_Secrets_of_the_Marian_en.mp4 differ diff --git a/output/1786872908_The_Secrets_of_the_Marian_es.mp4 b/output/1786872908_The_Secrets_of_the_Marian_es.mp4 new file mode 100644 index 0000000..4d25858 Binary files /dev/null and b/output/1786872908_The_Secrets_of_the_Marian_es.mp4 differ diff --git a/output/1786872908_The_Secrets_of_the_Marian_meta.json b/output/1786872908_The_Secrets_of_the_Marian_meta.json new file mode 100644 index 0000000..ed57908 --- /dev/null +++ b/output/1786872908_The_Secrets_of_the_Marian_meta.json @@ -0,0 +1,144 @@ +{ + "job_id": "1786872908_The_Secrets_of_the_Marian", + "topic": "The Secrets of the Mariana Trench", + "titles": [ + "Mariana Trench: Deeper Than You Can Imagine", + "Unearthing the Secrets of the Deepest Ocean", + "The Mariana Trench: A Journey to the Abyss" + ], + "titles_es": [ + "Mariana Trench: Más Profundo de lo Que Puedes Imaginar", + "Descubriendo los Secretos del Último Rincón del Océano", + "La Mariana Trench: Un Viaje al Abismo" + ], + "description": "Dive into the mysterious depths of the Mariana Trench, the deepest part of our oceans. Discover the unique creatures, extreme pressures, and scientific mysteries that await explorers. #Documentary #Science #Oceans\n\nTIMESTAMPS / CHAPTERS:\n00:00 - The Ancient Mystery\n00:08 - The Critical Discovery\n00:16 - The Baffling Discoveries\n00:24 - The Critical Future\n\n#Documentary #History #Science", + "description_es": "Sumérgete en los misteriosos confines de la Mariana Trench, la parte más profunda de nuestros océanos. Descubre criaturas únicas, presiones extremas y misterios científicos que esperan a los exploradores. #Documentario #Ciencia #Océanos\n\nCAPÍTULOS:\n00:00 - El Misterio Antiguo\n00:09 - La Descubierta Crítica\n00:18 - Las Descubiertas Desconcertantes\n00:26 - El Futuro Crítico\n\n#Documental #Historia #Ciencia", + "tags": [ + "documentary", + "science", + "oceans", + "deep sea", + "Mariana Trench", + "pressure", + "creatures", + "exploration", + "depth", + "environment", + "discovery", + "explorers", + "environmental" + ], + "chapters_en": [ + { + "index": 0, + "start": 0.0, + "end": 8.775, + "duration": 8.775, + "chapter_title": "The Ancient Mystery", + "text": "For centuries, the Mariana Trench has remained a mysterious, unexplored world. Its depths hold secrets waiting to be uncovered.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786872908_The_Secrets_of_the_Marian/tts_en_000.wav" + }, + { + "index": 1, + "start": 8.775, + "end": 16.950000000000003, + "duration": 8.175, + "chapter_title": "The Critical Discovery", + "text": "In 1960, the first human dove into the Mariana Trench, revealing the harsh reality of life at extreme depths.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786872908_The_Secrets_of_the_Marian/tts_en_001.wav" + }, + { + "index": 2, + "start": 16.950000000000003, + "end": 24.700000000000003, + "duration": 7.75, + "chapter_title": "The Baffling Discoveries", + "text": "Recent expeditions have uncovered unique ecosystems and creatures, challenging our understanding of life on Earth.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786872908_The_Secrets_of_the_Marian/tts_en_002.wav" + }, + { + "index": 3, + "start": 24.700000000000003, + "end": 33.825, + "duration": 9.125, + "chapter_title": "The Critical Future", + "text": "Continuing exploration of the Mariana Trench could unlock secrets that benefit science, technology, and our understanding of the unknown.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786872908_The_Secrets_of_the_Marian/tts_en_003.wav" + } + ], + "chapters_es": [ + { + "index": 0, + "start": 0.0, + "end": 9.675, + "duration": 9.675, + "chapter_title": "El Misterio Antiguo", + "text": "Por siglos, la Mariana Trench ha permanecido como un misterio, un mundo inexplorado. Sus profundidades albergan secretos esperando ser descubiertos.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786872908_The_Secrets_of_the_Marian/tts_es_000.wav" + }, + { + "index": 1, + "start": 9.675, + "end": 18.025, + "duration": 8.35, + "chapter_title": "La Descubierta Crítica", + "text": "En 1960, el primer humano sumergió hasta la Mariana Trench, revelando la dura realidad de la vida en extremos de profundidad.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786872908_The_Secrets_of_the_Marian/tts_es_001.wav" + }, + { + "index": 2, + "start": 18.025, + "end": 26.15, + "duration": 8.125, + "chapter_title": "Las Descubiertas Desconcertantes", + "text": "Expediciones recientes han descubierto ecosistemas y criaturas únicas, desafiando nuestra comprensión de la vida en la Tierra.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786872908_The_Secrets_of_the_Marian/tts_es_002.wav" + }, + { + "index": 3, + "start": 26.15, + "end": 35.325, + "duration": 9.175, + "chapter_title": "El Futuro Crítico", + "text": "La exploración continua de la Mariana Trench podría revelar secretos que beneficien la ciencia, la tecnología y nuestra comprensión del desconocido.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786872908_The_Secrets_of_the_Marian/tts_es_003.wav" + } + ], + "files": { + "en": "./output/1786872908_The_Secrets_of_the_Marian_en.mp4", + "es": "./output/1786872908_The_Secrets_of_the_Marian_es.mp4" + }, + "subtitles": { + "en": "./output/1786872908_The_Secrets_of_the_Marian_subtitles_en.srt", + "es": "./output/1786872908_The_Secrets_of_the_Marian_subtitles_es.srt" + }, + "thumbnails": { + "en": [ + "./output/1786872908_The_Secrets_of_the_Marian_thumb_A_en.png", + "./output/1786872908_The_Secrets_of_the_Marian_thumb_B_en.png", + "./output/1786872908_The_Secrets_of_the_Marian_thumb_C_en.png" + ], + "es": [ + "./output/1786872908_The_Secrets_of_the_Marian_thumb_A_es.png", + "./output/1786872908_The_Secrets_of_the_Marian_thumb_B_es.png", + "./output/1786872908_The_Secrets_of_the_Marian_thumb_C_es.png" + ], + "clean": [ + "./output/1786872908_The_Secrets_of_the_Marian_thumb_A_clean.png", + "./output/1786872908_The_Secrets_of_the_Marian_thumb_B_clean.png", + "./output/1786872908_The_Secrets_of_the_Marian_thumb_C_clean.png" + ] + }, + "timings": { + "SCRIPT": 86.4, + "TTS:EN": 16.5, + "TTS:ES": 15.1, + "MUSIC": 0.5, + "VISUAL": 52.2, + "SUBS:EN": 9.1, + "SUBS:ES": 9.5, + "THUMBNAILS": 47.8, + "ASSEMBLY": 64.0 + }, + "created_at": 1786873209.4279642 +} \ No newline at end of file diff --git a/output/1786872908_The_Secrets_of_the_Marian_subtitles_en.srt b/output/1786872908_The_Secrets_of_the_Marian_subtitles_en.srt new file mode 100644 index 0000000..284ad73 --- /dev/null +++ b/output/1786872908_The_Secrets_of_the_Marian_subtitles_en.srt @@ -0,0 +1,52 @@ +1 +00:00:00,000 --> 00:00:02,500 +For centuries, the Mariana Trench has + +2 +00:00:02,500 --> 00:00:05,800 +remained a mysterious, unexplored world. Its + +3 +00:00:05,800 --> 00:00:07,720 +depths hold secrets waiting to be + +4 +00:00:07,720 --> 00:00:11,240 +uncovered. In 1960, the first human + +5 +00:00:11,240 --> 00:00:13,620 +dove into the Mariana Trench, revealing + +6 +00:00:13,620 --> 00:00:15,460 +the harsh reality of life at + +7 +00:00:15,460 --> 00:00:18,880 +extreme depths. Recent expeditions have + +8 +00:00:18,880 --> 00:00:22,320 +uncovered unique ecosystems and creatures, challenging + +9 +00:00:22,320 --> 00:00:24,100 +our understanding of life on Earth. + +10 +00:00:24,100 --> 00:00:27,340 +Continuing exploration of the Mariana Trench + +11 +00:00:27,340 --> 00:00:30,020 +could unlock secrets that benefit science, + +12 +00:00:30,500 --> 00:00:32,760 +technology, and our understanding of the + +13 +00:00:32,760 --> 00:00:33,140 +unknown. + diff --git a/output/1786872908_The_Secrets_of_the_Marian_subtitles_es.srt b/output/1786872908_The_Secrets_of_the_Marian_subtitles_es.srt new file mode 100644 index 0000000..ba34ba0 --- /dev/null +++ b/output/1786872908_The_Secrets_of_the_Marian_subtitles_es.srt @@ -0,0 +1,56 @@ +1 +00:00:00,000 --> 00:00:01,940 +Por siglos, la Mariana Trenche ha + +2 +00:00:01,940 --> 00:00:04,640 +permancido como un misterio, un mando + +3 +00:00:04,640 --> 00:00:07,960 +inexplorado, sus profundidades albergán secretos de + +4 +00:00:07,960 --> 00:00:11,220 +espurrándose a discubirdos. En 1960, el + +5 +00:00:11,220 --> 00:00:13,380 +primer humano sumergió hasto la Mariana + +6 +00:00:13,380 --> 00:00:15,900 +Trenche, revelando la dura realidad de + +7 +00:00:15,900 --> 00:00:17,760 +la vida en extremos de profundidad. + +8 +00:00:18,220 --> 00:00:21,380 +Expeditions Rescientes, han discubirdo ecosistemas y + +9 +00:00:21,380 --> 00:00:24,700 +criaturas unicas, disafiando nuestra comprensión + +10 +00:00:24,700 --> 00:00:25,920 +de la vida en la tierra. + +11 +00:00:25,920 --> 00:00:28,140 +La exploración continúa de la Mariana + +12 +00:00:28,140 --> 00:00:30,940 +Trenche, Padria Reveller -Secredos, que beneficio + +13 +00:00:30,940 --> 00:00:33,020 +en la Asiancia, la tecnología y + +14 +00:00:33,020 --> 00:00:35,020 +nuestra comprensión del descanocido. + diff --git a/output/1786872908_The_Secrets_of_the_Marian_thumb_A_clean.png b/output/1786872908_The_Secrets_of_the_Marian_thumb_A_clean.png new file mode 100644 index 0000000..a4a213e Binary files /dev/null and b/output/1786872908_The_Secrets_of_the_Marian_thumb_A_clean.png differ diff --git a/output/1786872908_The_Secrets_of_the_Marian_thumb_A_en.png b/output/1786872908_The_Secrets_of_the_Marian_thumb_A_en.png new file mode 100644 index 0000000..a97887f Binary files /dev/null and b/output/1786872908_The_Secrets_of_the_Marian_thumb_A_en.png differ diff --git a/output/1786872908_The_Secrets_of_the_Marian_thumb_A_es.png b/output/1786872908_The_Secrets_of_the_Marian_thumb_A_es.png new file mode 100644 index 0000000..ddd0901 Binary files /dev/null and b/output/1786872908_The_Secrets_of_the_Marian_thumb_A_es.png differ diff --git a/output/1786872908_The_Secrets_of_the_Marian_thumb_B_clean.png b/output/1786872908_The_Secrets_of_the_Marian_thumb_B_clean.png new file mode 100644 index 0000000..efacbcb Binary files /dev/null and b/output/1786872908_The_Secrets_of_the_Marian_thumb_B_clean.png differ diff --git a/output/1786872908_The_Secrets_of_the_Marian_thumb_B_en.png b/output/1786872908_The_Secrets_of_the_Marian_thumb_B_en.png new file mode 100644 index 0000000..36cc89b Binary files /dev/null and b/output/1786872908_The_Secrets_of_the_Marian_thumb_B_en.png differ diff --git a/output/1786872908_The_Secrets_of_the_Marian_thumb_B_es.png b/output/1786872908_The_Secrets_of_the_Marian_thumb_B_es.png new file mode 100644 index 0000000..9edf3e5 Binary files /dev/null and b/output/1786872908_The_Secrets_of_the_Marian_thumb_B_es.png differ diff --git a/output/1786872908_The_Secrets_of_the_Marian_thumb_C_clean.png b/output/1786872908_The_Secrets_of_the_Marian_thumb_C_clean.png new file mode 100644 index 0000000..ebe6684 Binary files /dev/null and b/output/1786872908_The_Secrets_of_the_Marian_thumb_C_clean.png differ diff --git a/output/1786872908_The_Secrets_of_the_Marian_thumb_C_en.png b/output/1786872908_The_Secrets_of_the_Marian_thumb_C_en.png new file mode 100644 index 0000000..c63e146 Binary files /dev/null and b/output/1786872908_The_Secrets_of_the_Marian_thumb_C_en.png differ diff --git a/output/1786872908_The_Secrets_of_the_Marian_thumb_C_es.png b/output/1786872908_The_Secrets_of_the_Marian_thumb_C_es.png new file mode 100644 index 0000000..ccc6e01 Binary files /dev/null and b/output/1786872908_The_Secrets_of_the_Marian_thumb_C_es.png differ diff --git a/output/1786872908_The_Secrets_of_the_Marian_upload_EN.txt b/output/1786872908_The_Secrets_of_the_Marian_upload_EN.txt new file mode 100644 index 0000000..b85015f --- /dev/null +++ b/output/1786872908_The_Secrets_of_the_Marian_upload_EN.txt @@ -0,0 +1,29 @@ +============================================================ +YOUTUBE UPLOAD BUNDLE — ENGLISH (Topic: The Secrets of the Mariana Trench) +============================================================ + +TITLES FOR A/B TESTING: + A. Mariana Trench: Deeper Than You Can Imagine + B. Unearthing the Secrets of the Deepest Ocean + C. The Mariana Trench: A Journey to the Abyss + +DESCRIPTION & CHAPTERS: +Dive into the mysterious depths of the Mariana Trench, the deepest part of our oceans. Discover the unique creatures, extreme pressures, and scientific mysteries that await explorers. #Documentary #Science #Oceans + +TIMESTAMPS / CHAPTERS: +00:00 - The Ancient Mystery +00:08 - The Critical Discovery +00:16 - The Baffling Discoveries +00:24 - The Critical Future + +#Documentary #History #Science + +TAGS: +documentary, science, oceans, deep sea, Mariana Trench, pressure, creatures, exploration, depth, environment, discovery, explorers, environmental + +VIDEO FILE: ./output/1786872908_The_Secrets_of_the_Marian_en.mp4 +SUBTITLES: ./output/1786872908_The_Secrets_of_the_Marian_subtitles_en.srt +THUMBNAILS: + - ./output/1786872908_The_Secrets_of_the_Marian_thumb_A_en.png + - ./output/1786872908_The_Secrets_of_the_Marian_thumb_B_en.png + - ./output/1786872908_The_Secrets_of_the_Marian_thumb_C_en.png diff --git a/output/1786872908_The_Secrets_of_the_Marian_upload_ES.txt b/output/1786872908_The_Secrets_of_the_Marian_upload_ES.txt new file mode 100644 index 0000000..01b3f48 --- /dev/null +++ b/output/1786872908_The_Secrets_of_the_Marian_upload_ES.txt @@ -0,0 +1,29 @@ +============================================================ +PAQUETE DE SUBIDA A YOUTUBE — ESPAÑOL (Tema: The Secrets of the Mariana Trench) +============================================================ + +TÍTULOS PARA PRUEBA A/B: + A. Mariana Trench: Más Profundo de lo Que Puedes Imaginar + B. Descubriendo los Secretos del Último Rincón del Océano + C. La Mariana Trench: Un Viaje al Abismo + +DESCRIPCIÓN Y CAPÍTULOS: +Sumérgete en los misteriosos confines de la Mariana Trench, la parte más profunda de nuestros océanos. Descubre criaturas únicas, presiones extremas y misterios científicos que esperan a los exploradores. #Documentario #Ciencia #Océanos + +CAPÍTULOS: +00:00 - El Misterio Antiguo +00:09 - La Descubierta Crítica +00:18 - Las Descubiertas Desconcertantes +00:26 - El Futuro Crítico + +#Documental #Historia #Ciencia + +ETIQUETAS / TAGS: +documentary, science, oceans, deep sea, Mariana Trench, pressure, creatures, exploration, depth, environment, discovery, explorers, environmental + +ARCHIVO DE VIDEO: ./output/1786872908_The_Secrets_of_the_Marian_es.mp4 +SUBTÍTULOS: ./output/1786872908_The_Secrets_of_the_Marian_subtitles_es.srt +MINIATURAS: + - ./output/1786872908_The_Secrets_of_the_Marian_thumb_A_es.png + - ./output/1786872908_The_Secrets_of_the_Marian_thumb_B_es.png + - ./output/1786872908_The_Secrets_of_the_Marian_thumb_C_es.png diff --git a/output/1786889324_What_secret_knowledge_did_en.mp4 b/output/1786889324_What_secret_knowledge_did_en.mp4 new file mode 100644 index 0000000..e00c563 Binary files /dev/null and b/output/1786889324_What_secret_knowledge_did_en.mp4 differ diff --git a/output/1786889324_What_secret_knowledge_did_es.mp4 b/output/1786889324_What_secret_knowledge_did_es.mp4 new file mode 100644 index 0000000..de2f9e0 Binary files /dev/null and b/output/1786889324_What_secret_knowledge_did_es.mp4 differ diff --git a/output/1786889324_What_secret_knowledge_did_meta.json b/output/1786889324_What_secret_knowledge_did_meta.json new file mode 100644 index 0000000..8f1549c --- /dev/null +++ b/output/1786889324_What_secret_knowledge_did_meta.json @@ -0,0 +1,253 @@ +{ + "job_id": "1786889324_What_secret_knowledge_did", + "topic": "What secret knowledge did the ancient egyptians posses?", + "titles": [ + "What Secrets Did Ancient Egyptians Hold?", + "Unveiling Ancient Egyptian Mysteries", + "The Hidden Knowledge of Ancient Egypt" + ], + "titles_es": [ + "¿Qué Secretos Ocultaban los Antiguos Egipcios?", + "Desvelando Misterios Egipcios", + "El Saber Oculto de los Antiguos Egipcios" + ], + "description": "Dive into the enigmatic world of ancient Egypt and explore the hidden knowledge that has intrigued historians and scholars for centuries. This documentary uncovers the secrets of the ancients, from their advanced mathematical and architectural prowess to their spiritual beliefs and medical practices. Unravel the mysteries of the past and gain insights into the civilization that left an indelible mark on human history. #Documentary #History #AncientEgypt\n\nTIMESTAMPS / CHAPTERS:\n00:00 - The Dawn\n00:11 - Mathematical Mastery\n00:22 - Astronomical Insights\n00:33 - Advanced Medicine\n00:45 - Spiritual Wisdom\n00:56 - Architectural Genius\n01:05 - Engineering Marvels\n01:15 - Mystical Texts\n01:25 - Cultural Innovations\n01:36 - Legacy of Secrets\n\n#Documentary #History #Science", + "description_es": "Sumérgete en el mundo enigmático de Egipto antiguo y explora el conocimiento oculto que ha intrigado a historiadores y eruditos durante siglos. Este documental desvela los secretos de los antiguos, desde su maestría matemática y arquitectónica hasta sus creencias espirituales y prácticas médicas. Desatornilla los misterios del pasado y obtén perspectivas sobre una civilización que dejó un sello indeleble en la historia humana. #Documentario #Historia #EgiptoAntiguo\n\nCAPÍTULOS:\n00:00 - La Alborada\n00:11 - Maestría Matemática\n00:24 - Insights Astronómicos\n00:35 - Medicina Avanzada\n00:47 - Sabiduría Espiritual\n00:59 - Genio Arquitectónico\n01:08 - Maravillas de Ingeniería\n01:19 - Textos Místicos\n01:30 - Innovaciones Culturales\n01:43 - Legado de Secretos\n\n#Documental #Historia #Ciencia", + "tags": [ + "documentary", + "ancientegypt", + "history", + "secrets", + "knowledge", + "archaeology", + "mathematics", + "architecture", + "medicine", + "spirituality", + "ancientcivilizations", + "historydocumentary", + "ancientsecrets", + "egyptianmysteries" + ], + "chapters_en": [ + { + "index": 0, + "start": 0.0, + "end": 11.875, + "duration": 11.875, + "chapter_title": "The Dawn", + "text": "In the early days of civilization, ancient Egypt emerged as a beacon of knowledge. The Nile River nurtured a society that thrived in mathematics, astronomy, and architecture.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889324_What_secret_knowledge_did/tts_en_000.wav" + }, + { + "index": 1, + "start": 11.875, + "end": 22.65, + "duration": 10.775, + "chapter_title": "Mathematical Mastery", + "text": "The Egyptians were masters of geometry, using it to build the pyramids with astonishing precision. Their calculations for pi were surprisingly accurate for their time.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889324_What_secret_knowledge_did/tts_en_001.wav" + }, + { + "index": 2, + "start": 22.65, + "end": 33.75, + "duration": 11.1, + "chapter_title": "Astronomical Insights", + "text": "Their knowledge of the stars guided their calendar and agricultural practices. The ancient Egyptians could predict solar and lunar eclipses with remarkable accuracy.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889324_What_secret_knowledge_did/tts_en_002.wav" + }, + { + "index": 3, + "start": 33.75, + "end": 45.125, + "duration": 11.375, + "chapter_title": "Advanced Medicine", + "text": "The Edwin Smith Papyrus reveals surgical practices that were far ahead of its time. They understood the circulatory system and performed amputations with astonishing skill.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889324_What_secret_knowledge_did/tts_en_003.wav" + }, + { + "index": 4, + "start": 45.125, + "end": 56.9, + "duration": 11.775, + "chapter_title": "Spiritual Wisdom", + "text": "The Book of the Dead offered mystical guidance to the deceased, detailing rituals and spells for the afterlife. Their beliefs were complex, involving numerous deities and cosmic forces.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889324_What_secret_knowledge_did/tts_en_004.wav" + }, + { + "index": 5, + "start": 56.9, + "end": 65.8, + "duration": 8.9, + "chapter_title": "Architectural Genius", + "text": "The Great Pyramid of Giza is a testament to their architectural prowess. It remains one of the most enduring symbols of human achievement.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889324_What_secret_knowledge_did/tts_en_005.wav" + }, + { + "index": 6, + "start": 65.8, + "end": 75.975, + "duration": 10.175, + "chapter_title": "Engineering Marvels", + "text": "The construction of the pyramids required advanced engineering techniques. Their knowledge of water management and irrigation was crucial for the growth of crops.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889324_What_secret_knowledge_did/tts_en_006.wav" + }, + { + "index": 7, + "start": 75.975, + "end": 85.3, + "duration": 9.325, + "chapter_title": "Mystical Texts", + "text": "The Rosetta Stone helped decipher hieroglyphs, revealing the complex texts that tell of the pharaohs and their reigns. Each symbol held a deep meaning.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889324_What_secret_knowledge_did/tts_en_007.wav" + }, + { + "index": 8, + "start": 85.3, + "end": 96.925, + "duration": 11.625, + "chapter_title": "Cultural Innovations", + "text": "The ancient Egyptians were pioneers in many fields. Their art, literature, and music continue to influence us today, hinting at a civilization far more advanced than we once thought.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889324_What_secret_knowledge_did/tts_en_008.wav" + }, + { + "index": 9, + "start": 96.925, + "end": 107.675, + "duration": 10.75, + "chapter_title": "Legacy of Secrets", + "text": "The secrets of the ancient Egyptians continue to fascinate us. Their knowledge, passed down through generations, has shaped our understanding of history and human achievement.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889324_What_secret_knowledge_did/tts_en_009.wav" + } + ], + "chapters_es": [ + { + "index": 0, + "start": 0.0, + "end": 11.9, + "duration": 11.9, + "chapter_title": "La Alborada", + "text": "En los primeros días de la civilización, Egipto antiguo emergió como un faro de conocimiento. El río Nilo nutrió una sociedad que prosperó en matemáticas, astronomía y arquitectura.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889324_What_secret_knowledge_did/tts_es_000.wav" + }, + { + "index": 1, + "start": 11.9, + "end": 24.25, + "duration": 12.35, + "chapter_title": "Maestría Matemática", + "text": "Los egipcios eran maestros de la geometría, utilizando esta disciplina para construir pirámides con una precisión asombrosa. Sus cálculos de pi fueron sorprendentemente precisos para su época.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889324_What_secret_knowledge_did/tts_es_001.wav" + }, + { + "index": 2, + "start": 24.25, + "end": 35.6, + "duration": 11.35, + "chapter_title": "Insights Astronómicos", + "text": "Su conocimiento de las estrellas guiaba su calendario y prácticas agrícolas. Los antiguos egipcios podían predecir eclipses solares y lunares con una precisión asombrosa.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889324_What_secret_knowledge_did/tts_es_002.wav" + }, + { + "index": 3, + "start": 35.6, + "end": 47.3, + "duration": 11.7, + "chapter_title": "Medicina Avanzada", + "text": "El Papiro Edwin Smith revela prácticas quirúrgicas que estaban muy adelantadas a su tiempo. Entendían el sistema circulatorio y realizaron amputaciones con una habilidad asombrosa.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889324_What_secret_knowledge_did/tts_es_003.wav" + }, + { + "index": 4, + "start": 47.3, + "end": 59.625, + "duration": 12.325, + "chapter_title": "Sabiduría Espiritual", + "text": "El Libro de los Muertos ofrecía guía mística para los difuntos, detallando rituales y hechizos para el más allá. Sus creencias eran complejas, involucrando numerosos dioses y fuerzas cósmicas.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889324_What_secret_knowledge_did/tts_es_004.wav" + }, + { + "index": 5, + "start": 59.625, + "end": 68.575, + "duration": 8.95, + "chapter_title": "Genio Arquitectónico", + "text": "La Gran Pirámide de Giza es un testimonio de su genio arquitectónico. Se mantiene como uno de los símbolos más duraderos del logro humano.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889324_What_secret_knowledge_did/tts_es_005.wav" + }, + { + "index": 6, + "start": 68.575, + "end": 79.7, + "duration": 11.125, + "chapter_title": "Maravillas de Ingeniería", + "text": "La construcción de las pirámides requirió técnicas de ingeniería avanzadas. Su conocimiento de la gestión del agua e irrigación fue crucial para el crecimiento de los cultivos.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889324_What_secret_knowledge_did/tts_es_006.wav" + }, + { + "index": 7, + "start": 79.7, + "end": 90.75, + "duration": 11.05, + "chapter_title": "Textos Místicos", + "text": "La Piedra Rosetta ayudó a decifrar los hieroglifos, revelando los complejos textos que narran a los faraones y sus reinados. Cada símbolo llevaba un significado profundo.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889324_What_secret_knowledge_did/tts_es_007.wav" + }, + { + "index": 8, + "start": 90.75, + "end": 103.3, + "duration": 12.55, + "chapter_title": "Innovaciones Culturales", + "text": "Los antiguos egipcios fueron pioneros en muchos campos. Su arte, literatura y música continúan influyendo en nosotros hoy, sugiriendo una civilización mucho más avanzada de lo que una vez pensamos.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889324_What_secret_knowledge_did/tts_es_008.wav" + }, + { + "index": 9, + "start": 103.3, + "end": 115.35, + "duration": 12.05, + "chapter_title": "Legado de Secretos", + "text": "Los secretos de los antiguos egipcios continúan fascinándonos. Su conocimiento, transmitido a través de las generaciones, ha moldeado nuestra comprensión de la historia y el logro humano.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889324_What_secret_knowledge_did/tts_es_009.wav" + } + ], + "files": { + "en": "./output/1786889324_What_secret_knowledge_did_en.mp4", + "es": "./output/1786889324_What_secret_knowledge_did_es.mp4" + }, + "subtitles": { + "en": "./output/1786889324_What_secret_knowledge_did_subtitles_en.srt", + "es": "./output/1786889324_What_secret_knowledge_did_subtitles_es.srt" + }, + "thumbnails": { + "en": [ + "./output/1786889324_What_secret_knowledge_did_thumb_A_en.png", + "./output/1786889324_What_secret_knowledge_did_thumb_B_en.png", + "./output/1786889324_What_secret_knowledge_did_thumb_C_en.png" + ], + "es": [ + "./output/1786889324_What_secret_knowledge_did_thumb_A_es.png", + "./output/1786889324_What_secret_knowledge_did_thumb_B_es.png", + "./output/1786889324_What_secret_knowledge_did_thumb_C_es.png" + ], + "clean": [ + "./output/1786889324_What_secret_knowledge_did_thumb_A_clean.png", + "./output/1786889324_What_secret_knowledge_did_thumb_B_clean.png", + "./output/1786889324_What_secret_knowledge_did_thumb_C_clean.png" + ] + }, + "timings": { + "SCRIPT": 195.3, + "TTS:EN": 44.8, + "TTS:ES": 48.4, + "MUSIC": 2.0, + "VISUAL": 138.4, + "SUBS:EN": 16.5, + "SUBS:ES": 20.7, + "THUMBNAILS": 48.4, + "ASSEMBLY": 245.8 + }, + "created_at": 1786890085.329604 +} \ No newline at end of file diff --git a/output/1786889324_What_secret_knowledge_did_subtitles_en.srt b/output/1786889324_What_secret_knowledge_did_subtitles_en.srt new file mode 100644 index 0000000..fa6861d --- /dev/null +++ b/output/1786889324_What_secret_knowledge_did_subtitles_en.srt @@ -0,0 +1,172 @@ +1 +00:00:00,000 --> 00:00:01,880 +In the early days of civilization, + +2 +00:00:02,520 --> 00:00:04,280 +ancient Egypt emerged as a beacon + +3 +00:00:04,280 --> 00:00:06,860 +of knowledge. The Nile River nurtured + +4 +00:00:06,860 --> 00:00:09,140 +a society that thrived in mathematics, + +5 +00:00:09,720 --> 00:00:13,040 +astronomy, and architecture. The Egyptians were + +6 +00:00:13,040 --> 00:00:15,440 +masters of geometry, using it to + +7 +00:00:15,440 --> 00:00:17,640 +build the pyramids with astonishing precision. + +8 +00:00:18,340 --> 00:00:20,880 +Their calculations for pie were surprisingly + +9 +00:00:20,880 --> 00:00:23,480 +accurate for their time. Their knowledge + +10 +00:00:23,480 --> 00:00:25,500 +of the stars guided their calendar + +11 +00:00:25,500 --> 00:00:28,980 +and agricultural practices. The ancient Egyptians + +12 +00:00:28,980 --> 00:00:31,540 +could predict solar and lunar eclipses + +13 +00:00:31,540 --> 00:00:34,800 +with remarkable accuracy. The Edwin Smith + +14 +00:00:34,800 --> 00:00:37,700 +Papyrus reveals surgical practices that were + +15 +00:00:37,700 --> 00:00:39,700 +far ahead of its time. They + +16 +00:00:39,700 --> 00:00:42,360 +understood the circulatory system and performed + +17 +00:00:42,360 --> 00:00:45,660 +amputations with astonishing skill. The book + +18 +00:00:45,660 --> 00:00:47,540 +of the dead offered mystical guidance + +19 +00:00:47,540 --> 00:00:49,960 +to the deceased, detailing rituals and + +20 +00:00:49,960 --> 00:00:52,400 +spells for the afterlife. Their beliefs + +21 +00:00:52,400 --> 00:00:55,360 +were complex, involving numerous deities and + +22 +00:00:55,360 --> 00:00:58,260 +cosmic forces. The great pyramid of + +23 +00:00:58,260 --> 00:01:00,080 +Giza is a testament to their + +24 +00:01:00,080 --> 00:01:02,840 +architectural prowess. It remains one of + +25 +00:01:02,840 --> 00:01:04,680 +the most enduring symbols of human + +26 +00:01:04,680 --> 00:01:07,500 +achievement. The construction of the pyramids + +27 +00:01:07,500 --> 00:01:10,960 +required advanced engineering techniques. Their + +28 +00:01:10,960 --> 00:01:13,040 +knowledge of water management and irrigation + +29 +00:01:13,040 --> 00:01:15,060 +was crucial for the growth of + +30 +00:01:15,060 --> 00:01:17,860 +crops. The Rosetta Stone helped decipher + +31 +00:01:17,860 --> 00:01:20,720 +hieroglyphs, revealing the complex texts that + +32 +00:01:20,720 --> 00:01:22,020 +tell of the pharaohs and their + +33 +00:01:22,020 --> 00:01:24,320 +reigns. Each symbol held a deep + +34 +00:01:24,320 --> 00:01:27,320 +meaning. The ancient Egyptians were pioneers + +35 +00:01:27,320 --> 00:01:30,060 +in many fields. Their art, literature, + +36 +00:01:30,520 --> 00:01:32,240 +and music continue to influence us + +37 +00:01:32,240 --> 00:01:34,700 +today, hinting at a civilization far + +38 +00:01:34,700 --> 00:01:36,280 +more advanced than we once thought. + +39 +00:01:37,060 --> 00:01:38,760 +The secrets of the ancient Egyptians + +40 +00:01:38,760 --> 00:01:41,640 +continue to fascinate us. Their knowledge, + +41 +00:01:42,080 --> 00:01:44,480 +passed down through generations, has shaped + +42 +00:01:44,480 --> 00:01:46,540 +our understanding of history and human + +43 +00:01:46,540 --> 00:01:46,960 +achievement. + diff --git a/output/1786889324_What_secret_knowledge_did_subtitles_es.srt b/output/1786889324_What_secret_knowledge_did_subtitles_es.srt new file mode 100644 index 0000000..8ab7494 --- /dev/null +++ b/output/1786889324_What_secret_knowledge_did_subtitles_es.srt @@ -0,0 +1,180 @@ +1 +00:00:00,000 --> 00:00:01,520 +En los primeros días de la + +2 +00:00:01,520 --> 00:00:04,920 +civilización, Egipto Antiguio emergió como unfairo + +3 +00:00:04,920 --> 00:00:07,540 +de Canasimiento. El Rio Nilo nutrio + +4 +00:00:07,540 --> 00:00:09,800 +un asocio de aquéprospero en matemáticas, + +5 +00:00:10,200 --> 00:00:13,180 +Estronomía y Arquitura. Los egipcios iran + +6 +00:00:13,180 --> 00:00:15,680 +maestros de la geometria, utilizando esta + +7 +00:00:15,680 --> 00:00:18,180 +disciplina para construir paramites con una + +8 +00:00:18,180 --> 00:00:21,120 +presición asembrosa. Sus calculos de pie + +9 +00:00:21,120 --> 00:00:24,020 +furón sorprendentemente precisos para su epoca. + +10 +00:00:24,440 --> 00:00:26,400 +Tu Canasimiento de las estrellas guiaba + +11 +00:00:26,400 --> 00:00:29,500 +su calendario y prácticas agricolas. Los + +12 +00:00:29,500 --> 00:00:32,880 +egipcios, Podi y Pradeshir, aclipses solas + +13 +00:00:32,880 --> 00:00:35,300 +y lunes con una presición asembrosa. + +14 +00:00:35,800 --> 00:00:37,980 +El papero Edwin Smith revela prácticas + +15 +00:00:37,980 --> 00:00:40,200 +cuarurgicas, cuesta en Maya de Lentada + +16 +00:00:40,200 --> 00:00:42,240 +es su tiempo. En Tendi y + +17 +00:00:42,240 --> 00:00:44,640 +el sistema circulatorio, y realiza en + +18 +00:00:44,640 --> 00:00:47,600 +emputación con una habilitada asembrosa. El + +19 +00:00:47,600 --> 00:00:49,420 +libro de los muertos a frechigía + +20 +00:00:49,420 --> 00:00:51,800 +mística para los difuntos de Tlendo + +21 +00:00:51,800 --> 00:00:53,700 +Rituals y Hechizos para el Másala. + +22 +00:00:54,240 --> 00:00:57,540 +Sus crinches iran complejos, involucrando numerosos + +23 +00:00:57,540 --> 00:01:00,120 +dioses y fuses cosmicas. La gran + +24 +00:01:00,120 --> 00:01:02,480 +paramite de Gizaís, un testimonio de + +25 +00:01:02,480 --> 00:01:05,180 +su genio arquectónico. Se menciona como + +26 +00:01:05,180 --> 00:01:07,540 +uno de los símbolos mosteraderos del + +27 +00:01:07,540 --> 00:01:09,760 +logro humano. La construcción de las + +28 +00:01:09,760 --> 00:01:12,840 +paramites requerió técnicas de ingeniería avanzadas. + +29 +00:01:13,560 --> 00:01:15,260 +Su Canasimiento de la gestión del + +30 +00:01:15,260 --> 00:01:18,360 +agua, iragasión, fucrucial para el crescimiento + +31 +00:01:18,360 --> 00:01:20,660 +de los cultivos. La pídra Rosetta + +32 +00:01:20,660 --> 00:01:23,600 +ayudo a desifrar los hierglicos, revelando + +33 +00:01:23,600 --> 00:01:25,620 +los complejos textos que enerran a + +34 +00:01:25,620 --> 00:01:28,240 +los farianos y sus rinidus. Cárdas + +35 +00:01:28,240 --> 00:01:31,060 +símbolo levaba un significado profundo. Los + +36 +00:01:31,060 --> 00:01:33,400 +antiguos egyptios furan pioneros en muchos + +37 +00:01:33,400 --> 00:01:36,140 +campos. Su art, literatura y música + +38 +00:01:36,140 --> 00:01:38,340 +continúan en flyendo en esatoros hoy, + +39 +00:01:38,840 --> 00:01:40,900 +su geriendo una civilización mucho más + +40 +00:01:40,900 --> 00:01:42,960 +avanzada de loco y univers pencemos. + +41 +00:01:43,520 --> 00:01:45,760 +Los secretos de los antiguos egyptios + +42 +00:01:45,760 --> 00:01:48,780 +continúan fascinandonos. Su Canasimiento, + +43 +00:01:49,140 --> 00:01:51,140 +transmitido a traves de las generaciones, + +44 +00:01:51,600 --> 00:01:53,400 +ha moldado nuestra comprensión de la + +45 +00:01:53,400 --> 00:01:54,900 +historia, y al logro humano. + diff --git a/output/1786889324_What_secret_knowledge_did_thumb_A_clean.png b/output/1786889324_What_secret_knowledge_did_thumb_A_clean.png new file mode 100644 index 0000000..375ad9a Binary files /dev/null and b/output/1786889324_What_secret_knowledge_did_thumb_A_clean.png differ diff --git a/output/1786889324_What_secret_knowledge_did_thumb_A_en.png b/output/1786889324_What_secret_knowledge_did_thumb_A_en.png new file mode 100644 index 0000000..a67fc55 Binary files /dev/null and b/output/1786889324_What_secret_knowledge_did_thumb_A_en.png differ diff --git a/output/1786889324_What_secret_knowledge_did_thumb_A_es.png b/output/1786889324_What_secret_knowledge_did_thumb_A_es.png new file mode 100644 index 0000000..427f089 Binary files /dev/null and b/output/1786889324_What_secret_knowledge_did_thumb_A_es.png differ diff --git a/output/1786889324_What_secret_knowledge_did_thumb_B_clean.png b/output/1786889324_What_secret_knowledge_did_thumb_B_clean.png new file mode 100644 index 0000000..f8907c2 Binary files /dev/null and b/output/1786889324_What_secret_knowledge_did_thumb_B_clean.png differ diff --git a/output/1786889324_What_secret_knowledge_did_thumb_B_en.png b/output/1786889324_What_secret_knowledge_did_thumb_B_en.png new file mode 100644 index 0000000..2044635 Binary files /dev/null and b/output/1786889324_What_secret_knowledge_did_thumb_B_en.png differ diff --git a/output/1786889324_What_secret_knowledge_did_thumb_B_es.png b/output/1786889324_What_secret_knowledge_did_thumb_B_es.png new file mode 100644 index 0000000..6d9a6a2 Binary files /dev/null and b/output/1786889324_What_secret_knowledge_did_thumb_B_es.png differ diff --git a/output/1786889324_What_secret_knowledge_did_thumb_C_clean.png b/output/1786889324_What_secret_knowledge_did_thumb_C_clean.png new file mode 100644 index 0000000..9c326bc Binary files /dev/null and b/output/1786889324_What_secret_knowledge_did_thumb_C_clean.png differ diff --git a/output/1786889324_What_secret_knowledge_did_thumb_C_en.png b/output/1786889324_What_secret_knowledge_did_thumb_C_en.png new file mode 100644 index 0000000..fac2b28 Binary files /dev/null and b/output/1786889324_What_secret_knowledge_did_thumb_C_en.png differ diff --git a/output/1786889324_What_secret_knowledge_did_thumb_C_es.png b/output/1786889324_What_secret_knowledge_did_thumb_C_es.png new file mode 100644 index 0000000..b858396 Binary files /dev/null and b/output/1786889324_What_secret_knowledge_did_thumb_C_es.png differ diff --git a/output/1786889324_What_secret_knowledge_did_upload_EN.txt b/output/1786889324_What_secret_knowledge_did_upload_EN.txt new file mode 100644 index 0000000..c22900f --- /dev/null +++ b/output/1786889324_What_secret_knowledge_did_upload_EN.txt @@ -0,0 +1,35 @@ +============================================================ +YOUTUBE UPLOAD BUNDLE — ENGLISH (Topic: What secret knowledge did the ancient egyptians posses?) +============================================================ + +TITLES FOR A/B TESTING: + A. What Secrets Did Ancient Egyptians Hold? + B. Unveiling Ancient Egyptian Mysteries + C. The Hidden Knowledge of Ancient Egypt + +DESCRIPTION & CHAPTERS: +Dive into the enigmatic world of ancient Egypt and explore the hidden knowledge that has intrigued historians and scholars for centuries. This documentary uncovers the secrets of the ancients, from their advanced mathematical and architectural prowess to their spiritual beliefs and medical practices. Unravel the mysteries of the past and gain insights into the civilization that left an indelible mark on human history. #Documentary #History #AncientEgypt + +TIMESTAMPS / CHAPTERS: +00:00 - The Dawn +00:11 - Mathematical Mastery +00:22 - Astronomical Insights +00:33 - Advanced Medicine +00:45 - Spiritual Wisdom +00:56 - Architectural Genius +01:05 - Engineering Marvels +01:15 - Mystical Texts +01:25 - Cultural Innovations +01:36 - Legacy of Secrets + +#Documentary #History #Science + +TAGS: +documentary, ancientegypt, history, secrets, knowledge, archaeology, mathematics, architecture, medicine, spirituality, ancientcivilizations, historydocumentary, ancientsecrets, egyptianmysteries + +VIDEO FILE: ./output/1786889324_What_secret_knowledge_did_en.mp4 +SUBTITLES: ./output/1786889324_What_secret_knowledge_did_subtitles_en.srt +THUMBNAILS: + - ./output/1786889324_What_secret_knowledge_did_thumb_A_en.png + - ./output/1786889324_What_secret_knowledge_did_thumb_B_en.png + - ./output/1786889324_What_secret_knowledge_did_thumb_C_en.png diff --git a/output/1786889324_What_secret_knowledge_did_upload_ES.txt b/output/1786889324_What_secret_knowledge_did_upload_ES.txt new file mode 100644 index 0000000..c812ddb --- /dev/null +++ b/output/1786889324_What_secret_knowledge_did_upload_ES.txt @@ -0,0 +1,35 @@ +============================================================ +PAQUETE DE SUBIDA A YOUTUBE — ESPAÑOL (Tema: What secret knowledge did the ancient egyptians posses?) +============================================================ + +TÍTULOS PARA PRUEBA A/B: + A. ¿Qué Secretos Ocultaban los Antiguos Egipcios? + B. Desvelando Misterios Egipcios + C. El Saber Oculto de los Antiguos Egipcios + +DESCRIPCIÓN Y CAPÍTULOS: +Sumérgete en el mundo enigmático de Egipto antiguo y explora el conocimiento oculto que ha intrigado a historiadores y eruditos durante siglos. Este documental desvela los secretos de los antiguos, desde su maestría matemática y arquitectónica hasta sus creencias espirituales y prácticas médicas. Desatornilla los misterios del pasado y obtén perspectivas sobre una civilización que dejó un sello indeleble en la historia humana. #Documentario #Historia #EgiptoAntiguo + +CAPÍTULOS: +00:00 - La Alborada +00:11 - Maestría Matemática +00:24 - Insights Astronómicos +00:35 - Medicina Avanzada +00:47 - Sabiduría Espiritual +00:59 - Genio Arquitectónico +01:08 - Maravillas de Ingeniería +01:19 - Textos Místicos +01:30 - Innovaciones Culturales +01:43 - Legado de Secretos + +#Documental #Historia #Ciencia + +ETIQUETAS / TAGS: +documentary, ancientegypt, history, secrets, knowledge, archaeology, mathematics, architecture, medicine, spirituality, ancientcivilizations, historydocumentary, ancientsecrets, egyptianmysteries + +ARCHIVO DE VIDEO: ./output/1786889324_What_secret_knowledge_did_es.mp4 +SUBTÍTULOS: ./output/1786889324_What_secret_knowledge_did_subtitles_es.srt +MINIATURAS: + - ./output/1786889324_What_secret_knowledge_did_thumb_A_es.png + - ./output/1786889324_What_secret_knowledge_did_thumb_B_es.png + - ./output/1786889324_What_secret_knowledge_did_thumb_C_es.png diff --git a/output/1786889769_The_Lost_Library_of_Alexa_en.mp4 b/output/1786889769_The_Lost_Library_of_Alexa_en.mp4 new file mode 100644 index 0000000..88f13b4 Binary files /dev/null and b/output/1786889769_The_Lost_Library_of_Alexa_en.mp4 differ diff --git a/output/1786889769_The_Lost_Library_of_Alexa_es.mp4 b/output/1786889769_The_Lost_Library_of_Alexa_es.mp4 new file mode 100644 index 0000000..48c617f Binary files /dev/null and b/output/1786889769_The_Lost_Library_of_Alexa_es.mp4 differ diff --git a/output/1786889769_The_Lost_Library_of_Alexa_meta.json b/output/1786889769_The_Lost_Library_of_Alexa_meta.json new file mode 100644 index 0000000..bc93b3b --- /dev/null +++ b/output/1786889769_The_Lost_Library_of_Alexa_meta.json @@ -0,0 +1,145 @@ +{ + "job_id": "1786889769_The_Lost_Library_of_Alexa", + "topic": "The Lost Library of Alexandria", + "titles": [ + "The Enigma of Alexandria", + "Unearthing the Lost Library", + "Alexandria's Forgotten Knowledge" + ], + "titles_es": [ + "El Enigma de Alejandría", + "Descubriendo la Biblioteca Perdida", + "El Conocimiento Olvidado de Alejandría" + ], + "description": "Discover the mysterious story of the Lost Library of Alexandria, one of the world's oldest and most extensive collections. Explore its rise, fall, and enduring legacy. #Documentary #History #Science\n\nTIMESTAMPS / CHAPTERS:\n00:00 - Rise of the Great\n00:11 - The Critical Discovery\n00:20 - The Final Destruction\n00:30 - Legacy of Knowledge\n\n#Documentary #History #Science", + "description_es": "Descubre la misteriosa historia de la Biblioteca Perdida de Alejandría, una de las colecciones más antiguas y extensas del mundo. Explora su ascenso, caída y legado duradero. #Documental #Historia #Ciencia\n\nCAPÍTULOS:\n00:00 - Rise of the Great\n00:11 - La Descubierta Crucial\n00:20 - La Última Destrucción\n00:31 - Legado del Saber\n\n#Documental #Historia #Ciencia", + "tags": [ + "documentary", + "history", + "ancient civilization", + "library", + "alexandria", + "lost knowledge", + "ancient history", + "civilization", + "science", + "research", + "broadcaster", + "educational", + "knowledge", + "heritage" + ], + "chapters_en": [ + { + "index": 0, + "start": 0.0, + "end": 11.725, + "duration": 11.725, + "chapter_title": "Rise of the Great", + "text": "The Great Library of Alexandria was a beacon of knowledge, attracting scholars from all corners of the ancient world. Its vast collection of scrolls and texts was unparalleled.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889769_The_Lost_Library_of_Alexa/tts_en_000.wav" + }, + { + "index": 1, + "start": 11.725, + "end": 20.825, + "duration": 9.1, + "chapter_title": "The Critical Discovery", + "text": "Among its treasures, the library housed the famous 'Papyrus of Euphorion,' a rare literary work that vanished with the library's destruction.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889769_The_Lost_Library_of_Alexa/tts_en_001.wav" + }, + { + "index": 2, + "start": 20.825, + "end": 30.85, + "duration": 10.025, + "chapter_title": "The Final Destruction", + "text": "Historians debate the exact date and cause of its destruction, but by the 7th century, the library was no more, leaving only whispers of its grandeur.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889769_The_Lost_Library_of_Alexa/tts_en_002.wav" + }, + { + "index": 3, + "start": 30.85, + "end": 41.35, + "duration": 10.5, + "chapter_title": "Legacy of Knowledge", + "text": "Despite its fall, the legacy of the Library of Alexandria endures. Its spirit lives on in the pursuit of knowledge and the quest to uncover its lost texts.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889769_The_Lost_Library_of_Alexa/tts_en_003.wav" + } + ], + "chapters_es": [ + { + "index": 0, + "start": 0.0, + "end": 11.375, + "duration": 11.375, + "chapter_title": "Rise of the Great", + "text": "La Gran Biblioteca de Alejandría era una farola de conocimiento, atraída por académicos de todos los rincones del mundo antiguo. Su extensa colección de rollos y textos era sin par.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889769_The_Lost_Library_of_Alexa/tts_es_000.wav" + }, + { + "index": 1, + "start": 11.375, + "end": 20.925, + "duration": 9.55, + "chapter_title": "La Descubierta Crucial", + "text": "Entre sus tesoros, la biblioteca albergaba el famoso 'Papiro de Euforión,' un trabajo literario raro que desapareció junto con la destrucción de la biblioteca.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889769_The_Lost_Library_of_Alexa/tts_es_001.wav" + }, + { + "index": 2, + "start": 20.925, + "end": 31.6, + "duration": 10.675, + "chapter_title": "La Última Destrucción", + "text": "Los historiadores debaten la fecha exacta y la causa de su destrucción, pero a finales del siglo VII, la biblioteca ya no existía, dejando solo murmullos de su grandiosidad.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889769_The_Lost_Library_of_Alexa/tts_es_002.wav" + }, + { + "index": 3, + "start": 31.6, + "end": 41.975, + "duration": 10.375, + "chapter_title": "Legado del Saber", + "text": "A pesar de su caída, el legado de la Biblioteca de Alejandría persiste. Su espíritu vive en la búsqueda del conocimiento y el afán por descubrir sus textos perdidos.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889769_The_Lost_Library_of_Alexa/tts_es_003.wav" + } + ], + "files": { + "en": "./output/1786889769_The_Lost_Library_of_Alexa_en.mp4", + "es": "./output/1786889769_The_Lost_Library_of_Alexa_es.mp4" + }, + "subtitles": { + "en": "./output/1786889769_The_Lost_Library_of_Alexa_subtitles_en.srt", + "es": "./output/1786889769_The_Lost_Library_of_Alexa_subtitles_es.srt" + }, + "thumbnails": { + "en": [ + "./output/1786889769_The_Lost_Library_of_Alexa_thumb_A_en.png", + "./output/1786889769_The_Lost_Library_of_Alexa_thumb_B_en.png", + "./output/1786889769_The_Lost_Library_of_Alexa_thumb_C_en.png" + ], + "es": [ + "./output/1786889769_The_Lost_Library_of_Alexa_thumb_A_es.png", + "./output/1786889769_The_Lost_Library_of_Alexa_thumb_B_es.png", + "./output/1786889769_The_Lost_Library_of_Alexa_thumb_C_es.png" + ], + "clean": [ + "./output/1786889769_The_Lost_Library_of_Alexa_thumb_A_clean.png", + "./output/1786889769_The_Lost_Library_of_Alexa_thumb_B_clean.png", + "./output/1786889769_The_Lost_Library_of_Alexa_thumb_C_clean.png" + ] + }, + "timings": { + "SCRIPT": 97.4, + "TTS:EN": 24.5, + "TTS:ES": 28.1, + "MUSIC": 0.7, + "VISUAL": 1208.6, + "SUBS:EN": 9.0, + "SUBS:ES": 10.5, + "THUMBNAILS": 74.8, + "ASSEMBLY": 51.7 + }, + "created_at": 1786891274.544711 +} \ No newline at end of file diff --git a/output/1786889769_The_Lost_Library_of_Alexa_subtitles_en.srt b/output/1786889769_The_Lost_Library_of_Alexa_subtitles_en.srt new file mode 100644 index 0000000..f7d94f4 --- /dev/null +++ b/output/1786889769_The_Lost_Library_of_Alexa_subtitles_en.srt @@ -0,0 +1,72 @@ +1 +00:00:00,000 --> 00:00:02,460 +The great library of Alexandria was + +2 +00:00:02,460 --> 00:00:04,960 +a beacon of knowledge, attracting scholars + +3 +00:00:04,960 --> 00:00:06,580 +from all corners of the ancient + +4 +00:00:06,580 --> 00:00:09,420 +world. Its vast collection of scrolls + +5 +00:00:09,420 --> 00:00:12,440 +and texts was unparalleled. Among its + +6 +00:00:12,440 --> 00:00:14,820 +treasures, the library housed the famous + +7 +00:00:14,820 --> 00:00:17,740 +Papyrus of Euphorian, a rare literary + +8 +00:00:17,740 --> 00:00:19,680 +work that vanished with the library's + +9 +00:00:19,680 --> 00:00:23,000 +destruction. Historians debate the exact date + +10 +00:00:23,000 --> 00:00:25,160 +and cause of its destruction, but + +11 +00:00:25,160 --> 00:00:27,100 +by the seventh century, the library + +12 +00:00:27,100 --> 00:00:29,380 +was no more, leaving only whispers + +13 +00:00:29,380 --> 00:00:32,020 +of its grandeur. Despite its fall, + +14 +00:00:32,440 --> 00:00:33,880 +the legacy of the library of + +15 +00:00:33,880 --> 00:00:37,100 +Alexandria endures. Its spirit lives on + +16 +00:00:37,100 --> 00:00:38,720 +in the pursuit of knowledge and + +17 +00:00:38,720 --> 00:00:40,240 +the quest to uncover its lost + +18 +00:00:40,240 --> 00:00:40,720 +texts. + diff --git a/output/1786889769_The_Lost_Library_of_Alexa_subtitles_es.srt b/output/1786889769_The_Lost_Library_of_Alexa_subtitles_es.srt new file mode 100644 index 0000000..bf58e6b --- /dev/null +++ b/output/1786889769_The_Lost_Library_of_Alexa_subtitles_es.srt @@ -0,0 +1,76 @@ +1 +00:00:00,000 --> 00:00:01,920 +La gran Biblióque de Legendria era + +2 +00:00:01,920 --> 00:00:05,120 +unifarolo de Canasemiento, atreada por Académicos + +3 +00:00:05,120 --> 00:00:07,060 +de Tuduz, Los Rincones del Mundo + +4 +00:00:07,060 --> 00:00:10,040 +Antiguio. Su extensa coxiendo rolos, why + +5 +00:00:10,040 --> 00:00:12,080 +textos eras sin par. Intresas de + +6 +00:00:12,080 --> 00:00:14,520 +Soros, la Biblió Calbergaba El Famoso, + +7 +00:00:14,700 --> 00:00:17,740 +Papiro de Euphoriano, Antrabajo Literario, Raro + +8 +00:00:17,740 --> 00:00:19,940 +Que Dissepercio, Janto Canla de Struchián + +9 +00:00:19,940 --> 00:00:22,040 +de la Biblióque. Los historiadores de + +10 +00:00:22,040 --> 00:00:23,580 +Beten la fecha exacta while a + +11 +00:00:23,580 --> 00:00:25,600 +costa de su distruchián. Piro de + +12 +00:00:25,600 --> 00:00:27,860 +finales del siglo VII, la Biblióque + +13 +00:00:27,860 --> 00:00:29,320 +que ya no existia, de Gendo + +14 +00:00:29,320 --> 00:00:31,860 +Solo, Marmolos, de su grandiacidad. A + +15 +00:00:31,860 --> 00:00:33,620 +pesar de su ceda, el legado + +16 +00:00:33,620 --> 00:00:35,580 +de la Biblióque de Legendria persiste. + +17 +00:00:36,040 --> 00:00:37,280 +Su espiro 2 -5 en la + +18 +00:00:37,280 --> 00:00:39,660 +Básqueda del Canasemiento, while a fond + +19 +00:00:39,660 --> 00:00:41,680 +por descubrier sus textos perdidos. + diff --git a/output/1786889769_The_Lost_Library_of_Alexa_thumb_A_clean.png b/output/1786889769_The_Lost_Library_of_Alexa_thumb_A_clean.png new file mode 100644 index 0000000..eefacf3 Binary files /dev/null and b/output/1786889769_The_Lost_Library_of_Alexa_thumb_A_clean.png differ diff --git a/output/1786889769_The_Lost_Library_of_Alexa_thumb_A_en.png b/output/1786889769_The_Lost_Library_of_Alexa_thumb_A_en.png new file mode 100644 index 0000000..09c4900 Binary files /dev/null and b/output/1786889769_The_Lost_Library_of_Alexa_thumb_A_en.png differ diff --git a/output/1786889769_The_Lost_Library_of_Alexa_thumb_A_es.png b/output/1786889769_The_Lost_Library_of_Alexa_thumb_A_es.png new file mode 100644 index 0000000..b74bd02 Binary files /dev/null and b/output/1786889769_The_Lost_Library_of_Alexa_thumb_A_es.png differ diff --git a/output/1786889769_The_Lost_Library_of_Alexa_thumb_B_clean.png b/output/1786889769_The_Lost_Library_of_Alexa_thumb_B_clean.png new file mode 100644 index 0000000..6b9d1a3 Binary files /dev/null and b/output/1786889769_The_Lost_Library_of_Alexa_thumb_B_clean.png differ diff --git a/output/1786889769_The_Lost_Library_of_Alexa_thumb_B_en.png b/output/1786889769_The_Lost_Library_of_Alexa_thumb_B_en.png new file mode 100644 index 0000000..8953169 Binary files /dev/null and b/output/1786889769_The_Lost_Library_of_Alexa_thumb_B_en.png differ diff --git a/output/1786889769_The_Lost_Library_of_Alexa_thumb_B_es.png b/output/1786889769_The_Lost_Library_of_Alexa_thumb_B_es.png new file mode 100644 index 0000000..e8a9679 Binary files /dev/null and b/output/1786889769_The_Lost_Library_of_Alexa_thumb_B_es.png differ diff --git a/output/1786889769_The_Lost_Library_of_Alexa_thumb_C_clean.png b/output/1786889769_The_Lost_Library_of_Alexa_thumb_C_clean.png new file mode 100644 index 0000000..8868cdf Binary files /dev/null and b/output/1786889769_The_Lost_Library_of_Alexa_thumb_C_clean.png differ diff --git a/output/1786889769_The_Lost_Library_of_Alexa_thumb_C_en.png b/output/1786889769_The_Lost_Library_of_Alexa_thumb_C_en.png new file mode 100644 index 0000000..0fcbcf8 Binary files /dev/null and b/output/1786889769_The_Lost_Library_of_Alexa_thumb_C_en.png differ diff --git a/output/1786889769_The_Lost_Library_of_Alexa_thumb_C_es.png b/output/1786889769_The_Lost_Library_of_Alexa_thumb_C_es.png new file mode 100644 index 0000000..a448b28 Binary files /dev/null and b/output/1786889769_The_Lost_Library_of_Alexa_thumb_C_es.png differ diff --git a/output/1786889769_The_Lost_Library_of_Alexa_upload_EN.txt b/output/1786889769_The_Lost_Library_of_Alexa_upload_EN.txt new file mode 100644 index 0000000..e7327b3 --- /dev/null +++ b/output/1786889769_The_Lost_Library_of_Alexa_upload_EN.txt @@ -0,0 +1,29 @@ +============================================================ +YOUTUBE UPLOAD BUNDLE — ENGLISH (Topic: The Lost Library of Alexandria) +============================================================ + +TITLES FOR A/B TESTING: + A. The Enigma of Alexandria + B. Unearthing the Lost Library + C. Alexandria's Forgotten Knowledge + +DESCRIPTION & CHAPTERS: +Discover the mysterious story of the Lost Library of Alexandria, one of the world's oldest and most extensive collections. Explore its rise, fall, and enduring legacy. #Documentary #History #Science + +TIMESTAMPS / CHAPTERS: +00:00 - Rise of the Great +00:11 - The Critical Discovery +00:20 - The Final Destruction +00:30 - Legacy of Knowledge + +#Documentary #History #Science + +TAGS: +documentary, history, ancient civilization, library, alexandria, lost knowledge, ancient history, civilization, science, research, broadcaster, educational, knowledge, heritage + +VIDEO FILE: ./output/1786889769_The_Lost_Library_of_Alexa_en.mp4 +SUBTITLES: ./output/1786889769_The_Lost_Library_of_Alexa_subtitles_en.srt +THUMBNAILS: + - ./output/1786889769_The_Lost_Library_of_Alexa_thumb_A_en.png + - ./output/1786889769_The_Lost_Library_of_Alexa_thumb_B_en.png + - ./output/1786889769_The_Lost_Library_of_Alexa_thumb_C_en.png diff --git a/output/1786889769_The_Lost_Library_of_Alexa_upload_ES.txt b/output/1786889769_The_Lost_Library_of_Alexa_upload_ES.txt new file mode 100644 index 0000000..ae5a2b3 --- /dev/null +++ b/output/1786889769_The_Lost_Library_of_Alexa_upload_ES.txt @@ -0,0 +1,29 @@ +============================================================ +PAQUETE DE SUBIDA A YOUTUBE — ESPAÑOL (Tema: The Lost Library of Alexandria) +============================================================ + +TÍTULOS PARA PRUEBA A/B: + A. El Enigma de Alejandría + B. Descubriendo la Biblioteca Perdida + C. El Conocimiento Olvidado de Alejandría + +DESCRIPCIÓN Y CAPÍTULOS: +Descubre la misteriosa historia de la Biblioteca Perdida de Alejandría, una de las colecciones más antiguas y extensas del mundo. Explora su ascenso, caída y legado duradero. #Documental #Historia #Ciencia + +CAPÍTULOS: +00:00 - Rise of the Great +00:11 - La Descubierta Crucial +00:20 - La Última Destrucción +00:31 - Legado del Saber + +#Documental #Historia #Ciencia + +ETIQUETAS / TAGS: +documentary, history, ancient civilization, library, alexandria, lost knowledge, ancient history, civilization, science, research, broadcaster, educational, knowledge, heritage + +ARCHIVO DE VIDEO: ./output/1786889769_The_Lost_Library_of_Alexa_es.mp4 +SUBTÍTULOS: ./output/1786889769_The_Lost_Library_of_Alexa_subtitles_es.srt +MINIATURAS: + - ./output/1786889769_The_Lost_Library_of_Alexa_thumb_A_es.png + - ./output/1786889769_The_Lost_Library_of_Alexa_thumb_B_es.png + - ./output/1786889769_The_Lost_Library_of_Alexa_thumb_C_es.png diff --git a/output/1786889838_The_Mysterious_Derinkuyu_en.mp4 b/output/1786889838_The_Mysterious_Derinkuyu_en.mp4 new file mode 100644 index 0000000..2be8069 Binary files /dev/null and b/output/1786889838_The_Mysterious_Derinkuyu_en.mp4 differ diff --git a/output/1786889838_The_Mysterious_Derinkuyu_es.mp4 b/output/1786889838_The_Mysterious_Derinkuyu_es.mp4 new file mode 100644 index 0000000..98b1311 Binary files /dev/null and b/output/1786889838_The_Mysterious_Derinkuyu_es.mp4 differ diff --git a/output/1786889838_The_Mysterious_Derinkuyu_meta.json b/output/1786889838_The_Mysterious_Derinkuyu_meta.json new file mode 100644 index 0000000..cd60754 --- /dev/null +++ b/output/1786889838_The_Mysterious_Derinkuyu_meta.json @@ -0,0 +1,158 @@ +{ + "job_id": "1786889838_The_Mysterious_Derinkuyu", + "topic": "The Mysterious Derinkuyu Underground City", + "titles": [ + "Derinkuyu: The Lost Underground City", + "Unearthed: Derinkuyu’s Hidden Past", + "Derinkuyu: A Mysterious Underground City Revealed" + ], + "titles_es": [ + "Derinkuyu: La Ciudad Soterrada Olvidada", + "Descubierto: El Pasado Oculto de Derinkuyu", + "Derinkuyu: Una Ciudad Soterrada Misteriosa Revelada" + ], + "description": "Discover the enigmatic Derinkuyu Underground City, a marvel of ancient engineering. Dive into its hidden chambers, explore its mysterious origins, and uncover the secrets that have remained buried for centuries. #Documentary #History #Science\n\nTIMESTAMPS / CHAPTERS:\n00:00 - Ancient Mystery\n00:11 - Critical Discovery\n00:24 - Hidden Chambers\n00:35 - Mysterious Origins\n\n#Documentary #History #Science", + "description_es": "Descubre la enigmática Ciudad Soterrada de Derinkuyu, un maravilloso ejemplo de ingeniería antigua. Sumérgete en sus salones ocultos, explora sus orígenes misteriosos e inicies el descubrimiento de secretos que han permanecido enterrados durante siglos. #Documentario #Historia #Ciencia\n\nCAPÍTULOS:\n00:00 - Misterio Antiguo\n00:12 - Descubrimiento Crítico\n00:25 - Salones Ocultos\n00:37 - Orígenes Misteriosos\n\n#Documental #Historia #Ciencia", + "tags": [ + "documentary", + "history", + "ancient", + "underground city", + "derinkuyu", + "turkey", + "mystery", + "engineering", + "archaeology", + "ancient civilization", + "hidden city", + "underground", + "history" + ], + "chapters_en": [ + { + "index": 0, + "start": 0.0, + "end": 11.825, + "duration": 11.825, + "chapter_title": "Ancient Mystery", + "text": "In the heart of Turkey, an ancient city lies hidden, its secrets buried for millennia. Derinkuyu, a labyrinth of tunnels and chambers, was built to withstand sieges and invasions.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889838_The_Mysterious_Derinkuyu/tts_en_000.wav" + }, + { + "index": 1, + "start": 11.825, + "end": 24.049999999999997, + "duration": 12.225, + "chapter_title": "Critical Discovery", + "text": "In 1960, local farmers stumbled upon the entrance, unveiling a city that could house thousands. Archaeologists raced to document the findings, piecing together the city’s history.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889838_The_Mysterious_Derinkuyu/tts_en_001.wav" + }, + { + "index": 2, + "start": 24.049999999999997, + "end": 35.974999999999994, + "duration": 11.925, + "chapter_title": "Hidden Chambers", + "text": "The city features complex systems for air, water, and food, hinting at a sophisticated society. Each level, with its own unique features, reveals the ingenuity of its builders.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889838_The_Mysterious_Derinkuyu/tts_en_002.wav" + }, + { + "index": 3, + "start": 35.974999999999994, + "end": 46.425, + "duration": 10.45, + "chapter_title": "Mysterious Origins", + "text": "Derinkuyu remains a puzzle, with no clear records of its builders. Some theories link it to the Phrygians, Hittites, or even the Knights Templar, adding to its allure.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889838_The_Mysterious_Derinkuyu/tts_en_003.wav" + } + ], + "chapters_es": [ + { + "index": 0, + "start": 0.0, + "end": 12.025, + "duration": 12.025, + "chapter_title": "Misterio Antiguo", + "text": "En el corazón de Turquía, una antigua ciudad se oculta, sus secretos sepultados durante milenios. Derinkuyu, un laberinto de túneles y salones, fue construido para resistir asedios e invasiones.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889838_The_Mysterious_Derinkuyu/tts_es_000.wav" + }, + { + "index": 1, + "start": 12.025, + "end": 25.625, + "duration": 13.6, + "chapter_title": "Descubrimiento Crítico", + "text": "En 1960, agricultores locales descubrieron el acceso, revelando una ciudad que podría albergar a miles de habitantes. Arqueólogos se apresuraron a documentar los hallazgos, reconstruyendo la historia de la ciudad.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889838_The_Mysterious_Derinkuyu/tts_es_001.wav" + }, + { + "index": 2, + "start": 25.625, + "end": 37.975, + "duration": 12.35, + "chapter_title": "Salones Ocultos", + "text": "La ciudad cuenta con complejos sistemas de aire, agua y alimentos, sugiriendo una sociedad sofisticada. Cada nivel, con sus propias características únicas, revela la ingeniosidad de sus constructores.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889838_The_Mysterious_Derinkuyu/tts_es_002.wav" + }, + { + "index": 3, + "start": 37.975, + "end": 50.625, + "duration": 12.65, + "chapter_title": "Orígenes Misteriosos", + "text": "Derinkuyu permanece un rompecabezas, sin registros claros de sus constructores. Se han propuesto teorías que lo vinculan con los Frigios, Hititas, o incluso los Caballeros Templarios, añadiendo a su encanto.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786889838_The_Mysterious_Derinkuyu/tts_es_003.wav" + } + ], + "clips": { + "en": [ + "./temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_en_000.mp4", + "./temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_en_001.mp4", + "./temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_en_002.mp4", + "./temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_en_003.mp4" + ], + "es": [ + "./temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_es_000.mp4", + "./temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_es_001.mp4", + "./temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_es_002.mp4", + "./temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_es_003.mp4" + ] + }, + "files": { + "en": "./output/1786889838_The_Mysterious_Derinkuyu_en.mp4", + "es": "./output/1786889838_The_Mysterious_Derinkuyu_es.mp4" + }, + "subtitles": { + "en": "./output/1786889838_The_Mysterious_Derinkuyu_subtitles_en.srt", + "es": "./output/1786889838_The_Mysterious_Derinkuyu_subtitles_es.srt" + }, + "thumbnails": { + "en": [ + "./output/1786889838_The_Mysterious_Derinkuyu_thumb_A_en.png", + "./output/1786889838_The_Mysterious_Derinkuyu_thumb_B_en.png", + "./output/1786889838_The_Mysterious_Derinkuyu_thumb_C_en.png" + ], + "es": [ + "./output/1786889838_The_Mysterious_Derinkuyu_thumb_A_es.png", + "./output/1786889838_The_Mysterious_Derinkuyu_thumb_B_es.png", + "./output/1786889838_The_Mysterious_Derinkuyu_thumb_C_es.png" + ], + "clean": [ + "./output/1786889838_The_Mysterious_Derinkuyu_thumb_A_clean.png", + "./output/1786889838_The_Mysterious_Derinkuyu_thumb_B_clean.png", + "./output/1786889838_The_Mysterious_Derinkuyu_thumb_C_clean.png" + ] + }, + "timings": { + "SCRIPT": 112.9, + "TTS:EN": 33.2, + "TTS:ES": 40.9, + "MUSIC": 0.8, + "VISUAL": 1147.6, + "SUBS:EN": 9.3, + "SUBS:ES": 11.4, + "THUMBNAILS": 56.6, + "ASSEMBLY": 62.8 + }, + "created_at": 1786891314.4357455 +} \ No newline at end of file diff --git a/output/1786889838_The_Mysterious_Derinkuyu_subtitles_en.srt b/output/1786889838_The_Mysterious_Derinkuyu_subtitles_en.srt new file mode 100644 index 0000000..c34d872 --- /dev/null +++ b/output/1786889838_The_Mysterious_Derinkuyu_subtitles_en.srt @@ -0,0 +1,76 @@ +1 +00:00:00,000 --> 00:00:01,540 +In the heart of Turkey, an + +2 +00:00:01,540 --> 00:00:03,900 +ancient city lies hidden. Its secrets + +3 +00:00:03,900 --> 00:00:06,800 +buried for millennia. During Kuyu, a + +4 +00:00:06,800 --> 00:00:09,000 +labyrinth of tunnels and chambers was + +5 +00:00:09,000 --> 00:00:11,240 +built to withstand sieges and invasions. + +6 +00:00:11,960 --> 00:00:14,980 +In 1960, local farmers stumbled upon + +7 +00:00:14,980 --> 00:00:17,220 +the entrance, unveiling a city that + +8 +00:00:17,220 --> 00:00:20,340 +could house thousands. Archaeologists race to + +9 +00:00:20,340 --> 00:00:22,660 +document the findings, piecing together the + +10 +00:00:22,660 --> 00:00:25,560 +city's history. The city features complex + +11 +00:00:25,560 --> 00:00:27,860 +systems for air, water, and food, + +12 +00:00:27,860 --> 00:00:31,180 +hinting at a sophisticated society. Each + +13 +00:00:31,180 --> 00:00:32,960 +level, with its own unique features, + +14 +00:00:33,440 --> 00:00:35,240 +reveals the ingenuity of its builders. + +15 +00:00:36,200 --> 00:00:38,180 +During Kuyu remains a puzzle with + +16 +00:00:38,180 --> 00:00:39,740 +no clear records of its builders. + +17 +00:00:40,440 --> 00:00:41,740 +Some theories link it to the + +18 +00:00:41,740 --> 00:00:43,960 +Frigians, Hittites, or even the Knights + +19 +00:00:43,960 --> 00:00:45,840 +Templar, adding to its allure. + diff --git a/output/1786889838_The_Mysterious_Derinkuyu_subtitles_es.srt b/output/1786889838_The_Mysterious_Derinkuyu_subtitles_es.srt new file mode 100644 index 0000000..ca3d286 --- /dev/null +++ b/output/1786889838_The_Mysterious_Derinkuyu_subtitles_es.srt @@ -0,0 +1,84 @@ +1 +00:00:00,000 --> 00:00:01,740 +En el corzán de Turquia, y + +2 +00:00:01,740 --> 00:00:04,680 +una antigua ciudad siacolta sasecrito sepultados + +3 +00:00:04,680 --> 00:00:07,080 +de Rante Milños. Daring cuyo un + +4 +00:00:07,080 --> 00:00:09,120 +laborinto de túneles y salones, fue + +5 +00:00:09,120 --> 00:00:11,740 +construido para resistir asedios y invasiones. + +6 +00:00:12,120 --> 00:00:15,200 +En 1960, agricultores locales descubrieron el + +7 +00:00:15,200 --> 00:00:17,480 +exceso, revelando una ciudad que fue + +8 +00:00:17,480 --> 00:00:19,520 +podria albergar a miles de habitantes. + +9 +00:00:20,060 --> 00:00:22,380 +Arquilógos se aprieraron a documentar los + +10 +00:00:22,380 --> 00:00:24,860 +halazgos, reconstruyendo la historia de la + +11 +00:00:24,860 --> 00:00:26,860 +ciudad. La ciudad que cuyenta con + +12 +00:00:26,860 --> 00:00:28,960 +complejos sistemas de heir, agua y + +13 +00:00:28,960 --> 00:00:31,080 +alimento, sugeriendo un asocio de la + +14 +00:00:31,080 --> 00:00:33,800 +sofisticada. Cada Nivel, con sus propias + +15 +00:00:33,800 --> 00:00:36,600 +características únicas, revela la ingenia ciudad + +16 +00:00:36,600 --> 00:00:39,020 +de sus constructores. Daring cuyo pérmense + +17 +00:00:39,020 --> 00:00:41,480 +en rompecabes, sin registros claros de + +18 +00:00:41,480 --> 00:00:44,300 +sus constructores. Cihem propuso teorias que + +19 +00:00:44,300 --> 00:00:46,480 +lo vinculan con los frijos, heatitas, + +20 +00:00:46,960 --> 00:00:49,200 +o incluso los caballeros templarios, y + +21 +00:00:49,200 --> 00:00:50,380 +de indos su encanto. + diff --git a/output/1786889838_The_Mysterious_Derinkuyu_thumb_A_clean.png b/output/1786889838_The_Mysterious_Derinkuyu_thumb_A_clean.png new file mode 100644 index 0000000..fbfaf45 Binary files /dev/null and b/output/1786889838_The_Mysterious_Derinkuyu_thumb_A_clean.png differ diff --git a/output/1786889838_The_Mysterious_Derinkuyu_thumb_A_en.png b/output/1786889838_The_Mysterious_Derinkuyu_thumb_A_en.png new file mode 100644 index 0000000..035e1f6 Binary files /dev/null and b/output/1786889838_The_Mysterious_Derinkuyu_thumb_A_en.png differ diff --git a/output/1786889838_The_Mysterious_Derinkuyu_thumb_A_es.png b/output/1786889838_The_Mysterious_Derinkuyu_thumb_A_es.png new file mode 100644 index 0000000..e076f2a Binary files /dev/null and b/output/1786889838_The_Mysterious_Derinkuyu_thumb_A_es.png differ diff --git a/output/1786889838_The_Mysterious_Derinkuyu_thumb_B_clean.png b/output/1786889838_The_Mysterious_Derinkuyu_thumb_B_clean.png new file mode 100644 index 0000000..431c808 Binary files /dev/null and b/output/1786889838_The_Mysterious_Derinkuyu_thumb_B_clean.png differ diff --git a/output/1786889838_The_Mysterious_Derinkuyu_thumb_B_en.png b/output/1786889838_The_Mysterious_Derinkuyu_thumb_B_en.png new file mode 100644 index 0000000..b4ae42f Binary files /dev/null and b/output/1786889838_The_Mysterious_Derinkuyu_thumb_B_en.png differ diff --git a/output/1786889838_The_Mysterious_Derinkuyu_thumb_B_es.png b/output/1786889838_The_Mysterious_Derinkuyu_thumb_B_es.png new file mode 100644 index 0000000..4dc776f Binary files /dev/null and b/output/1786889838_The_Mysterious_Derinkuyu_thumb_B_es.png differ diff --git a/output/1786889838_The_Mysterious_Derinkuyu_thumb_C_clean.png b/output/1786889838_The_Mysterious_Derinkuyu_thumb_C_clean.png new file mode 100644 index 0000000..d5ce7fa Binary files /dev/null and b/output/1786889838_The_Mysterious_Derinkuyu_thumb_C_clean.png differ diff --git a/output/1786889838_The_Mysterious_Derinkuyu_thumb_C_en.png b/output/1786889838_The_Mysterious_Derinkuyu_thumb_C_en.png new file mode 100644 index 0000000..754871a Binary files /dev/null and b/output/1786889838_The_Mysterious_Derinkuyu_thumb_C_en.png differ diff --git a/output/1786889838_The_Mysterious_Derinkuyu_thumb_C_es.png b/output/1786889838_The_Mysterious_Derinkuyu_thumb_C_es.png new file mode 100644 index 0000000..02692ba Binary files /dev/null and b/output/1786889838_The_Mysterious_Derinkuyu_thumb_C_es.png differ diff --git a/output/1786889838_The_Mysterious_Derinkuyu_upload_EN.txt b/output/1786889838_The_Mysterious_Derinkuyu_upload_EN.txt new file mode 100644 index 0000000..b4e5e2e --- /dev/null +++ b/output/1786889838_The_Mysterious_Derinkuyu_upload_EN.txt @@ -0,0 +1,29 @@ +============================================================ +YOUTUBE UPLOAD BUNDLE — ENGLISH (Topic: The Mysterious Derinkuyu Underground City) +============================================================ + +TITLES FOR A/B TESTING: + A. Derinkuyu: The Lost Underground City + B. Unearthed: Derinkuyu’s Hidden Past + C. Derinkuyu: A Mysterious Underground City Revealed + +DESCRIPTION & CHAPTERS: +Discover the enigmatic Derinkuyu Underground City, a marvel of ancient engineering. Dive into its hidden chambers, explore its mysterious origins, and uncover the secrets that have remained buried for centuries. #Documentary #History #Science + +TIMESTAMPS / CHAPTERS: +00:00 - Ancient Mystery +00:11 - Critical Discovery +00:24 - Hidden Chambers +00:35 - Mysterious Origins + +#Documentary #History #Science + +TAGS: +documentary, history, ancient, underground city, derinkuyu, turkey, mystery, engineering, archaeology, ancient civilization, hidden city, underground, history + +VIDEO FILE: ./output/1786889838_The_Mysterious_Derinkuyu_en.mp4 +SUBTITLES: ./output/1786889838_The_Mysterious_Derinkuyu_subtitles_en.srt +THUMBNAILS: + - ./output/1786889838_The_Mysterious_Derinkuyu_thumb_A_en.png + - ./output/1786889838_The_Mysterious_Derinkuyu_thumb_B_en.png + - ./output/1786889838_The_Mysterious_Derinkuyu_thumb_C_en.png diff --git a/output/1786889838_The_Mysterious_Derinkuyu_upload_ES.txt b/output/1786889838_The_Mysterious_Derinkuyu_upload_ES.txt new file mode 100644 index 0000000..65240ab --- /dev/null +++ b/output/1786889838_The_Mysterious_Derinkuyu_upload_ES.txt @@ -0,0 +1,29 @@ +============================================================ +PAQUETE DE SUBIDA A YOUTUBE — ESPAÑOL (Tema: The Mysterious Derinkuyu Underground City) +============================================================ + +TÍTULOS PARA PRUEBA A/B: + A. Derinkuyu: La Ciudad Soterrada Olvidada + B. Descubierto: El Pasado Oculto de Derinkuyu + C. Derinkuyu: Una Ciudad Soterrada Misteriosa Revelada + +DESCRIPCIÓN Y CAPÍTULOS: +Descubre la enigmática Ciudad Soterrada de Derinkuyu, un maravilloso ejemplo de ingeniería antigua. Sumérgete en sus salones ocultos, explora sus orígenes misteriosos e inicies el descubrimiento de secretos que han permanecido enterrados durante siglos. #Documentario #Historia #Ciencia + +CAPÍTULOS: +00:00 - Misterio Antiguo +00:12 - Descubrimiento Crítico +00:25 - Salones Ocultos +00:37 - Orígenes Misteriosos + +#Documental #Historia #Ciencia + +ETIQUETAS / TAGS: +documentary, history, ancient, underground city, derinkuyu, turkey, mystery, engineering, archaeology, ancient civilization, hidden city, underground, history + +ARCHIVO DE VIDEO: ./output/1786889838_The_Mysterious_Derinkuyu_es.mp4 +SUBTÍTULOS: ./output/1786889838_The_Mysterious_Derinkuyu_subtitles_es.srt +MINIATURAS: + - ./output/1786889838_The_Mysterious_Derinkuyu_thumb_A_es.png + - ./output/1786889838_The_Mysterious_Derinkuyu_thumb_B_es.png + - ./output/1786889838_The_Mysterious_Derinkuyu_thumb_C_es.png diff --git a/output/1786891137_Who_was_Jack_the_Ripper_en.mp4 b/output/1786891137_Who_was_Jack_the_Ripper_en.mp4 new file mode 100644 index 0000000..d0e308b Binary files /dev/null and b/output/1786891137_Who_was_Jack_the_Ripper_en.mp4 differ diff --git a/output/1786891137_Who_was_Jack_the_Ripper_es.mp4 b/output/1786891137_Who_was_Jack_the_Ripper_es.mp4 new file mode 100644 index 0000000..e6247a0 Binary files /dev/null and b/output/1786891137_Who_was_Jack_the_Ripper_es.mp4 differ diff --git a/output/1786891137_Who_was_Jack_the_Ripper_meta.json b/output/1786891137_Who_was_Jack_the_Ripper_meta.json new file mode 100644 index 0000000..e7acd84 --- /dev/null +++ b/output/1786891137_Who_was_Jack_the_Ripper_meta.json @@ -0,0 +1,279 @@ +{ + "job_id": "1786891137_Who_was_Jack_the_Ripper", + "topic": "Who was Jack the Ripper, who did he kill, and why was he never caught?", + "titles": [ + "Jack the Ripper: The Unsolved Mystery", + "Who Was the Real Jack the Ripper?", + "Jack the Ripper: Why Was He Never Caught?" + ], + "titles_es": [ + "Jack el Destripador: El Misterio Sin Resolver", + "¿Quién Fue el Real Jack el Destripador?", + "Jack el Destripador: ¿Por Qué Nunca Fue Capturado?" + ], + "description": "Jack the Ripper remains one of history's most notorious and enigmatic serial killers. Join us on a chilling journey through the fog-drenched streets of Victorian London, uncovering the stories behind the murders, the suspects, and the enduring mystery. #Documentary #History #JackTheRipper\n\nTIMESTAMPS / CHAPTERS:\n00:00 - The Murders\n00:11 - The Victims\n00:20 - The Suspects\n00:32 - The Letters\n00:43 - The Investigation\n00:53 - Theories\n01:02 - The Evidence\n01:11 - The Legacy\n01:21 - The Unsolved Mystery\n01:30 - The Ripper's Escape\n\n#Documentary #History #Science", + "description_es": "Jack el Destripador sigue siendo uno de los asesinos más notables y enigmáticos de la historia. Únete a nosotros en un viaje inquietante por las calles neblinosas de Londres victoriana, descubriendo las historias detrás de los asesinatos, los sospechosos y el misterio que permanece intacto. #Documental #Historia #JackElDestripador\n\nCAPÍTULOS:\n00:00 - Los Asesinatos\n00:12 - Las Víctimas\n00:24 - Los Sospechosos\n00:37 - Las Cartas\n00:49 - La Investigación\n00:59 - Las Teorías\n01:10 - La Evidencia\n01:19 - El Legado\n01:30 - El Misterio Sin Resolver\n01:40 - El Escape de Jack el Destripador\n\n#Documental #Historia #Ciencia", + "tags": [ + "documentary", + "history", + "jack the ripper", + "serial killer", + "crime", + "victorian england", + "unsolved mystery", + "police investigation", + "forensic science", + "mystery", + "true crime", + "urban legend", + "police records", + "19th century" + ], + "chapters_en": [ + { + "index": 0, + "start": 0.0, + "end": 11.275, + "duration": 11.275, + "chapter_title": "The Murders", + "text": "In 1888, the Whitechapel district of London was terrorized by a mysterious figure known as Jack the Ripper. Five women were brutally murdered in a matter of weeks.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_000.wav" + }, + { + "index": 1, + "start": 11.275, + "end": 20.725, + "duration": 9.45, + "chapter_title": "The Victims", + "text": "The victims were all sex workers, brutally mutilated, their bodies found in alleys and backyards. The case was dubbed 'The Whitechapel Murders'.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_001.wav" + }, + { + "index": 2, + "start": 20.725, + "end": 32.650000000000006, + "duration": 11.925, + "chapter_title": "The Suspects", + "text": "Scores of suspects were investigated, including immigrants, doctors, and even a famous doctor, Dr. William H. Palmer. Each was a potential candidate, but all were eventually cleared.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_002.wav" + }, + { + "index": 3, + "start": 32.650000000000006, + "end": 43.62500000000001, + "duration": 10.975, + "chapter_title": "The Letters", + "text": "The killer left two chilling letters, one to the Central News and another to the Whitechapel Vigilance Committee. They contained warnings and taunts, but no concrete evidence.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_003.wav" + }, + { + "index": 4, + "start": 43.62500000000001, + "end": 53.22500000000001, + "duration": 9.6, + "chapter_title": "The Investigation", + "text": "The Metropolitan Police, led by Inspector Abberline, conducted a meticulous investigation, but the clues were few and the suspects many.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_004.wav" + }, + { + "index": 5, + "start": 53.22500000000001, + "end": 62.85000000000001, + "duration": 9.625, + "chapter_title": "Theories", + "text": "Theories about Jack the Ripper range from a doctor to a woman to even a supernatural entity. Nothing has been proven, and the case remains open.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_005.wav" + }, + { + "index": 6, + "start": 62.85000000000001, + "end": 71.22500000000001, + "duration": 8.375, + "chapter_title": "The Evidence", + "text": "Despite extensive searches, no conclusive evidence was found. The Ripper's signature was never matched, and the case went cold.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_006.wav" + }, + { + "index": 7, + "start": 71.22500000000001, + "end": 81.67500000000001, + "duration": 10.45, + "chapter_title": "The Legacy", + "text": "Jack the Ripper has become a symbol of fear and fascination. His name has been the subject of countless books and films, a shadow that haunts the history of London.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_007.wav" + }, + { + "index": 8, + "start": 81.67500000000001, + "end": 90.62500000000001, + "duration": 8.95, + "chapter_title": "The Unsolved Mystery", + "text": "Jack the Ripper remains one of the most enduring unsolved mysteries in history. His identity, if ever known, has never been revealed.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_008.wav" + }, + { + "index": 9, + "start": 90.62500000000001, + "end": 98.22500000000001, + "duration": 7.6, + "chapter_title": "The Ripper's Escape", + "text": "Jack the Ripper escaped justice, leaving behind a legacy of fear and a mystery that continues to captivate the world.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_009.wav" + } + ], + "chapters_es": [ + { + "index": 0, + "start": 0.0, + "end": 12.575, + "duration": 12.575, + "chapter_title": "Los Asesinatos", + "text": "En 1888, el distrito de Whitechapel en Londres fue asolado por una figura misteriosa conocida como Jack el Destripador. Cinco mujeres fueron brutalmente asesinadas en apenas unas semanas.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_000.wav" + }, + { + "index": 1, + "start": 12.575, + "end": 24.825, + "duration": 12.25, + "chapter_title": "Las Víctimas", + "text": "Las víctimas eran todas trabajadoras sexuales, mutiladas de manera brutal, sus cuerpos fueron encontrados en callejones y patios traseros. El caso se conoció como 'Los Asesinatos de Whitechapel'.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_001.wav" + }, + { + "index": 2, + "start": 24.825, + "end": 37.875, + "duration": 13.05, + "chapter_title": "Los Sospechosos", + "text": "Se investigaron cientos de sospechosos, incluyendo inmigrantes, médicos y hasta un famoso doctor, Dr. William H. Palmer. Cada uno era un candidato potencial, pero todos fueron eventualmente descartados.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_002.wav" + }, + { + "index": 3, + "start": 37.875, + "end": 49.15, + "duration": 11.275, + "chapter_title": "Las Cartas", + "text": "El asesino dejó dos cartas espeluznantes, una a Central News y otra a la Comisión de Vigilancia de Whitechapel. Contenían advertencias y desafíos, pero no evidencia concreta.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_003.wav" + }, + { + "index": 4, + "start": 49.15, + "end": 59.275, + "duration": 10.125, + "chapter_title": "La Investigación", + "text": "La policía metropolitana, liderada por el Inspector Abberline, llevó a cabo una investigación minuciosa, pero las pistas eran pocas y los sospechosos muchos.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_004.wav" + }, + { + "index": 5, + "start": 59.275, + "end": 70.1, + "duration": 10.825, + "chapter_title": "Las Teorías", + "text": "Las teorías sobre Jack el Destripador van desde un médico hasta una mujer, incluso hasta una entidad sobrenatural. Nada ha sido probado y el caso permanece abierto.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_005.wav" + }, + { + "index": 6, + "start": 70.1, + "end": 79.175, + "duration": 9.075, + "chapter_title": "La Evidencia", + "text": "A pesar de las exhaustivas investigaciones, no se encontró evidencia concluyente. El sello del asesino nunca fue identificado, y el caso se enfrío.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_006.wav" + }, + { + "index": 7, + "start": 79.175, + "end": 90.64999999999999, + "duration": 11.475, + "chapter_title": "El Legado", + "text": "Jack el Destripador se ha convertido en un símbolo de miedo y fascinación. Su nombre ha sido el tema de numerosos libros y películas, una sombra que persigue la historia de Londres.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_007.wav" + }, + { + "index": 8, + "start": 90.64999999999999, + "end": 100.225, + "duration": 9.575, + "chapter_title": "El Misterio Sin Resolver", + "text": "Jack el Destripador sigue siendo uno de los misterios sin resolver más duraderos en la historia. Su identidad, si alguna vez se conoció, nunca fue revelada.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_008.wav" + }, + { + "index": 9, + "start": 100.225, + "end": 108.35, + "duration": 8.125, + "chapter_title": "El Escape de Jack el Destripador", + "text": "Jack el Destripador escapó de la justicia, dejando tras de sí una legado de miedo y un misterio que continúa atrapando al mundo.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_009.wav" + } + ], + "clips": { + "en": [ + "./temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_000.mp4", + "./temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_001.mp4", + "./temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_002.mp4", + "./temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_003.mp4", + "./temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_004.mp4", + "./temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_005.mp4", + "./temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_006.mp4", + "./temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_007.mp4", + "./temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_008.mp4", + "./temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_009.mp4" + ], + "es": [ + "./temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_000.mp4", + "./temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_001.mp4", + "./temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_002.mp4", + "./temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_003.mp4", + "./temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_004.mp4", + "./temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_005.mp4", + "./temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_006.mp4", + "./temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_007.mp4", + "./temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_008.mp4", + "./temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_009.mp4" + ] + }, + "files": { + "en": "./output/1786891137_Who_was_Jack_the_Ripper_en.mp4", + "es": "./output/1786891137_Who_was_Jack_the_Ripper_es.mp4" + }, + "subtitles": { + "en": "./output/1786891137_Who_was_Jack_the_Ripper_subtitles_en.srt", + "es": "./output/1786891137_Who_was_Jack_the_Ripper_subtitles_es.srt" + }, + "thumbnails": { + "en": [ + "./output/1786891137_Who_was_Jack_the_Ripper_thumb_A_en.png", + "./output/1786891137_Who_was_Jack_the_Ripper_thumb_B_en.png", + "./output/1786891137_Who_was_Jack_the_Ripper_thumb_C_en.png" + ], + "es": [ + "./output/1786891137_Who_was_Jack_the_Ripper_thumb_A_es.png", + "./output/1786891137_Who_was_Jack_the_Ripper_thumb_B_es.png", + "./output/1786891137_Who_was_Jack_the_Ripper_thumb_C_es.png" + ], + "clean": [ + "./output/1786891137_Who_was_Jack_the_Ripper_thumb_A_clean.png", + "./output/1786891137_Who_was_Jack_the_Ripper_thumb_B_clean.png", + "./output/1786891137_Who_was_Jack_the_Ripper_thumb_C_clean.png" + ] + }, + "timings": { + "SCRIPT": 275.4, + "TTS:EN": 41.6, + "TTS:ES": 45.9, + "MUSIC": 1.9, + "VISUAL": 1404.1, + "SUBS:EN": 14.1, + "SUBS:ES": 18.9, + "THUMBNAILS": 60.7, + "ASSEMBLY": 116.2 + }, + "created_at": 1786893116.3643885 +} \ No newline at end of file diff --git a/output/1786891137_Who_was_Jack_the_Ripper_subtitles_en.srt b/output/1786891137_Who_was_Jack_the_Ripper_subtitles_en.srt new file mode 100644 index 0000000..c39918c --- /dev/null +++ b/output/1786891137_Who_was_Jack_the_Ripper_subtitles_en.srt @@ -0,0 +1,164 @@ +1 +00:00:00,000 --> 00:00:02,880 +In 1888, the white tecapel district + +2 +00:00:02,880 --> 00:00:04,840 +of London was terrorized by a + +3 +00:00:04,840 --> 00:00:07,060 +mysterious figure known as Jack the + +4 +00:00:07,060 --> 00:00:09,600 +Ripper. Five women were brutally murdered + +5 +00:00:09,600 --> 00:00:11,640 +in a matter of weeks. The + +6 +00:00:11,640 --> 00:00:13,920 +victims were all sex workers, brutally + +7 +00:00:13,920 --> 00:00:16,360 +mutilated, their bodies found in alleys + +8 +00:00:16,360 --> 00:00:18,680 +and backyards. The case was dubbed + +9 +00:00:18,680 --> 00:00:21,500 +the white tecapel murders. Scores of + +10 +00:00:21,500 --> 00:00:24,840 +suspects were investigated, including immigrants, doctors, + +11 +00:00:25,180 --> 00:00:27,060 +and even a famous doctor, Dr. + +12 +00:00:27,280 --> 00:00:29,360 +William H. Palmer. Each was a + +13 +00:00:29,360 --> 00:00:31,620 +potential candidate, but all were eventually + +14 +00:00:31,620 --> 00:00:34,300 +cleared. The killer left two chilling + +15 +00:00:34,300 --> 00:00:36,300 +letters, one to the central news, + +16 +00:00:36,600 --> 00:00:37,960 +and another to the white tecapel + +17 +00:00:37,960 --> 00:00:40,960 +vigilance committee. They contained warnings and + +18 +00:00:40,960 --> 00:00:43,980 +taunts, but no concrete evidence. The + +19 +00:00:43,980 --> 00:00:47,040 +Metropolitan Police, led by Inspector Abberline, + +20 +00:00:47,500 --> 00:00:50,420 +conducted a meticulous investigation. But the + +21 +00:00:50,420 --> 00:00:52,140 +clues were few and the suspects + +22 +00:00:52,140 --> 00:00:54,880 +many. Theories about Jack the Ripper + +23 +00:00:54,880 --> 00:00:56,640 +range from a doctor to a + +24 +00:00:56,640 --> 00:00:58,760 +woman to even a supernatural entity. + +25 +00:00:59,360 --> 00:01:01,240 +Nothing has been proven and the + +26 +00:01:01,240 --> 00:01:04,520 +case remains open. Despite extensive searches, + +27 +00:01:05,020 --> 00:01:07,520 +no conclusive evidence was found. The + +28 +00:01:07,520 --> 00:01:09,680 +Ripper's signature was never matched and + +29 +00:01:09,680 --> 00:01:11,900 +the case went cold. Jack the + +30 +00:01:11,900 --> 00:01:13,460 +Ripper has become a symbol of + +31 +00:01:13,460 --> 00:01:16,300 +fear and fascination. His name has + +32 +00:01:16,300 --> 00:01:18,000 +been the subject of countless books + +33 +00:01:18,000 --> 00:01:20,060 +and films, a shadow that haunts + +34 +00:01:20,060 --> 00:01:22,360 +the history of London. Jack the + +35 +00:01:22,360 --> 00:01:23,740 +Ripper remains one of the most + +36 +00:01:23,740 --> 00:01:26,900 +enduring unsolved mysteries in history. His + +37 +00:01:26,900 --> 00:01:29,340 +identity, if ever known, has never + +38 +00:01:29,340 --> 00:01:31,920 +been revealed. Jack the Ripper escaped + +39 +00:01:31,920 --> 00:01:34,480 +justice, leaving behind a legacy of + +40 +00:01:34,480 --> 00:01:36,420 +fear and a mystery that continues + +41 +00:01:36,420 --> 00:01:37,680 +to captivate the world. + diff --git a/output/1786891137_Who_was_Jack_the_Ripper_subtitles_es.srt b/output/1786891137_Who_was_Jack_the_Ripper_subtitles_es.srt new file mode 100644 index 0000000..1ce40cc --- /dev/null +++ b/output/1786891137_Who_was_Jack_the_Ripper_subtitles_es.srt @@ -0,0 +1,180 @@ +1 +00:00:00,000 --> 00:00:02,820 +En 1888, el distrito de whitecapele + +2 +00:00:02,820 --> 00:00:05,160 +en Londres, Fuea Salado, por unificiero + +3 +00:00:05,160 --> 00:00:07,260 +misteriosa Canása de Camo, Jack L. + +4 +00:00:07,360 --> 00:00:10,740 +Distribidor. Cinco Mujer's Fioran Brutalment asesinadas, + +5 +00:00:11,100 --> 00:00:12,900 +N .A. Pina's Yunas Semanas. Las + +6 +00:00:12,900 --> 00:00:15,960 +víctimas iran totes trabigeras sexuales, mutiladas + +7 +00:00:15,960 --> 00:00:18,300 +de manera brutal, suscupos furan en + +8 +00:00:18,300 --> 00:00:21,420 +contratos y callejones y patiostraseros. El + +9 +00:00:21,420 --> 00:00:23,980 +Caso Sicanosio Camo, los asesinatos de + +10 +00:00:23,980 --> 00:00:26,220 +whitecapele. Si investigar en Tos de + +11 +00:00:26,220 --> 00:00:29,420 +Suspechosos, inclayendo en migrantes, Madeco's White + +12 +00:00:29,420 --> 00:00:31,800 +Haistron Famoso Doctor, Dr. William H. + +13 +00:00:31,960 --> 00:00:34,180 +Palmer. Cada uno era en Candidato + +14 +00:00:34,180 --> 00:00:37,620 +Potential, Piro toduz Fioran eventualmente discartados. + +15 +00:00:38,100 --> 00:00:39,600 +El asesino de Joe Duz Cartas + +16 +00:00:39,600 --> 00:00:42,140 +espelas nantes, Yunas Central News, White + +17 +00:00:42,140 --> 00:00:44,700 +Otra Elacomision de Vigiláncia de Whitecapele. + +18 +00:00:45,100 --> 00:00:47,820 +Continian advertencias y disafios, Piro no + +19 +00:00:47,820 --> 00:00:50,940 +evidente concreta. La Policia Metropolitana, la + +20 +00:00:50,940 --> 00:00:53,040 +hidrada por el Inspector Abberline, Livo + +21 +00:00:53,040 --> 00:00:56,500 +Acaboyuna Investigación Minuciosa, Piro las Pistas + +22 +00:00:56,500 --> 00:00:59,080 +Irán Pocas y Los Suspechosos Muchos. + +23 +00:00:59,480 --> 00:01:01,500 +Las teorias Saber Jack, El Distributor + +24 +00:01:01,500 --> 00:01:03,260 +Vendiz de Un Médico, Haste Una + +25 +00:01:03,260 --> 00:01:05,800 +Mujer, Incluso Haste Una, Entidad Saber + +26 +00:01:05,800 --> 00:01:08,500 +Natural. Nada ha sido probado while + +27 +00:01:08,500 --> 00:01:10,900 +Caso Permins Abberdo. Apesar de las + +28 +00:01:10,900 --> 00:01:13,840 +exhaustivas investigaciones, no se incontro evidente + +29 +00:01:13,840 --> 00:01:16,200 +con cliente. El Celo del asesino + +30 +00:01:16,200 --> 00:01:18,840 +nunca fue identificado while Caso Cienfrio. + +31 +00:01:19,360 --> 00:01:21,220 +Jack el Distributor se ha convertido + +32 +00:01:21,220 --> 00:01:22,900 +en un símbolo de Mido, why + +33 +00:01:22,900 --> 00:01:25,440 +fascinación. Su nombre ha sido el + +34 +00:01:25,440 --> 00:01:27,880 +tema de numerosos libros y películas, + +35 +00:01:28,080 --> 00:01:29,740 +un asombre que perseguió la historia + +36 +00:01:29,740 --> 00:01:31,640 +de los lindos. Jack el Distributor + +37 +00:01:31,640 --> 00:01:33,020 +Sigue sin de uno de los + +38 +00:01:33,020 --> 00:01:35,240 +misterios, sin resolver más de los + +39 +00:01:35,240 --> 00:01:37,460 +raderos y la historia. Su identidad + +40 +00:01:37,460 --> 00:01:39,240 +sea alguna vez si canócio nunca + +41 +00:01:39,240 --> 00:01:41,840 +fue revelada. Jack el Distributor escapó + +42 +00:01:41,840 --> 00:01:43,660 +de la justicia, de Gendo Tras, + +43 +00:01:43,760 --> 00:01:45,000 +de si un alegado de Mido, + +44 +00:01:45,380 --> 00:01:47,460 +why un misterio que continúa atrapando + +45 +00:01:47,460 --> 00:01:47,980 +al mundo. + diff --git a/output/1786891137_Who_was_Jack_the_Ripper_thumb_A_clean.png b/output/1786891137_Who_was_Jack_the_Ripper_thumb_A_clean.png new file mode 100644 index 0000000..ea4a2c7 Binary files /dev/null and b/output/1786891137_Who_was_Jack_the_Ripper_thumb_A_clean.png differ diff --git a/output/1786891137_Who_was_Jack_the_Ripper_thumb_A_en.png b/output/1786891137_Who_was_Jack_the_Ripper_thumb_A_en.png new file mode 100644 index 0000000..3c25264 Binary files /dev/null and b/output/1786891137_Who_was_Jack_the_Ripper_thumb_A_en.png differ diff --git a/output/1786891137_Who_was_Jack_the_Ripper_thumb_A_es.png b/output/1786891137_Who_was_Jack_the_Ripper_thumb_A_es.png new file mode 100644 index 0000000..9cd48b4 Binary files /dev/null and b/output/1786891137_Who_was_Jack_the_Ripper_thumb_A_es.png differ diff --git a/output/1786891137_Who_was_Jack_the_Ripper_thumb_B_clean.png b/output/1786891137_Who_was_Jack_the_Ripper_thumb_B_clean.png new file mode 100644 index 0000000..f5b0312 Binary files /dev/null and b/output/1786891137_Who_was_Jack_the_Ripper_thumb_B_clean.png differ diff --git a/output/1786891137_Who_was_Jack_the_Ripper_thumb_B_en.png b/output/1786891137_Who_was_Jack_the_Ripper_thumb_B_en.png new file mode 100644 index 0000000..8e3ee44 Binary files /dev/null and b/output/1786891137_Who_was_Jack_the_Ripper_thumb_B_en.png differ diff --git a/output/1786891137_Who_was_Jack_the_Ripper_thumb_B_es.png b/output/1786891137_Who_was_Jack_the_Ripper_thumb_B_es.png new file mode 100644 index 0000000..6efa532 Binary files /dev/null and b/output/1786891137_Who_was_Jack_the_Ripper_thumb_B_es.png differ diff --git a/output/1786891137_Who_was_Jack_the_Ripper_thumb_C_clean.png b/output/1786891137_Who_was_Jack_the_Ripper_thumb_C_clean.png new file mode 100644 index 0000000..d95aa61 Binary files /dev/null and b/output/1786891137_Who_was_Jack_the_Ripper_thumb_C_clean.png differ diff --git a/output/1786891137_Who_was_Jack_the_Ripper_thumb_C_en.png b/output/1786891137_Who_was_Jack_the_Ripper_thumb_C_en.png new file mode 100644 index 0000000..99f26c2 Binary files /dev/null and b/output/1786891137_Who_was_Jack_the_Ripper_thumb_C_en.png differ diff --git a/output/1786891137_Who_was_Jack_the_Ripper_thumb_C_es.png b/output/1786891137_Who_was_Jack_the_Ripper_thumb_C_es.png new file mode 100644 index 0000000..04682e1 Binary files /dev/null and b/output/1786891137_Who_was_Jack_the_Ripper_thumb_C_es.png differ diff --git a/output/1786891137_Who_was_Jack_the_Ripper_upload_EN.txt b/output/1786891137_Who_was_Jack_the_Ripper_upload_EN.txt new file mode 100644 index 0000000..fd3d494 --- /dev/null +++ b/output/1786891137_Who_was_Jack_the_Ripper_upload_EN.txt @@ -0,0 +1,35 @@ +============================================================ +YOUTUBE UPLOAD BUNDLE — ENGLISH (Topic: Who was Jack the Ripper, who did he kill, and why was he never caught?) +============================================================ + +TITLES FOR A/B TESTING: + A. Jack the Ripper: The Unsolved Mystery + B. Who Was the Real Jack the Ripper? + C. Jack the Ripper: Why Was He Never Caught? + +DESCRIPTION & CHAPTERS: +Jack the Ripper remains one of history's most notorious and enigmatic serial killers. Join us on a chilling journey through the fog-drenched streets of Victorian London, uncovering the stories behind the murders, the suspects, and the enduring mystery. #Documentary #History #JackTheRipper + +TIMESTAMPS / CHAPTERS: +00:00 - The Murders +00:11 - The Victims +00:20 - The Suspects +00:32 - The Letters +00:43 - The Investigation +00:53 - Theories +01:02 - The Evidence +01:11 - The Legacy +01:21 - The Unsolved Mystery +01:30 - The Ripper's Escape + +#Documentary #History #Science + +TAGS: +documentary, history, jack the ripper, serial killer, crime, victorian england, unsolved mystery, police investigation, forensic science, mystery, true crime, urban legend, police records, 19th century + +VIDEO FILE: ./output/1786891137_Who_was_Jack_the_Ripper_en.mp4 +SUBTITLES: ./output/1786891137_Who_was_Jack_the_Ripper_subtitles_en.srt +THUMBNAILS: + - ./output/1786891137_Who_was_Jack_the_Ripper_thumb_A_en.png + - ./output/1786891137_Who_was_Jack_the_Ripper_thumb_B_en.png + - ./output/1786891137_Who_was_Jack_the_Ripper_thumb_C_en.png diff --git a/output/1786891137_Who_was_Jack_the_Ripper_upload_ES.txt b/output/1786891137_Who_was_Jack_the_Ripper_upload_ES.txt new file mode 100644 index 0000000..82b58f7 --- /dev/null +++ b/output/1786891137_Who_was_Jack_the_Ripper_upload_ES.txt @@ -0,0 +1,35 @@ +============================================================ +PAQUETE DE SUBIDA A YOUTUBE — ESPAÑOL (Tema: Who was Jack the Ripper, who did he kill, and why was he never caught?) +============================================================ + +TÍTULOS PARA PRUEBA A/B: + A. Jack el Destripador: El Misterio Sin Resolver + B. ¿Quién Fue el Real Jack el Destripador? + C. Jack el Destripador: ¿Por Qué Nunca Fue Capturado? + +DESCRIPCIÓN Y CAPÍTULOS: +Jack el Destripador sigue siendo uno de los asesinos más notables y enigmáticos de la historia. Únete a nosotros en un viaje inquietante por las calles neblinosas de Londres victoriana, descubriendo las historias detrás de los asesinatos, los sospechosos y el misterio que permanece intacto. #Documental #Historia #JackElDestripador + +CAPÍTULOS: +00:00 - Los Asesinatos +00:12 - Las Víctimas +00:24 - Los Sospechosos +00:37 - Las Cartas +00:49 - La Investigación +00:59 - Las Teorías +01:10 - La Evidencia +01:19 - El Legado +01:30 - El Misterio Sin Resolver +01:40 - El Escape de Jack el Destripador + +#Documental #Historia #Ciencia + +ETIQUETAS / TAGS: +documentary, history, jack the ripper, serial killer, crime, victorian england, unsolved mystery, police investigation, forensic science, mystery, true crime, urban legend, police records, 19th century + +ARCHIVO DE VIDEO: ./output/1786891137_Who_was_Jack_the_Ripper_es.mp4 +SUBTÍTULOS: ./output/1786891137_Who_was_Jack_the_Ripper_subtitles_es.srt +MINIATURAS: + - ./output/1786891137_Who_was_Jack_the_Ripper_thumb_A_es.png + - ./output/1786891137_Who_was_Jack_the_Ripper_thumb_B_es.png + - ./output/1786891137_Who_was_Jack_the_Ripper_thumb_C_es.png diff --git a/output/1786891437_The_Lost_Library_of_Alexa_en.mp4 b/output/1786891437_The_Lost_Library_of_Alexa_en.mp4 new file mode 100644 index 0000000..7a00179 Binary files /dev/null and b/output/1786891437_The_Lost_Library_of_Alexa_en.mp4 differ diff --git a/output/1786891437_The_Lost_Library_of_Alexa_es.mp4 b/output/1786891437_The_Lost_Library_of_Alexa_es.mp4 new file mode 100644 index 0000000..64c9064 Binary files /dev/null and b/output/1786891437_The_Lost_Library_of_Alexa_es.mp4 differ diff --git a/output/1786891437_The_Lost_Library_of_Alexa_meta.json b/output/1786891437_The_Lost_Library_of_Alexa_meta.json new file mode 100644 index 0000000..6a40ecb --- /dev/null +++ b/output/1786891437_The_Lost_Library_of_Alexa_meta.json @@ -0,0 +1,159 @@ +{ + "job_id": "1786891437_The_Lost_Library_of_Alexa", + "topic": "The Lost Library of Alexandria", + "titles": [ + "The Forgotten Knowledge of Alexandria", + "Uncovering the Lost Library", + "Alexandria's Timeless Secrets" + ], + "titles_es": [ + "El Olvidado Conocimiento de Alejandría", + "Descubriendo la Perdida Biblioteca", + "Secretos Eternos de Alejandría" + ], + "description": "Dive into the mysterious history of the lost Library of Alexandria, one of the greatest knowledge centers of antiquity. Discover the treasures, tragedies, and enduring legacy of this ancient wonder. #Documentary #History #Science\n\nTIMESTAMPS / CHAPTERS:\n00:00 - The Ancient Mystery\n00:15 - The Critical Discovery\n00:30 - The Great Library's Last Chapter\n00:45 - Uncovering the Lost Library\n\n#Documentary #History #Science", + "description_es": "Sumérgete en la historia misteriosa de la Biblioteca de Alejandría, una de las mayores centrales de conocimientos de la antigüedad. Descubre las tesoros, tragedias y legado eterno de esta antigua maravilla. #Documentario #Historia #Ciencia\n\nCAPÍTULOS:\n00:00 - El Misterio Antiguo\n00:18 - La Descubierta Crítica\n00:34 - El Último Capítulo de la Gran Biblioteca\n00:52 - Descubriendo la Perdida Biblioteca\n\n#Documental #Historia #Ciencia", + "tags": [ + "ancient history", + "lost library", + "alexandria", + "knowledge center", + "bce", + "bce history", + "ancient library", + "egypt", + "mediterranean", + "library of alexandria", + "university", + "ancient books", + "ancient knowledge", + "lost knowledge" + ], + "chapters_en": [ + { + "index": 0, + "start": 0.0, + "end": 15.975, + "duration": 15.975, + "chapter_title": "The Ancient Mystery", + "text": "Amidst the bustling harbor of Alexandria, stood a beacon of learning, the great Library. Founded in 300 BCE, it was a hub of intellectual brilliance, housing over half a million scrolls. Tragically, it burned, but its legacy endured.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891437_The_Lost_Library_of_Alexa/tts_en_000.wav" + }, + { + "index": 1, + "start": 15.975, + "end": 30.25, + "duration": 14.275, + "chapter_title": "The Critical Discovery", + "text": "In 1906, a German archaeologist discovered papyrus fragments in the ruins of the library. These remnants offered glimpses of the vast collection. But the full extent of its loss and treasures remained a mystery.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891437_The_Lost_Library_of_Alexa/tts_en_001.wav" + }, + { + "index": 2, + "start": 30.25, + "end": 45.8, + "duration": 15.55, + "chapter_title": "The Great Library's Last Chapter", + "text": "Despite the fire and subsequent invasions, the Library's influence persisted. Its scholars, like Eratosthenes, made groundbreaking discoveries in science and philosophy. Today, the site remains a symbol of the power of knowledge.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891437_The_Lost_Library_of_Alexa/tts_en_002.wav" + }, + { + "index": 3, + "start": 45.8, + "end": 58.9, + "duration": 13.1, + "chapter_title": "Uncovering the Lost Library", + "text": "Join us on this journey to uncover the secrets of the lost Library of Alexandria. From its rise to its fall, explore the enduring legacy of this intellectual treasure. The quest for knowledge continues.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891437_The_Lost_Library_of_Alexa/tts_en_003.wav" + } + ], + "chapters_es": [ + { + "index": 0, + "start": 0.0, + "end": 18.48, + "duration": 18.48, + "chapter_title": "El Misterio Antiguo", + "text": "En el bullicioso puerto de Alejandría, se alzaba un faro del saber, la gran Biblioteca. Fundada en el 300 a.C., era un centro de brillante intelecto, alojando más de medio millón de rollos. Trágicamente, se incendió, pero su legado sobrevivió.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891437_The_Lost_Library_of_Alexa/tts_es_000.wav" + }, + { + "index": 1, + "start": 18.48, + "end": 34.70401360544218, + "duration": 16.224013605442178, + "chapter_title": "La Descubierta Crítica", + "text": "En 1906, un arqueólogo alemán descubrió fragmentos de papiro en los ruinosos restos de la biblioteca. Estos restos ofrecían vislumbres de la vasta colección. Pero el alcance completo de su pérdida y tesoro permanecieron en el misterio.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891437_The_Lost_Library_of_Alexa/tts_es_001.wav" + }, + { + "index": 2, + "start": 34.70401360544218, + "end": 52.824013605442175, + "duration": 18.12, + "chapter_title": "El Último Capítulo de la Gran Biblioteca", + "text": "A pesar del incendio y las posteriores invasiones, la influencia de la Biblioteca persistió. Sus eruditos, como Eratóstenes, realizaron descubrimientos revolucionarios en ciencia y filosofía. Hoy en día, el sitio sigue siendo un símbolo del poder del conocimiento.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891437_The_Lost_Library_of_Alexa/tts_es_002.wav" + }, + { + "index": 3, + "start": 52.824013605442175, + "end": 67.72802721088435, + "duration": 14.904013605442177, + "chapter_title": "Descubriendo la Perdida Biblioteca", + "text": "Únete a nosotros en esta jornada para descubrir los secretos de la Biblioteca de Alejandría perdida. Desde su ascenso hasta su caída, explora el legado duradero de este tesoro intelectual. La búsqueda del conocimiento continúa.", + "wav_file": "/home/mark/Projects/GeminiVideoPipeline/temp/1786891437_The_Lost_Library_of_Alexa/tts_es_003.wav" + } + ], + "clips": { + "en": [ + "./temp/1786891437_The_Lost_Library_of_Alexa/clips/clip_000.mp4", + "./temp/1786891437_The_Lost_Library_of_Alexa/clips/clip_001.mp4", + "./temp/1786891437_The_Lost_Library_of_Alexa/clips/clip_002.mp4", + "./temp/1786891437_The_Lost_Library_of_Alexa/clips/clip_003.mp4" + ], + "es": [ + "./temp/1786891437_The_Lost_Library_of_Alexa/clips/clip_000.mp4", + "./temp/1786891437_The_Lost_Library_of_Alexa/clips/clip_001.mp4", + "./temp/1786891437_The_Lost_Library_of_Alexa/clips/clip_002.mp4", + "./temp/1786891437_The_Lost_Library_of_Alexa/clips/clip_003.mp4" + ] + }, + "files": { + "en": "./output/1786891437_The_Lost_Library_of_Alexa_en.mp4", + "es": "./output/1786891437_The_Lost_Library_of_Alexa_es.mp4" + }, + "subtitles": { + "en": "./output/1786891437_The_Lost_Library_of_Alexa_subtitles_en.srt", + "es": "./output/1786891437_The_Lost_Library_of_Alexa_subtitles_es.srt" + }, + "thumbnails": { + "en": [ + "./output/1786891437_The_Lost_Library_of_Alexa_thumb_A_en.png", + "./output/1786891437_The_Lost_Library_of_Alexa_thumb_B_en.png", + "./output/1786891437_The_Lost_Library_of_Alexa_thumb_C_en.png" + ], + "es": [ + "./output/1786891437_The_Lost_Library_of_Alexa_thumb_A_es.png", + "./output/1786891437_The_Lost_Library_of_Alexa_thumb_B_es.png", + "./output/1786891437_The_Lost_Library_of_Alexa_thumb_C_es.png" + ], + "clean": [ + "./output/1786891437_The_Lost_Library_of_Alexa_thumb_A_clean.png", + "./output/1786891437_The_Lost_Library_of_Alexa_thumb_B_clean.png", + "./output/1786891437_The_Lost_Library_of_Alexa_thumb_C_clean.png" + ] + }, + "timings": { + "SCRIPT": 115.1, + "TTS:EN": 27.3, + "TTS:ES": 5.4, + "MUSIC": 1.0, + "VISUAL": 1176.8, + "SUBS:EN": 11.0, + "SUBS:ES": 11.9, + "THUMBNAILS": 185.9, + "ASSEMBLY": 62.3 + }, + "created_at": 1786893034.729872 +} \ No newline at end of file diff --git a/output/1786891437_The_Lost_Library_of_Alexa_subtitles_en.srt b/output/1786891437_The_Lost_Library_of_Alexa_subtitles_en.srt new file mode 100644 index 0000000..3d3c670 --- /dev/null +++ b/output/1786891437_The_Lost_Library_of_Alexa_subtitles_en.srt @@ -0,0 +1,96 @@ +1 +00:00:00,000 --> 00:00:02,280 +Amidst the bustling harbor of Alexandria + +2 +00:00:02,280 --> 00:00:04,380 +stood a beacon of learning, the + +3 +00:00:04,380 --> 00:00:07,220 +Great Library. Founded in 300 BCE, + +4 +00:00:07,800 --> 00:00:09,060 +it was a hub of intellectual + +5 +00:00:09,060 --> 00:00:11,500 +brilliance, housing over half a million + +6 +00:00:11,500 --> 00:00:14,420 +scrolls. Tragically, it burned, but its + +7 +00:00:14,420 --> 00:00:17,120 +legacy endured. In 1906, + +8 +00:00:17,660 --> 00:00:20,480 +a German archaeologist discovered papyrus fragments + +9 +00:00:20,480 --> 00:00:22,100 +in the ruins of the library. + +10 +00:00:22,660 --> 00:00:24,900 +These remnants offered glimpses of the + +11 +00:00:24,900 --> 00:00:27,200 +vast collection, but the full extent + +12 +00:00:27,200 --> 00:00:29,040 +of its loss and treasures remained + +13 +00:00:29,040 --> 00:00:31,700 +a mystery. Despite the fire and + +14 +00:00:31,700 --> 00:00:35,200 +subsequent invasions, the library's influence persisted. + +15 +00:00:35,720 --> 00:00:38,840 +Its scholars, like Aratosthenes, made groundbreaking + +16 +00:00:38,840 --> 00:00:42,180 +discoveries in science and philosophy. Today, + +17 +00:00:42,600 --> 00:00:44,220 +the site remains a symbol of + +18 +00:00:44,220 --> 00:00:46,480 +the power of knowledge. Join us + +19 +00:00:46,480 --> 00:00:48,080 +on this journey to uncover the + +20 +00:00:48,080 --> 00:00:49,920 +secrets of the lost library of + +21 +00:00:49,920 --> 00:00:52,300 +Alexandria. From its rise to its + +22 +00:00:52,300 --> 00:00:54,780 +fall, explore the enduring legacy of + +23 +00:00:54,780 --> 00:00:57,160 +this intellectual treasure. The quest for + +24 +00:00:57,160 --> 00:00:58,120 +knowledge continues. + diff --git a/output/1786891437_The_Lost_Library_of_Alexa_subtitles_es.srt b/output/1786891437_The_Lost_Library_of_Alexa_subtitles_es.srt new file mode 100644 index 0000000..6e61cec --- /dev/null +++ b/output/1786891437_The_Lost_Library_of_Alexa_subtitles_es.srt @@ -0,0 +1,104 @@ +1 +00:00:00,000 --> 00:00:02,120 +En el bujicioso puerto de Alejandría, + +2 +00:00:02,580 --> 00:00:03,820 +se alzaba un faro del saber, + +3 +00:00:04,280 --> 00:00:06,940 +la Gran Biblioteca. Fundada en el + +4 +00:00:06,940 --> 00:00:09,080 +300 antes de Cristo, era un + +5 +00:00:09,080 --> 00:00:11,660 +centro de brillante intelecto, alojando más + +6 +00:00:11,660 --> 00:00:14,840 +de medio millón de rollos. Trágicamente, + +7 +00:00:15,200 --> 00:00:17,520 +se incendió, pero su legado sobrevivió. + +8 +00:00:18,580 --> 00:00:21,820 +En 1906, un arqueólogo alemán descubrió + +9 +00:00:21,820 --> 00:00:23,580 +fragmentos de papiro en los rinosos + +10 +00:00:23,580 --> 00:00:26,560 +restos de la Biblioteca. Estos restos + +11 +00:00:26,560 --> 00:00:28,740 +ofrecían bislumbres de la vasta colección. + +12 +00:00:28,740 --> 00:00:31,680 +Pero el alcance completo de superdida + +13 +00:00:31,680 --> 00:00:33,820 +y tesoro permanecieron en el misterio. + +14 +00:00:34,860 --> 00:00:36,260 +A pesar del incendio y las + +15 +00:00:36,260 --> 00:00:38,720 +posteriores invasiones, la influencia de la + +16 +00:00:38,720 --> 00:00:41,660 +Biblioteca persistió. Sus eruditos, + +17 +00:00:41,960 --> 00:00:45,280 +como Heratóstenes, realizaron descubrimientos revolucionarios + +18 +00:00:45,280 --> 00:00:48,160 +en ciencia y filosofía. Hoy en + +19 +00:00:48,160 --> 00:00:50,100 +día, el sitio sigue siendo un + +20 +00:00:50,100 --> 00:00:53,280 +símbolo del poder del conocimiento. Unete + +21 +00:00:53,280 --> 00:00:54,880 +a nosotros en esta jornada para + +22 +00:00:54,880 --> 00:00:56,840 +descubrir los secretos de la Biblioteca + +23 +00:00:56,840 --> 00:00:59,880 +de Alejandría perdida. Desde su ascenso + +24 +00:00:59,880 --> 00:01:01,900 +hasta su caída, explora el legado + +25 +00:01:01,900 --> 00:01:04,980 +duradero de este tesoro intelectual. La + +26 +00:01:04,980 --> 00:01:06,800 +búsqueda del conocimiento continúa. + diff --git a/output/1786891437_The_Lost_Library_of_Alexa_thumb_A_clean.png b/output/1786891437_The_Lost_Library_of_Alexa_thumb_A_clean.png new file mode 100644 index 0000000..476c67d Binary files /dev/null and b/output/1786891437_The_Lost_Library_of_Alexa_thumb_A_clean.png differ diff --git a/output/1786891437_The_Lost_Library_of_Alexa_thumb_A_en.png b/output/1786891437_The_Lost_Library_of_Alexa_thumb_A_en.png new file mode 100644 index 0000000..593a347 Binary files /dev/null and b/output/1786891437_The_Lost_Library_of_Alexa_thumb_A_en.png differ diff --git a/output/1786891437_The_Lost_Library_of_Alexa_thumb_A_es.png b/output/1786891437_The_Lost_Library_of_Alexa_thumb_A_es.png new file mode 100644 index 0000000..548b698 Binary files /dev/null and b/output/1786891437_The_Lost_Library_of_Alexa_thumb_A_es.png differ diff --git a/output/1786891437_The_Lost_Library_of_Alexa_thumb_B_clean.png b/output/1786891437_The_Lost_Library_of_Alexa_thumb_B_clean.png new file mode 100644 index 0000000..9e62484 Binary files /dev/null and b/output/1786891437_The_Lost_Library_of_Alexa_thumb_B_clean.png differ diff --git a/output/1786891437_The_Lost_Library_of_Alexa_thumb_B_en.png b/output/1786891437_The_Lost_Library_of_Alexa_thumb_B_en.png new file mode 100644 index 0000000..f332a39 Binary files /dev/null and b/output/1786891437_The_Lost_Library_of_Alexa_thumb_B_en.png differ diff --git a/output/1786891437_The_Lost_Library_of_Alexa_thumb_B_es.png b/output/1786891437_The_Lost_Library_of_Alexa_thumb_B_es.png new file mode 100644 index 0000000..48aa314 Binary files /dev/null and b/output/1786891437_The_Lost_Library_of_Alexa_thumb_B_es.png differ diff --git a/output/1786891437_The_Lost_Library_of_Alexa_thumb_C_clean.png b/output/1786891437_The_Lost_Library_of_Alexa_thumb_C_clean.png new file mode 100644 index 0000000..8868cdf Binary files /dev/null and b/output/1786891437_The_Lost_Library_of_Alexa_thumb_C_clean.png differ diff --git a/output/1786891437_The_Lost_Library_of_Alexa_thumb_C_en.png b/output/1786891437_The_Lost_Library_of_Alexa_thumb_C_en.png new file mode 100644 index 0000000..5370d2a Binary files /dev/null and b/output/1786891437_The_Lost_Library_of_Alexa_thumb_C_en.png differ diff --git a/output/1786891437_The_Lost_Library_of_Alexa_thumb_C_es.png b/output/1786891437_The_Lost_Library_of_Alexa_thumb_C_es.png new file mode 100644 index 0000000..2f7cb90 Binary files /dev/null and b/output/1786891437_The_Lost_Library_of_Alexa_thumb_C_es.png differ diff --git a/output/1786891437_The_Lost_Library_of_Alexa_upload_EN.txt b/output/1786891437_The_Lost_Library_of_Alexa_upload_EN.txt new file mode 100644 index 0000000..1de9511 --- /dev/null +++ b/output/1786891437_The_Lost_Library_of_Alexa_upload_EN.txt @@ -0,0 +1,29 @@ +============================================================ +YOUTUBE UPLOAD BUNDLE — ENGLISH (Topic: The Lost Library of Alexandria) +============================================================ + +TITLES FOR A/B TESTING: + A. The Forgotten Knowledge of Alexandria + B. Uncovering the Lost Library + C. Alexandria's Timeless Secrets + +DESCRIPTION & CHAPTERS: +Dive into the mysterious history of the lost Library of Alexandria, one of the greatest knowledge centers of antiquity. Discover the treasures, tragedies, and enduring legacy of this ancient wonder. #Documentary #History #Science + +TIMESTAMPS / CHAPTERS: +00:00 - The Ancient Mystery +00:15 - The Critical Discovery +00:30 - The Great Library's Last Chapter +00:45 - Uncovering the Lost Library + +#Documentary #History #Science + +TAGS: +ancient history, lost library, alexandria, knowledge center, bce, bce history, ancient library, egypt, mediterranean, library of alexandria, university, ancient books, ancient knowledge, lost knowledge + +VIDEO FILE: ./output/1786891437_The_Lost_Library_of_Alexa_en.mp4 +SUBTITLES: ./output/1786891437_The_Lost_Library_of_Alexa_subtitles_en.srt +THUMBNAILS: + - ./output/1786891437_The_Lost_Library_of_Alexa_thumb_A_en.png + - ./output/1786891437_The_Lost_Library_of_Alexa_thumb_B_en.png + - ./output/1786891437_The_Lost_Library_of_Alexa_thumb_C_en.png diff --git a/output/1786891437_The_Lost_Library_of_Alexa_upload_ES.txt b/output/1786891437_The_Lost_Library_of_Alexa_upload_ES.txt new file mode 100644 index 0000000..df73298 --- /dev/null +++ b/output/1786891437_The_Lost_Library_of_Alexa_upload_ES.txt @@ -0,0 +1,29 @@ +============================================================ +PAQUETE DE SUBIDA A YOUTUBE — ESPAÑOL (Tema: The Lost Library of Alexandria) +============================================================ + +TÍTULOS PARA PRUEBA A/B: + A. El Olvidado Conocimiento de Alejandría + B. Descubriendo la Perdida Biblioteca + C. Secretos Eternos de Alejandría + +DESCRIPCIÓN Y CAPÍTULOS: +Sumérgete en la historia misteriosa de la Biblioteca de Alejandría, una de las mayores centrales de conocimientos de la antigüedad. Descubre las tesoros, tragedias y legado eterno de esta antigua maravilla. #Documentario #Historia #Ciencia + +CAPÍTULOS: +00:00 - El Misterio Antiguo +00:18 - La Descubierta Crítica +00:34 - El Último Capítulo de la Gran Biblioteca +00:52 - Descubriendo la Perdida Biblioteca + +#Documental #Historia #Ciencia + +ETIQUETAS / TAGS: +ancient history, lost library, alexandria, knowledge center, bce, bce history, ancient library, egypt, mediterranean, library of alexandria, university, ancient books, ancient knowledge, lost knowledge + +ARCHIVO DE VIDEO: ./output/1786891437_The_Lost_Library_of_Alexa_es.mp4 +SUBTÍTULOS: ./output/1786891437_The_Lost_Library_of_Alexa_subtitles_es.srt +MINIATURAS: + - ./output/1786891437_The_Lost_Library_of_Alexa_thumb_A_es.png + - ./output/1786891437_The_Lost_Library_of_Alexa_thumb_B_es.png + - ./output/1786891437_The_Lost_Library_of_Alexa_thumb_C_es.png diff --git a/output/factory_queue.db b/output/factory_queue.db new file mode 100644 index 0000000..c6a62c3 Binary files /dev/null and b/output/factory_queue.db differ diff --git a/pipeline/__init__.py b/pipeline/__init__.py new file mode 100644 index 0000000..72f68c4 --- /dev/null +++ b/pipeline/__init__.py @@ -0,0 +1,35 @@ +""" +YouTube Factory Pipeline Package +Distributed Faceless Video Generation across 3 AI PCs +""" + +from .remote import RemotePC +from .trending import TrendingFetcher +from .script_gen import ScriptGen +from .tts_gen import TTSGen +from .music_gen import MusicGen +from .visual_gen import VisualGen, StockMediaFetcher +from .sub_gen import SubGen +from .thumb_gen import ThumbnailGen +from .assembler import Assembler +from .queue_manager import QueueManager +from .youtube_uploader import YouTubeUploader +from .dependency_manager import ensure_dependencies, check_python_packages, check_system_binaries + +__all__ = [ + "RemotePC", + "TrendingFetcher", + "ScriptGen", + "TTSGen", + "MusicGen", + "VisualGen", + "StockMediaFetcher", + "SubGen", + "ThumbnailGen", + "Assembler", + "QueueManager", + "YouTubeUploader", + "ensure_dependencies", + "check_python_packages", + "check_system_binaries", +] diff --git a/pipeline/__pycache__/__init__.cpython-314.pyc b/pipeline/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000..3e2080e Binary files /dev/null and b/pipeline/__pycache__/__init__.cpython-314.pyc differ diff --git a/pipeline/__pycache__/assembler.cpython-314.pyc b/pipeline/__pycache__/assembler.cpython-314.pyc new file mode 100644 index 0000000..4484bb0 Binary files /dev/null and b/pipeline/__pycache__/assembler.cpython-314.pyc differ diff --git a/pipeline/__pycache__/dependency_manager.cpython-314.pyc b/pipeline/__pycache__/dependency_manager.cpython-314.pyc new file mode 100644 index 0000000..ec6aa43 Binary files /dev/null and b/pipeline/__pycache__/dependency_manager.cpython-314.pyc differ diff --git a/pipeline/__pycache__/music_gen.cpython-314.pyc b/pipeline/__pycache__/music_gen.cpython-314.pyc new file mode 100644 index 0000000..54a5dea Binary files /dev/null and b/pipeline/__pycache__/music_gen.cpython-314.pyc differ diff --git a/pipeline/__pycache__/queue_manager.cpython-314.pyc b/pipeline/__pycache__/queue_manager.cpython-314.pyc new file mode 100644 index 0000000..f603cab Binary files /dev/null and b/pipeline/__pycache__/queue_manager.cpython-314.pyc differ diff --git a/pipeline/__pycache__/remote.cpython-314.pyc b/pipeline/__pycache__/remote.cpython-314.pyc new file mode 100644 index 0000000..a87501e Binary files /dev/null and b/pipeline/__pycache__/remote.cpython-314.pyc differ diff --git a/pipeline/__pycache__/script_gen.cpython-314.pyc b/pipeline/__pycache__/script_gen.cpython-314.pyc new file mode 100644 index 0000000..39b4585 Binary files /dev/null and b/pipeline/__pycache__/script_gen.cpython-314.pyc differ diff --git a/pipeline/__pycache__/sub_gen.cpython-314.pyc b/pipeline/__pycache__/sub_gen.cpython-314.pyc new file mode 100644 index 0000000..abe8c24 Binary files /dev/null and b/pipeline/__pycache__/sub_gen.cpython-314.pyc differ diff --git a/pipeline/__pycache__/thumb_gen.cpython-314.pyc b/pipeline/__pycache__/thumb_gen.cpython-314.pyc new file mode 100644 index 0000000..564b6cd Binary files /dev/null and b/pipeline/__pycache__/thumb_gen.cpython-314.pyc differ diff --git a/pipeline/__pycache__/trending.cpython-314.pyc b/pipeline/__pycache__/trending.cpython-314.pyc new file mode 100644 index 0000000..6a02aa2 Binary files /dev/null and b/pipeline/__pycache__/trending.cpython-314.pyc differ diff --git a/pipeline/__pycache__/tts_gen.cpython-314.pyc b/pipeline/__pycache__/tts_gen.cpython-314.pyc new file mode 100644 index 0000000..9ff3f7a Binary files /dev/null and b/pipeline/__pycache__/tts_gen.cpython-314.pyc differ diff --git a/pipeline/__pycache__/visual_gen.cpython-314.pyc b/pipeline/__pycache__/visual_gen.cpython-314.pyc new file mode 100644 index 0000000..de54692 Binary files /dev/null and b/pipeline/__pycache__/visual_gen.cpython-314.pyc differ diff --git a/pipeline/__pycache__/youtube_uploader.cpython-314.pyc b/pipeline/__pycache__/youtube_uploader.cpython-314.pyc new file mode 100644 index 0000000..c2d395b Binary files /dev/null and b/pipeline/__pycache__/youtube_uploader.cpython-314.pyc differ diff --git a/pipeline/assembler.py b/pipeline/assembler.py new file mode 100644 index 0000000..73e132c --- /dev/null +++ b/pipeline/assembler.py @@ -0,0 +1,209 @@ +""" +Master Video Assembly Module using FFmpeg on IntelLLM. +Performs clip normalization, multi-track audio mixing with active sidechain ducking, +subtitles burning, YouTube chapter metadata embedding, and 1080p/720p master rendering. +""" + +import os +import time +import logging +import subprocess +from typing import Dict, Any, List, Optional +from .remote import RemotePC + +logger = logging.getLogger("YTFactory.Assembler") + +def ffprobe_duration(path: str) -> float: + r = subprocess.run( + ["ffprobe", "-v", "error", "-show_entries", "format=duration", + "-of", "default=noprint_wrappers=1:nokey=1", path], + capture_output=True, text=True + ) + try: + return float(r.stdout.strip()) + except ValueError: + return 0.0 + +class Assembler: + def __init__(self, pcs: Dict[str, RemotePC]): + self.pcs = pcs + + def _normalize_clips(self, pc: RemotePC, clips: List[str], remote_job: str) -> List[str]: + """Normalize all video and image clips into a unified 1280x720 25fps stream.""" + video_clips = [] + logger.info(f"[ASSEMBLY] Normalizing {len(clips)} clips on IntelLLM...") + + for i, c in enumerate(clips): + basename = os.path.basename(c) + remote_src = f"{remote_job}/clips/{basename}" + vname = f"norm_{i:03d}.mp4" + remote_dest = f"{remote_job}/clips/{vname}" + + pc.scp_to(c, remote_src) + + if c.endswith((".png", ".jpg", ".jpeg", ".webp")): + m_idx = i % 6 + if m_idx == 0: + z_expr = "min(zoom+0.0012,1.25)" + x_expr = "iw/2-(iw/zoom/2)" + y_expr = "ih/2-(ih/zoom/2)" + elif m_idx == 1: + z_expr = "if(eq(on,1),1.25,max(1.0,zoom-0.0012))" + x_expr = "iw/2-(iw/zoom/2)" + y_expr = "ih/2-(ih/zoom/2)" + elif m_idx == 2: + z_expr = "1.20" + x_expr = "if(eq(on,1),iw-iw/zoom,max(0,x-(iw-iw/zoom)/375))" + y_expr = "if(eq(on,1),ih-ih/zoom,max(0,y-(ih-ih/zoom)/375))" + elif m_idx == 3: + z_expr = "1.20" + x_expr = "if(eq(on,1),0,min(iw-iw/zoom,x+(iw-iw/zoom)/375))" + y_expr = "if(eq(on,1),0,min(ih-ih/zoom,y+(ih-ih/zoom)/375))" + elif m_idx == 4: + z_expr = "1.18" + x_expr = "if(eq(on,1),0,min(iw-iw/zoom,x+(iw-iw/zoom)/375))" + y_expr = "ih/2-(ih/zoom/2)" + else: + z_expr = "1.18" + x_expr = "if(eq(on,1),iw-iw/zoom,max(0,x-(iw-iw/zoom)/375))" + y_expr = "ih/2-(ih/zoom/2)" + + cmd = ( + f"cd {remote_job}/clips && ffmpeg -y -loop 1 -i {basename} " + f"-vf \"scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080,zoompan=z='{z_expr}':x='{x_expr}':y='{y_expr}':d=375:s=1280x720:fps=25,format=yuv420p\" " + f"-t 15 -r 25 -c:v libx264 -preset fast -crf 22 -pix_fmt yuv420p -an {vname}" + ) + else: + cmd = ( + f"cd {remote_job}/clips && ffmpeg -y -i {basename} " + f"-vf 'scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2:black,fps=25,format=yuv420p' " + f"-c:v libx264 -preset fast -crf 22 -pix_fmt yuv420p -an {vname}" + ) + + rc, _, err = pc.run(cmd) + if rc != 0: + logger.error(f"[ASSEMBLY] Clip {i} normalization failed: {err}") + raise RuntimeError(f"Clip normalization failed: {err}") + + video_clips.append(remote_dest) + + return video_clips + + def _render_lang( + self, + pc: RemotePC, + remote_job: str, + audio_path: str, + music_path: str, + subs_path: str, + lang: str, + local_out: str, + title: str + ) -> str: + """Render single language final video with audio ducking and subtitles.""" + logger.info(f"[ASSEMBLY:{lang.upper()}] Rendering final video with dynamic audio ducking & subtitles...") + + remote_audio = f"{remote_job}/audio_{lang}.wav" + remote_music = f"{remote_job}/music.wav" + remote_subs = f"{remote_job}/subs_{lang}.srt" + remote_final = f"{remote_job}/final_{lang}.mp4" + + # Exact voiceover length drives the output length: -shortest is unreliable + # with filter_complex (observed 4x video overrun), so pad the video past + # the audio end with cloned frames and hard-trim with -t instead. + audio_dur = ffprobe_duration(audio_path) + + pc.scp_to(audio_path, remote_audio) + pc.scp_to(music_path, remote_music) + pc.scp_to(subs_path, remote_subs) + + # Dynamic Audio Ducking Filter: + # [1:a] = Voiceover (splits into main + sidechain trigger) + # [2:a] = Background music + # sidechaincompress smoothly reduces music volume by ~18dB whenever speech occurs + filter_complex = ( + f"\"[1:a]volume=1.0,asplit=2[v_main][v_sc];" + f"[2:a]volume=0.35[bg_raw];" + f"[bg_raw][v_sc]sidechaincompress=threshold=0.06:ratio=5:attack=40:release=350[bg_ducked];" + f"[v_main][bg_ducked]amix=inputs=2:duration=first:dropout_transition=2[aout]\"" + ) + + cmd = ( + f"cd {remote_job} && ffmpeg -y " + f"-f concat -safe 0 -i concat.txt " + f"-i audio_{lang}.wav " + f"-stream_loop -1 -i music.wav " + f"-filter_complex {filter_complex} " + f"-map 0:v -map [aout] " + f"-vf tpad=stop_mode=clone:stop=120 " + f"-t {audio_dur:.3f} -c:v libx264 -preset fast -crf 22 " + f"-c:a aac -b:a 192k -movflags +faststart -pix_fmt yuv420p final_{lang}.mp4" + ) + + rc, _, err = pc.run(cmd, timeout=3600) + if rc != 0: + logger.error(f"[ASSEMBLY:{lang.upper()}] FFmpeg assembly failed: {err}") + raise RuntimeError(f"FFmpeg assembly failed on IntelLLM: {err}") + + # Download rendered video + pc.scp_from(remote_final, local_out) + + # Add metadata title tag locally + tmp_tagged = local_out.replace(".mp4", "_meta.mp4") + subprocess.run([ + "ffmpeg", "-y", "-i", local_out, "-metadata", f"title={title}", + "-codec", "copy", tmp_tagged + ], check=True, capture_output=True) + os.replace(tmp_tagged, local_out) + + dur = ffprobe_duration(local_out) + logger.info(f"[ASSEMBLY:{lang.upper()}] Complete: {local_out} ({dur:.1f}s)") + return local_out + + def assemble( + self, + clips: Any, + audio_map: Dict[str, str], + music_path: str, + subs_map: Dict[str, str], + script: Dict[str, Any], + out_prefix: str + ) -> Dict[str, str]: + """Orchestrate full assembly pipeline across both language tracks with language-matched clips.""" + logger.info("[ASSEMBLY] Starting master video assembly on IntelLLM...") + pc = self.pcs.get("intelllm") + if not pc: + raise RuntimeError("IntelLLM is unreachable for assembly") + + remote_job_base = f"/tmp/yt_assemble_{int(time.time())}" + rendered_videos = {} + + try: + for lang in ("en", "es"): + if lang in audio_map and lang in subs_map: + lang_clips = clips.get(lang, clips.get("en", [])) if isinstance(clips, dict) else clips + remote_job = f"{remote_job_base}_{lang}" + pc.run(f"mkdir -p {remote_job}/clips") + + try: + # 1. Normalize clips for this specific language sequence + norm_clips = self._normalize_clips(pc, lang_clips, remote_job) + + # 2. Write concat list + concat_content = "\n".join([f"file '{nc}'" for nc in norm_clips]) + pc.run(f"cat > {remote_job}/concat.txt << 'EOF'\n{concat_content}\nEOF") + + # 3. Render final language video + out_mp4 = f"{out_prefix}_{lang}.mp4" + title = script.get("titles", ["Documentary"])[0] if lang == "en" else script.get("titles_es", ["Documental"])[0] + rendered_videos[lang] = self._render_lang( + pc, remote_job, audio_map[lang], music_path, subs_map[lang], + lang, out_mp4, title + ) + finally: + pc.run(f"rm -rf {remote_job}") + + return rendered_videos + + finally: + pc.run(f"rm -rf {remote_job_base}*") diff --git a/pipeline/dependency_manager.py b/pipeline/dependency_manager.py new file mode 100644 index 0000000..3f0b14e --- /dev/null +++ b/pipeline/dependency_manager.py @@ -0,0 +1,151 @@ +""" +Automatic Dependency Checker & Self-Healing Installer for YouTube Factory. +Ensures that all Python packages, system CLI utilities (ffmpeg, ssh, etc.), +and remote PC connectivity are fully configured when moving orchestration to a new PC. +""" + +import sys +import os +import shutil +import subprocess +import logging +import importlib + +logger = logging.getLogger("YTFactory.Deps") + +PYTHON_DEPENDENCIES = { + "requests": "requests>=2.28.0", + "yaml": "pyyaml>=6.0", + "numpy": "numpy>=1.22.0", + "edge_tts": "edge-tts>=7.0.0", + "aiohttp": "aiohttp>=3.8.0", + "PIL": "Pillow>=9.0.0", + "googleapiclient": "google-api-python-client>=2.0.0", + "google_auth_oauthlib": "google-auth-oauthlib>=1.0.0", + "google.auth": "google-auth-httplib2>=0.1.0", +} + +SYSTEM_BINARIES = [ + ("ffmpeg", "Required for video rendering, Ken Burns motion, and audio ducking"), + ("ffprobe", "Required for audio and video stream analysis"), + ("ssh", "Required for remote PC orchestration (AMDLLM, NvidiaLLM, IntelLLM)"), + ("scp", "Required for cross-PC artifact transfers"), + ("curl", "Required for REST API polling"), +] + +def check_python_packages(auto_install: bool = True) -> bool: + """Check for missing Python packages and automatically install them via pip.""" + missing = [] + for mod_name, pip_pkg in PYTHON_DEPENDENCIES.items(): + try: + importlib.import_module(mod_name) + except ImportError: + missing.append(pip_pkg) + + if not missing: + return True + + logger.warning(f"[DEPS] Missing {len(missing)} Python packages: {', '.join(missing)}") + if not auto_install: + return False + + logger.info("[DEPS] Automatically installing missing Python packages via pip...") + try: + cmd = [sys.executable, "-m", "pip", "install", "--upgrade"] + missing + r = subprocess.run(cmd, check=True, text=True) + logger.info("[DEPS] All Python packages successfully installed!") + return True + except subprocess.CalledProcessError as e: + logger.error(f"[DEPS] Automatic pip install failed: {e}") + logger.error(f"Please run manually: {sys.executable} -m pip install -r requirements.txt") + return False + +def check_system_binaries(auto_install: bool = True) -> bool: + """Check for required system binaries (ffmpeg, ssh, scp, etc.) and attempt self-install.""" + missing_bins = [] + for binary, desc in SYSTEM_BINARIES: + if not shutil.which(binary): + missing_bins.append((binary, desc)) + + if not missing_bins: + return True + + logger.warning(f"[DEPS] Missing {len(missing_bins)} required system tools:") + for binary, desc in missing_bins: + logger.warning(f" - '{binary}': {desc}") + + if not auto_install: + return False + + # Attempt automatic package manager install on Linux + if sys.platform.startswith("linux"): + if shutil.which("apt-get"): + logger.info("[DEPS] Attempting to install system tools via apt-get...") + pkg_map = { + "ffmpeg": "ffmpeg", + "ffprobe": "ffmpeg", + "ssh": "openssh-client", + "scp": "openssh-client", + "curl": "curl", + } + pkgs = list({pkg_map.get(b, b) for b, _ in missing_bins}) + try: + # Test if sudo is passwordless or we are root + cmd = ["sudo", "apt-get", "update", "-qq"] + subprocess.run(cmd, check=True, capture_output=True) + install_cmd = ["sudo", "apt-get", "install", "-y", "-qq"] + pkgs + subprocess.run(install_cmd, check=True) + logger.info("[DEPS] System tools successfully installed via apt-get!") + return True + except Exception as e: + logger.warning(f"[DEPS] Automatic apt install failed: {e}") + + logger.error("=" * 70) + logger.error("🚨 REQUIRED SYSTEM BINARIES MISSING") + logger.error("Please install them using your system package manager:") + logger.error(" Ubuntu / Debian: sudo apt-get update && sudo apt-get install -y ffmpeg openssh-client curl") + logger.error(" Arch Linux: sudo pacman -S ffmpeg openssh curl") + logger.error(" Fedora / RHEL: sudo dnf install ffmpeg openssh-clients curl") + logger.error(" macOS: brew install ffmpeg curl") + logger.error("=" * 70) + return False + +def check_remote_hosts(hosts: list = None) -> bool: + """Verify SSH connectivity to the remote AI servers.""" + if not hosts: + hosts = [("AMDLLM", "10.4.0.181"), ("NvidiaLLM", "10.4.0.180"), ("IntelLLM", "10.4.0.182")] + + all_ok = True + for name, host in hosts: + r = subprocess.run( + ["ssh", "-o", "BatchMode=yes", "-o", "ConnectTimeout=3", "-o", "StrictHostKeyChecking=no", f"mark@{host}", "echo ok"], + capture_output=True, text=True + ) + if r.returncode != 0: + logger.warning(f"[DEPS] SSH key auth to {name} ({host}) failed or timed out.") + logger.warning(f" Run: ssh-copy-id mark@{host}") + all_ok = False + else: + logger.debug(f"[DEPS] SSH connection to {name} ({host}) verified.") + + return all_ok + +def ensure_dependencies(auto_install: bool = True, check_remote: bool = False) -> bool: + """ + Main entry point for verifying runtime dependencies. + Called automatically on factory startup to ensure smooth portability across PCs. + """ + py_ok = check_python_packages(auto_install=auto_install) + sys_ok = check_system_binaries(auto_install=auto_install) + if check_remote: + check_remote_hosts() + return py_ok and sys_ok + +if __name__ == "__main__": + logging.basicConfig(level=logging.INFO, format="%(levelname)s | %(message)s") + print("\n🔍 Checking YouTube Factory Dependencies across PC...\n") + ok = ensure_dependencies(auto_install=True, check_remote=True) + if ok: + print("\n✅ All local dependencies are satisfied and verified!\n") + else: + print("\n⚠️ Some dependencies require attention (see logs above).\n") diff --git a/pipeline/music_gen.py b/pipeline/music_gen.py new file mode 100644 index 0000000..e846703 --- /dev/null +++ b/pipeline/music_gen.py @@ -0,0 +1,183 @@ +""" +Background Music Generation & Audio Synthesis Module. +Generates dynamic, mood-matched cinematic background music scores (ambient pads, +harmonic minor chord progressions, subtle sub-bass, atmospheric texture) for the exact +video length, perfectly structured for dynamic audio ducking under speech. +""" + +import os +import math +import wave +import struct +import random +import logging +import numpy as np +from typing import Optional + +logger = logging.getLogger("YTFactory.Music") + +# Musical note frequencies (Hz) +NOTES = { + "C2": 65.41, "D2": 73.42, "E2": 82.41, "F2": 87.31, "G2": 98.00, "A2": 110.00, "B2": 123.47, + "C3": 130.81, "D3": 146.83, "E3": 164.81, "F3": 174.61, "G3": 196.00, "A3": 220.00, "B3": 246.94, + "C4": 261.63, "D4": 293.66, "E4": 329.63, "F4": 349.23, "G4": 392.00, "A4": 440.00, "B4": 493.88, + "C5": 523.25, "D5": 587.33, "E5": 659.25, "F5": 698.46, "G5": 783.99, "A5": 880.00, "B5": 987.77, +} + +# Cinematic minor chord progressions (Root, Minor 3rd, 5th, Octave) +PROGRESSIONS = { + "d_minor": [ + [NOTES["D3"], NOTES["F3"], NOTES["A3"], NOTES["D4"]], + [NOTES["B2"], NOTES["D3"], NOTES["F3"], NOTES["B3"]], + [NOTES["G2"], NOTES["B2"], NOTES["D3"], NOTES["G3"]], + [NOTES["A2"], NOTES["C3"], NOTES["E3"], NOTES["A3"]], + ], + "a_minor": [ + [NOTES["A2"], NOTES["C3"], NOTES["E3"], NOTES["A3"]], + [NOTES["F2"], NOTES["A2"], NOTES["C3"], NOTES["F3"]], + [NOTES["D2"], NOTES["F2"], NOTES["A2"], NOTES["D3"]], + [NOTES["E2"], NOTES["G2"], NOTES["B2"], NOTES["E3"]], + ], + "c_minor": [ + [NOTES["C3"], NOTES["D3"] * 1.06, NOTES["G3"], NOTES["C4"]], + [NOTES["A2"] * 1.06, NOTES["C3"], NOTES["E3"] * 1.06, NOTES["A3"] * 1.06], + [NOTES["F2"], NOTES["A2"] * 1.06, NOTES["C3"], NOTES["F3"]], + [NOTES["G2"], NOTES["B2"], NOTES["D3"], NOTES["G3"]], + ] +} + +class MusicGen: + def __init__(self, sample_rate: int = 44100): + self.sample_rate = sample_rate + + def _generate_pad_chord(self, freqs: list, duration_sec: float) -> np.ndarray: + """Synthesize a lush, detuned ambient pad chord with subtle LFO filtering.""" + num_samples = int(self.sample_rate * duration_sec) + t = np.linspace(0, duration_sec, num_samples, endpoint=False) + chord_signal = np.zeros(num_samples, dtype=np.float32) + + # LFO for slow ambient movement (0.2 Hz) + lfo = 0.5 + 0.5 * np.sin(2 * np.pi * 0.2 * t) + + for freq in freqs: + # 3 detuned oscillators per note for stereo-like warmth + osc1 = np.sin(2 * np.pi * freq * t) + osc2 = 0.5 * np.sin(2 * np.pi * (freq * 1.003) * t) + osc3 = 0.5 * np.sin(2 * np.pi * (freq * 0.997) * t) + # Gentle soft harmonic + osc4 = 0.15 * np.sin(2 * np.pi * (freq * 2.0) * t) + + note_signal = (osc1 + osc2 + osc3 + osc4) / 2.15 + chord_signal += note_signal + + # Normalize chord + chord_signal = (chord_signal / max(1, len(freqs))) * lfo + + # Envelope: 1.5s attack, 1.5s release + attack_samples = int(self.sample_rate * min(1.5, duration_sec * 0.25)) + release_samples = int(self.sample_rate * min(1.5, duration_sec * 0.25)) + + env = np.ones(num_samples, dtype=np.float32) + if attack_samples > 0: + env[:attack_samples] = np.linspace(0, 1, attack_samples) + if release_samples > 0: + env[-release_samples:] = np.linspace(1, 0, release_samples) + + return chord_signal * env + + def _generate_sub_bass(self, root_freq: float, duration_sec: float) -> np.ndarray: + """Warm deep sub-bass oscillator (sine + soft 2nd harmonic).""" + num_samples = int(self.sample_rate * duration_sec) + t = np.linspace(0, duration_sec, num_samples, endpoint=False) + sub = np.sin(2 * np.pi * (root_freq / 2.0) * t) + sub_2 = 0.25 * np.sin(2 * np.pi * root_freq * t) + return (sub + sub_2) * 0.4 + + def _generate_texture(self, duration_sec: float) -> np.ndarray: + """Gentle tape/atmosphere background texture.""" + num_samples = int(self.sample_rate * duration_sec) + # Pinkish filtered noise + noise = np.random.normal(0, 0.02, num_samples).astype(np.float32) + # Simple moving average lowpass filter + kernel_size = 50 + kernel = np.ones(kernel_size) / kernel_size + filtered_noise = np.convolve(noise, kernel, mode='same') + return filtered_noise + + def generate(self, duration_sec: float, output_wav: str, mood: str = "cinematic") -> str: + """ + Synthesize a complete cinematic background music track tailored to the exact duration. + """ + logger.info(f"[MUSIC] Synthesizing {duration_sec:.1f}s cinematic soundtrack ({mood})...") + os.makedirs(os.path.dirname(os.path.abspath(output_wav)), exist_ok=True) + + chord_prog = PROGRESSIONS["d_minor"] if mood != "space" else PROGRESSIONS["a_minor"] + chord_duration = 6.0 # 6 seconds per chord change + + total_samples = int(self.sample_rate * duration_sec) + master_audio_left = np.zeros(total_samples, dtype=np.float32) + master_audio_right = np.zeros(total_samples, dtype=np.float32) + + # Generate sequential chords + cur_sample = 0 + chord_idx = 0 + while cur_sample < total_samples: + remaining_samples = total_samples - cur_sample + this_dur = min(chord_duration, remaining_samples / self.sample_rate) + if this_dur <= 0.1: + break + + chord = chord_prog[chord_idx % len(chord_prog)] + pad = self._generate_pad_chord(chord, this_dur) + bass = self._generate_sub_bass(chord[0], this_dur) + + seg_samples = len(pad) + + # Stereo spread: subtle phase offset + master_audio_left[cur_sample:cur_sample + seg_samples] += (pad * 0.7 + bass * 0.5) + master_audio_right[cur_sample:cur_sample + seg_samples] += (pad * 0.72 + bass * 0.48) + + cur_sample += seg_samples + chord_idx += 1 + + # Add atmospheric texture layer + texture = self._generate_texture(duration_sec) + master_audio_left += texture[:total_samples] + master_audio_right += texture[:total_samples] + + # Master Fade-in and Fade-out + fade_in_samples = int(self.sample_rate * 2.0) + fade_out_samples = int(self.sample_rate * 3.0) + + if fade_in_samples < total_samples: + fade_in = np.linspace(0, 1, fade_in_samples) + master_audio_left[:fade_in_samples] *= fade_in + master_audio_right[:fade_in_samples] *= fade_in + + if fade_out_samples < total_samples: + fade_out = np.linspace(1, 0, fade_out_samples) + master_audio_left[-fade_out_samples:] *= fade_out + master_audio_right[-fade_out_samples:] *= fade_out + + # Normalize to -18 dB peak so it is ready for background ducking + peak = max(np.max(np.abs(master_audio_left)), np.max(np.abs(master_audio_right)), 1e-6) + target_peak = 0.35 # ~ -18 dBFS + master_audio_left = (master_audio_left / peak) * target_peak + master_audio_right = (master_audio_right / peak) * target_peak + + # Convert to 16-bit PCM stereo + left_int16 = (master_audio_left * 32767).astype(np.int16) + right_int16 = (master_audio_right * 32767).astype(np.int16) + + stereo = np.empty((total_samples, 2), dtype=np.int16) + stereo[:, 0] = left_int16 + stereo[:, 1] = right_int16 + + with wave.open(output_wav, 'wb') as wf: + wf.setnchannels(2) + wf.setsampwidth(2) + wf.setframerate(self.sample_rate) + wf.writeframes(stereo.tobytes()) + + logger.info(f"[MUSIC] Soundtrack generated successfully: {output_wav}") + return output_wav diff --git a/pipeline/queue_manager.py b/pipeline/queue_manager.py new file mode 100644 index 0000000..83710ef --- /dev/null +++ b/pipeline/queue_manager.py @@ -0,0 +1,137 @@ +""" +Persistent SQLite Queue & Checkpoint Manager for 24/7 Autonomous Operation. +Provides job scheduling, per-step progress tracking, crash resumption, and job status reporting. +""" + +import os +import sqlite3 +import json +import time +import logging +from typing import List, Dict, Any, Optional + +logger = logging.getLogger("YTFactory.Queue") + +class QueueManager: + def __init__(self, db_path: str = "output/factory_queue.db"): + self.db_path = db_path + os.makedirs(os.path.dirname(os.path.abspath(self.db_path)), exist_ok=True) + self._init_db() + + def _get_conn(self) -> sqlite3.Connection: + conn = sqlite3.connect(self.db_path) + conn.row_factory = sqlite3.Row + return conn + + def _init_db(self): + with self._get_conn() as conn: + conn.execute(""" + CREATE TABLE IF NOT EXISTS video_jobs ( + job_id TEXT PRIMARY KEY, + topic TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'QUEUED', + progress_step TEXT NOT NULL DEFAULT 'PENDING', + duration INTEGER, + created_at REAL NOT NULL, + started_at REAL, + completed_at REAL, + error_message TEXT, + job_dir TEXT, + output_bundle TEXT + ) + """) + conn.commit() + + def add_job(self, topic: str, duration: Optional[int] = None) -> str: + """Enqueue a new topic for processing.""" + job_id = f"{int(time.time())}_{abs(hash(topic)) % 100000}" + now = time.time() + with self._get_conn() as conn: + conn.execute(""" + INSERT INTO video_jobs (job_id, topic, status, progress_step, duration, created_at) + VALUES (?, ?, 'QUEUED', 'PENDING', ?, ?) + """, (job_id, topic.strip(), duration, now)) + conn.commit() + logger.info(f"[QUEUE] Added job '{topic[:40]}' (ID: {job_id})") + return job_id + + def get_next_job(self) -> Optional[Dict[str, Any]]: + """Retrieve and lock the next pending or retriable job.""" + with self._get_conn() as conn: + row = conn.execute(""" + SELECT * FROM video_jobs + WHERE status = 'QUEUED' + ORDER BY created_at ASC + LIMIT 1 + """).fetchone() + + if row: + job = dict(row) + conn.execute(""" + UPDATE video_jobs + SET status = 'PROCESSING', started_at = ? + WHERE job_id = ? + """, (time.time(), job["job_id"])) + conn.commit() + return job + return None + + def update_progress(self, job_id: str, step: str, job_dir: Optional[str] = None): + """Update current active processing step.""" + with self._get_conn() as conn: + conn.execute(""" + UPDATE video_jobs + SET progress_step = ?, job_dir = COALESCE(?, job_dir) + WHERE job_id = ? + """, (step, job_dir, job_id)) + conn.commit() + + def mark_completed(self, job_id: str, output_bundle: Dict[str, Any]): + """Mark job successfully completed.""" + with self._get_conn() as conn: + conn.execute(""" + UPDATE video_jobs + SET status = 'COMPLETED', progress_step = 'DONE', completed_at = ?, output_bundle = ? + WHERE job_id = ? + """, (time.time(), json.dumps(output_bundle, ensure_ascii=False), job_id)) + conn.commit() + logger.info(f"[QUEUE] Job {job_id} marked COMPLETED") + + def mark_failed(self, job_id: str, error_msg: str): + """Mark job as failed with error details.""" + with self._get_conn() as conn: + conn.execute(""" + UPDATE video_jobs + SET status = 'FAILED', error_message = ?, completed_at = ? + WHERE job_id = ? + """, (error_msg, time.time(), job_id)) + conn.commit() + logger.error(f"[QUEUE] Job {job_id} marked FAILED: {error_msg}") + + def list_jobs(self, limit: int = 25) -> List[Dict[str, Any]]: + """List recent jobs with their statuses.""" + with self._get_conn() as conn: + rows = conn.execute(""" + SELECT job_id, topic, status, progress_step, duration, created_at, completed_at, error_message + FROM video_jobs + ORDER BY created_at DESC + LIMIT ? + """, (limit,)).fetchall() + return [dict(r) for r in rows] + + def retry_failed(self) -> int: + """Reset failed jobs back to QUEUED state.""" + with self._get_conn() as conn: + cur = conn.execute(""" + UPDATE video_jobs + SET status = 'QUEUED', progress_step = 'PENDING', error_message = NULL + WHERE status = 'FAILED' + """) + conn.commit() + return cur.rowcount + + def has_pending_jobs(self) -> bool: + """Check if any jobs are waiting in queue.""" + with self._get_conn() as conn: + count = conn.execute("SELECT COUNT(*) FROM video_jobs WHERE status = 'QUEUED'").fetchone()[0] + return count > 0 diff --git a/pipeline/remote.py b/pipeline/remote.py new file mode 100644 index 0000000..f93f7c5 --- /dev/null +++ b/pipeline/remote.py @@ -0,0 +1,115 @@ +""" +Remote PC manager with SSH, SCP, and HTTP API helpers. +""" + +import subprocess +import requests +import logging +from typing import Dict, Any, Optional, Tuple + +logger = logging.getLogger("YTFactory.Remote") + +class RemotePC: + def __init__(self, name: str, host: str, ssh_user: str, services: Optional[Dict[str, Any]] = None): + self.name = name + self.host = host + self.ssh_user = ssh_user + self.services = services or {} + self.ssh_base = [ + "ssh", + "-o", "StrictHostKeyChecking=no", + "-o", "ConnectTimeout=5", + "-o", "BatchMode=yes", + f"{ssh_user}@{host}" + ] + + def check(self, port: int) -> bool: + """Check if service is responding on port.""" + for path in ("/health", "/system_stats", "/v1/models", "/"): + try: + r = requests.get(f"http://{self.host}:{port}{path}", timeout=3) + if r.status_code in (200, 204, 404): # 404 still means server is alive + return True + except Exception: + pass + return False + + def post_json(self, port: int, endpoint: str, payload: Dict[str, Any], timeout: int = 180) -> Optional[Dict[str, Any]]: + """Send JSON POST request to service.""" + url = f"http://{self.host}:{port}{endpoint}" + try: + r = requests.post(url, json=payload, timeout=timeout) + r.raise_for_status() + return r.json() + except Exception as e: + logger.debug(f"POST {self.name}:{port}{endpoint} failed: {e}") + return None + + def post_binary(self, port: int, endpoint: str, payload: Dict[str, Any], timeout: int = 180) -> Optional[bytes]: + """Send JSON POST request expecting binary audio/image output.""" + url = f"http://{self.host}:{port}{endpoint}" + try: + r = requests.post(url, json=payload, timeout=timeout) + r.raise_for_status() + return r.content + except Exception as e: + logger.debug(f"POST binary {self.name}:{port}{endpoint} failed: {e}") + return None + + def get_json(self, port: int, endpoint: str, timeout: int = 30) -> Optional[Dict[str, Any]]: + """Send GET request expecting JSON.""" + url = f"http://{self.host}:{port}{endpoint}" + try: + r = requests.get(url, timeout=timeout) + r.raise_for_status() + return r.json() + except Exception as e: + logger.debug(f"GET {self.name}:{port}{endpoint} failed: {e}") + return None + + def run(self, cmd: str, timeout: int = 600) -> Tuple[int, str, str]: + """Execute command over SSH.""" + try: + r = subprocess.run( + self.ssh_base + [cmd], + capture_output=True, + text=True, + timeout=timeout + ) + return r.returncode, r.stdout, r.stderr + except subprocess.TimeoutExpired: + logger.error(f"SSH command timed out on {self.name}: {cmd[:80]}") + return -1, "", "TimeoutExpired" + except Exception as e: + logger.error(f"SSH command failed on {self.name}: {e}") + return -1, "", str(e) + + def scp_to(self, local_path: str, remote_path: str) -> bool: + """Upload file via SCP.""" + cmd = [ + "scp", + "-o", "StrictHostKeyChecking=no", + "-o", "ConnectTimeout=10", + local_path, + f"{self.ssh_user}@{self.host}:{remote_path}" + ] + r = subprocess.run(cmd, capture_output=True, text=True) + if r.returncode != 0: + logger.error(f"SCP to {self.name}:{remote_path} failed: {r.stderr}") + return False + return True + + def scp_from(self, remote_path: str, local_path: str) -> bool: + """Download file via SCP.""" + cmd = [ + "scp", + "-o", "StrictHostKeyChecking=no", + "-o", "ConnectTimeout=10", + f"{self.ssh_user}@{self.host}:{remote_path}", + local_path + ] + r = subprocess.run(cmd, capture_output=True, text=True) + if r.returncode != 0: + logger.error(f"SCP from {self.name}:{remote_path} failed: {r.stderr}") + return False + return True diff --git a/pipeline/script_gen.py b/pipeline/script_gen.py new file mode 100644 index 0000000..d1c2b3b --- /dev/null +++ b/pipeline/script_gen.py @@ -0,0 +1,343 @@ +""" +Script Generation Module using AMDLLM (llama.cpp Qwen3.5-7B). +Generates bilingual documentary scripts, A/B test titles, SEO metadata, +dynamic chapter markers, visual generation prompts, and stock search queries. +""" + +import json +import logging +import re +from typing import Dict, Any, List, Optional +from .remote import RemotePC + +logger = logging.getLogger("YTFactory.Script") + +class ScriptGen: + def __init__(self, pcs: Dict[str, RemotePC], llm_port: int = 8002): + self.pcs = pcs + self.llm_port = llm_port + + def _build_master_prompt(self, topic: str, duration: int) -> str: + # Pacing: ~140 words per minute for professional documentary delivery. + num_segments = max(4, duration // 20) + target_words = max(70, int(duration * 140 / 60)) + words_per_seg = max(25, target_words // num_segments) + + return f"""You are an award-winning documentary writer and YouTube strategist. +Generate a complete, high-retention faceless documentary script for the topic: "{topic}". + +SPECIFICATIONS: +- Target Duration: Exactly ~{duration} seconds of continuous narration +- Total Word Count: ~{target_words} spoken words across all segments (~{words_per_seg} words per segment) +- Number of Segments: Exactly {num_segments} chronological segments +- Tone: Mysterious, engaging, cinematic, informative, highly gripping +- Spoken Depth: Each segment MUST contain a full, rich spoken paragraph ({words_per_seg - 5} to {words_per_seg + 10} words) so the narration fills the entire video duration without silence or rushing. + +For EACH segment provide: +1. "chapter_title": Short 2-4 word chapter title (e.g., "The Ancient Mystery", "The Critical Discovery") +2. "text": English spoken narration (rich 2-4 sentence narrative paragraph, natural pacing, compelling storytelling) +3. "visual_prompt": Highly detailed visual scene description for an AI video/image generator (cinematic lighting, camera angle, 8k documentary style) +4. "stock_query": 2-4 word search term to find relevant stock b-roll footage online (e.g., "ancient library books", "desert ruins aerial") +5. "on_screen_text": Optional 2-5 word lower-third label, key statistic, date, or scene title to display on screen (e.g., "Depth: 11,034m", "Year: 1960", "Pacific Ocean Abyss", or "" if none) +6. "is_historical": boolean (true if this segment depicts past events, ancient civilizations, historical figures, archaeological discoveries, or vintage eras; false if modern/contemporary) +7. "duration_estimate": Estimated duration in seconds ({max(10, duration // num_segments)}s) + +METADATA REQUIREMENTS: +- "titles": Exactly 3 distinct viral, high-CTR YouTube titles for A/B testing (max 85 chars each) +- "hook": Compelling 5-second opening question or statement +- "description": Comprehensive 3-paragraph YouTube description with engaging summary, key takeaways, and relevant hashtags (#Documentary #History #Science) +- "tags": 12-18 highly relevant YouTube search tags + +STRICT OUTPUT FORMAT: +Output MUST be a single, valid JSON object starting with {{ and ending with }}. Do NOT include markdown code blocks (```), comments, or text before/after. + +JSON Schema: +{{ + "titles": ["Title A", "Title B", "Title C"], + "hook": "Opening hook line...", + "description": "SEO description...", + "tags": ["tag1", "tag2", "tag3"], + "script_segments": [ + {{ + "chapter_title": "Chapter Name", + "text": "English spoken narration for segment 1...", + "visual_prompt": "Cinematic visual description...", + "stock_query": "relevant broll keyword", + "on_screen_text": "Key Metric or Title", + "is_historical": true, + "duration_estimate": 18 + }} + ] +}}""" + + def _extract_json(self, text: str) -> Dict[str, Any]: + """Sanitize and parse JSON from LLM response with multiple fallback passes.""" + text = text.strip() + text = re.sub(r'^\s*```(?:json)?\s*', '', text, flags=re.IGNORECASE) + text = re.sub(r'\s*```\s*$', '', text) + text = text.strip() + + start = text.find('{') + end = text.rfind('}') + if start == -1 or end <= start: + raise ValueError("No JSON object found in response") + + json_str = text[start:end + 1] + # Clean trailing commas + json_str = re.sub(r',\s*}', '}', json_str) + json_str = re.sub(r',\s*]', ']', json_str) + + try: + return json.loads(json_str) + except json.JSONDecodeError: + pass + + # Try json5 or partial bracket matching if available + try: + import json5 + return json5.loads(json_str) + except Exception: + pass + + for end_idx in range(end, start, -1): + if text[end_idx] == '}': + candidate = text[start:end_idx + 1] + candidate = re.sub(r',\s*}', '}', candidate) + candidate = re.sub(r',\s*]', ']', candidate) + try: + return json.loads(candidate) + except json.JSONDecodeError: + continue + + raise ValueError("Unable to parse JSON from LLM response after all sanitization passes.") + + def _chat(self, pc: RemotePC, prompt: str, max_tokens: int = 8192) -> Optional[str]: + payload = { + "model": "llama", + "messages": [{"role": "user", "content": prompt}], + "temperature": 0.7, + "max_tokens": max_tokens + } + r = pc.post_json(self.llm_port, "/v1/chat/completions", payload, timeout=600) + if not r or "choices" not in r: + return None + return r["choices"][0]["message"]["content"] + + def _translate_to_spanish(self, pc: RemotePC, script_data: Dict[str, Any]) -> Dict[str, Any]: + """Translate narration, titles, chapters, description, and on-screen text into Latin American Spanish.""" + logger.info("[SCRIPT] Translating script to Latin-American Spanish...") + + segments = script_data.get("script_segments", []) + titles = script_data.get("titles", []) + desc = script_data.get("description", "") + + translation_payload = { + "titles": titles, + "narrations": [s.get("text", "") for s in segments], + "chapters": [s.get("chapter_title", f"Part {i+1}") for i, s in enumerate(segments)], + "on_screen_texts": [s.get("on_screen_text", "") for s in segments], + "description": desc + } + + prompt = f"""You are a professional documentary translator. +Translate the following English YouTube documentary package into fluent, natural Latin-American Spanish for voiceover and YouTube upload. + +English Data: +{json.dumps(translation_payload, ensure_ascii=False, indent=2)} + +Requirements: +- "titles_es": 3 catchy Spanish titles matching the English titles +- "narrations_es": array of exact same length containing the Spanish voiceover text +- "chapters_es": array of exact same length containing short 2-4 word Spanish chapter titles +- "on_screen_texts_es": array of exact same length containing Spanish translations of the on-screen text labels (keep empty if original is empty) +- "description_es": full Spanish translation of the YouTube description with Spanish hashtags +- Output STRICT JSON only with keys: {{"titles_es": [...], "narrations_es": [...], "chapters_es": [...], "on_screen_texts_es": [...], "description_es": "..."}} +- No markdown formatting or extra text.""" + + for attempt in (1, 2): + text = self._chat(pc, prompt, max_tokens=4096) + if not text: + continue + try: + es_data = self._extract_json(text) + narr_es = es_data.get("narrations_es", []) + titles_es = es_data.get("titles_es", []) + chapters_es = es_data.get("chapters_es", []) + ost_es = es_data.get("on_screen_texts_es", []) + desc_es = es_data.get("description_es", "") + + if len(narr_es) == len(segments): + for i, seg in enumerate(segments): + seg["text_es"] = narr_es[i] + seg["chapter_title_es"] = chapters_es[i] if i < len(chapters_es) else seg.get("chapter_title", "") + seg["on_screen_text_es"] = ost_es[i] if i < len(ost_es) else seg.get("on_screen_text", "") + + script_data["titles_es"] = titles_es if len(titles_es) >= len(titles) else titles + script_data["description_es"] = desc_es or desc + logger.info("[SCRIPT] Spanish translation completed successfully.") + return script_data + else: + logger.warning(f"[SCRIPT] Segment length mismatch on ES translation ({len(narr_es)} vs {len(segments)})") + except Exception as e: + logger.warning(f"[SCRIPT] ES translation parse attempt {attempt} failed: {e}") + + logger.warning("[SCRIPT] Spanish translation failed after retries. Using English fallbacks.") + for seg in segments: + seg.setdefault("text_es", seg.get("text", "")) + seg.setdefault("chapter_title_es", seg.get("chapter_title", "")) + seg.setdefault("on_screen_text_es", seg.get("on_screen_text", "")) + script_data["titles_es"] = script_data.get("titles", []) + script_data["description_es"] = script_data.get("description", "") + return script_data + + def _proofread_and_refine_script(self, pc: RemotePC, script_data: Dict[str, Any], topic: str) -> Dict[str, Any]: + """ + Secondary LLM pass to proofread, fact-check, and fix proper noun/phonetic errors + (e.g., 'white tecapel' -> 'Whitechapel', 'tutankamen' -> 'Tutankhamun'). + """ + logger.info("[SCRIPT:AUDIT] Running secondary LLM proofreading & fact-checking pass...") + + prompt = f"""You are a master documentary script editor, fact-checker, and phonetics auditor. +Your job is to rigorously review and correct this draft documentary script for the topic: "{topic}". + +AUDITING OBJECTIVES: +1. Proper Nouns & Historical Places: + - Identify and correct ANY misspellings, phonetic corruptions, or garbled proper nouns (for example, if you see "white tecapel" or "white te capel", change it to "Whitechapel"; fix any names of people, cities, landmarks, vessels, historical dates, or scientific terms). +2. Phonetic Cleanliness for Text-to-Speech: + - Ensure words are written cleanly so speech synthesizers pronounce them naturally without awkward syllable breaks. +3. Flow & Grammar: + - Enhance sentence rhythm, natural documentary pacing, and dramatic intrigue. +4. Structure: + - Preserve the exact same JSON schema, segment count, keys, visual prompts, and metadata. + +DRAFT SCRIPT TO AUDIT: +{json.dumps(script_data, ensure_ascii=False, indent=2)} + +STRICT OUTPUT FORMAT: +Return ONLY the corrected script as a single valid JSON object starting with {{ and ending with }}. No markdown, no commentary.""" + + try: + raw_text = self._chat(pc, prompt, max_tokens=8192) + if raw_text: + refined = self._extract_json(raw_text) + if "script_segments" in refined and len(refined["script_segments"]) == len(script_data.get("script_segments", [])): + logger.info("[SCRIPT:AUDIT] Secondary LLM proofreading pass passed successfully.") + return refined + else: + logger.warning("[SCRIPT:AUDIT] Segment count mismatch in audit pass. Keeping original.") + except Exception as e: + logger.warning(f"[SCRIPT:AUDIT] Secondary LLM audit pass encountered error: {e}. Keeping original.") + + return script_data + + def _proofread_spanish_translation(self, pc: RemotePC, script_data: Dict[str, Any], topic: str) -> Dict[str, Any]: + """ + Secondary LLM pass to proofread Spanish translation for natural Latin-American idioms, + proper noun spelling (e.g. 'Whitechapel', 'Alejandría'), accent marks, and pronunciation. + """ + logger.info("[SCRIPT:AUDIT] Running secondary LLM Spanish audit pass...") + + segments = script_data.get("script_segments", []) + payload = { + "titles_es": script_data.get("titles_es", []), + "description_es": script_data.get("description_es", ""), + "segments_es": [ + { + "chapter_title_es": s.get("chapter_title_es", ""), + "text_es": s.get("text_es", ""), + "on_screen_text_es": s.get("on_screen_text_es", "") + } + for s in segments + ] + } + + prompt = f"""You are a master Spanish documentary editor and translator. +Review and polish this Spanish translation for topic "{topic}". + +OBJECTIVES: +1. Fix proper nouns (keep standard names like "Whitechapel", "Jack el Destripador", "Londres", "Alejandría" accurate). +2. Correct any phonetic spelling mistakes or awkward phrasing. +3. Ensure natural Latin-American documentary narration tone and correct accent marks (tildes). +4. Preserve the exact number of segments. + +Spanish Data: +{json.dumps(payload, ensure_ascii=False, indent=2)} + +STRICT OUTPUT FORMAT: +Return STRICT JSON only with keys: {{"titles_es": [...], "description_es": "...", "segments_es": [{{"chapter_title_es": "...", "text_es": "...", "on_screen_text_es": "..."}}, ...]}}""" + + try: + raw_text = self._chat(pc, prompt, max_tokens=8192) + if raw_text: + refined = self._extract_json(raw_text) + segs_es = refined.get("segments_es", []) + if len(segs_es) == len(segments): + for i, s in enumerate(segments): + s["text_es"] = segs_es[i].get("text_es", s.get("text_es", "")) + s["chapter_title_es"] = segs_es[i].get("chapter_title_es", s.get("chapter_title_es", "")) + s["on_screen_text_es"] = segs_es[i].get("on_screen_text_es", s.get("on_screen_text_es", "")) + if "titles_es" in refined and refined["titles_es"]: + script_data["titles_es"] = refined["titles_es"] + if "description_es" in refined and refined["description_es"]: + script_data["description_es"] = refined["description_es"] + logger.info("[SCRIPT:AUDIT] Spanish audit pass completed successfully.") + except Exception as e: + logger.warning(f"[SCRIPT:AUDIT] Spanish audit pass error: {e}") + + return script_data + + def generate(self, topic: str, duration: int) -> Dict[str, Any]: + """Generate master bilingual script with secondary LLM verification & proofreading passes.""" + logger.info(f"[SCRIPT] Generating script for topic: '{topic}' (~{duration}s)...") + pc = self.pcs.get("amdllm") + if not pc or not pc.check(self.llm_port): + raise RuntimeError(f"AMDLLM llama.cpp not reachable on port {self.llm_port}") + + prompt = self._build_master_prompt(topic, duration) + + for attempt in range(1, 4): + logger.info(f"[SCRIPT] Requesting script generation from AMDLLM (attempt {attempt}/3)...") + raw_text = self._chat(pc, prompt, max_tokens=8192) + if not raw_text: + logger.warning(f"[SCRIPT] AMDLLM returned empty response on attempt {attempt}") + continue + + try: + data = self._extract_json(raw_text) + + # Validation & Normalization + titles = data.get("titles", []) + if isinstance(titles, str): + titles = [titles] + while len(titles) < 3: + titles.append(f"{topic} - Part {len(titles)+1}") + data["titles"] = titles[:3] + data["title"] = titles[0] + + segments = data.get("script_segments", []) + if not segments: + raise ValueError("No script_segments generated") + + for i, s in enumerate(segments): + s.setdefault("chapter_title", f"Part {i+1}") + s.setdefault("duration_estimate", max(15, duration // len(segments))) + s.setdefault("stock_query", topic) + if not s.get("visual_prompt"): + s["visual_prompt"] = f"Cinematic documentary footage illustrating: {s.get('text', topic)}" + + # ── Step 1.5: Secondary LLM Proofreading & Fact-Checking Pass (English) ── + data = self._proofread_and_refine_script(pc, data, topic) + + # ── Step 1.6: Spanish Translation ── + data = self._translate_to_spanish(pc, data) + + # ── Step 1.7: Secondary LLM Spanish Translation Audit ── + data = self._proofread_spanish_translation(pc, data, topic) + + logger.info(f"[SCRIPT] Master script successfully created & audited: '{data['title']}' ({len(data.get('script_segments', []))} segments)") + return data + + except Exception as e: + logger.warning(f"[SCRIPT] Parse error on attempt {attempt}: {e}") + + raise RuntimeError("Failed to generate and parse script after 3 attempts.") diff --git a/pipeline/sub_gen.py b/pipeline/sub_gen.py new file mode 100644 index 0000000..50a3285 --- /dev/null +++ b/pipeline/sub_gen.py @@ -0,0 +1,102 @@ +""" +Subtitle Generation Module using Faster-Whisper on IntelLLM. +Generates word-level synchronized .srt subtitle tracks in English and Spanish. +""" + +import os +import time +import logging +from typing import Dict, Any +from .remote import RemotePC + +logger = logging.getLogger("YTFactory.Subs") + +WHISPER_WORKER_SCRIPT = r''' +import sys +from faster_whisper import WhisperModel + +audio_path = sys.argv[1] +lang = sys.argv[2] +out_srt = sys.argv[3] + +# Load faster-whisper on CPU using int8 quantization +model = WhisperModel("base", device="cpu", compute_type="int8") +segments, _ = model.transcribe(audio_path, language=lang, word_timestamps=True) + +def format_timestamp(seconds): + ms = int(round(seconds * 1000)) + hours, ms = divmod(ms, 3600000) + minutes, ms = divmod(ms, 60000) + secs, ms = divmod(ms, 1000) + return f"{hours:02d}:{minutes:02d}:{secs:02d},{ms:03d}" + +words = [] +for seg in segments: + words.extend(seg.words or []) + +cues = [] +current_words = [] +start_time = None +last_end_time = None + +for w in words: + if current_words and (len(current_words) >= 6 or (w.start - start_time) > 3.2): + cues.append((start_time, last_end_time, " ".join(x.word.strip() for x in current_words))) + current_words = [] + + if not current_words: + start_time = w.start + + current_words.append(w) + last_end_time = w.end + +if current_words: + cues.append((start_time, last_end_time, " ".join(x.word.strip() for x in current_words))) + +with open(out_srt, "w", encoding="utf-8") as f: + for i, (s, e, text) in enumerate(cues, 1): + f.write(f"{i}\n{format_timestamp(s)} --> {format_timestamp(e)}\n{text}\n\n") + +print(f"GENERATED_{len(cues)}_CUES") +''' + +class SubGen: + def __init__(self, pcs: Dict[str, RemotePC]): + self.pcs = pcs + + def generate(self, audio_path: str, job_dir: str, lang: str = "en") -> str: + """Generate accurate .srt subtitle file on IntelLLM.""" + logger.info(f"[SUBS:{lang.upper()}] Transcribing audio with Faster-Whisper on IntelLLM...") + pc = self.pcs.get("intelllm") + if not pc: + raise RuntimeError("IntelLLM is not available for Whisper transcription") + + ts = int(time.time()) + remote_audio = f"/tmp/whisper_in_{lang}_{ts}.wav" + remote_srt = f"/tmp/whisper_out_{lang}_{ts}.srt" + remote_script = f"/tmp/run_whisper_{lang}_{ts}.py" + + pc.scp_to(audio_path, remote_audio) + + # Upload whisper worker script + rc, _, err = pc.run(f"cat > {remote_script} << 'PYEOF'\n{WHISPER_WORKER_SCRIPT.strip()}\nPYEOF") + if rc != 0: + raise RuntimeError(f"Failed to deploy whisper worker script: {err}") + + # Execute in intel venv + cmd = ( + f"source ~/venvs/youtube-factory-intel/bin/activate 2>/dev/null || true; " + f"python3 {remote_script} {remote_audio} {lang} {remote_srt}" + ) + rc, stdout, stderr = pc.run(cmd, timeout=900) + if rc != 0: + logger.error(f"[SUBS:{lang.upper()}] Whisper transcription failed: {stderr}") + raise RuntimeError(f"Whisper failed: {stderr}") + + local_srt = os.path.join(job_dir, f"subtitles_{lang}.srt") + pc.scp_from(remote_srt, local_srt) + + # Cleanup remote tmp files + pc.run(f"rm -f {remote_audio} {remote_srt} {remote_script}") + logger.info(f"[SUBS:{lang.upper()}] Subtitles generated: {local_srt} ({stdout.strip()})") + return local_srt diff --git a/pipeline/thumb_gen.py b/pipeline/thumb_gen.py new file mode 100644 index 0000000..532d016 --- /dev/null +++ b/pipeline/thumb_gen.py @@ -0,0 +1,196 @@ +""" +Thumbnail Generation Module for A/B Testing. +Generates 3 distinct high-impact visual concepts via NvidiaLLM ComfyUI (z-image-turbo/SDXL) +and renders crisp typography overlays for both English and Spanish + clean raw versions. +""" + +import os +import re +import zlib +import logging +from typing import Dict, Any, List, Optional +from PIL import Image, ImageDraw, ImageFont +from .remote import RemotePC +from .visual_gen import VisualGen, StockMediaFetcher + +logger = logging.getLogger("YTFactory.Thumb") + +THUMB_PROMPT_STYLES = [ + "hyper-realistic dramatic close-up, intense emotional expression, high-contrast cinematic lighting, 8k wallpaper", + "epic wide-angle establishing shot, vast mysterious atmosphere, vibrant golden hour illumination, ultra-detailed", + "striking high-contrast stylized illustration, vivid neon backlight, bold cinematic composition, intriguing perspective", +] + +class ThumbnailGen: + def __init__(self, pcs: Dict[str, RemotePC], cfg: Any): + self.pcs = pcs + self.cfg = cfg + self.visual = VisualGen(pcs, cfg) + + def _render_typography_overlay(self, bg_image_path: str, title: str, out_path: str) -> str: + """Render high-impact YouTube thumbnail typography over background image using Pillow.""" + try: + img = Image.open(bg_image_path).convert("RGBA") + img = img.resize((1280, 720), Image.Resampling.LANCZOS) + + # Format punchy 3-5 word headline + clean_title = re.sub(r'[^A-Za-z0-9 \-\?\!\,\']', '', title).strip().upper() + words = clean_title.split() + if len(words) > 6: + words = words[:6] + + # Group into 2 lines if needed + if len(words) > 3: + mid = len(words) // 2 + lines = [" ".join(words[:mid]), " ".join(words[mid:])] + else: + lines = [" ".join(words)] + + # Locate bold font + font_paths = [ + "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", + "/usr/share/fonts/TTF/DejaVuSans-Bold.ttf", + "/usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf", + "/usr/share/fonts/truetype/freefont/FreeSansBold.ttf", + ] + font_file = None + for fp in font_paths: + if os.path.exists(fp): + font_file = fp + break + + font_size = 58 if len(lines) > 1 else 68 + font = ImageFont.truetype(font_file, font_size) if font_file else ImageFont.load_default() + + overlay = Image.new("RGBA", img.size, (0, 0, 0, 0)) + draw = ImageDraw.Draw(overlay) + + # Calculate box dimensions + line_height = font_size + 16 + total_text_height = len(lines) * line_height + max_line_width = 0 + for line in lines: + bbox = draw.textbbox((0, 0), line, font=font) + max_line_width = max(max_line_width, bbox[2] - bbox[0]) + + # Draw semi-transparent dark banner backing + banner_padding = 24 + banner_top = 720 - total_text_height - 60 - banner_padding + banner_bottom = 720 - 60 + banner_padding + banner_left = max(20, int((1280 - max_line_width) / 2) - banner_padding) + banner_right = min(1260, int((1280 + max_line_width) / 2) + banner_padding) + + draw.rounded_rectangle( + [banner_left, banner_top, banner_right, banner_bottom], + radius=16, + fill=(0, 0, 0, 180), + outline=(255, 204, 0, 220), # Vibrant yellow-gold accent border + width=3 + ) + + # Draw text with dark drop shadow and bright yellow/white fill + cur_y = banner_top + banner_padding + for i, line in enumerate(lines): + bbox = draw.textbbox((0, 0), line, font=font) + line_w = bbox[2] - bbox[0] + cur_x = int((1280 - line_w) / 2) + + # Shadow + draw.text((cur_x + 3, cur_y + 3), line, font=font, fill=(0, 0, 0, 255)) + # Text fill (Top line yellow, bottom line white) + fill_color = (255, 220, 0, 255) if i == 0 else (255, 255, 255, 255) + draw.text((cur_x, cur_y), line, font=font, fill=fill_color) + cur_y += line_height + + final_img = Image.alpha_composite(img, overlay).convert("RGB") + final_img.save(out_path, "PNG", quality=95) + return out_path + except Exception as e: + logger.warning(f"[THUMB] Pillow typography overlay failed: {e}. Copying raw image.") + import shutil + shutil.copy(bg_image_path, out_path) + return out_path + + def generate(self, script: Dict[str, Any], topic: str, job_dir: str) -> Dict[str, List[str]]: + """ + Generate 3 A/B test thumbnail concepts in English, Spanish, and Clean. + Returns: { 'en': [...], 'es': [...], 'clean': [...] } + """ + n = getattr(self.cfg, "thumbnail_count", 3) + logger.info(f"[THUMB] Generating {n} distinct A/B thumbnail variations on NvidiaLLM...") + pc = self.pcs.get("nvidiam") + if not pc or not pc.check(8188): + logger.warning("[THUMB] NvidiaLLM ComfyUI unreachable, skipping AI thumbnails") + return {"en": [], "es": [], "clean": []} + + thumbs_dir = os.path.join(job_dir, "thumbs") + os.makedirs(thumbs_dir, exist_ok=True) + + titles_en = script.get("titles", [topic]) + titles_es = script.get("titles_es", [topic]) + + results = {"en": [], "es": [], "clean": []} + + for i in range(n): + variant_letter = chr(65 + i) # A, B, C + style = THUMB_PROMPT_STYLES[i % len(THUMB_PROMPT_STYLES)] + prompt = f"YouTube documentary thumbnail for '{topic}', {style}, no text, no logos, 16:9 widescreen" + seed = zlib.crc32(prompt.encode()) % (2**31) + + clean_path = os.path.join(thumbs_dir, f"thumb_{variant_letter}_clean.png") + en_path = os.path.join(thumbs_dir, f"thumb_{variant_letter}_en.png") + es_path = os.path.join(thumbs_dir, f"thumb_{variant_letter}_es.png") + + # 1. Generate Clean Background via z-image-turbo or SDXL + generated = False + for wf in (self.visual._sdxl_workflow(prompt, seed), self._zimage_workflow(prompt, seed)): + try: + pid = self.visual._submit(pc.host, wf) + outputs = self.visual._wait_result(pc.host, pid, timeout_s=600) + self.visual._download_outputs(pc.host, outputs, clean_path) + generated = True + break + except Exception as e: + logger.debug(f"[THUMB] Variant {variant_letter} generator attempt failed: {e}") + + if not generated: + # Stock image fallback + logger.info(f"[THUMB] Variant {variant_letter} falling back to stock image...") + self.visual.stock_fetcher.search_and_download(topic, clean_path, prefer_video=False) + + if not os.path.exists(clean_path): + logger.error(f"[THUMB] Variant {variant_letter} failed to produce background image.") + continue + + results["clean"].append(clean_path) + + # 2. Render English Overlay + title_en = titles_en[i % len(titles_en)] + self._render_typography_overlay(clean_path, title_en, en_path) + results["en"].append(en_path) + + # 3. Render Spanish Overlay + title_es = titles_es[i % len(titles_es)] + self._render_typography_overlay(clean_path, title_es, es_path) + results["es"].append(es_path) + + logger.info(f"[THUMB] Concept {variant_letter} OK (EN, ES, Clean)") + + return results + + def _zimage_workflow(self, prompt: str, seed: int) -> Dict[str, Any]: + from .visual_gen import ZIMAGE_UNET, ZIMAGE_CLIP, ZIMAGE_VAE + return { + "1": {"inputs": {"unet_name": ZIMAGE_UNET, "weight_dtype": "default"}, "class_type": "UNETLoader"}, + "2": {"inputs": {"clip_name": ZIMAGE_CLIP, "type": "lumina2"}, "class_type": "CLIPLoader"}, + "3": {"inputs": {"vae_name": ZIMAGE_VAE}, "class_type": "VAELoader"}, + "4": {"inputs": {"text": prompt, "clip": ["2", 0]}, "class_type": "CLIPTextEncode"}, + "5": {"inputs": {"text": "", "clip": ["2", 0]}, "class_type": "CLIPTextEncode"}, + "6": {"inputs": {"width": 1280, "height": 720, "batch_size": 1}, "class_type": "EmptyLatentImage"}, + "7": {"inputs": {"seed": seed, "steps": 8, "cfg": 1.0, "sampler_name": "euler", + "scheduler": "simple", "denoise": 1.0, + "model": ["1", 0], "positive": ["4", 0], "negative": ["5", 0], + "latent_image": ["6", 0]}, "class_type": "KSampler"}, + "8": {"inputs": {"samples": ["7", 0], "vae": ["3", 0]}, "class_type": "VAEDecode"}, + "9": {"inputs": {"filename_prefix": "yt_thumb", "images": ["8", 0]}, "class_type": "SaveImage"}, + } diff --git a/pipeline/trending.py b/pipeline/trending.py new file mode 100644 index 0000000..a58c600 --- /dev/null +++ b/pipeline/trending.py @@ -0,0 +1,184 @@ +""" +Trending topics discovery engine for 24/7 video generation. +Fetches real-time search trends from Google Trends RSS and leverages AMDLLM LLM to +brainstorm viral, high-retention faceless documentary topics across niches. +""" + +import urllib.request +import xml.etree.ElementTree as ET +import json +import logging +import random +import re +from typing import List, Dict, Optional, Any +from .remote import RemotePC + +logger = logging.getLogger("YTFactory.Trending") + +NICHES = { + "history": "Ancient civilizations, forgotten empires, historical conspiracies, lost technologies, archaeological discoveries", + "space": "Cosmic mysteries, black holes, NASA discoveries, alien worlds, quantum astrophysics, future space missions", + "science": "Mind-bending paradoxes, deep ocean biology, cutting-edge genetics, unexplained natural phenomena, human longevity", + "tech": "Artificial Intelligence breakthroughs, robotics revolution, future civilization, cyber warfare, quantum computing", + "mysteries": "Unsolved cold cases, bizarre disappearances, ancient maps, oceanic anomalies, secret underground vaults", + "business": "Mega-corporation empires, greatest marketing hacks, financial crashes, economic warfare, billionaire secrets" +} + +class TrendingFetcher: + def __init__(self, amdllm_pc: Optional[RemotePC] = None, llm_port: int = 8002): + self.pc = amdllm_pc + self.llm_port = llm_port + + def get_google_trends(self, geo: str = "US", max_items: int = 15) -> List[str]: + """Fetch raw trending search queries from Google Trends RSS.""" + url = f"https://trends.google.com/trending/rss?geo={geo}" + trends = [] + try: + req = urllib.request.Request( + url, + headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"} + ) + with urllib.request.urlopen(req, timeout=10) as resp: + root = ET.fromstring(resp.read()) + for item in root.findall(".//item"): + title = item.find("title") + if title is not None and title.text: + trends.append(title.text.strip()) + if len(trends) >= max_items: + break + except Exception as e: + logger.warning(f"Failed to fetch Google Trends RSS: {e}") + return trends + + def brainstorm_niche_topics(self, niche: str, count: int = 5) -> List[str]: + """Use AMDLLM LLM to brainstorm viral documentary topics for a given niche.""" + if not self.pc or not self.pc.check(self.llm_port): + logger.warning("AMDLLM not available for brainstorming, using curated fallback topics.") + return self._fallback_topics(niche, count) + + niche_desc = NICHES.get(niche.lower(), niche) + prompt = f"""You are a master YouTube content strategist specializing in viral faceless documentaries. +Generate {count} engaging, viral, high-CTR documentary video topics for the niche: "{niche}" ({niche_desc}). + +Requirements: +- Strong curiosity hooks, intriguing mysteries, or surprising revelations +- Optimized for 5-10 minute faceless video documentaries +- Output STRICT JSON only: {{"topics": ["Topic 1", "Topic 2", ...]}} +- Do NOT output any markdown, explanations, or code blocks.""" + + payload = { + "model": "llama", + "messages": [{"role": "user", "content": prompt}], + "temperature": 0.8, + "max_tokens": 1024 + } + r = self.pc.post_json(self.llm_port, "/v1/chat/completions", payload, timeout=60) + if r and "choices" in r: + content = r["choices"][0]["message"]["content"].strip() + content = re.sub(r'```(?:json)?', '', content).strip('` \n') + try: + data = json.loads(content) + topics = data.get("topics", []) + if topics: + return topics[:count] + except Exception as e: + logger.warning(f"Error parsing LLM niche topics: {e}") + + return self._fallback_topics(niche, count) + + def convert_trends_to_video_topics(self, raw_trends: List[str], count: int = 5) -> List[str]: + """Transform raw search queries into compelling documentary video topics.""" + if not raw_trends: + return self.brainstorm_niche_topics(random.choice(list(NICHES.keys())), count) + + if not self.pc or not self.pc.check(self.llm_port): + return [f"The Shocking Truth About {t}" for t in raw_trends[:count]] + + prompt = f"""You are a viral YouTube documentary producer. +Transform the following real-time search trends into {count} high-retention faceless documentary topics: +{json.dumps(raw_trends[:10])} + +Requirements: +- Turn simple keywords into deep, narrative-driven documentary angles +- Output STRICT JSON only: {{"topics": ["Topic 1", "Topic 2", ...]}} +- No markdown formatting or extra text.""" + + payload = { + "model": "llama", + "messages": [{"role": "user", "content": prompt}], + "temperature": 0.7, + "max_tokens": 1024 + } + r = self.pc.post_json(self.llm_port, "/v1/chat/completions", payload, timeout=60) + if r and "choices" in r: + content = r["choices"][0]["message"]["content"].strip() + content = re.sub(r'```(?:json)?', '', content).strip('` \n') + try: + data = json.loads(content) + topics = data.get("topics", []) + if topics: + return topics[:count] + except Exception as e: + logger.warning(f"Error parsing trend conversion JSON: {e}") + + return [f"The Untold Story of {t}" for t in raw_trends[:count]] + + def get_trending_topics(self, niche: Optional[str] = None, count: int = 3) -> List[str]: + """Main method to get trending topics, either niche-based or real-time web trends.""" + if niche: + return self.brainstorm_niche_topics(niche, count) + + raw = self.get_google_trends(max_items=10) + if raw: + return self.convert_trends_to_video_topics(raw, count) + else: + return self.brainstorm_niche_topics(random.choice(list(NICHES.keys())), count) + + def _fallback_topics(self, niche: str, count: int) -> List[str]: + curated = { + "history": [ + "The Lost Library of Alexandria and Its Forgotten Secrets", + "Why the Roman Empire Actually Collapsed", + "The Ancient Underground City of Derinkuyu", + "The Real Reason the Pyramids Were Built", + "The Dark Secrets of the Medieval Black Plague" + ], + "space": [ + "What If the James Webb Telescope Found an Artificial Structure?", + "The Great Attractor: The Cosmic Monster Pulling Our Galaxy", + "What Actually Happens Inside a Supermassive Black Hole?", + "The Terrifying Theory of the Dead Universe", + "Europa: The Hidden Ocean That Could Harbor Alien Life" + ], + "science": [ + "The Deepest Point on Earth: Secrets of the Mariana Trench", + "The Quantum Paradox That Breaks Modern Physics", + "Can We Stop Aging? The Biological Immortality Breakthrough", + "The Mysterious Sounds Recorded in the Deepest Mines", + "The Hive Mind: How Ants Outsmart Supercomputers" + ], + "tech": [ + "The Rise of Autonomous AI Agents: What Comes Next?", + "How Quantum Computers Will Break Global Encryption", + "The Silicon Shield: How One Island Controls All Global Tech", + "Humanoid Robots in Everyday Life: The Next 10 Years", + "The Hidden Global Fiber-Optic Cables Running Under the Ocean" + ], + "mysteries": [ + "The Voynich Manuscript: The Unbreakable Ancient Code", + "The Mystery of the Mary Celeste Ship", + "The Lost Amber Room: History's Greatest Stolen Treasure", + "The Strange Case of the Dyatlov Pass Incident", + "The Bermuda Triangle of Space: The South Atlantic Anomaly" + ], + "business": [ + "How One Company Quietly Controls 90% of the World's Microchips", + "The Greatest Wall Street Heist in History", + "The Collapse of the South Sea Bubble: The First Stock Mania", + "How Dubai Built a Trillion-Dollar Metropolis Out of the Desert", + "The Dark Economics Behind Fast Fashion Giants" + ] + } + pool = curated.get(niche.lower(), curated["history"]) + random.shuffle(pool) + return pool[:count] diff --git a/pipeline/tts_gen.py b/pipeline/tts_gen.py new file mode 100644 index 0000000..bbad2c0 --- /dev/null +++ b/pipeline/tts_gen.py @@ -0,0 +1,177 @@ +""" +Voiceover Synthesis Module using Kokoro TTS on IntelLLM (port 8003). +Generates crystal-clear narration in English and Spanish with accurate per-segment timestamps. +""" + +import os +import subprocess +import logging +import wave +import contextlib +from typing import Dict, Any, List, Tuple +from .remote import RemotePC + +logger = logging.getLogger("YTFactory.TTS") + +def get_wav_duration(path: str) -> float: + """Accurately compute WAV audio duration in seconds.""" + try: + with contextlib.closing(wave.open(path, 'r')) as f: + frames = f.getnframes() + rate = f.getframerate() + return frames / float(rate) + except Exception: + # Fallback to ffprobe + r = subprocess.run( + ["ffprobe", "-v", "error", "-show_entries", "format=duration", + "-of", "default=noprint_wrappers=1:nokey=1", path], + capture_output=True, text=True + ) + try: + return float(r.stdout.strip()) + except ValueError: + return 0.0 + +import asyncio +try: + import edge_tts +except ImportError: + edge_tts = None + +def _run_edge_tts(text: str, voice: str, out_wav_path: str): + """Synthesize high-quality natural neural voiceover directly via module or CLI.""" + tmp_mp3 = out_wav_path.replace(".wav", "_temp.mp3") + + if edge_tts is not None: + async def _speak(): + communicate = edge_tts.Communicate(text, voice) + await communicate.save(tmp_mp3) + asyncio.run(_speak()) + else: + r = subprocess.run([ + "edge-tts", "--voice", voice, "--text", text, "--write-media", tmp_mp3 + ], capture_output=True, text=True) + if r.returncode != 0: + raise RuntimeError(f"edge-tts CLI error: {r.stderr}") + + subprocess.run([ + "ffmpeg", "-y", "-i", tmp_mp3, + "-ar", "44100", "-ac", "2", "-c:a", "pcm_s16le", out_wav_path + ], check=True, capture_output=True) + if os.path.exists(tmp_mp3): + os.remove(tmp_mp3) + +class TTSGen: + def __init__(self, pcs: Dict[str, RemotePC], voices: Dict[str, str], tts_port: int = 8003): + self.pcs = pcs + self.voices = voices or {"en": "af_heart", "es": "es-MX-JorgeNeural"} + self.tts_port = tts_port + + def generate(self, script_data: Dict[str, Any], job_dir: str, lang: str = "en") -> Dict[str, Any]: + """Generate voiceover audio for all segments in the specified language.""" + segments = script_data.get("script_segments", []) + text_key = "text" if lang == "en" else "text_es" + default_voice = "af_heart" if lang == "en" else "es-MX-JorgeNeural" + voice = self.voices.get(lang, default_voice) + + # Ensure Spanish uses native neural voice if an old Kokoro voice was configured + if lang == "es" and voice in ("ef_dora", "em_alex", "ef_clara", "em_santa"): + voice = "es-MX-JorgeNeural" + + logger.info(f"[TTS:{lang.upper()}] Synthesizing narration with voice '{voice}'...") + + abs_job_dir = os.path.abspath(job_dir) + os.makedirs(abs_job_dir, exist_ok=True) + + segment_wavs = [] + segment_timings = [] + current_time = 0.0 + + is_neural = voice.startswith(("es-", "en-", "fr-", "de-", "it-", "pt-")) + + for i, seg in enumerate(segments): + text = seg.get(text_key, "").strip() + if not text: + text = seg.get("text", f"Segment {i+1}") + + seg_path = os.path.join(abs_job_dir, f"tts_{lang}_{i:03d}.wav") + + if is_neural: + # Use native neural speech engine + try: + _run_edge_tts(text, voice, seg_path) + except Exception as e: + logger.warning(f"[TTS:{lang.upper()}] Neural TTS failed: {e}, attempting Kokoro fallback...") + is_neural = False + + if not is_neural: + # Use Kokoro on IntelLLM + pc = self.pcs.get("intelllm") + if not pc or not pc.check(self.tts_port): + raise RuntimeError(f"IntelLLM Kokoro TTS not reachable on port {self.tts_port}") + + payload = { + "input": text, + "voice": "af_heart" if lang == "en" else "ef_dora", + "speed": 1.0, + "lang": "e" if lang == "es" else "a" + } + + wav_data = None + for attempt in range(1, 4): + wav_data = pc.post_binary(self.tts_port, "/v1/audio/speech", payload, timeout=120) + if wav_data and len(wav_data) >= 1024: + break + logger.warning(f"[TTS:{lang.upper()}] Segment {i+1} attempt {attempt} failed, retrying...") + + if not wav_data or len(wav_data) < 1024: + raise RuntimeError(f"Failed to generate TTS audio for segment {i+1} ({lang})") + + with open(seg_path, "wb") as f: + f.write(wav_data) + + dur = get_wav_duration(seg_path) + chapter_title = seg.get("chapter_title" if lang == "en" else "chapter_title_es", f"Part {i+1}") + + segment_timings.append({ + "index": i, + "start": current_time, + "end": current_time + dur, + "duration": dur, + "chapter_title": chapter_title, + "text": text, + "wav_file": seg_path + }) + current_time += dur + segment_wavs.append(seg_path) + logger.info(f"[TTS:{lang.upper()}] Segment {i+1}/{len(segments)} OK ({dur:.2f}s)") + + # Create concat list for ffmpeg + concat_txt = os.path.join(abs_job_dir, f"concat_tts_{lang}.txt") + with open(concat_txt, "w") as f: + for sw in segment_wavs: + f.write(f"file '{sw}'\n") + + master_wav = os.path.join(abs_job_dir, f"voiceover_{lang}.wav") + res = subprocess.run([ + "ffmpeg", "-y", "-f", "concat", "-safe", "0", "-i", concat_txt, + "-ar", "44100", "-ac", "2", "-c:a", "pcm_s16le", master_wav + ], capture_output=True, text=True) + + if res.returncode != 0: + logger.error(f"[TTS:{lang.upper()}] FFmpeg concat failed: {res.stderr}") + raise RuntimeError(f"FFmpeg audio concatenation failed: {res.stderr}") + + if os.path.exists(concat_txt): + os.remove(concat_txt) + + total_dur = get_wav_duration(master_wav) + logger.info(f"[TTS:{lang.upper()}] Master voiceover generated: {master_wav} ({total_dur:.2f}s)") + + return { + "master_wav": master_wav, + "total_duration": total_dur, + "segments": segment_timings, + "voice": voice, + "language": lang + } diff --git a/pipeline/visual_gen.py b/pipeline/visual_gen.py new file mode 100644 index 0000000..431a1d3 --- /dev/null +++ b/pipeline/visual_gen.py @@ -0,0 +1,626 @@ +""" +Visual Generation & Stock Media Module. +Handles: +1. NvidiaLLM ComfyUI MiniMax H3 Text-to-Video generation +2. NvidiaLLM ComfyUI z-image-turbo / SDXL AI Image generation +3. Internet Stock Video & Stock Image downloaders (Wikimedia Commons, Pexels, Pixabay) +4. Dynamic Ken Burns Motion Effects (pan/zoom) in FFmpeg for still images +5. Intelligent visual curation and multi-tier fallback pipeline +""" + +import os +import re +import time +import json +import zlib +import random +import logging +import urllib.request +import urllib.parse +import subprocess +import requests +from typing import Dict, Any, List, Optional +from .remote import RemotePC + +logger = logging.getLogger("YTFactory.Visual") + +# ─── ComfyUI Model Constants ──────────────────────────────────────────────── +H3_UNET = "minimax_h3_fl2va_pruned_int8_convrot.safetensors" +H3_CLIP = "qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors" +H3_VAE = "minimax_h3_video_vae_fp16.safetensors" +H3_FPS = 24 +H3_MIN_LEN, H3_MAX_LEN = 124, 362 + +ZIMAGE_UNET = "z_image_turbo_bf16.safetensors" +ZIMAGE_CLIP = "qwen_3_4b.safetensors" +ZIMAGE_VAE = "ae.safetensors" + +SDXL_CKPT = "sd_xl_base_1.0.safetensors" + +def h3_snap_length(seconds: float) -> int: + """Snap a duration in seconds to the MiniMax H3 17k+5 frame grid.""" + n = max(H3_MIN_LEN, min(H3_MAX_LEN, int(round(seconds * H3_FPS)))) + k = max(7, round((n - 5) / 17)) + return 17 * k + 5 + +# ─── Stock Media Fetcher ──────────────────────────────────────────────────── + +class StockMediaFetcher: + def __init__(self, pexels_key: Optional[str] = None, pixabay_key: Optional[str] = None): + self.pexels_key = pexels_key + self.pixabay_key = pixabay_key + self.user_agent = "YouTubeFactory/2.0 (faceless-video-pipeline)" + + def _query_wikimedia(self, query: str, is_video: bool = False) -> Optional[str]: + """Search Wikimedia Commons for high-resolution images or videos without API keys.""" + try: + clean_q = re.sub(r'[^A-Za-z0-9 ]', '', query).strip() + encoded_q = urllib.parse.quote(clean_q) + api_url = ( + f"https://commons.wikimedia.org/w/api.php?action=query&generator=search" + f"&gsrsearch={encoded_q}&gsrnamespace=6&gsrlimit=5&prop=imageinfo" + f"&iiprop=url|mime|size&format=json" + ) + req = urllib.request.Request(api_url, headers={"User-Agent": self.user_agent}) + with urllib.request.urlopen(req, timeout=10) as resp: + data = json.loads(resp.read().decode("utf-8")) + pages = data.get("query", {}).get("pages", {}) + for _, page in pages.items(): + infos = page.get("imageinfo", []) + if not infos: + continue + url = infos[0].get("url", "") + mime = infos[0].get("mime", "").lower() + if is_video and ("video" in mime or url.endswith((".webm", ".mp4", ".ogv"))): + return url + if not is_video and ("image" in mime or url.endswith((".jpg", ".jpeg", ".png", ".webp"))): + return url + except Exception as e: + logger.debug(f"Wikimedia search failed for '{query}': {e}") + return None + + def _query_pexels_video(self, query: str) -> Optional[str]: + """Search Pexels for free HD stock videos if API key is provided.""" + if not self.pexels_key: + return None + try: + clean_q = urllib.parse.quote(query) + url = f"https://api.pexels.com/videos/search?query={clean_q}&per_page=5&orientation=landscape" + headers = {"Authorization": self.pexels_key, "User-Agent": self.user_agent} + req = urllib.request.Request(url, headers=headers) + with urllib.request.urlopen(req, timeout=10) as resp: + data = json.loads(resp.read().decode("utf-8")) + videos = data.get("videos", []) + for v in videos: + files = v.get("video_files", []) + # Prefer the smallest HD file (>=1280 wide) to keep downloads fast + hd = [vf for vf in files if vf.get("width", 0) >= 1280 and vf.get("link")] + if hd: + return sorted(hd, key=lambda x: x["width"])[0]["link"] + if files and files[0].get("link"): + return files[0]["link"] + except Exception as e: + logger.debug(f"Pexels video query failed: {e}") + return None + + def _query_pexels_photo(self, query: str) -> Optional[str]: + """Search Pexels for free HD stock photos if API key is provided.""" + if not self.pexels_key: + return None + try: + clean_q = urllib.parse.quote(query) + url = f"https://api.pexels.com/v1/search?query={clean_q}&per_page=5&orientation=landscape" + headers = {"Authorization": self.pexels_key, "User-Agent": self.user_agent} + req = urllib.request.Request(url, headers=headers) + with urllib.request.urlopen(req, timeout=10) as resp: + data = json.loads(resp.read().decode("utf-8")) + photos = data.get("photos", []) + if photos: + return photos[0].get("src", {}).get("large2x") or photos[0].get("src", {}).get("large") + except Exception as e: + logger.debug(f"Pexels photo query failed: {e}") + return None + + def _query_pixabay_video(self, query: str) -> Optional[str]: + """Search Pixabay for free HD stock videos if API key is provided.""" + if not self.pixabay_key: + return None + try: + clean_q = urllib.parse.quote(query) + url = f"https://pixabay.com/api/videos/?key={self.pixabay_key}&q={clean_q}&per_page=5&safesearch=true" + req = urllib.request.Request(url, headers={"User-Agent": self.user_agent}) + with urllib.request.urlopen(req, timeout=10) as resp: + data = json.loads(resp.read().decode("utf-8")) + for hit in data.get("hits", []): + vids = hit.get("videos", {}) + for quality in ("large", "medium", "small"): + v = vids.get(quality) + if v and v.get("url") and v.get("width", 0) >= 640: + return v["url"] + except Exception as e: + logger.debug(f"Pixabay video query failed: {e}") + return None + + def _query_pixabay_photo(self, query: str) -> Optional[str]: + """Search Pixabay for free HD stock photos if API key is provided.""" + if not self.pixabay_key: + return None + try: + clean_q = urllib.parse.quote(query) + url = (f"https://pixabay.com/api/?key={self.pixabay_key}&q={clean_q}" + f"&image_type=photo&orientation=horizontal&per_page=5&safesearch=true") + req = urllib.request.Request(url, headers={"User-Agent": self.user_agent}) + with urllib.request.urlopen(req, timeout=10) as resp: + data = json.loads(resp.read().decode("utf-8")) + hits = data.get("hits", []) + if hits: + return hits[0].get("largeImageURL") or hits[0].get("webformatURL") + except Exception as e: + logger.debug(f"Pixabay photo query failed: {e}") + return None + + def download_media(self, url: str, out_path: str) -> bool: + """Download remote media with retry and validation.""" + try: + req = urllib.request.Request(url, headers={"User-Agent": self.user_agent}) + with urllib.request.urlopen(req, timeout=30) as resp, open(out_path, "wb") as f: + f.write(resp.read()) + if os.path.exists(out_path) and os.path.getsize(out_path) > 5000: + return True + except Exception as e: + logger.debug(f"Download failed from {url}: {e}") + if os.path.exists(out_path): + try: + os.remove(out_path) + except OSError: + pass + return False + + def search_and_download(self, query: str, out_path: str, prefer_video: bool = False) -> Optional[str]: + """Search across stock engines and download asset.""" + logger.info(f"[STOCK] Searching stock media for: '{query}' (video={prefer_video})...") + if prefer_video: + for label, fn in (("Pexels", self._query_pexels_video), + ("Pixabay", self._query_pixabay_video), + ("Wikimedia", lambda q: self._query_wikimedia(q, is_video=True))): + v_url = fn(query) + if v_url and self.download_media(v_url, out_path): + logger.info(f"[STOCK] Downloaded {label} video for '{query}'") + return out_path + return None + + for label, fn in (("Pexels", self._query_pexels_photo), + ("Pixabay", self._query_pixabay_photo), + ("Wikimedia", lambda q: self._query_wikimedia(q, is_video=False))): + p_url = fn(query) + if p_url and self.download_media(p_url, out_path): + logger.info(f"[STOCK] Downloaded {label} photo for '{query}'") + return out_path + + logger.debug(f"[STOCK] No stock media found for: '{query}'") + return None + +# ─── Ken Burns Motion Engine ──────────────────────────────────────────────── + +def apply_ken_burns_effect(img_path: str, out_mp4: str, duration_sec: float, motion_type: int = 0) -> str: + """ + Animate a still image into a cinematic 16:9 25fps video clip using FFmpeg pan & zoom motion. + Provides 6 distinct cinematic camera movements: + 0: Smooth Center Zoom-In + 1: Smooth Center Zoom-Out + 2: Diagonal Pan Left-Up with subtle zoom + 3: Diagonal Pan Right-Down with subtle zoom + 4: Slow Pan Right across center + 5: Slow Pan Left across center + """ + total_frames = max(50, int(round(duration_sec * 25))) + m_idx = motion_type % 6 + + if m_idx == 0: + # Smooth Zoom-In (center) + z_expr = "min(zoom+0.0012,1.25)" + x_expr = "iw/2-(iw/zoom/2)" + y_expr = "ih/2-(ih/zoom/2)" + elif m_idx == 1: + # Smooth Zoom-Out (center) + z_expr = "if(eq(on,1),1.25,max(1.0,zoom-0.0012))" + x_expr = "iw/2-(iw/zoom/2)" + y_expr = "ih/2-(ih/zoom/2)" + elif m_idx == 2: + # Diagonal Pan Left-Up with subtle zoom + z_expr = "1.20" + x_expr = f"if(eq(on,1),iw-iw/zoom,max(0,x-(iw-iw/zoom)/{total_frames}))" + y_expr = f"if(eq(on,1),ih-ih/zoom,max(0,y-(ih-ih/zoom)/{total_frames}))" + elif m_idx == 3: + # Diagonal Pan Right-Down with subtle zoom + z_expr = "1.20" + x_expr = f"if(eq(on,1),0,min(iw-iw/zoom,x+(iw-iw/zoom)/{total_frames}))" + y_expr = f"if(eq(on,1),0,min(ih-ih/zoom,y+(ih-ih/zoom)/{total_frames}))" + elif m_idx == 4: + # Slow Pan Right across center + z_expr = "1.18" + x_expr = f"if(eq(on,1),0,min(iw-iw/zoom,x+(iw-iw/zoom)/{total_frames}))" + y_expr = "ih/2-(ih/zoom/2)" + else: + # Slow Pan Left across center + z_expr = "1.18" + x_expr = f"if(eq(on,1),iw-iw/zoom,max(0,x-(iw-iw/zoom)/{total_frames}))" + y_expr = "ih/2-(ih/zoom/2)" + + vf = ( + f"scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080," + f"zoompan=z='{z_expr}':x='{x_expr}':y='{y_expr}':d={total_frames}:s=1280x720:fps=25," + f"format=yuv420p" + ) + + cmd = [ + "ffmpeg", "-y", "-loop", "1", "-i", img_path, + "-vf", vf, + "-t", f"{duration_sec:.2f}", + "-r", "25", + "-c:v", "libx264", "-preset", "fast", "-crf", "22", + "-pix_fmt", "yuv420p", "-an", out_mp4 + ] + r = subprocess.run(cmd, capture_output=True, text=True) + if r.returncode != 0: + logger.warning(f"Ken Burns animation fallback: {r.stderr[-200:]}") + # Simple loop fallback + fallback_vf = "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2:black,format=yuv420p" + subprocess.run([ + "ffmpeg", "-y", "-loop", "1", "-i", img_path, + "-vf", fallback_vf, "-t", f"{duration_sec:.2f}", "-r", "25", + "-c:v", "libx264", "-preset", "fast", "-crf", "22", "-pix_fmt", "yuv420p", "-an", out_mp4 + ], check=True, capture_output=True) + + return out_mp4 + +def normalize_clip_to_duration(src_path: str, out_path: str, duration_sec: float) -> str: + """ + Normalize any video clip to exactly duration_sec at 1280x720 25fps. + Loops short clips (-stream_loop) and trims long ones (-t) so every segment + stays in sync with its narration. + """ + vf = ("scale=1280:720:force_original_aspect_ratio=decrease," + "pad=1280:720:(ow-iw)/2:(oh-ih)/2:black,fps=25,format=yuv420p") + r = subprocess.run([ + "ffmpeg", "-y", "-stream_loop", "-1", "-i", src_path, + "-vf", vf, "-t", f"{duration_sec:.2f}", "-r", "25", + "-c:v", "libx264", "-preset", "fast", "-crf", "22", + "-pix_fmt", "yuv420p", "-an", out_path + ], capture_output=True, text=True) + if r.returncode != 0: + raise RuntimeError(f"clip normalization failed: {r.stderr[-200:]}") + return out_path + +def apply_text_overlay(video_path: str, out_mp4: str, text: str, duration_sec: float) -> str: + """ + Render a broadcast-style lower-third text banner onto the video clip. + Only active if text is non-empty. + """ + clean_text = re.sub(r"[^A-Za-z0-9 \-\?\!\,\:\'\.\/]", "", text).strip() + if not clean_text: + if video_path != out_mp4: + import shutil + shutil.copy(video_path, out_mp4) + return out_mp4 + + font_paths = [ + "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", + "/usr/share/fonts/TTF/DejaVuSans-Bold.ttf", + "/usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf", + "/usr/share/fonts/truetype/freefont/FreeSansBold.ttf", + ] + font_file = None + for fp in font_paths: + if os.path.exists(fp): + font_file = fp + break + + font_param = f":fontfile='{font_file}'" if font_file else "" + escaped_text = clean_text.replace("'", "'\\''").replace(":", "\\:") + + # Lower-third banner active between 0.8s and (duration - 0.8s) + end_t = max(1.0, duration_sec - 0.8) + enable_expr = f"between(t,0.8,{end_t:.2f})" + vf = ( + f"drawtext=text='{escaped_text}'{font_param}:fontcolor=white:fontsize=36:" + f"box=1:boxcolor=black@0.65:boxborderw=14:x=60:y=h-th-60:enable='{enable_expr}'" + ) + + cmd = [ + "ffmpeg", "-y", "-i", video_path, + "-vf", vf, + "-c:v", "libx264", "-preset", "fast", "-crf", "22", "-pix_fmt", "yuv420p", + "-an", out_mp4 + ] + r = subprocess.run(cmd, capture_output=True, text=True) + if r.returncode != 0: + logger.warning(f"Text overlay rendering fallback: {r.stderr[-200:]}") + if video_path != out_mp4: + import shutil + shutil.copy(video_path, out_mp4) + return out_mp4 + +# ─── Film Grain & Vintage Aging Filter ────────────────────────────────────── + +HISTORICAL_KEYWORDS = { + "ancient", "archaeology", "archaeological", "history", "historical", "century", + "b.c.", "bc", "a.d.", "ad", "victorian", "medieval", "ruins", "pharaoh", + "temple", "pyramids", "past", "hunter gatherer", "hunter-gatherer", "gobeklitepe", + "göbeklitepe", "stone age", "bronze age", "iron age", "1888", "1900", "1920", + "1930", "1940", "1950", "1960", "1970", "empire", "dynasty", "columbus", + "alexandria", "antiquity", "paleolithic", "neolithic", "civilization", "excavation", + "fossil", "scrolls", "papyrus", "jack the ripper", "monument", "artifacts", "artifact", + "bermuda", "atlantis", "mythology", "prehistoric", "dynastic", "tomb", "sarcophagus", + "excavations", "relic", "relics", "megalith", "megalithic", "sanctuary" +} + +def is_historical_scene(seg: Dict[str, Any], topic: str = "") -> bool: + """Check if the segment depicts historical/past events based on flag or keywords.""" + if seg.get("is_historical") is True: + return True + combined_text = ( + f"{topic} {seg.get('chapter_title', '')} {seg.get('text', '')} " + f"{seg.get('visual_prompt', '')} {seg.get('stock_query', '')}" + ).lower() + return any(kw in combined_text for kw in HISTORICAL_KEYWORDS) + +def apply_film_grain_overlay(video_path: str, out_mp4: str) -> str: + """ + Apply a dynamic 35mm film grain overlay with subtle vintage contrast & vignette + to give historical footage an authentically aged cinematic look. + """ + vintage_vf = ( + "noise=alls=14:allf=t+u," + "eq=contrast=1.06:brightness=-0.01:saturation=0.88," + "vignette=PI/5" + ) + cmd = [ + "ffmpeg", "-y", "-i", video_path, + "-vf", vintage_vf, + "-c:v", "libx264", "-preset", "fast", "-crf", "22", "-pix_fmt", "yuv420p", + "-an", out_mp4 + ] + r = subprocess.run(cmd, capture_output=True, text=True) + if r.returncode != 0: + logger.warning(f"Film grain filter fallback: {r.stderr[-200:]}") + if video_path != out_mp4: + import shutil + shutil.copy(video_path, out_mp4) + return out_mp4 + +# ─── ComfyUI Orchestration ───────────────────────────────────────────────── + +class VisualGen: + def __init__(self, pcs: Dict[str, RemotePC], cfg: Any): + self.pcs = pcs + self.cfg = cfg + self.stock_fetcher = StockMediaFetcher( + pexels_key=getattr(cfg, "pexels_api_key", None), + pixabay_key=getattr(cfg, "pixabay_api_key", None) + ) + + def _h3_workflow(self, prompt: str, seed: int, width: int, height: int, length: int) -> Dict[str, Any]: + return { + "1": {"inputs": {"unet_name": H3_UNET, "weight_dtype": "default"}, "class_type": "UNETLoader"}, + "2": {"inputs": {"model": ["1", 0], "shift_video": 12.0, "shift_audio": 3.0}, "class_type": "MiniMaxH3SigmaShift"}, + "3": {"inputs": {"clip_name": H3_CLIP, "type": "minimax"}, "class_type": "CLIPLoader"}, + "4": {"inputs": {"vae_name": H3_VAE}, "class_type": "VAELoader"}, + "5": {"inputs": {"clip": ["3", 0], "vae": ["4", 0], "prompt": prompt, + "width": width, "height": height, "length": length}, + "class_type": "MiniMaxH3ImageToVideo"}, + "6": {"inputs": {"text": "", "clip": ["3", 0]}, "class_type": "CLIPTextEncode"}, + "7": {"inputs": {"seed": seed, "steps": 20, "cfg": 5.0, "sampler_name": "euler", + "scheduler": "normal", "denoise": 1.0, + "model": ["2", 0], "positive": ["5", 0], "negative": ["6", 0], + "latent_image": ["5", 1]}, "class_type": "KSampler"}, + "8": {"inputs": {"samples": ["7", 0], "vae": ["4", 0]}, "class_type": "VAEDecode"}, + "9": {"inputs": {"images": ["8", 0], "fps": float(H3_FPS)}, "class_type": "CreateVideo"}, + "10": {"inputs": {"video": ["9", 0], "filename_prefix": "yt_clip", + "format": "auto", "codec": "auto"}, "class_type": "SaveVideo"}, + } + + def _sdxl_workflow(self, prompt: str, seed: int) -> Dict[str, Any]: + return { + "1": {"inputs": {"ckpt_name": SDXL_CKPT}, "class_type": "CheckpointLoaderSimple"}, + "2": {"inputs": {"text": prompt + ", 8k resolution, cinematic lighting, photorealistic, documentary b-roll", "clip": ["1", 1]}, "class_type": "CLIPTextEncode"}, + "2b": {"inputs": {"text": "blurry, low quality, watermark, text, logo, ugly, deformed, oversaturated", "clip": ["1", 1]}, "class_type": "CLIPTextEncode"}, + "3": {"inputs": {"width": 1280, "height": 720, "batch_size": 1}, "class_type": "EmptyLatentImage"}, + "4": {"inputs": {"seed": seed, "steps": 22, "cfg": 7.0, "sampler_name": "euler", + "scheduler": "normal", "denoise": 1.0, + "model": ["1", 0], "positive": ["2", 0], "negative": ["2b", 0], + "latent_image": ["3", 0]}, "class_type": "KSampler"}, + "5": {"inputs": {"samples": ["4", 0], "vae": ["1", 2]}, "class_type": "VAEDecode"}, + "6": {"inputs": {"filename_prefix": "yt_img", "images": ["5", 0]}, "class_type": "SaveImage"}, + } + + def _submit(self, host: str, workflow: Dict[str, Any]) -> str: + r = requests.post(f"http://{host}:8188/prompt", json={"prompt": workflow}, timeout=30) + data = r.json() + if r.status_code != 200 or "prompt_id" not in data: + raise RuntimeError(f"ComfyUI rejected workflow: {json.dumps(data)[:300]}") + return data["prompt_id"] + + def _cancel_job(self, host: str, pid: str): + """Interrupt current execution and remove the job from the ComfyUI queue. + Prevents client-side timeouts from leaving zombie jobs that block later prompts.""" + try: + requests.post(f"http://{host}:8188/interrupt", timeout=5) + except Exception: + pass + try: + requests.post(f"http://{host}:8188/queue", json={"delete": [pid]}, timeout=5) + except Exception: + pass + + def _wait_result(self, host: str, pid: str, timeout_s: int = 1800) -> Dict[str, Any]: + deadline = time.time() + timeout_s + while time.time() < deadline: + time.sleep(3) + try: + h = requests.get(f"http://{host}:8188/history/{pid}", timeout=10).json() + except Exception: + continue + if pid not in h: + continue + status = h[pid].get("status", {}) + if status.get("status_str") == "error": + msgs = h[pid].get("status", {}).get("messages", []) + self._cancel_job(host, pid) + raise RuntimeError(f"ComfyUI execution error: {json.dumps(msgs)[:300]}") + if status.get("completed") or h[pid].get("outputs"): + return h[pid].get("outputs", {}) + self._cancel_job(host, pid) + raise RuntimeError("ComfyUI generation timed out.") + + def _download_outputs(self, host: str, outputs: Dict[str, Any], out_path: str) -> str: + for node_out in outputs.values(): + for key in ("videos", "gifs", "images"): + for item in node_out.get(key, []): + params = {"filename": item["filename"], "type": item.get("type", "output")} + if item.get("subfolder"): + params["subfolder"] = item["subfolder"] + d = requests.get(f"http://{host}:8188/view", params=params, timeout=120).content + if len(d) >= 1024: + with open(out_path, "wb") as f: + f.write(d) + return out_path + raise RuntimeError("No downloadable asset returned by ComfyUI") + + # Maximum frames for a MiniMax H3 clip (~6.5s at 24fps). Longer clips take + # 30+ min on the RTX 4060; clips are looped/trimmed to segment length anyway. + H3_CLIP_CAP = 158 + + def _try_ai_video(self, pc, prompt, seed, duration_sec, raw_path, final_clip_path, idx): + """MiniMax H3 text-to-video clip, normalized to the segment duration.""" + h3_length = min(h3_snap_length(duration_sec), self.H3_CLIP_CAP) + logger.info(f"[VISUAL] Segment {idx+1}: MiniMax H3 AI video ({h3_length} frames)...") + wf = self._h3_workflow(prompt, seed, self.cfg.clip_width, self.cfg.clip_height, h3_length) + pid = self._submit(pc.host, wf) + outputs = self._wait_result(pc.host, pid, timeout_s=1200) + self._download_outputs(pc.host, outputs, raw_path) + return normalize_clip_to_duration(raw_path, final_clip_path, duration_sec) + + def _try_ai_image(self, pc, prompt, seed, duration_sec, raw_path, final_clip_path, idx): + """SDXL AI image animated with Ken Burns motion.""" + logger.info(f"[VISUAL] Segment {idx+1}: SDXL AI image + Ken Burns...") + pid = self._submit(pc.host, self._sdxl_workflow(prompt, seed)) + outputs = self._wait_result(pc.host, pid, timeout_s=300) + self._download_outputs(pc.host, outputs, raw_path) + return apply_ken_burns_effect(raw_path, final_clip_path, duration_sec, motion_type=idx) + + def _try_stock(self, query, duration_sec, raw_path, final_clip_path, idx, prefer_video): + """Stock video (looped/trimmed) or stock image (Ken Burns).""" + kind = "video" if prefer_video else "image" + logger.info(f"[VISUAL] Segment {idx+1}: stock {kind} for '{query}'...") + got = self.stock_fetcher.search_and_download(query, raw_path, prefer_video=prefer_video) + if not got or not os.path.exists(got): + raise RuntimeError(f"no stock {kind} found for '{query}'") + if got.lower().endswith((".mp4", ".webm", ".mov")): + return normalize_clip_to_duration(got, final_clip_path, duration_sec) + return apply_ken_burns_effect(got, final_clip_path, duration_sec, motion_type=idx) + + def _generate_segment_visual(self, pc: RemotePC, seg: Dict[str, Any], idx: int, out_dir: str, duration_sec: float) -> str: + """ + Produce one visual for a segment as an MP4 of exactly duration_sec. + + "hybrid" rotates across 4 styles for maximum variety: + AI video (MiniMax H3) -> stock video -> AI image (Ken Burns) -> stock image (Ken Burns) + Each source falls back to the next one in the rotation on failure. + """ + prompt = (seg.get("visual_prompt") or seg.get("text", "")) + ", cinematic documentary style, 8k, detailed" + stock_query = seg.get("stock_query") or seg.get("chapter_title") or seg.get("text", "")[:40] + seed = zlib.crc32(prompt.encode()) % (2**31) + + final_clip_path = os.path.join(out_dir, f"clip_{idx:03d}.mp4") + raw_video = os.path.join(out_dir, f"raw_vid_{idx:03d}.mp4") + raw_img = os.path.join(out_dir, f"raw_img_{idx:03d}.jpg") + + strategy = getattr(self.cfg, "visual_strategy", "hybrid") + attempts = { + "ai_video": lambda: self._try_ai_video(pc, prompt, seed, duration_sec, raw_video, final_clip_path, idx), + "stock_video": lambda: self._try_stock(stock_query, duration_sec, raw_video, final_clip_path, idx, prefer_video=True), + "ai_image": lambda: self._try_ai_image(pc, prompt, seed, duration_sec, raw_img, final_clip_path, idx), + "stock_image": lambda: self._try_stock(stock_query, duration_sec, raw_img, final_clip_path, idx, prefer_video=False), + } + if strategy == "all_ai": + order = ["ai_video", "ai_image", "stock_video", "stock_image"] + elif strategy == "stock_focused": + order = ["stock_video", "stock_image", "ai_video", "ai_image"] + else: # hybrid — rotate the starting source so all 4 styles appear + base = ["ai_video", "stock_video", "ai_image", "stock_image"] + order = base[idx % 4:] + base[:idx % 4] + + chosen_clip = None + for source in order: + try: + chosen_clip = attempts[source]() + break + except Exception as e: + logger.warning(f"[VISUAL] Segment {idx+1} source '{source}' failed: {e}") + errors.append(f"{source}: {e}") + + if not chosen_clip: + # Emergency color background — pipeline never dies on visuals + logger.warning(f"[VISUAL] Segment {idx+1}: all sources failed, using color background") + subprocess.run([ + "ffmpeg", "-y", "-f", "lavfi", "-i", f"color=c=0x0a1128:s=1280x720:d={duration_sec:.2f}", + "-r", "25", "-c:v", "libx264", "-preset", "ultrafast", "-pix_fmt", "yuv420p", "-an", final_clip_path + ], check=True, capture_output=True) + chosen_clip = final_clip_path + + # Apply dynamic 35mm film grain filter overlay if scene depicts past/historical events + if is_historical_scene(seg, topic=getattr(self.cfg, "topic", "")): + aged_tmp = os.path.join(out_dir, f"aged_{idx:03d}.mp4") + apply_film_grain_overlay(chosen_clip, aged_tmp) + if os.path.exists(aged_tmp) and os.path.getsize(aged_tmp) > 1000: + import shutil + shutil.move(aged_tmp, chosen_clip) + logger.info(f"[VISUAL] Segment {idx+1}: Applied authentic 35mm film grain & vintage aging overlay.") + + return chosen_clip + + def generate(self, script: Dict[str, Any], job_dir: str, segment_timings: Optional[List[Dict[str, Any]]] = None) -> Dict[str, List[str]]: + """ + Generate bilingual sequences of video clips matching each script segment. + Returns: {"en": List[str], "es": List[str]} + If on-screen text is present in a segment, generates distinct English and Spanish clips. + """ + segs = script.get("script_segments", []) + logger.info(f"[VISUAL] Producing {len(segs)} video clips (bilingual text-matching enabled)...") + pc = self.pcs.get("nvidiam") + if not pc or not pc.check(8188): + raise RuntimeError("NvidiaLLM ComfyUI is unreachable on port 8188") + + clips_dir = os.path.join(job_dir, "clips") + os.makedirs(clips_dir, exist_ok=True) + + clips_en = [] + clips_es = [] + + for i, seg in enumerate(segs): + t0 = time.time() + dur = segment_timings[i]["duration"] if segment_timings and i < len(segment_timings) else seg.get("duration_estimate", 18) + base_clip_path = self._generate_segment_visual(pc, seg, i, clips_dir, dur) + + text_en = (seg.get("on_screen_text") or "").strip() + text_es = (seg.get("on_screen_text_es") or text_en).strip() + + if text_en or text_es: + # Segment has on-screen text: render separate English and Spanish video clips + clip_en = os.path.join(clips_dir, f"clip_en_{i:03d}.mp4") + clip_es = os.path.join(clips_dir, f"clip_es_{i:03d}.mp4") + + apply_text_overlay(base_clip_path, clip_en, text_en, dur) + apply_text_overlay(base_clip_path, clip_es, text_es, dur) + + clips_en.append(clip_en) + clips_es.append(clip_es) + logger.info(f"[VISUAL] Clip {i+1}/{len(segs)} bilingual text applied: '{text_en}' (EN) / '{text_es}' (ES) in {time.time()-t0:.1f}s") + else: + # Clean visual clip without text is shared across both languages + clips_en.append(base_clip_path) + clips_es.append(base_clip_path) + logger.info(f"[VISUAL] Clip {i+1}/{len(segs)} generated in {time.time()-t0:.1f}s -> {os.path.basename(base_clip_path)}") + + return {"en": clips_en, "es": clips_es} diff --git a/pipeline/youtube_uploader.py b/pipeline/youtube_uploader.py new file mode 100644 index 0000000..d2a64e5 --- /dev/null +++ b/pipeline/youtube_uploader.py @@ -0,0 +1,197 @@ +""" +YouTube Data API v3 Uploader Module. +Handles OAuth2 authentication, video uploading, custom thumbnail uploading, +multi-language captions (.srt), YouTube chapters embedding, and metadata publishing. +""" + +import os +import json +import logging +from typing import Dict, Any, Optional, List + +logger = logging.getLogger("YTFactory.YouTube") + +SCOPES = [ + "https://www.googleapis.com/auth/youtube.upload", + "https://www.googleapis.com/auth/youtube.force-ssl" +] + +class YouTubeUploader: + def __init__( + self, + client_secrets_file: str = "client_secrets.json", + token_file: str = "youtube_token.json", + default_privacy: str = "private" + ): + self.client_secrets_file = client_secrets_file + self.token_file = token_file + self.default_privacy = default_privacy + self.youtube_service = None + + def is_configured(self) -> bool: + """Check if OAuth client secrets file exists.""" + return os.path.exists(self.client_secrets_file) or os.path.exists(self.token_file) + + def get_service(self): + """Authenticate and return YouTube API service client.""" + if self.youtube_service: + return self.youtube_service + + try: + from google.oauth2.credentials import Credentials + from google_auth_oauthlib.flow import InstalledAppFlow + from google.auth.transport.requests import Request + from googleapiclient.discovery import build + + creds = None + if os.path.exists(self.token_file): + creds = Credentials.from_authorized_user_file(self.token_file, SCOPES) + + if not creds or not creds.valid: + if creds and creds.expired and creds.refresh_token: + creds.refresh(Request()) + else: + if not os.path.exists(self.client_secrets_file): + raise FileNotFoundError( + f"YouTube OAuth secrets file '{self.client_secrets_file}' not found.\n" + "To enable YouTube API uploads, download your client_secrets.json from Google Cloud Console." + ) + flow = InstalledAppFlow.from_client_secrets_file(self.client_secrets_file, SCOPES) + creds = flow.run_local_server(port=0) + + with open(self.token_file, "w") as token: + token.write(creds.to_json()) + + self.youtube_service = build("youtube", "v3", credentials=creds) + return self.youtube_service + + except Exception as e: + logger.error(f"[YOUTUBE] Authentication failed: {e}") + raise + + def upload_video( + self, + video_path: str, + title: str, + description: str, + tags: List[str], + category_id: str = "27", # Education + privacy_status: Optional[str] = None + ) -> str: + """Upload video file to YouTube and return video ID.""" + from googleapiclient.http import MediaFileUpload + + service = self.get_service() + privacy = privacy_status or self.default_privacy + + logger.info(f"[YOUTUBE] Uploading video '{title}' ({privacy})...") + + body = { + "snippet": { + "title": title[:100], + "description": description, + "tags": tags, + "categoryId": category_id + }, + "status": { + "privacyStatus": privacy, + "selfDeclaredMadeForKids": False + } + } + + media = MediaFileUpload(video_path, chunksize=-1, resumable=True) + request = service.videos().insert(part="snippet,status", body=body, media_body=media) + + response = None + while response is None: + status, response = request.next_chunk() + if status: + logger.info(f"[YOUTUBE] Upload progress: {int(status.progress() * 100)}%") + + video_id = response.get("id") + logger.info(f"[YOUTUBE] Video uploaded successfully! ID: {video_id} -> https://youtu.be/{video_id}") + return video_id + + def set_thumbnail(self, video_id: str, thumbnail_path: str) -> bool: + """Upload custom thumbnail for a video.""" + from googleapiclient.http import MediaFileUpload + + if not os.path.exists(thumbnail_path): + logger.warning(f"[YOUTUBE] Thumbnail file not found: {thumbnail_path}") + return False + + try: + service = self.get_service() + logger.info(f"[YOUTUBE] Setting thumbnail for video {video_id}...") + media = MediaFileUpload(thumbnail_path, mimetype="image/png") + service.thumbnails().set(videoId=video_id, media_body=media).execute() + logger.info(f"[YOUTUBE] Thumbnail set successfully for {video_id}") + return True + except Exception as e: + logger.error(f"[YOUTUBE] Failed to set thumbnail: {e}") + return False + + def upload_caption(self, video_id: str, srt_path: str, lang: str = "en", name: str = "English") -> bool: + """Upload subtitle/caption track for a video.""" + from googleapiclient.http import MediaFileUpload + + if not os.path.exists(srt_path): + return False + + try: + service = self.get_service() + logger.info(f"[YOUTUBE] Uploading {lang} captions for video {video_id}...") + body = { + "snippet": { + "videoId": video_id, + "language": lang, + "name": name, + "isDraft": False + } + } + media = MediaFileUpload(srt_path, mimetype="application/x-subrip") + service.captions().insert(part="snippet", body=body, media_body=media).execute() + logger.info(f"[YOUTUBE] {lang} captions uploaded successfully.") + return True + except Exception as e: + logger.error(f"[YOUTUBE] Failed to upload captions: {e}") + return False + + def upload_bundle(self, bundle_meta_path: str, lang: str = "en", privacy_status: Optional[str] = None) -> Dict[str, Any]: + """Upload a complete packaged video bundle (video + metadata + thumbnail + captions).""" + with open(bundle_meta_path, "r", encoding="utf-8") as f: + meta = json.load(f) + + video_path = meta.get("files", {}).get(lang) + if not video_path or not os.path.exists(video_path): + raise FileNotFoundError(f"Video file for language '{lang}' not found in bundle.") + + title = meta.get("titles", ["Documentary"])[0] if lang == "en" else meta.get("titles_es", meta.get("titles", ["Documentary"]))[0] + desc = meta.get("description", "") if lang == "en" else meta.get("description_es", meta.get("description", "")) + tags = meta.get("tags", []) + + # Select best thumbnail + thumb_list = meta.get("thumbnails", {}).get(lang, []) or meta.get("thumbnails_raw", []) + thumb_path = thumb_list[0] if thumb_list else None + + srt_path = meta.get("subtitles", {}).get(lang) + + # 1. Upload Video + video_id = self.upload_video(video_path, title, desc, tags, privacy_status=privacy_status) + + # 2. Upload Thumbnail + if thumb_path: + self.set_thumbnail(video_id, thumb_path) + + # 3. Upload Captions + if srt_path: + caption_name = "English" if lang == "en" else "Spanish" + self.upload_caption(video_id, srt_path, lang=lang, name=caption_name) + + return { + "video_id": video_id, + "url": f"https://youtu.be/{video_id}", + "title": title, + "language": lang, + "privacy": privacy_status or self.default_privacy + } diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..9afc08f --- /dev/null +++ b/requirements.txt @@ -0,0 +1,10 @@ +# YouTube Factory - Dependencies +requests>=2.28.0 +pyyaml>=6.0 +numpy>=1.22.0 +edge-tts>=7.0.0 +aiohttp>=3.8.0 +Pillow>=9.0.0 +google-api-python-client>=2.0.0 +google-auth-oauthlib>=1.0.0 +google-auth-httplib2>=0.1.0 diff --git a/setup.sh b/setup.sh new file mode 100755 index 0000000..de56bb0 --- /dev/null +++ b/setup.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +# ============================================================================== +# YouTube Factory - One-Command Environment Setup +# Automates dependency checking and installation on any new machine. +# ============================================================================== + +set -e + +echo "==============================================================================" +echo "🚀 Setting up YouTube Factory Environment..." +echo "==============================================================================" + +# 1. Check Python +if ! command -v python3 &> /dev/null; then + echo "❌ python3 not found. Please install Python 3.9+." + exit 1 +fi + +echo "📦 Python version: $(python3 --version)" + +# 2. Upgrade pip and install Python dependencies +echo "📦 Installing Python packages from requirements.txt..." +python3 -m pip install --upgrade pip +python3 -m pip install -r requirements.txt + +# 3. Check system tools +echo "🔧 Checking system utilities (ffmpeg, ssh, scp, curl)..." +python3 -c "from pipeline.dependency_manager import ensure_dependencies; ensure_dependencies(auto_install=True, check_remote=True)" + +echo "==============================================================================" +echo "✅ Environment setup complete!" +echo "To test your connection to the 3 AI PCs, run:" +echo " python3 youtube_factory.py --health" +echo "To generate your first video, run:" +echo " python3 youtube_factory.py --topic 'The Mysteries of the Universe'" +echo "==============================================================================" diff --git a/start_nvidia.sh b/start_nvidia.sh new file mode 100755 index 0000000..5f44a5e --- /dev/null +++ b/start_nvidia.sh @@ -0,0 +1,77 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════════════════════ +# FIXED: start_nvidiam.sh (10.4.0.180) +# Safely boots Unsloth and vLLM-Omni on the same 16GB GPU without OOM crashes. +# ═══════════════════════════════════════════════════════════════════════════════ +set -e + +GREEN='\033[0;32m'; BLUE='\033[0;34m'; NC='\033[0m' +log() { echo -e "${BLUE}[NvidiaLLM]${NC} $1"; } +ok() { echo -e "${GREEN}[NvidiaLLM] ✅${NC} $1"; } + +log "Starting all NvidiaLLM services..." + +if [ ! -d "$HOME/venvs/youtube-factory-nvidia" ]; then + echo "❌ venv not found!" + exit 1 +fi + +source ~/venvs/youtube-factory-nvidia/bin/activate + +# 1. Brutally clean up any hung Python processes on these ports +log "Cleaning up old processes..." +pkill -f "unsloth.serve" || true +pkill -f "vllm_omni" || true +pkill -f "llm_server.py" || true +pkill -f "tts_server.py" || true +sleep 3 + +# 2. Start Unsloth LLM (GPU 0) +log "Starting Unsloth LLM on port 8001..." +CUDA_VISIBLE_DEVICES=0 \ +PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True \ +nohup python -m unsloth.serve \ + --model unsloth/Qwen3.5-7B-Instruct \ + --port 8001 \ + --max-model-len 8192 \ + > /tmp/unsloth-llm.log 2>&1 & + +sleep 5 +if curl -s http://localhost:8001/health > /dev/null 2>&1; then + ok "Unsloth LLM running on port 8001" +else + echo "⚠️ Unsloth still loading. Check: tail -f /tmp/unsloth-llm.log" +fi + +# 3. Start vLLM-Omni (GPU 0) with strict VRAM limits +log "Starting vLLM-Omni TTS on port 8000..." +CUDA_VISIBLE_DEVICES=0 \ +nohup python -m vllm_omni.entrypoints.cli.serve \ + --model step-audio-editx \ + --port 8000 \ + --dtype bfloat16 \ + --gpu-memory-utilization 0.55 \ + --enforce-eager \ + --max-model-len 4096 \ + --trust-remote-code \ + > /tmp/vllm-omni.log 2>&1 & + +sleep 5 +if curl -s http://localhost:8000/health > /dev/null 2>&1; then + ok "vLLM-Omni TTS running on port 8000" +else + echo "⚠️ vLLM-Omni still loading. Check: tail -f /tmp/vllm-omni.log" +fi + +# 4. Verify ComfyUI +if curl -s http://localhost:8188/system_stats > /dev/null 2>&1; then + ok "ComfyUI already running on port 8188" +else + echo "⚠️ ComfyUI not detected on port 8188." +fi + +echo "" +echo "📊 NvidiaLLM Status:" +echo " Unsloth LLM: http://10.4.0.180:8001" +echo " vLLM-Omni TTS: http://10.4.0.180:8000" +echo " ComfyUI: http://10.4.0.180:8188" diff --git a/temp/1786804388_History_of_ML_and_AI/audio_en.wav b/temp/1786804388_History_of_ML_and_AI/audio_en.wav new file mode 100644 index 0000000..1798e23 Binary files /dev/null and b/temp/1786804388_History_of_ML_and_AI/audio_en.wav differ diff --git a/temp/1786804388_History_of_ML_and_AI/audio_es.wav b/temp/1786804388_History_of_ML_and_AI/audio_es.wav new file mode 100644 index 0000000..ebefead Binary files /dev/null and b/temp/1786804388_History_of_ML_and_AI/audio_es.wav differ diff --git a/temp/1786804388_History_of_ML_and_AI/script.json b/temp/1786804388_History_of_ML_and_AI/script.json new file mode 100644 index 0000000..11c7d61 --- /dev/null +++ b/temp/1786804388_History_of_ML_and_AI/script.json @@ -0,0 +1,52 @@ +{ + "title_en": "The Future is Here: Unveiling the Rise of AGI", + "title_es": "La Era de la Inteligencia Artificial: El Llegado del AGI", + "description_en": "Discover the history of machine learning and AI, and what to expect from the emergence of AGI. From humble beginnings to the present day, we explore the milestones and innovations that will shape our future.", + "description_es": "Explora la historia del aprendizaje automático y la inteligencia artificial, y lo que podemos esperar del surgimiento del AGI. Desde sus inicios humildes hasta el presente, descubre los hitos y las innovaciones que moldearán nuestro futuro.", + "tags_en": [ + "AI", + "Machine Learning", + "AGI", + "FutureTech" + ], + "tags_es": [ + "IA", + "Aprendizaje Automático", + "AGI", + "Tecnología Futura" + ], + "thumbnail_prompt": "A futuristic cityscape with sleek skyscrapers and neon lights, with a subtle glow effect in the background, and a figure in the foreground with a tablet showing a holographic interface.", + "thumbnail_overlay_text": "Transforma el Futuro", + "script_segments": [ + { + "text_en": "Machine learning began in the 1950s with the development of the first neural networks.", + "text_es": "El aprendizaje automático comenzó en la década de 1950 con el desarrollo de las primeras redes neuronales.", + "visual_prompt": "A blackboard with equations and diagrams of neural networks, with a clock ticking in the background.", + "duration_estimate": 10 + }, + { + "text_en": "In the 1990s, the rise of big data and the internet enabled the development of more complex algorithms.", + "text_es": "En la década de 1990, el auge del big data y la internet permitió el desarrollo de algoritmos más complejos.", + "visual_prompt": "A graph showing the growth of the internet and data, with a laptop and a tablet in the foreground.", + "duration_estimate": 12 + }, + { + "text_en": "Fast forward to today, we have AGI on the horizon, with applications in healthcare, finance, and more.", + "text_es": "Fast forward a la actualidad, tenemos AGI en la horizonte, con aplicaciones en salud, finanzas y más.", + "visual_prompt": "A futuristic laboratory with scientists working on AGI projects, with a large screen displaying code and data.", + "duration_estimate": 10 + }, + { + "text_en": "But what does the future hold for humanity? Will AGI bring about a utopia or a dystopia?", + "text_es": "Pero ¿qué nos depara el futuro para la humanidad? ¿Un utopía o un dystopía?", + "visual_prompt": "A split-screen image with a utopian and dystopian landscape, with a question mark hovering above.", + "duration_estimate": 10 + }, + { + "text_en": "Join the conversation and let's explore the possibilities of AGI together.", + "text_es": "Únete a la conversación y explora las posibilidades del AGI juntos.", + "visual_prompt": "A group of people from different backgrounds and ages, sitting around a table with laptops and tablets, looking curious and excited.", + "duration_estimate": 8 + } + ] +} \ No newline at end of file diff --git a/temp/1786806569_History_of_ML_and_AI/audio_en.wav b/temp/1786806569_History_of_ML_and_AI/audio_en.wav new file mode 100644 index 0000000..e3c63f7 Binary files /dev/null and b/temp/1786806569_History_of_ML_and_AI/audio_en.wav differ diff --git a/temp/1786806569_History_of_ML_and_AI/script.json b/temp/1786806569_History_of_ML_and_AI/script.json new file mode 100644 index 0000000..c461873 --- /dev/null +++ b/temp/1786806569_History_of_ML_and_AI/script.json @@ -0,0 +1,52 @@ +{ + "title_en": "The Future of AI: From ML to AGI", + "title_es": "El Futuro de la Inteligencia Artificial: De ML a AGI", + "description_en": "Explore the history of Machine Learning and Artificial General Intelligence, and what's next for AI.", + "description_es": "Descubre la historia de la Inteligencia Artificial y la Inteligencia General Artificial, y lo que nos espera en el futuro.", + "tags_en": [ + "AI", + "Machine Learning", + "Artificial General Intelligence", + "Future" + ], + "tags_es": [ + "IA", + "Aprendizaje Automático", + "Inteligencia General Artificial", + "Futuro" + ], + "thumbnail_prompt": "A futuristic cityscape with a bright blue sky, neon lights, and a subtle AI-related glitch effect", + "thumbnail_overlay_text": "Revolutioniza la Inteligencia", + "script_segments": [ + { + "text_en": "Welcome to the future of AI, where Machine Learning has been the driving force behind incredible advancements.", + "text_es": "Bienvenidos al futuro de la inteligencia artificial, donde el aprendizaje automático ha impulsado avances increíbles.", + "visual_prompt": "A close-up of a person's eyes with a glowing blue light behind, representing the spark of innovation", + "duration_estimate": 5 + }, + { + "text_en": "From image recognition to natural language processing, ML has enabled us to build intelligent systems that can learn and adapt.", + "text_es": "De la reconocimiento de imágenes a el procesamiento del lenguaje natural, el aprendizaje automático nos ha permitido construir sistemas inteligentes que pueden aprender y adaptarse.", + "visual_prompt": "A shot of a computer screen displaying a complex algorithm, with lines and nodes connecting, representing the intricate workings of ML", + "duration_estimate": 8 + }, + { + "text_en": "But what about Artificial General Intelligence? Can we create machines that can think, reason, and learn like humans?", + "text_es": "Pero ¿qué hay de la inteligencia general? ¿Podemos crear máquinas que piensen, razonen y aprendan como los humanos?", + "visual_prompt": "A futuristic lab with a scientist working on a top-secret project, with a hint of uncertainty and excitement", + "duration_estimate": 10 + }, + { + "text_en": "As we edge closer to achieving AGI, we must consider the implications on our society, ethics, and the future of work.", + "text_es": "A medida que nos acercamos a lograr la inteligencia general, debemos considerar las implicaciones en nuestra sociedad, ética y el futuro del trabajo.", + "visual_prompt": "A split-screen comparison of a world with and without AGI, highlighting the potential benefits and risks", + "duration_estimate": 8 + }, + { + "text_en": "Join the conversation and share your thoughts on the future of AI and AGI.", + "text_es": "Únete a la conversación y comparte tus pensamientos sobre el futuro de la inteligencia artificial y la inteligencia general.", + "visual_prompt": "A group of people from diverse backgrounds and ages gathered around a table, discussing AI and AGI with passion and curiosity", + "duration_estimate": 5 + } + ] +} \ No newline at end of file diff --git a/temp/1786806569_History_of_ML_and_AI/tts_es_000.wav b/temp/1786806569_History_of_ML_and_AI/tts_es_000.wav new file mode 100644 index 0000000..b4c7ed9 Binary files /dev/null and b/temp/1786806569_History_of_ML_and_AI/tts_es_000.wav differ diff --git a/temp/1786806569_History_of_ML_and_AI/tts_es_001.wav b/temp/1786806569_History_of_ML_and_AI/tts_es_001.wav new file mode 100644 index 0000000..f594bc7 Binary files /dev/null and b/temp/1786806569_History_of_ML_and_AI/tts_es_001.wav differ diff --git a/temp/1786806569_History_of_ML_and_AI/tts_es_002.wav b/temp/1786806569_History_of_ML_and_AI/tts_es_002.wav new file mode 100644 index 0000000..29ae54e Binary files /dev/null and b/temp/1786806569_History_of_ML_and_AI/tts_es_002.wav differ diff --git a/temp/1786806569_History_of_ML_and_AI/tts_es_003.wav b/temp/1786806569_History_of_ML_and_AI/tts_es_003.wav new file mode 100644 index 0000000..82f2e9d Binary files /dev/null and b/temp/1786806569_History_of_ML_and_AI/tts_es_003.wav differ diff --git a/temp/1786807021_History_of_ML_and_AI/audio_en.wav b/temp/1786807021_History_of_ML_and_AI/audio_en.wav new file mode 100644 index 0000000..8b56e25 Binary files /dev/null and b/temp/1786807021_History_of_ML_and_AI/audio_en.wav differ diff --git a/temp/1786807021_History_of_ML_and_AI/audio_es.wav b/temp/1786807021_History_of_ML_and_AI/audio_es.wav new file mode 100644 index 0000000..fe4e94f Binary files /dev/null and b/temp/1786807021_History_of_ML_and_AI/audio_es.wav differ diff --git a/temp/1786807021_History_of_ML_and_AI/script.json b/temp/1786807021_History_of_ML_and_AI/script.json new file mode 100644 index 0000000..89b0796 --- /dev/null +++ b/temp/1786807021_History_of_ML_and_AI/script.json @@ -0,0 +1,52 @@ +{ + "title_en": "The Future is Now: The Rise of AGI", + "title_es": "El Futuro Ahora: El Ascenso del AGI", + "description_en": "Discover the history of Machine Learning and Artificial General Intelligence, and what to expect from the future.", + "description_es": "Explora la historia de la Inteligencia Artificial Máquina y la Inteligencia General Artificial, y lo que podemos esperar del futuro.", + "tags_en": [ + "Machine Learning", + "Artificial General Intelligence", + "AI", + "Future" + ], + "tags_es": [ + "Inteligencia Artificial Máquina", + "Inteligencia General Artificial", + "IA", + "Futuro" + ], + "thumbnail_prompt": "A futuristic cityscape with sleek skyscrapers and neon lights, with a faint glow of computers and robots in the background.", + "thumbnail_overlay_text": "Transforma el Futuro", + "script_segments": [ + { + "text_en": "Welcome to the future of AI, where machines are becoming increasingly intelligent and autonomous.", + "text_es": "Bienvenidos al futuro de la inteligencia artificial, donde las máquinas están volviendo cada vez más inteligentes y autónomas.", + "visual_prompt": "A shot of a city street with self-driving cars and drones flying overhead.", + "duration_estimate": 5 + }, + { + "text_en": "From the early days of Machine Learning, to the current advancements in Deep Learning and Reinforcement Learning.", + "text_es": "Desde los primeros días de la Inteligencia Artificial Máquina, hasta las actualizaciones actuales en Aprendizaje Profundo y Aprendizaje por Refuerzo.", + "visual_prompt": "A split-screen comparison of old and new AI systems, with a robotic arm reaching for a puzzle piece.", + "duration_estimate": 6 + }, + { + "text_en": "But what does the future hold for AGI? Can machines truly surpass human intelligence?", + "text_es": "Pero ¿qué nos espera el futuro del AGI? ¿Pueden las máquinas verdaderamente superar la inteligencia humana?", + "visual_prompt": "A futuristic laboratory with scientists working on a top-secret project, with a glowing screen displaying a brain-like structure.", + "duration_estimate": 7 + }, + { + "text_en": "Join us as we explore the possibilities and challenges of AGI, and what it means for humanity.", + "text_es": "Únete a nosotros mientras exploramos las posibilidades y desafíos del AGI, y lo que eso significa para la humanidad.", + "visual_prompt": "A shot of a person looking at a computer screen with a cityscape in the background, symbolizing the connection between humans and machines.", + "duration_estimate": 5 + }, + { + "text_en": "The future of AI is here, and it's going to change everything.", + "text_es": "El futuro de la inteligencia artificial está aquí, y va a cambiar todo.", + "visual_prompt": "A dramatic shot of a robot standing in front of a city skyline, with a bold, futuristic font displaying the words \"The Future is Now\".", + "duration_estimate": 8 + } + ] +} \ No newline at end of file diff --git a/temp/1786808009_History_of_ML_and_AI/audio_en.wav b/temp/1786808009_History_of_ML_and_AI/audio_en.wav new file mode 100644 index 0000000..57b215f Binary files /dev/null and b/temp/1786808009_History_of_ML_and_AI/audio_en.wav differ diff --git a/temp/1786808009_History_of_ML_and_AI/audio_es.wav b/temp/1786808009_History_of_ML_and_AI/audio_es.wav new file mode 100644 index 0000000..215d6ad Binary files /dev/null and b/temp/1786808009_History_of_ML_and_AI/audio_es.wav differ diff --git a/temp/1786808009_History_of_ML_and_AI/script.json b/temp/1786808009_History_of_ML_and_AI/script.json new file mode 100644 index 0000000..0d88388 --- /dev/null +++ b/temp/1786808009_History_of_ML_and_AI/script.json @@ -0,0 +1,52 @@ +{ + "title_en": "From Code to Consciousness: The Rise of AGI", + "title_es": "De Código a Conciencia: El Ascenso de la AGI", + "description_en": "Discover the history of Machine Learning and Artificial General Intelligence, and what's next for the future of tech.", + "description_es": "Explora la historia del Aprendizaje Automático y la Inteligencia General Artificial, y lo que esto significa para el futuro de la tecnología.", + "tags_en": [ + "Artificial General Intelligence", + "Machine Learning", + "AI History", + "Tech Future" + ], + "tags_es": [ + "Inteligencia General Artificial", + "Aprendizaje Automático", + "Historia de la Inteligencia Artificial", + "Futuro de la Tecnología" + ], + "thumbnail_prompt": "A futuristic cityscape with a glowing neon sign reading 'AGI' in the distance, with a subtle robotic arm in the foreground.", + "thumbnail_overlay_text": "El Futuro de la Inteligencia", + "script_segments": [ + { + "text_en": "In the early 1950s, computer scientists like Alan Turing and Marvin Minsky began exploring the concept of Artificial Intelligence.", + "text_es": "En la década de 1950, los científicos de computadora como Alan Turing y Marvin Minsky comenzaron a explorar la idea de la Inteligencia Artificial.", + "visual_prompt": "A black and white image of Alan Turing working at a computer, with a faint cityscape in the background.", + "duration_estimate": 5 + }, + { + "text_en": "The 1980s saw the rise of Machine Learning, with the introduction of neural networks and the backpropagation algorithm.", + "text_es": "Los años ochenta vieron el surgimiento del Aprendizaje Automático, con la introducción de redes neuronales y el algoritmo de retropropagación.", + "visual_prompt": "A split-screen image of a brain scan and a computer screen displaying a neural network diagram.", + "duration_estimate": 8 + }, + { + "text_en": "Fast forward to today, we have made tremendous progress in AI, with applications in image recognition, natural language processing, and more.", + "text_es": "En el presente, hemos avanzado enormemente en la Inteligencia Artificial, con aplicaciones en reconocimiento de imágenes, procesamiento de lenguaje natural y más.", + "visual_prompt": "A futuristic laboratory with robots and scientists working together, surrounded by screens displaying AI-related data.", + "duration_estimate": 10 + }, + { + "text_en": "But what about Artificial General Intelligence? Can we create machines that think like humans?", + "text_es": "Pero ¿qué hay de la Inteligencia General? ¿Podemos crear máquinas que piensen como los humanos?", + "visual_prompt": "A close-up shot of a robot's face, with a question mark hovering above its head.", + "duration_estimate": 8 + }, + { + "text_en": "The future of AGI is uncertain, but one thing is clear: it will revolutionize industries and change the world.", + "text_es": "El futuro de la AGI es incierto, pero una cosa es segura: cambiará industrias y cambiará el mundo.", + "visual_prompt": "A panoramic shot of a cityscape at sunset, with a subtle glow emanating from the horizon.", + "duration_estimate": 10 + } + ] +} \ No newline at end of file diff --git a/temp/1786872060_The_Deep_Secrets_of_the_M/script.json b/temp/1786872060_The_Deep_Secrets_of_the_M/script.json new file mode 100644 index 0000000..b4f04b4 --- /dev/null +++ b/temp/1786872060_The_Deep_Secrets_of_the_M/script.json @@ -0,0 +1,78 @@ +{ + "titles": [ + "Mysteries of the Deep Mariana Trench", + "Discovering the Unknown Mariana Trench", + "Hidden Secrets of the Mariana Trench" + ], + "hook": "What lies in the deepest part of the ocean?", + "description": "Dive into the enigmatic Mariana Trench, the deepest part of the ocean, where pressure is intense and life thrives in ways you can hardly imagine. From ancient creatures to scientific wonders, this documentary reveals the secrets of the Mariana Trench. #Documentary #Science #OceanExploration", + "tags": [ + "deep ocean", + "Mariana Trench", + "ocean floor", + "pressure", + "underwater discovery", + "marine life", + "scientific exploration", + "underwater adventure", + "ocean depths", + "oceangoing", + "marine biology", + "underwater mysteries", + "scientific research" + ], + "script_segments": [ + { + "chapter_title": "The Ancient Mystery", + "text": "Dive into the deepest part of the ocean, where the pressure is intense and the mysteries are ancient. The Mariana Trench, a place where sunlight barely penetrates, is home to secrets waiting to be uncovered.", + "visual_prompt": "Cinematic lighting, deep blue waters, shadowy depths, underwater exploration vehicle approaching.", + "stock_query": "deep ocean exploration", + "duration_estimate": 18, + "text_es": "Sumérgete en la parte más profunda del océano, donde la presión es intensa y los misterios son antiguos. La Trench Mariana, un lugar donde apenas el sol logra penetrar, es hogar de secretos que esperan ser desvelados.", + "chapter_title_es": "El Misterio Antiguo" + }, + { + "chapter_title": "The Critical Discovery", + "text": "In 1960, Swiss engineer Jacques Piccard and U.S. Navy Lieutenant Don Walsh embarked on a historic mission. Their submersible, the Trieste, descended into the abyss, unveiling a world of unknown life forms and geological wonders.", + "visual_prompt": "Submersible Trieste submerged, close-up of pressure-resistant windows, dramatic ocean depths with mysterious creatures.", + "stock_query": "submersible trieste", + "duration_estimate": 18, + "text_es": "En 1960, el ingeniero suizo Jacques Piccard y el teniente de la Marina de EE. UU. Don Walsh emprendieron una misión histórica. Su sumergible, el Trieste, descendió al abismo, revelando un mundo de formas de vida desconocidas y maravillas geológicas.", + "chapter_title_es": "La Descubierta Vital" + }, + { + "chapter_title": "The Unseen Wonders", + "text": "In 2012, James Cameron returned to the trench, capturing the first solo human dive. He discovered unique species, including snailfish, thriving in conditions once thought impossible for life.", + "visual_prompt": "James Cameron’s submersible, close-up of snailfish, underwater landscapes with vibrant colors and life.", + "stock_query": "james cameron submersible", + "duration_estimate": 18, + "text_es": "En 2012, James Cameron regresó a la tumba, capturando el primer baño solo humano. Descubrió especies únicas, como las pez-escama, prosperando en condiciones que se pensaba que eran imposibles para la vida.", + "chapter_title_es": "Las Maravillas Ocultas" + }, + { + "chapter_title": "The Scientific Frontier", + "text": "Today, scientists continue to explore the trench, studying the unique microbiology and geology. Their findings could unlock new insights into life on Earth and beyond.", + "visual_prompt": "Scientists in lab, close-up of microscopes, geologists studying rocks, underwater exploration footage.", + "stock_query": "scientific exploration", + "duration_estimate": 18, + "text_es": "Hoy en día, los científicos continúan explorando la tumba, estudiando la microbiología y la geología únicas. Sus hallazgos podrían abrir nuevas perspectivas sobre la vida en la Tierra y más allá.", + "chapter_title_es": "La Frontera Científica" + }, + { + "chapter_title": "The Enduring Enigma", + "text": "The Mariana Trench remains one of the last frontiers on Earth, a place of endless mystery and wonder. As we continue to explore, we unravel the secrets of this deep-sea world, one that holds the key to our own planet’s story.", + "visual_prompt": "Dramatic ocean scenes, submersibles returning to the surface, scientists celebrating their discoveries.", + "stock_query": "endless mystery", + "duration_estimate": 18, + "text_es": "La Trench Mariana sigue siendo una de las últimas fronteras de la Tierra, un lugar de misterio y maravilla sin fin. A medida que continúamos explorando, desentrañamos los secretos de este mundo subacuático profundo, que contiene las claves de nuestra propia historia planetaria.", + "chapter_title_es": "El Enigma Duradero" + } + ], + "title": "Mysteries of the Deep Mariana Trench", + "titles_es": [ + "Misterios Profundos de la Trench Mariana", + "Descubriendo lo Desconocido en la Trench Mariana", + "Secretos Ocultos en la Trench Mariana" + ], + "description_es": "Sumérgete en el misterioso Mariana Trench, la parte más profunda del océano, donde la presión es intensa y la vida prospera de maneras que casi no puedes imaginar. Desde criaturas antiguas hasta maravillas científicas, este documental revela los secretos del Mariana Trench. #Documental #Ciencia #ExploraciónOceánica" +} \ No newline at end of file diff --git a/temp/1786872191_The_Secrets_of_the_Marian/background_music.wav b/temp/1786872191_The_Secrets_of_the_Marian/background_music.wav new file mode 100644 index 0000000..ebdacc3 Binary files /dev/null and b/temp/1786872191_The_Secrets_of_the_Marian/background_music.wav differ diff --git a/temp/1786872191_The_Secrets_of_the_Marian/clips/stock_raw_000.mp4 b/temp/1786872191_The_Secrets_of_the_Marian/clips/stock_raw_000.mp4 new file mode 100644 index 0000000..d963c39 Binary files /dev/null and b/temp/1786872191_The_Secrets_of_the_Marian/clips/stock_raw_000.mp4 differ diff --git a/temp/1786872191_The_Secrets_of_the_Marian/clips/stock_raw_001.mp4 b/temp/1786872191_The_Secrets_of_the_Marian/clips/stock_raw_001.mp4 new file mode 100644 index 0000000..ffb6044 Binary files /dev/null and b/temp/1786872191_The_Secrets_of_the_Marian/clips/stock_raw_001.mp4 differ diff --git a/temp/1786872191_The_Secrets_of_the_Marian/clips/stock_raw_002.mp4 b/temp/1786872191_The_Secrets_of_the_Marian/clips/stock_raw_002.mp4 new file mode 100644 index 0000000..e7e9c09 Binary files /dev/null and b/temp/1786872191_The_Secrets_of_the_Marian/clips/stock_raw_002.mp4 differ diff --git a/temp/1786872191_The_Secrets_of_the_Marian/clips/stock_raw_003.mp4 b/temp/1786872191_The_Secrets_of_the_Marian/clips/stock_raw_003.mp4 new file mode 100644 index 0000000..5c20576 Binary files /dev/null and b/temp/1786872191_The_Secrets_of_the_Marian/clips/stock_raw_003.mp4 differ diff --git a/temp/1786872191_The_Secrets_of_the_Marian/script.json b/temp/1786872191_The_Secrets_of_the_Marian/script.json new file mode 100644 index 0000000..0c75c52 --- /dev/null +++ b/temp/1786872191_The_Secrets_of_the_Marian/script.json @@ -0,0 +1,69 @@ +{ + "titles": [ + "Mysteries of the Deepest Sea", + "The Mariana Trench: Unveiling Secrets", + "Dive into the Dark Depths" + ], + "hook": "What lies at the bottom of the ocean?", + "description": "Dive into the uncharted depths of the Mariana Trench, the deepest point on Earth. Discover the unique ecosystem, mysterious creatures, and scientific secrets hidden in its shadow. #Documentary #Science #Ocean", + "tags": [ + "documentary", + "oceanography", + "marine biology", + "deep sea", + "Mariana Trench", + "ocean floor", + "scientific exploration", + "underwater life", + "marine ecology", + "underwater mystery", + "deep sea discovery", + "sea exploration", + "ocean trenches" + ], + "script_segments": [ + { + "chapter_title": "The Ancient Mystery", + "text": "In the Mariana Trench, 36,000 feet below the surface, lies an ancient mystery. Explore the deepest point on Earth, a place untouched by sunlight, where life thrives in darkness.", + "visual_prompt": "Cinematic lighting, deep blue ocean, camera angle looking down into the trench, 8k documentary style", + "stock_query": "deep ocean trench", + "duration_estimate": 18, + "text_es": "En el Trench Mariana, a 36,000 pies bajo la superficie, se esconde un misterio antiguo. Explora el punto más profundo de la Tierra, un lugar que nunca ha visto la luz del sol, donde la vida sobrevive en la oscuridad.", + "chapter_title_es": "El Misterio Antiguo" + }, + { + "chapter_title": "The Critical Discovery", + "text": "In 1960, Swiss engineer Jacques Piccard descended into this abyss. His voyage marked the first and only human visit to the Challenger Deep. What did he find?", + "visual_prompt": "Vintage submarine, camera angle inside the submarine, 8k documentary style, cinematic lighting", + "stock_query": "piccard submarine", + "duration_estimate": 17, + "text_es": "En 1960, el ingeniero suizo Jacques Piccard descendió hasta este abismo. Su viaje marcó la primera y única visita humana al Challenger Deep. ¿Qué encontró?", + "chapter_title_es": "El Descubrimiento Crítico" + }, + { + "chapter_title": "Beneath the Surface", + "text": "Today, scientists continue to uncover the secrets of this dark realm. Strange creatures, unique ecosystems, and rare minerals await exploration.", + "visual_prompt": "Underwater creatures, camera angle looking up from the surface, 8k documentary style, cinematic lighting", + "stock_query": "underwater creatures", + "duration_estimate": 15, + "text_es": "Hoy en día, los científicos continúan desvelando los secretos de este reino oscuro. Criaturas extrañas, ecosistemas únicos y minerales raros esperan ser explorados.", + "chapter_title_es": "Bajo la Superficie" + }, + { + "chapter_title": "Unlocking Mysteries", + "text": "The Mariana Trench holds more mysteries than we can imagine. As we delve deeper, the future of exploration and discovery unfolds.", + "visual_prompt": "Scientific equipment, camera angle showing depth gauge, 8k documentary style, cinematic lighting", + "stock_query": "scientific equipment", + "duration_estimate": 16, + "text_es": "El Trench Mariana alberga más misterios de los que podemos imaginar. A medida que nos adentramos más, se despliega el futuro de la exploración y la descubrimiento.", + "chapter_title_es": "Desvelando Misterios" + } + ], + "title": "Mysteries of the Deepest Sea", + "titles_es": [ + "Misterios del Mar Más Profundo", + "La Marea Mariana: Revelando Secretos", + "Sumérgete en las Profundidades Oscuras" + ], + "description_es": "Sumérgete en las profundidades sin explorar del Trench Mariana, el punto más profundo de la Tierra. Descubre el ecosistema único, criaturas misteriosas y secretos científicos ocultos en su sombra. #Documentario #Ciencia #Océano" +} \ No newline at end of file diff --git a/temp/1786872191_The_Secrets_of_the_Marian/subtitles_en.srt b/temp/1786872191_The_Secrets_of_the_Marian/subtitles_en.srt new file mode 100644 index 0000000..425b3ab --- /dev/null +++ b/temp/1786872191_The_Secrets_of_the_Marian/subtitles_en.srt @@ -0,0 +1,68 @@ +1 +00:00:00,000 --> 00:00:02,780 +In the Mariana Trench, 36 ,000 + +2 +00:00:02,780 --> 00:00:04,700 +feet below the surface lies an + +3 +00:00:04,700 --> 00:00:07,500 +ancient mystery. Explore the deepest point + +4 +00:00:07,500 --> 00:00:09,440 +on Earth, a place untouched by + +5 +00:00:09,440 --> 00:00:11,760 +sunlight, where life thrives in darkness. + +6 +00:00:12,600 --> 00:00:15,640 +In 1960, Swiss engineer Jacques Pickard + +7 +00:00:15,640 --> 00:00:18,100 +descended into this abyss. His voyage + +8 +00:00:18,100 --> 00:00:19,920 +marked the first and only human + +9 +00:00:19,920 --> 00:00:22,000 +visit to the challenger deep. What + +10 +00:00:22,000 --> 00:00:25,020 +did he find? Today, scientists continue + +11 +00:00:25,020 --> 00:00:26,560 +to uncover the secrets of this + +12 +00:00:26,560 --> 00:00:30,080 +dark realm. Strange creatures, unique ecosystems, + +13 +00:00:30,680 --> 00:00:33,640 +and rare minerals await exploration. The + +14 +00:00:33,640 --> 00:00:35,960 +Mariana Trench holds more mysteries than + +15 +00:00:35,960 --> 00:00:38,000 +we can imagine. As we delve + +16 +00:00:38,000 --> 00:00:40,380 +deeper, the future of exploration and + +17 +00:00:40,380 --> 00:00:41,860 +discovery unfolds. + diff --git a/temp/1786872191_The_Secrets_of_the_Marian/subtitles_es.srt b/temp/1786872191_The_Secrets_of_the_Marian/subtitles_es.srt new file mode 100644 index 0000000..3e55333 --- /dev/null +++ b/temp/1786872191_The_Secrets_of_the_Marian/subtitles_es.srt @@ -0,0 +1,72 @@ +1 +00:00:00,000 --> 00:00:01,900 +En el Trench Mariana, a 36 + +2 +00:00:01,900 --> 00:00:04,600 +,000 pies bajula superficie, se escandan + +3 +00:00:04,600 --> 00:00:06,920 +misterio ante guio. Explora el punto + +4 +00:00:06,920 --> 00:00:08,820 +más profundo de la tierra, un + +5 +00:00:08,820 --> 00:00:11,240 +lugar cuenancajavistula las del sol, don + +6 +00:00:11,240 --> 00:00:13,120 +la vida sobrevivía y la oscuridad. + +7 +00:00:13,520 --> 00:00:16,060 +En 1960, el ingeniero suizo Jack + +8 +00:00:16,060 --> 00:00:18,640 +Pickard descendió a Estabismo, su voyage + +9 +00:00:18,640 --> 00:00:20,520 +marcó la primer y única visita + +10 +00:00:20,520 --> 00:00:22,660 +humana al challenger deep. Cue en + +11 +00:00:22,660 --> 00:00:26,340 +control. Poyendaia, loscientificos continuan disvolando + +12 +00:00:26,340 --> 00:00:29,440 +los secretos de esterino oscuro. Criaturas + +13 +00:00:29,440 --> 00:00:32,680 +extrañas, ecosystemas unicos, why minerals, raros, + +14 +00:00:33,000 --> 00:00:35,400 +espurns, ser explorados. El Trench Mariana, + +15 +00:00:35,580 --> 00:00:37,800 +alberga mas misterios de los cuepadimos + +16 +00:00:37,800 --> 00:00:40,320 +imaginar. A medida que nos adentramos + +17 +00:00:40,320 --> 00:00:42,560 +mas, se despliegue el futuro de + +18 +00:00:42,560 --> 00:00:44,520 +la exploración y la descubrimiento. + diff --git a/temp/1786872191_The_Secrets_of_the_Marian/tts_en_000.wav b/temp/1786872191_The_Secrets_of_the_Marian/tts_en_000.wav new file mode 100644 index 0000000..dcbc1f0 Binary files /dev/null and b/temp/1786872191_The_Secrets_of_the_Marian/tts_en_000.wav differ diff --git a/temp/1786872191_The_Secrets_of_the_Marian/tts_en_001.wav b/temp/1786872191_The_Secrets_of_the_Marian/tts_en_001.wav new file mode 100644 index 0000000..4ea911f Binary files /dev/null and b/temp/1786872191_The_Secrets_of_the_Marian/tts_en_001.wav differ diff --git a/temp/1786872191_The_Secrets_of_the_Marian/tts_en_002.wav b/temp/1786872191_The_Secrets_of_the_Marian/tts_en_002.wav new file mode 100644 index 0000000..1eafe79 Binary files /dev/null and b/temp/1786872191_The_Secrets_of_the_Marian/tts_en_002.wav differ diff --git a/temp/1786872191_The_Secrets_of_the_Marian/tts_en_003.wav b/temp/1786872191_The_Secrets_of_the_Marian/tts_en_003.wav new file mode 100644 index 0000000..fe2a88b Binary files /dev/null and b/temp/1786872191_The_Secrets_of_the_Marian/tts_en_003.wav differ diff --git a/temp/1786872191_The_Secrets_of_the_Marian/tts_es_000.wav b/temp/1786872191_The_Secrets_of_the_Marian/tts_es_000.wav new file mode 100644 index 0000000..be0c42f Binary files /dev/null and b/temp/1786872191_The_Secrets_of_the_Marian/tts_es_000.wav differ diff --git a/temp/1786872191_The_Secrets_of_the_Marian/tts_es_001.wav b/temp/1786872191_The_Secrets_of_the_Marian/tts_es_001.wav new file mode 100644 index 0000000..f45353f Binary files /dev/null and b/temp/1786872191_The_Secrets_of_the_Marian/tts_es_001.wav differ diff --git a/temp/1786872191_The_Secrets_of_the_Marian/tts_es_002.wav b/temp/1786872191_The_Secrets_of_the_Marian/tts_es_002.wav new file mode 100644 index 0000000..5259012 Binary files /dev/null and b/temp/1786872191_The_Secrets_of_the_Marian/tts_es_002.wav differ diff --git a/temp/1786872191_The_Secrets_of_the_Marian/tts_es_003.wav b/temp/1786872191_The_Secrets_of_the_Marian/tts_es_003.wav new file mode 100644 index 0000000..81b3aab Binary files /dev/null and b/temp/1786872191_The_Secrets_of_the_Marian/tts_es_003.wav differ diff --git a/temp/1786872191_The_Secrets_of_the_Marian/voiceover_en.wav b/temp/1786872191_The_Secrets_of_the_Marian/voiceover_en.wav new file mode 100644 index 0000000..234b531 Binary files /dev/null and b/temp/1786872191_The_Secrets_of_the_Marian/voiceover_en.wav differ diff --git a/temp/1786872191_The_Secrets_of_the_Marian/voiceover_es.wav b/temp/1786872191_The_Secrets_of_the_Marian/voiceover_es.wav new file mode 100644 index 0000000..485d681 Binary files /dev/null and b/temp/1786872191_The_Secrets_of_the_Marian/voiceover_es.wav differ diff --git a/temp/1786872595_The_Mystery_of_the_Marian/background_music.wav b/temp/1786872595_The_Mystery_of_the_Marian/background_music.wav new file mode 100644 index 0000000..7b3782c Binary files /dev/null and b/temp/1786872595_The_Mystery_of_the_Marian/background_music.wav differ diff --git a/temp/1786872595_The_Mystery_of_the_Marian/script.json b/temp/1786872595_The_Mystery_of_the_Marian/script.json new file mode 100644 index 0000000..378b6b3 --- /dev/null +++ b/temp/1786872595_The_Mystery_of_the_Marian/script.json @@ -0,0 +1,68 @@ +{ + "titles": [ + "Mysteries of the Mariana Trench", + "Unveiling the Deepest Point on Earth", + "Exploring the Unseen Mariana Trench" + ], + "hook": "What lies at the bottom of the Mariana Trench?", + "description": "Dive into the enigmatic depths of the Mariana Trench, the deepest part of the world's oceans. Discover the unique creatures, extreme pressures, and mysterious phenomena that await explorers. #Documentary #Science #MarianaTrench", + "tags": [ + "documentary", + "science", + "oceanography", + "Mariana Trench", + "deep sea", + "pressure", + "creatures", + "exploration", + "oceans", + "environment", + "earth", + "nature" + ], + "script_segments": [ + { + "chapter_title": "Ancient Mystery", + "text": "The Mariana Trench, a place of unimaginable depths and pressure. It was only in the 20th century that we dared to explore its secrets.", + "visual_prompt": "A deep ocean shot at sunset, with waves and mist. A research vessel approaching the trench, surrounded by dark, mysterious waters.", + "stock_query": "deep ocean exploration", + "duration_estimate": 18, + "text_es": "El Trench de Mariana, un lugar de profundidades y presiones inimaginables. Fue solo en el siglo XX que osamos explorar sus secretos.", + "chapter_title_es": "Misterio Antiguo" + }, + { + "chapter_title": "Critical Discovery", + "text": "In 1960, Swiss oceanographer Jacques Piccard and US Navy Lieutenant Don Walsh made history by descending to the Challenger Deep, the deepest known point on Earth.", + "visual_prompt": "A dramatic close-up of a submersible vessel descending into the abyss, with a blue and black gradient background.", + "stock_query": "challenger deep", + "duration_estimate": 18, + "text_es": "En 1960, el oceanólogo suizo Jacques Piccard y el teniente de la Marina de EE.UU. Don Walsh hicieron historia al descendern hasta el Challenger Deep, el punto más profundo conocido de la Tierra.", + "chapter_title_es": "Descubrimiento Crítico" + }, + { + "chapter_title": "Mysterious Creatures", + "text": "But the true mystery lies in the creatures that thrive in this alien world. They adapt to pressures that would crush a human in seconds.", + "visual_prompt": "A close-up of an unidentified deep-sea creature with bioluminescent features in a dark, underwater environment.", + "stock_query": "deep sea creatures", + "duration_estimate": 18, + "text_es": "Pero el verdadero misterio reside en las criaturas que prosperan en este mundo alienígena. Adaptan su organismo a presiones que triturarían a un humano en cuestión de segundos.", + "chapter_title_es": "Criaturas Misteriosas" + }, + { + "chapter_title": "Unsolved Enigmas", + "text": "Today, the Mariana Trench remains a place of endless intrigue and discovery. What new mysteries lie hidden in its depths, waiting to be revealed?", + "visual_prompt": "An aerial shot of the trench, with a research vessel and submersibles in the foreground. The trench appears as a dark, mysterious chasm against a bright blue sky.", + "stock_query": "Mariana Trench exploration", + "duration_estimate": 18, + "text_es": "Hoy en día, el Trench de Mariana sigue siendo un lugar de intrigas y descubrimientos infinitos. ¿Qué nuevas misterios se ocultan en sus profundidades, esperando ser revelados?", + "chapter_title_es": "Enigmas Sin Resolver" + } + ], + "title": "Mysteries of the Mariana Trench", + "titles_es": [ + "Misterios del Trench de Mariana", + "Desvelando el Punto Más Profundo de la Tierra", + "Explorando el Trench Invisible" + ], + "description_es": "Sumérgete en las profundidades enigmáticas del Trench de Mariana, la parte más profunda de los océanos del mundo. Descubre las criaturas únicas, las presiones extremas y los fenómenos misteriosos que esperan a los exploradores. #Documental #Ciencia #TrenchMariana" +} \ No newline at end of file diff --git a/temp/1786872595_The_Mystery_of_the_Marian/tts_en_000.wav b/temp/1786872595_The_Mystery_of_the_Marian/tts_en_000.wav new file mode 100644 index 0000000..3e12e3c Binary files /dev/null and b/temp/1786872595_The_Mystery_of_the_Marian/tts_en_000.wav differ diff --git a/temp/1786872595_The_Mystery_of_the_Marian/tts_en_001.wav b/temp/1786872595_The_Mystery_of_the_Marian/tts_en_001.wav new file mode 100644 index 0000000..7a3efdd Binary files /dev/null and b/temp/1786872595_The_Mystery_of_the_Marian/tts_en_001.wav differ diff --git a/temp/1786872595_The_Mystery_of_the_Marian/tts_en_002.wav b/temp/1786872595_The_Mystery_of_the_Marian/tts_en_002.wav new file mode 100644 index 0000000..c42906a Binary files /dev/null and b/temp/1786872595_The_Mystery_of_the_Marian/tts_en_002.wav differ diff --git a/temp/1786872595_The_Mystery_of_the_Marian/tts_en_003.wav b/temp/1786872595_The_Mystery_of_the_Marian/tts_en_003.wav new file mode 100644 index 0000000..620a56b Binary files /dev/null and b/temp/1786872595_The_Mystery_of_the_Marian/tts_en_003.wav differ diff --git a/temp/1786872595_The_Mystery_of_the_Marian/tts_es_000.wav b/temp/1786872595_The_Mystery_of_the_Marian/tts_es_000.wav new file mode 100644 index 0000000..adddb04 Binary files /dev/null and b/temp/1786872595_The_Mystery_of_the_Marian/tts_es_000.wav differ diff --git a/temp/1786872595_The_Mystery_of_the_Marian/tts_es_001.wav b/temp/1786872595_The_Mystery_of_the_Marian/tts_es_001.wav new file mode 100644 index 0000000..8c07cbb Binary files /dev/null and b/temp/1786872595_The_Mystery_of_the_Marian/tts_es_001.wav differ diff --git a/temp/1786872595_The_Mystery_of_the_Marian/tts_es_002.wav b/temp/1786872595_The_Mystery_of_the_Marian/tts_es_002.wav new file mode 100644 index 0000000..8a1f0a9 Binary files /dev/null and b/temp/1786872595_The_Mystery_of_the_Marian/tts_es_002.wav differ diff --git a/temp/1786872595_The_Mystery_of_the_Marian/tts_es_003.wav b/temp/1786872595_The_Mystery_of_the_Marian/tts_es_003.wav new file mode 100644 index 0000000..e087fd0 Binary files /dev/null and b/temp/1786872595_The_Mystery_of_the_Marian/tts_es_003.wav differ diff --git a/temp/1786872595_The_Mystery_of_the_Marian/voiceover_en.wav b/temp/1786872595_The_Mystery_of_the_Marian/voiceover_en.wav new file mode 100644 index 0000000..9ae40f9 Binary files /dev/null and b/temp/1786872595_The_Mystery_of_the_Marian/voiceover_en.wav differ diff --git a/temp/1786872595_The_Mystery_of_the_Marian/voiceover_es.wav b/temp/1786872595_The_Mystery_of_the_Marian/voiceover_es.wav new file mode 100644 index 0000000..03dac73 Binary files /dev/null and b/temp/1786872595_The_Mystery_of_the_Marian/voiceover_es.wav differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/background_music.wav b/temp/1786872908_The_Secrets_of_the_Marian/background_music.wav new file mode 100644 index 0000000..3712c83 Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/background_music.wav differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/clips/clip_000.mp4 b/temp/1786872908_The_Secrets_of_the_Marian/clips/clip_000.mp4 new file mode 100644 index 0000000..b090d17 Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/clips/clip_000.mp4 differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/clips/clip_001.mp4 b/temp/1786872908_The_Secrets_of_the_Marian/clips/clip_001.mp4 new file mode 100644 index 0000000..84435fa Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/clips/clip_001.mp4 differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/clips/clip_002.mp4 b/temp/1786872908_The_Secrets_of_the_Marian/clips/clip_002.mp4 new file mode 100644 index 0000000..ba05129 Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/clips/clip_002.mp4 differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/clips/raw_img_000.png b/temp/1786872908_The_Secrets_of_the_Marian/clips/raw_img_000.png new file mode 100644 index 0000000..dad604e Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/clips/raw_img_000.png differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/clips/raw_img_001.png b/temp/1786872908_The_Secrets_of_the_Marian/clips/raw_img_001.png new file mode 100644 index 0000000..b768ef6 Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/clips/raw_img_001.png differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/clips/raw_img_002.png b/temp/1786872908_The_Secrets_of_the_Marian/clips/raw_img_002.png new file mode 100644 index 0000000..bd26efd Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/clips/raw_img_002.png differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/clips/stock_raw_003.mp4 b/temp/1786872908_The_Secrets_of_the_Marian/clips/stock_raw_003.mp4 new file mode 100644 index 0000000..3e2419b --- /dev/null +++ b/temp/1786872908_The_Secrets_of_the_Marian/clips/stock_raw_003.mp4 @@ -0,0 +1,382 @@ + + + + + + + + + + + + + + + නිරීක්ෂණය/ ගැටළුව + Observação /Questão + + + + මාතෘකාවගවේෂණය + Pesquisaro tópico + + + + කල්පිතය + Formular umahipótese + + + + පරීක්ෂණය + Testar comexperiências + + + + දත්තවිශ්ලේෂණය + Analisardados + + + + අවසානනිගමනයවිද්‍යාත්මකක්‍රමය + Reportarconclusões + + + Método científico + diff --git a/temp/1786872908_The_Secrets_of_the_Marian/script.json b/temp/1786872908_The_Secrets_of_the_Marian/script.json new file mode 100644 index 0000000..a381b7c --- /dev/null +++ b/temp/1786872908_The_Secrets_of_the_Marian/script.json @@ -0,0 +1,69 @@ +{ + "titles": [ + "Mariana Trench: Deeper Than You Can Imagine", + "Unearthing the Secrets of the Deepest Ocean", + "The Mariana Trench: A Journey to the Abyss" + ], + "hook": "What lies at the bottom of the Mariana Trench?", + "description": "Dive into the mysterious depths of the Mariana Trench, the deepest part of our oceans. Discover the unique creatures, extreme pressures, and scientific mysteries that await explorers. #Documentary #Science #Oceans", + "tags": [ + "documentary", + "science", + "oceans", + "deep sea", + "Mariana Trench", + "pressure", + "creatures", + "exploration", + "depth", + "environment", + "discovery", + "explorers", + "environmental" + ], + "script_segments": [ + { + "chapter_title": "The Ancient Mystery", + "text": "For centuries, the Mariana Trench has remained a mysterious, unexplored world. Its depths hold secrets waiting to be uncovered.", + "visual_prompt": "Cinematic lighting with a dark, deep blue ocean background, camera angle looking down into the abyss, 8k documentary style.", + "stock_query": "deep ocean exploration", + "duration_estimate": 18, + "text_es": "Por siglos, la Mariana Trench ha permanecido como un misterio, un mundo inexplorado. Sus profundidades albergan secretos esperando ser descubiertos.", + "chapter_title_es": "El Misterio Antiguo" + }, + { + "chapter_title": "The Critical Discovery", + "text": "In 1960, the first human dove into the Mariana Trench, revealing the harsh reality of life at extreme depths.", + "visual_prompt": "Close-up of a pressurized submersible descending into the ocean, with dramatic underwater footage and lighting effects, 8k documentary style.", + "stock_query": "first human dive", + "duration_estimate": 16, + "text_es": "En 1960, el primer humano sumergió hasta la Mariana Trench, revelando la dura realidad de la vida en extremos de profundidad.", + "chapter_title_es": "La Descubierta Crítica" + }, + { + "chapter_title": "The Baffling Discoveries", + "text": "Recent expeditions have uncovered unique ecosystems and creatures, challenging our understanding of life on Earth.", + "visual_prompt": "Camera slowly zooms into a vibrant undersea ecosystem filled with strange creatures, 8k documentary style.", + "stock_query": "underwater life", + "duration_estimate": 17, + "text_es": "Expediciones recientes han descubierto ecosistemas y criaturas únicas, desafiando nuestra comprensión de la vida en la Tierra.", + "chapter_title_es": "Las Descubiertas Desconcertantes" + }, + { + "chapter_title": "The Critical Future", + "text": "Continuing exploration of the Mariana Trench could unlock secrets that benefit science, technology, and our understanding of the unknown.", + "visual_prompt": "A team of scientists reviewing data and samples collected from the trench, with a futuristic lab setting, 8k documentary style.", + "stock_query": "scientific research", + "duration_estimate": 18, + "text_es": "La exploración continua de la Mariana Trench podría revelar secretos que beneficien la ciencia, la tecnología y nuestra comprensión del desconocido.", + "chapter_title_es": "El Futuro Crítico" + } + ], + "title": "Mariana Trench: Deeper Than You Can Imagine", + "titles_es": [ + "Mariana Trench: Más Profundo de lo Que Puedes Imaginar", + "Descubriendo los Secretos del Último Rincón del Océano", + "La Mariana Trench: Un Viaje al Abismo" + ], + "description_es": "Sumérgete en los misteriosos confines de la Mariana Trench, la parte más profunda de nuestros océanos. Descubre criaturas únicas, presiones extremas y misterios científicos que esperan a los exploradores. #Documentario #Ciencia #Océanos" +} \ No newline at end of file diff --git a/temp/1786872908_The_Secrets_of_the_Marian/subtitles_en.srt b/temp/1786872908_The_Secrets_of_the_Marian/subtitles_en.srt new file mode 100644 index 0000000..284ad73 --- /dev/null +++ b/temp/1786872908_The_Secrets_of_the_Marian/subtitles_en.srt @@ -0,0 +1,52 @@ +1 +00:00:00,000 --> 00:00:02,500 +For centuries, the Mariana Trench has + +2 +00:00:02,500 --> 00:00:05,800 +remained a mysterious, unexplored world. Its + +3 +00:00:05,800 --> 00:00:07,720 +depths hold secrets waiting to be + +4 +00:00:07,720 --> 00:00:11,240 +uncovered. In 1960, the first human + +5 +00:00:11,240 --> 00:00:13,620 +dove into the Mariana Trench, revealing + +6 +00:00:13,620 --> 00:00:15,460 +the harsh reality of life at + +7 +00:00:15,460 --> 00:00:18,880 +extreme depths. Recent expeditions have + +8 +00:00:18,880 --> 00:00:22,320 +uncovered unique ecosystems and creatures, challenging + +9 +00:00:22,320 --> 00:00:24,100 +our understanding of life on Earth. + +10 +00:00:24,100 --> 00:00:27,340 +Continuing exploration of the Mariana Trench + +11 +00:00:27,340 --> 00:00:30,020 +could unlock secrets that benefit science, + +12 +00:00:30,500 --> 00:00:32,760 +technology, and our understanding of the + +13 +00:00:32,760 --> 00:00:33,140 +unknown. + diff --git a/temp/1786872908_The_Secrets_of_the_Marian/subtitles_es.srt b/temp/1786872908_The_Secrets_of_the_Marian/subtitles_es.srt new file mode 100644 index 0000000..ba34ba0 --- /dev/null +++ b/temp/1786872908_The_Secrets_of_the_Marian/subtitles_es.srt @@ -0,0 +1,56 @@ +1 +00:00:00,000 --> 00:00:01,940 +Por siglos, la Mariana Trenche ha + +2 +00:00:01,940 --> 00:00:04,640 +permancido como un misterio, un mando + +3 +00:00:04,640 --> 00:00:07,960 +inexplorado, sus profundidades albergán secretos de + +4 +00:00:07,960 --> 00:00:11,220 +espurrándose a discubirdos. En 1960, el + +5 +00:00:11,220 --> 00:00:13,380 +primer humano sumergió hasto la Mariana + +6 +00:00:13,380 --> 00:00:15,900 +Trenche, revelando la dura realidad de + +7 +00:00:15,900 --> 00:00:17,760 +la vida en extremos de profundidad. + +8 +00:00:18,220 --> 00:00:21,380 +Expeditions Rescientes, han discubirdo ecosistemas y + +9 +00:00:21,380 --> 00:00:24,700 +criaturas unicas, disafiando nuestra comprensión + +10 +00:00:24,700 --> 00:00:25,920 +de la vida en la tierra. + +11 +00:00:25,920 --> 00:00:28,140 +La exploración continúa de la Mariana + +12 +00:00:28,140 --> 00:00:30,940 +Trenche, Padria Reveller -Secredos, que beneficio + +13 +00:00:30,940 --> 00:00:33,020 +en la Asiancia, la tecnología y + +14 +00:00:33,020 --> 00:00:35,020 +nuestra comprensión del descanocido. + diff --git a/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_A_clean.png b/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_A_clean.png new file mode 100644 index 0000000..a4a213e Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_A_clean.png differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_A_en.png b/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_A_en.png new file mode 100644 index 0000000..a97887f Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_A_en.png differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_A_es.png b/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_A_es.png new file mode 100644 index 0000000..ddd0901 Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_A_es.png differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_B_clean.png b/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_B_clean.png new file mode 100644 index 0000000..efacbcb Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_B_clean.png differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_B_en.png b/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_B_en.png new file mode 100644 index 0000000..36cc89b Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_B_en.png differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_B_es.png b/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_B_es.png new file mode 100644 index 0000000..9edf3e5 Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_B_es.png differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_C_clean.png b/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_C_clean.png new file mode 100644 index 0000000..ebe6684 Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_C_clean.png differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_C_en.png b/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_C_en.png new file mode 100644 index 0000000..c63e146 Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_C_en.png differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_C_es.png b/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_C_es.png new file mode 100644 index 0000000..ccc6e01 Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/thumbs/thumb_C_es.png differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/tts_en_000.wav b/temp/1786872908_The_Secrets_of_the_Marian/tts_en_000.wav new file mode 100644 index 0000000..4541209 Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/tts_en_000.wav differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/tts_en_001.wav b/temp/1786872908_The_Secrets_of_the_Marian/tts_en_001.wav new file mode 100644 index 0000000..9939726 Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/tts_en_001.wav differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/tts_en_002.wav b/temp/1786872908_The_Secrets_of_the_Marian/tts_en_002.wav new file mode 100644 index 0000000..2641f9f Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/tts_en_002.wav differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/tts_en_003.wav b/temp/1786872908_The_Secrets_of_the_Marian/tts_en_003.wav new file mode 100644 index 0000000..cbb28bb Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/tts_en_003.wav differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/tts_es_000.wav b/temp/1786872908_The_Secrets_of_the_Marian/tts_es_000.wav new file mode 100644 index 0000000..deec5fa Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/tts_es_000.wav differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/tts_es_001.wav b/temp/1786872908_The_Secrets_of_the_Marian/tts_es_001.wav new file mode 100644 index 0000000..2435537 Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/tts_es_001.wav differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/tts_es_002.wav b/temp/1786872908_The_Secrets_of_the_Marian/tts_es_002.wav new file mode 100644 index 0000000..115e662 Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/tts_es_002.wav differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/tts_es_003.wav b/temp/1786872908_The_Secrets_of_the_Marian/tts_es_003.wav new file mode 100644 index 0000000..aad0c6f Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/tts_es_003.wav differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/voiceover_en.wav b/temp/1786872908_The_Secrets_of_the_Marian/voiceover_en.wav new file mode 100644 index 0000000..7cba314 Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/voiceover_en.wav differ diff --git a/temp/1786872908_The_Secrets_of_the_Marian/voiceover_es.wav b/temp/1786872908_The_Secrets_of_the_Marian/voiceover_es.wav new file mode 100644 index 0000000..a09c199 Binary files /dev/null and b/temp/1786872908_The_Secrets_of_the_Marian/voiceover_es.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/background_music.wav b/temp/1786889324_What_secret_knowledge_did/background_music.wav new file mode 100644 index 0000000..8736309 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/background_music.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/clips/clip_000.mp4 b/temp/1786889324_What_secret_knowledge_did/clips/clip_000.mp4 new file mode 100644 index 0000000..78b0419 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/clips/clip_000.mp4 differ diff --git a/temp/1786889324_What_secret_knowledge_did/clips/clip_002.mp4 b/temp/1786889324_What_secret_knowledge_did/clips/clip_002.mp4 new file mode 100644 index 0000000..f708adf Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/clips/clip_002.mp4 differ diff --git a/temp/1786889324_What_secret_knowledge_did/clips/clip_004.mp4 b/temp/1786889324_What_secret_knowledge_did/clips/clip_004.mp4 new file mode 100644 index 0000000..9425651 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/clips/clip_004.mp4 differ diff --git a/temp/1786889324_What_secret_knowledge_did/clips/clip_006.mp4 b/temp/1786889324_What_secret_knowledge_did/clips/clip_006.mp4 new file mode 100644 index 0000000..3b4a32e Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/clips/clip_006.mp4 differ diff --git a/temp/1786889324_What_secret_knowledge_did/clips/clip_008.mp4 b/temp/1786889324_What_secret_knowledge_did/clips/clip_008.mp4 new file mode 100644 index 0000000..9852c00 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/clips/clip_008.mp4 differ diff --git a/temp/1786889324_What_secret_knowledge_did/clips/raw_img_000.png b/temp/1786889324_What_secret_knowledge_did/clips/raw_img_000.png new file mode 100644 index 0000000..e2ea563 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/clips/raw_img_000.png differ diff --git a/temp/1786889324_What_secret_knowledge_did/clips/raw_img_002.png b/temp/1786889324_What_secret_knowledge_did/clips/raw_img_002.png new file mode 100644 index 0000000..2a71591 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/clips/raw_img_002.png differ diff --git a/temp/1786889324_What_secret_knowledge_did/clips/raw_img_004.png b/temp/1786889324_What_secret_knowledge_did/clips/raw_img_004.png new file mode 100644 index 0000000..0075a40 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/clips/raw_img_004.png differ diff --git a/temp/1786889324_What_secret_knowledge_did/clips/raw_img_006.png b/temp/1786889324_What_secret_knowledge_did/clips/raw_img_006.png new file mode 100644 index 0000000..df588bf Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/clips/raw_img_006.png differ diff --git a/temp/1786889324_What_secret_knowledge_did/clips/raw_img_008.png b/temp/1786889324_What_secret_knowledge_did/clips/raw_img_008.png new file mode 100644 index 0000000..88525d6 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/clips/raw_img_008.png differ diff --git a/temp/1786889324_What_secret_knowledge_did/clips/stock_raw_001.mp4 b/temp/1786889324_What_secret_knowledge_did/clips/stock_raw_001.mp4 new file mode 100644 index 0000000..fc993e0 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/clips/stock_raw_001.mp4 differ diff --git a/temp/1786889324_What_secret_knowledge_did/clips/stock_raw_003.mp4 b/temp/1786889324_What_secret_knowledge_did/clips/stock_raw_003.mp4 new file mode 100644 index 0000000..d8df100 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/clips/stock_raw_003.mp4 differ diff --git a/temp/1786889324_What_secret_knowledge_did/clips/stock_raw_005.mp4 b/temp/1786889324_What_secret_knowledge_did/clips/stock_raw_005.mp4 new file mode 100644 index 0000000..48eb93d Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/clips/stock_raw_005.mp4 differ diff --git a/temp/1786889324_What_secret_knowledge_did/clips/stock_raw_007.mp4 b/temp/1786889324_What_secret_knowledge_did/clips/stock_raw_007.mp4 new file mode 100644 index 0000000..02e31f8 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/clips/stock_raw_007.mp4 differ diff --git a/temp/1786889324_What_secret_knowledge_did/clips/stock_raw_009.mp4 b/temp/1786889324_What_secret_knowledge_did/clips/stock_raw_009.mp4 new file mode 100644 index 0000000..28b69f2 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/clips/stock_raw_009.mp4 differ diff --git a/temp/1786889324_What_secret_knowledge_did/script.json b/temp/1786889324_What_secret_knowledge_did/script.json new file mode 100644 index 0000000..2ea73d9 --- /dev/null +++ b/temp/1786889324_What_secret_knowledge_did/script.json @@ -0,0 +1,124 @@ +{ + "titles": [ + "What Secrets Did Ancient Egyptians Hold?", + "Unveiling Ancient Egyptian Mysteries", + "The Hidden Knowledge of Ancient Egypt" + ], + "hook": "Did the ancient Egyptians possess secrets that shaped the world?", + "description": "Dive into the enigmatic world of ancient Egypt and explore the hidden knowledge that has intrigued historians and scholars for centuries. This documentary uncovers the secrets of the ancients, from their advanced mathematical and architectural prowess to their spiritual beliefs and medical practices. Unravel the mysteries of the past and gain insights into the civilization that left an indelible mark on human history. #Documentary #History #AncientEgypt", + "tags": [ + "documentary", + "ancientegypt", + "history", + "secrets", + "knowledge", + "archaeology", + "mathematics", + "architecture", + "medicine", + "spirituality", + "ancientcivilizations", + "historydocumentary", + "ancientsecrets", + "egyptianmysteries" + ], + "script_segments": [ + { + "chapter_title": "The Dawn", + "text": "In the early days of civilization, ancient Egypt emerged as a beacon of knowledge. The Nile River nurtured a society that thrived in mathematics, astronomy, and architecture.", + "visual_prompt": "Close-up of papyrus scrolls in a dimly lit library, with sunlight streaming through a window, showing hieroglyphs and ancient writings. Camera zooms in on a scribe writing on a scroll.", + "stock_query": "ancient library scrolls", + "duration_estimate": 18, + "text_es": "En los primeros días de la civilización, Egipto antiguo emergió como un faro de conocimiento. El río Nilo nutrió una sociedad que prosperó en matemáticas, astronomía y arquitectura.", + "chapter_title_es": "La Alborada" + }, + { + "chapter_title": "Mathematical Mastery", + "text": "The Egyptians were masters of geometry, using it to build the pyramids with astonishing precision. Their calculations for pi were surprisingly accurate for their time.", + "visual_prompt": "Time-lapse of a pyramid being constructed, with workers laying stones, followed by a close-up of a scribe with a reed pen, writing on papyrus.", + "stock_query": "pyramid construction", + "duration_estimate": 18, + "text_es": "Los egipcios eran maestros de la geometría, utilizando esta disciplina para construir pirámides con una precisión asombrosa. Sus cálculos de pi fueron sorprendentemente precisos para su época.", + "chapter_title_es": "Maestría Matemática" + }, + { + "chapter_title": "Astronomical Insights", + "text": "Their knowledge of the stars guided their calendar and agricultural practices. The ancient Egyptians could predict solar and lunar eclipses with remarkable accuracy.", + "visual_prompt": "Night sky filled with stars, with a zoom into the constellation Orion, followed by a close-up of an ancient Egyptian star map.", + "stock_query": "star map ancient", + "duration_estimate": 18, + "text_es": "Su conocimiento de las estrellas guiaba su calendario y prácticas agrícolas. Los antiguos egipcios podían predecir eclipses solares y lunares con una precisión asombrosa.", + "chapter_title_es": "Insights Astronómicos" + }, + { + "chapter_title": "Advanced Medicine", + "text": "The Edwin Smith Papyrus reveals surgical practices that were far ahead of its time. They understood the circulatory system and performed amputations with astonishing skill.", + "visual_prompt": "Close-up of papyrus scroll with hieroglyphs, then a dramatic cut to a surgeon in a hospital, performing a surgical operation with ancient tools.", + "stock_query": "papyrus scroll surgery", + "duration_estimate": 18, + "text_es": "El Papiro Edwin Smith revela prácticas quirúrgicas que estaban muy adelantadas a su tiempo. Entendían el sistema circulatorio y realizaron amputaciones con una habilidad asombrosa.", + "chapter_title_es": "Medicina Avanzada" + }, + { + "chapter_title": "Spiritual Wisdom", + "text": "The Book of the Dead offered mystical guidance to the deceased, detailing rituals and spells for the afterlife. Their beliefs were complex, involving numerous deities and cosmic forces.", + "visual_prompt": "Dramatic shot of the pyramids at night, with a close-up of hieroglyphs on a wall, followed by a serene image of a tomb with inscriptions and paintings.", + "stock_query": "book of the dead", + "duration_estimate": 18, + "text_es": "El Libro de los Muertos ofrecía guía mística para los difuntos, detallando rituales y hechizos para el más allá. Sus creencias eran complejas, involucrando numerosos dioses y fuerzas cósmicas.", + "chapter_title_es": "Sabiduría Espiritual" + }, + { + "chapter_title": "Architectural Genius", + "text": "The Great Pyramid of Giza is a testament to their architectural prowess. It remains one of the most enduring symbols of human achievement.", + "visual_prompt": "Close-up of the Great Pyramid, with a wide shot of the Giza plateau, followed by a detailed shot of the pyramid’s internal chambers and structures.", + "stock_query": "great pyramid", + "duration_estimate": 18, + "text_es": "La Gran Pirámide de Giza es un testimonio de su genio arquitectónico. Se mantiene como uno de los símbolos más duraderos del logro humano.", + "chapter_title_es": "Genio Arquitectónico" + }, + { + "chapter_title": "Engineering Marvels", + "text": "The construction of the pyramids required advanced engineering techniques. Their knowledge of water management and irrigation was crucial for the growth of crops.", + "visual_prompt": "Dramatic aerial shot of the Nile River, then a close-up of an ancient canal, followed by a time-lapse of modern excavations revealing the ancient engineering.", + "stock_query": "nile river", + "duration_estimate": 18, + "text_es": "La construcción de las pirámides requirió técnicas de ingeniería avanzadas. Su conocimiento de la gestión del agua e irrigación fue crucial para el crecimiento de los cultivos.", + "chapter_title_es": "Maravillas de Ingeniería" + }, + { + "chapter_title": "Mystical Texts", + "text": "The Rosetta Stone helped decipher hieroglyphs, revealing the complex texts that tell of the pharaohs and their reigns. Each symbol held a deep meaning.", + "visual_prompt": "Close-up of the Rosetta Stone, with a dramatic reveal of the text being translated, followed by a montage of hieroglyphs and their meanings.", + "stock_query": "rosetta stone", + "duration_estimate": 18, + "text_es": "La Piedra Rosetta ayudó a decifrar los hieroglifos, revelando los complejos textos que narran a los faraones y sus reinados. Cada símbolo llevaba un significado profundo.", + "chapter_title_es": "Textos Místicos" + }, + { + "chapter_title": "Cultural Innovations", + "text": "The ancient Egyptians were pioneers in many fields. Their art, literature, and music continue to influence us today, hinting at a civilization far more advanced than we once thought.", + "visual_prompt": "Close-up of ancient Egyptian paintings and sculptures, followed by a montage of modern art and music inspired by ancient Egyptian themes.", + "stock_query": "ancient art", + "duration_estimate": 18, + "text_es": "Los antiguos egipcios fueron pioneros en muchos campos. Su arte, literatura y música continúan influyendo en nosotros hoy, sugiriendo una civilización mucho más avanzada de lo que una vez pensamos.", + "chapter_title_es": "Innovaciones Culturales" + }, + { + "chapter_title": "Legacy of Secrets", + "text": "The secrets of the ancient Egyptians continue to fascinate us. Their knowledge, passed down through generations, has shaped our understanding of history and human achievement.", + "visual_prompt": "Time-lapse of the sun setting over the pyramids, with a final shot of a modern city skyline, symbolizing the enduring legacy of their knowledge.", + "stock_query": "pyramid sunset", + "duration_estimate": 18, + "text_es": "Los secretos de los antiguos egipcios continúan fascinándonos. Su conocimiento, transmitido a través de las generaciones, ha moldeado nuestra comprensión de la historia y el logro humano.", + "chapter_title_es": "Legado de Secretos" + } + ], + "title": "What Secrets Did Ancient Egyptians Hold?", + "titles_es": [ + "¿Qué Secretos Ocultaban los Antiguos Egipcios?", + "Desvelando Misterios Egipcios", + "El Saber Oculto de los Antiguos Egipcios" + ], + "description_es": "Sumérgete en el mundo enigmático de Egipto antiguo y explora el conocimiento oculto que ha intrigado a historiadores y eruditos durante siglos. Este documental desvela los secretos de los antiguos, desde su maestría matemática y arquitectónica hasta sus creencias espirituales y prácticas médicas. Desatornilla los misterios del pasado y obtén perspectivas sobre una civilización que dejó un sello indeleble en la historia humana. #Documentario #Historia #EgiptoAntiguo" +} \ No newline at end of file diff --git a/temp/1786889324_What_secret_knowledge_did/subtitles_en.srt b/temp/1786889324_What_secret_knowledge_did/subtitles_en.srt new file mode 100644 index 0000000..fa6861d --- /dev/null +++ b/temp/1786889324_What_secret_knowledge_did/subtitles_en.srt @@ -0,0 +1,172 @@ +1 +00:00:00,000 --> 00:00:01,880 +In the early days of civilization, + +2 +00:00:02,520 --> 00:00:04,280 +ancient Egypt emerged as a beacon + +3 +00:00:04,280 --> 00:00:06,860 +of knowledge. The Nile River nurtured + +4 +00:00:06,860 --> 00:00:09,140 +a society that thrived in mathematics, + +5 +00:00:09,720 --> 00:00:13,040 +astronomy, and architecture. The Egyptians were + +6 +00:00:13,040 --> 00:00:15,440 +masters of geometry, using it to + +7 +00:00:15,440 --> 00:00:17,640 +build the pyramids with astonishing precision. + +8 +00:00:18,340 --> 00:00:20,880 +Their calculations for pie were surprisingly + +9 +00:00:20,880 --> 00:00:23,480 +accurate for their time. Their knowledge + +10 +00:00:23,480 --> 00:00:25,500 +of the stars guided their calendar + +11 +00:00:25,500 --> 00:00:28,980 +and agricultural practices. The ancient Egyptians + +12 +00:00:28,980 --> 00:00:31,540 +could predict solar and lunar eclipses + +13 +00:00:31,540 --> 00:00:34,800 +with remarkable accuracy. The Edwin Smith + +14 +00:00:34,800 --> 00:00:37,700 +Papyrus reveals surgical practices that were + +15 +00:00:37,700 --> 00:00:39,700 +far ahead of its time. They + +16 +00:00:39,700 --> 00:00:42,360 +understood the circulatory system and performed + +17 +00:00:42,360 --> 00:00:45,660 +amputations with astonishing skill. The book + +18 +00:00:45,660 --> 00:00:47,540 +of the dead offered mystical guidance + +19 +00:00:47,540 --> 00:00:49,960 +to the deceased, detailing rituals and + +20 +00:00:49,960 --> 00:00:52,400 +spells for the afterlife. Their beliefs + +21 +00:00:52,400 --> 00:00:55,360 +were complex, involving numerous deities and + +22 +00:00:55,360 --> 00:00:58,260 +cosmic forces. The great pyramid of + +23 +00:00:58,260 --> 00:01:00,080 +Giza is a testament to their + +24 +00:01:00,080 --> 00:01:02,840 +architectural prowess. It remains one of + +25 +00:01:02,840 --> 00:01:04,680 +the most enduring symbols of human + +26 +00:01:04,680 --> 00:01:07,500 +achievement. The construction of the pyramids + +27 +00:01:07,500 --> 00:01:10,960 +required advanced engineering techniques. Their + +28 +00:01:10,960 --> 00:01:13,040 +knowledge of water management and irrigation + +29 +00:01:13,040 --> 00:01:15,060 +was crucial for the growth of + +30 +00:01:15,060 --> 00:01:17,860 +crops. The Rosetta Stone helped decipher + +31 +00:01:17,860 --> 00:01:20,720 +hieroglyphs, revealing the complex texts that + +32 +00:01:20,720 --> 00:01:22,020 +tell of the pharaohs and their + +33 +00:01:22,020 --> 00:01:24,320 +reigns. Each symbol held a deep + +34 +00:01:24,320 --> 00:01:27,320 +meaning. The ancient Egyptians were pioneers + +35 +00:01:27,320 --> 00:01:30,060 +in many fields. Their art, literature, + +36 +00:01:30,520 --> 00:01:32,240 +and music continue to influence us + +37 +00:01:32,240 --> 00:01:34,700 +today, hinting at a civilization far + +38 +00:01:34,700 --> 00:01:36,280 +more advanced than we once thought. + +39 +00:01:37,060 --> 00:01:38,760 +The secrets of the ancient Egyptians + +40 +00:01:38,760 --> 00:01:41,640 +continue to fascinate us. Their knowledge, + +41 +00:01:42,080 --> 00:01:44,480 +passed down through generations, has shaped + +42 +00:01:44,480 --> 00:01:46,540 +our understanding of history and human + +43 +00:01:46,540 --> 00:01:46,960 +achievement. + diff --git a/temp/1786889324_What_secret_knowledge_did/subtitles_es.srt b/temp/1786889324_What_secret_knowledge_did/subtitles_es.srt new file mode 100644 index 0000000..8ab7494 --- /dev/null +++ b/temp/1786889324_What_secret_knowledge_did/subtitles_es.srt @@ -0,0 +1,180 @@ +1 +00:00:00,000 --> 00:00:01,520 +En los primeros días de la + +2 +00:00:01,520 --> 00:00:04,920 +civilización, Egipto Antiguio emergió como unfairo + +3 +00:00:04,920 --> 00:00:07,540 +de Canasimiento. El Rio Nilo nutrio + +4 +00:00:07,540 --> 00:00:09,800 +un asocio de aquéprospero en matemáticas, + +5 +00:00:10,200 --> 00:00:13,180 +Estronomía y Arquitura. Los egipcios iran + +6 +00:00:13,180 --> 00:00:15,680 +maestros de la geometria, utilizando esta + +7 +00:00:15,680 --> 00:00:18,180 +disciplina para construir paramites con una + +8 +00:00:18,180 --> 00:00:21,120 +presición asembrosa. Sus calculos de pie + +9 +00:00:21,120 --> 00:00:24,020 +furón sorprendentemente precisos para su epoca. + +10 +00:00:24,440 --> 00:00:26,400 +Tu Canasimiento de las estrellas guiaba + +11 +00:00:26,400 --> 00:00:29,500 +su calendario y prácticas agricolas. Los + +12 +00:00:29,500 --> 00:00:32,880 +egipcios, Podi y Pradeshir, aclipses solas + +13 +00:00:32,880 --> 00:00:35,300 +y lunes con una presición asembrosa. + +14 +00:00:35,800 --> 00:00:37,980 +El papero Edwin Smith revela prácticas + +15 +00:00:37,980 --> 00:00:40,200 +cuarurgicas, cuesta en Maya de Lentada + +16 +00:00:40,200 --> 00:00:42,240 +es su tiempo. En Tendi y + +17 +00:00:42,240 --> 00:00:44,640 +el sistema circulatorio, y realiza en + +18 +00:00:44,640 --> 00:00:47,600 +emputación con una habilitada asembrosa. El + +19 +00:00:47,600 --> 00:00:49,420 +libro de los muertos a frechigía + +20 +00:00:49,420 --> 00:00:51,800 +mística para los difuntos de Tlendo + +21 +00:00:51,800 --> 00:00:53,700 +Rituals y Hechizos para el Másala. + +22 +00:00:54,240 --> 00:00:57,540 +Sus crinches iran complejos, involucrando numerosos + +23 +00:00:57,540 --> 00:01:00,120 +dioses y fuses cosmicas. La gran + +24 +00:01:00,120 --> 00:01:02,480 +paramite de Gizaís, un testimonio de + +25 +00:01:02,480 --> 00:01:05,180 +su genio arquectónico. Se menciona como + +26 +00:01:05,180 --> 00:01:07,540 +uno de los símbolos mosteraderos del + +27 +00:01:07,540 --> 00:01:09,760 +logro humano. La construcción de las + +28 +00:01:09,760 --> 00:01:12,840 +paramites requerió técnicas de ingeniería avanzadas. + +29 +00:01:13,560 --> 00:01:15,260 +Su Canasimiento de la gestión del + +30 +00:01:15,260 --> 00:01:18,360 +agua, iragasión, fucrucial para el crescimiento + +31 +00:01:18,360 --> 00:01:20,660 +de los cultivos. La pídra Rosetta + +32 +00:01:20,660 --> 00:01:23,600 +ayudo a desifrar los hierglicos, revelando + +33 +00:01:23,600 --> 00:01:25,620 +los complejos textos que enerran a + +34 +00:01:25,620 --> 00:01:28,240 +los farianos y sus rinidus. Cárdas + +35 +00:01:28,240 --> 00:01:31,060 +símbolo levaba un significado profundo. Los + +36 +00:01:31,060 --> 00:01:33,400 +antiguos egyptios furan pioneros en muchos + +37 +00:01:33,400 --> 00:01:36,140 +campos. Su art, literatura y música + +38 +00:01:36,140 --> 00:01:38,340 +continúan en flyendo en esatoros hoy, + +39 +00:01:38,840 --> 00:01:40,900 +su geriendo una civilización mucho más + +40 +00:01:40,900 --> 00:01:42,960 +avanzada de loco y univers pencemos. + +41 +00:01:43,520 --> 00:01:45,760 +Los secretos de los antiguos egyptios + +42 +00:01:45,760 --> 00:01:48,780 +continúan fascinandonos. Su Canasimiento, + +43 +00:01:49,140 --> 00:01:51,140 +transmitido a traves de las generaciones, + +44 +00:01:51,600 --> 00:01:53,400 +ha moldado nuestra comprensión de la + +45 +00:01:53,400 --> 00:01:54,900 +historia, y al logro humano. + diff --git a/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_A_clean.png b/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_A_clean.png new file mode 100644 index 0000000..375ad9a Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_A_clean.png differ diff --git a/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_A_en.png b/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_A_en.png new file mode 100644 index 0000000..a67fc55 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_A_en.png differ diff --git a/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_A_es.png b/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_A_es.png new file mode 100644 index 0000000..427f089 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_A_es.png differ diff --git a/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_B_clean.png b/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_B_clean.png new file mode 100644 index 0000000..f8907c2 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_B_clean.png differ diff --git a/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_B_en.png b/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_B_en.png new file mode 100644 index 0000000..2044635 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_B_en.png differ diff --git a/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_B_es.png b/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_B_es.png new file mode 100644 index 0000000..6d9a6a2 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_B_es.png differ diff --git a/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_C_clean.png b/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_C_clean.png new file mode 100644 index 0000000..9c326bc Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_C_clean.png differ diff --git a/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_C_en.png b/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_C_en.png new file mode 100644 index 0000000..fac2b28 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_C_en.png differ diff --git a/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_C_es.png b/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_C_es.png new file mode 100644 index 0000000..b858396 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/thumbs/thumb_C_es.png differ diff --git a/temp/1786889324_What_secret_knowledge_did/tts_en_000.wav b/temp/1786889324_What_secret_knowledge_did/tts_en_000.wav new file mode 100644 index 0000000..6b80b93 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/tts_en_000.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/tts_en_001.wav b/temp/1786889324_What_secret_knowledge_did/tts_en_001.wav new file mode 100644 index 0000000..d3e2e22 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/tts_en_001.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/tts_en_002.wav b/temp/1786889324_What_secret_knowledge_did/tts_en_002.wav new file mode 100644 index 0000000..d387db8 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/tts_en_002.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/tts_en_003.wav b/temp/1786889324_What_secret_knowledge_did/tts_en_003.wav new file mode 100644 index 0000000..de97b6f Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/tts_en_003.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/tts_en_004.wav b/temp/1786889324_What_secret_knowledge_did/tts_en_004.wav new file mode 100644 index 0000000..17abb7e Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/tts_en_004.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/tts_en_005.wav b/temp/1786889324_What_secret_knowledge_did/tts_en_005.wav new file mode 100644 index 0000000..06c0443 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/tts_en_005.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/tts_en_006.wav b/temp/1786889324_What_secret_knowledge_did/tts_en_006.wav new file mode 100644 index 0000000..6404711 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/tts_en_006.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/tts_en_007.wav b/temp/1786889324_What_secret_knowledge_did/tts_en_007.wav new file mode 100644 index 0000000..963aea2 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/tts_en_007.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/tts_en_008.wav b/temp/1786889324_What_secret_knowledge_did/tts_en_008.wav new file mode 100644 index 0000000..12e6eb5 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/tts_en_008.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/tts_en_009.wav b/temp/1786889324_What_secret_knowledge_did/tts_en_009.wav new file mode 100644 index 0000000..aa56eaa Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/tts_en_009.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/tts_es_000.wav b/temp/1786889324_What_secret_knowledge_did/tts_es_000.wav new file mode 100644 index 0000000..8da4342 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/tts_es_000.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/tts_es_001.wav b/temp/1786889324_What_secret_knowledge_did/tts_es_001.wav new file mode 100644 index 0000000..cf368b7 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/tts_es_001.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/tts_es_002.wav b/temp/1786889324_What_secret_knowledge_did/tts_es_002.wav new file mode 100644 index 0000000..9974f06 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/tts_es_002.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/tts_es_003.wav b/temp/1786889324_What_secret_knowledge_did/tts_es_003.wav new file mode 100644 index 0000000..a9b19f3 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/tts_es_003.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/tts_es_004.wav b/temp/1786889324_What_secret_knowledge_did/tts_es_004.wav new file mode 100644 index 0000000..2761c80 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/tts_es_004.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/tts_es_005.wav b/temp/1786889324_What_secret_knowledge_did/tts_es_005.wav new file mode 100644 index 0000000..63a25d9 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/tts_es_005.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/tts_es_006.wav b/temp/1786889324_What_secret_knowledge_did/tts_es_006.wav new file mode 100644 index 0000000..c0bb0c8 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/tts_es_006.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/tts_es_007.wav b/temp/1786889324_What_secret_knowledge_did/tts_es_007.wav new file mode 100644 index 0000000..369f876 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/tts_es_007.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/tts_es_008.wav b/temp/1786889324_What_secret_knowledge_did/tts_es_008.wav new file mode 100644 index 0000000..6760f38 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/tts_es_008.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/tts_es_009.wav b/temp/1786889324_What_secret_knowledge_did/tts_es_009.wav new file mode 100644 index 0000000..c30ab2c Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/tts_es_009.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/voiceover_en.wav b/temp/1786889324_What_secret_knowledge_did/voiceover_en.wav new file mode 100644 index 0000000..d47e3bc Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/voiceover_en.wav differ diff --git a/temp/1786889324_What_secret_knowledge_did/voiceover_es.wav b/temp/1786889324_What_secret_knowledge_did/voiceover_es.wav new file mode 100644 index 0000000..56ae849 Binary files /dev/null and b/temp/1786889324_What_secret_knowledge_did/voiceover_es.wav differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/background_music.wav b/temp/1786889769_The_Lost_Library_of_Alexa/background_music.wav new file mode 100644 index 0000000..6496dab Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/background_music.wav differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/clips/clip_000.mp4 b/temp/1786889769_The_Lost_Library_of_Alexa/clips/clip_000.mp4 new file mode 100644 index 0000000..7515c64 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/clips/clip_000.mp4 differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/clips/clip_001.mp4 b/temp/1786889769_The_Lost_Library_of_Alexa/clips/clip_001.mp4 new file mode 100644 index 0000000..0407fde Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/clips/clip_001.mp4 differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/clips/clip_002.mp4 b/temp/1786889769_The_Lost_Library_of_Alexa/clips/clip_002.mp4 new file mode 100644 index 0000000..81b8ca3 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/clips/clip_002.mp4 differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/clips/clip_003.mp4 b/temp/1786889769_The_Lost_Library_of_Alexa/clips/clip_003.mp4 new file mode 100644 index 0000000..b6e307a Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/clips/clip_003.mp4 differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/clips/raw_img_002.jpg b/temp/1786889769_The_Lost_Library_of_Alexa/clips/raw_img_002.jpg new file mode 100644 index 0000000..f1a7287 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/clips/raw_img_002.jpg differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/clips/raw_img_003.jpg b/temp/1786889769_The_Lost_Library_of_Alexa/clips/raw_img_003.jpg new file mode 100644 index 0000000..971f897 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/clips/raw_img_003.jpg differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/clips/raw_vid_000.mp4 b/temp/1786889769_The_Lost_Library_of_Alexa/clips/raw_vid_000.mp4 new file mode 100644 index 0000000..33b77c0 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/clips/raw_vid_000.mp4 differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/clips/raw_vid_001.mp4 b/temp/1786889769_The_Lost_Library_of_Alexa/clips/raw_vid_001.mp4 new file mode 100644 index 0000000..141b617 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/clips/raw_vid_001.mp4 differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/script.json b/temp/1786889769_The_Lost_Library_of_Alexa/script.json new file mode 100644 index 0000000..21ba363 --- /dev/null +++ b/temp/1786889769_The_Lost_Library_of_Alexa/script.json @@ -0,0 +1,70 @@ +{ + "titles": [ + "The Enigma of Alexandria", + "Unearthing the Lost Library", + "Alexandria's Forgotten Knowledge" + ], + "hook": "Have you heard of the greatest library in ancient history?", + "description": "Discover the mysterious story of the Lost Library of Alexandria, one of the world's oldest and most extensive collections. Explore its rise, fall, and enduring legacy. #Documentary #History #Science", + "tags": [ + "documentary", + "history", + "ancient civilization", + "library", + "alexandria", + "lost knowledge", + "ancient history", + "civilization", + "science", + "research", + "broadcaster", + "educational", + "knowledge", + "heritage" + ], + "script_segments": [ + { + "chapter_title": "Rise of the Great", + "text": "The Great Library of Alexandria was a beacon of knowledge, attracting scholars from all corners of the ancient world. Its vast collection of scrolls and texts was unparalleled.", + "visual_prompt": "Aerial shot of a bustling ancient city with a grand, ornate library building in the center, under a clear blue sky with golden sunlight.", + "stock_query": "ancient city library", + "duration_estimate": 18, + "text_es": "La Gran Biblioteca de Alejandría era una farola de conocimiento, atraída por académicos de todos los rincones del mundo antiguo. Su extensa colección de rollos y textos era sin par.", + "chapter_title_es": "Rise of the Great" + }, + { + "chapter_title": "The Critical Discovery", + "text": "Among its treasures, the library housed the famous 'Papyrus of Euphorion,' a rare literary work that vanished with the library's destruction.", + "visual_prompt": "Close-up of ancient papyrus scrolls with intricate writing, illuminated by soft, warm light, with a magnifying glass in the foreground.", + "stock_query": "ancient papyrus scrolls", + "duration_estimate": 18, + "text_es": "Entre sus tesoros, la biblioteca albergaba el famoso 'Papiro de Euforión,' un trabajo literario raro que desapareció junto con la destrucción de la biblioteca.", + "chapter_title_es": "La Descubierta Crucial" + }, + { + "chapter_title": "The Final Destruction", + "text": "Historians debate the exact date and cause of its destruction, but by the 7th century, the library was no more, leaving only whispers of its grandeur.", + "visual_prompt": "Aerial view of a desolate, arid landscape with crumbling ruins in the distance, under a vast, starry sky at night.", + "stock_query": "desert ruins aerial", + "duration_estimate": 18, + "text_es": "Los historiadores debaten la fecha exacta y la causa de su destrucción, pero a finales del siglo VII, la biblioteca ya no existía, dejando solo murmullos de su grandiosidad.", + "chapter_title_es": "La Última Destrucción" + }, + { + "chapter_title": "Legacy of Knowledge", + "text": "Despite its fall, the legacy of the Library of Alexandria endures. Its spirit lives on in the pursuit of knowledge and the quest to uncover its lost texts.", + "visual_prompt": "A modern scholar studying ancient texts in a library, with a map of ancient Alexandria in the background, illuminated by soft, ambient light.", + "stock_query": "modern scholar studying ancient texts", + "duration_estimate": 18, + "text_es": "A pesar de su caída, el legado de la Biblioteca de Alejandría persiste. Su espíritu vive en la búsqueda del conocimiento y el afán por descubrir sus textos perdidos.", + "chapter_title_es": "Legado del Saber" + } + ], + "title": "The Enigma of Alexandria", + "titles_es": [ + "El Enigma de Alejandría", + "Descubriendo la Biblioteca Perdida", + "El Conocimiento Olvidado de Alejandría" + ], + "description_es": "Descubre la misteriosa historia de la Biblioteca Perdida de Alejandría, una de las colecciones más antiguas y extensas del mundo. Explora su ascenso, caída y legado duradero. #Documental #Historia #Ciencia" +} \ No newline at end of file diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/subtitles_en.srt b/temp/1786889769_The_Lost_Library_of_Alexa/subtitles_en.srt new file mode 100644 index 0000000..f7d94f4 --- /dev/null +++ b/temp/1786889769_The_Lost_Library_of_Alexa/subtitles_en.srt @@ -0,0 +1,72 @@ +1 +00:00:00,000 --> 00:00:02,460 +The great library of Alexandria was + +2 +00:00:02,460 --> 00:00:04,960 +a beacon of knowledge, attracting scholars + +3 +00:00:04,960 --> 00:00:06,580 +from all corners of the ancient + +4 +00:00:06,580 --> 00:00:09,420 +world. Its vast collection of scrolls + +5 +00:00:09,420 --> 00:00:12,440 +and texts was unparalleled. Among its + +6 +00:00:12,440 --> 00:00:14,820 +treasures, the library housed the famous + +7 +00:00:14,820 --> 00:00:17,740 +Papyrus of Euphorian, a rare literary + +8 +00:00:17,740 --> 00:00:19,680 +work that vanished with the library's + +9 +00:00:19,680 --> 00:00:23,000 +destruction. Historians debate the exact date + +10 +00:00:23,000 --> 00:00:25,160 +and cause of its destruction, but + +11 +00:00:25,160 --> 00:00:27,100 +by the seventh century, the library + +12 +00:00:27,100 --> 00:00:29,380 +was no more, leaving only whispers + +13 +00:00:29,380 --> 00:00:32,020 +of its grandeur. Despite its fall, + +14 +00:00:32,440 --> 00:00:33,880 +the legacy of the library of + +15 +00:00:33,880 --> 00:00:37,100 +Alexandria endures. Its spirit lives on + +16 +00:00:37,100 --> 00:00:38,720 +in the pursuit of knowledge and + +17 +00:00:38,720 --> 00:00:40,240 +the quest to uncover its lost + +18 +00:00:40,240 --> 00:00:40,720 +texts. + diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/subtitles_es.srt b/temp/1786889769_The_Lost_Library_of_Alexa/subtitles_es.srt new file mode 100644 index 0000000..bf58e6b --- /dev/null +++ b/temp/1786889769_The_Lost_Library_of_Alexa/subtitles_es.srt @@ -0,0 +1,76 @@ +1 +00:00:00,000 --> 00:00:01,920 +La gran Biblióque de Legendria era + +2 +00:00:01,920 --> 00:00:05,120 +unifarolo de Canasemiento, atreada por Académicos + +3 +00:00:05,120 --> 00:00:07,060 +de Tuduz, Los Rincones del Mundo + +4 +00:00:07,060 --> 00:00:10,040 +Antiguio. Su extensa coxiendo rolos, why + +5 +00:00:10,040 --> 00:00:12,080 +textos eras sin par. Intresas de + +6 +00:00:12,080 --> 00:00:14,520 +Soros, la Biblió Calbergaba El Famoso, + +7 +00:00:14,700 --> 00:00:17,740 +Papiro de Euphoriano, Antrabajo Literario, Raro + +8 +00:00:17,740 --> 00:00:19,940 +Que Dissepercio, Janto Canla de Struchián + +9 +00:00:19,940 --> 00:00:22,040 +de la Biblióque. Los historiadores de + +10 +00:00:22,040 --> 00:00:23,580 +Beten la fecha exacta while a + +11 +00:00:23,580 --> 00:00:25,600 +costa de su distruchián. Piro de + +12 +00:00:25,600 --> 00:00:27,860 +finales del siglo VII, la Biblióque + +13 +00:00:27,860 --> 00:00:29,320 +que ya no existia, de Gendo + +14 +00:00:29,320 --> 00:00:31,860 +Solo, Marmolos, de su grandiacidad. A + +15 +00:00:31,860 --> 00:00:33,620 +pesar de su ceda, el legado + +16 +00:00:33,620 --> 00:00:35,580 +de la Biblióque de Legendria persiste. + +17 +00:00:36,040 --> 00:00:37,280 +Su espiro 2 -5 en la + +18 +00:00:37,280 --> 00:00:39,660 +Básqueda del Canasemiento, while a fond + +19 +00:00:39,660 --> 00:00:41,680 +por descubrier sus textos perdidos. + diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_A_clean.png b/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_A_clean.png new file mode 100644 index 0000000..eefacf3 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_A_clean.png differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_A_en.png b/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_A_en.png new file mode 100644 index 0000000..09c4900 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_A_en.png differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_A_es.png b/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_A_es.png new file mode 100644 index 0000000..b74bd02 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_A_es.png differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_B_clean.png b/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_B_clean.png new file mode 100644 index 0000000..6b9d1a3 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_B_clean.png differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_B_en.png b/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_B_en.png new file mode 100644 index 0000000..8953169 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_B_en.png differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_B_es.png b/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_B_es.png new file mode 100644 index 0000000..e8a9679 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_B_es.png differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_C_clean.png b/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_C_clean.png new file mode 100644 index 0000000..8868cdf Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_C_clean.png differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_C_en.png b/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_C_en.png new file mode 100644 index 0000000..0fcbcf8 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_C_en.png differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_C_es.png b/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_C_es.png new file mode 100644 index 0000000..a448b28 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/thumbs/thumb_C_es.png differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/tts_en_000.wav b/temp/1786889769_The_Lost_Library_of_Alexa/tts_en_000.wav new file mode 100644 index 0000000..737ddb8 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/tts_en_000.wav differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/tts_en_001.wav b/temp/1786889769_The_Lost_Library_of_Alexa/tts_en_001.wav new file mode 100644 index 0000000..5d0b930 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/tts_en_001.wav differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/tts_en_002.wav b/temp/1786889769_The_Lost_Library_of_Alexa/tts_en_002.wav new file mode 100644 index 0000000..127da72 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/tts_en_002.wav differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/tts_en_003.wav b/temp/1786889769_The_Lost_Library_of_Alexa/tts_en_003.wav new file mode 100644 index 0000000..7c2c010 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/tts_en_003.wav differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/tts_es_000.wav b/temp/1786889769_The_Lost_Library_of_Alexa/tts_es_000.wav new file mode 100644 index 0000000..1d61692 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/tts_es_000.wav differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/tts_es_001.wav b/temp/1786889769_The_Lost_Library_of_Alexa/tts_es_001.wav new file mode 100644 index 0000000..e645569 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/tts_es_001.wav differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/tts_es_002.wav b/temp/1786889769_The_Lost_Library_of_Alexa/tts_es_002.wav new file mode 100644 index 0000000..078d956 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/tts_es_002.wav differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/tts_es_003.wav b/temp/1786889769_The_Lost_Library_of_Alexa/tts_es_003.wav new file mode 100644 index 0000000..82e7459 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/tts_es_003.wav differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/voiceover_en.wav b/temp/1786889769_The_Lost_Library_of_Alexa/voiceover_en.wav new file mode 100644 index 0000000..bf27526 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/voiceover_en.wav differ diff --git a/temp/1786889769_The_Lost_Library_of_Alexa/voiceover_es.wav b/temp/1786889769_The_Lost_Library_of_Alexa/voiceover_es.wav new file mode 100644 index 0000000..90ab6d4 Binary files /dev/null and b/temp/1786889769_The_Lost_Library_of_Alexa/voiceover_es.wav differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/background_music.wav b/temp/1786889838_The_Mysterious_Derinkuyu/background_music.wav new file mode 100644 index 0000000..848f30b Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/background_music.wav differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_000.mp4 b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_000.mp4 new file mode 100644 index 0000000..93aeabf Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_000.mp4 differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_001.mp4 b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_001.mp4 new file mode 100644 index 0000000..7676275 Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_001.mp4 differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_002.mp4 b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_002.mp4 new file mode 100644 index 0000000..10dc1e8 Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_002.mp4 differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_003.mp4 b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_003.mp4 new file mode 100644 index 0000000..2df9d77 Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_003.mp4 differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_en_000.mp4 b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_en_000.mp4 new file mode 100644 index 0000000..a559ade Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_en_000.mp4 differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_en_001.mp4 b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_en_001.mp4 new file mode 100644 index 0000000..37b76c8 Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_en_001.mp4 differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_en_002.mp4 b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_en_002.mp4 new file mode 100644 index 0000000..e6d0a8b Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_en_002.mp4 differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_en_003.mp4 b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_en_003.mp4 new file mode 100644 index 0000000..1c82884 Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_en_003.mp4 differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_es_000.mp4 b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_es_000.mp4 new file mode 100644 index 0000000..58b0cc6 Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_es_000.mp4 differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_es_001.mp4 b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_es_001.mp4 new file mode 100644 index 0000000..c1d825b Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_es_001.mp4 differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_es_002.mp4 b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_es_002.mp4 new file mode 100644 index 0000000..c3d06ec Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_es_002.mp4 differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_es_003.mp4 b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_es_003.mp4 new file mode 100644 index 0000000..3aed6fe Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/clips/clip_es_003.mp4 differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/clips/raw_img_002.jpg b/temp/1786889838_The_Mysterious_Derinkuyu/clips/raw_img_002.jpg new file mode 100644 index 0000000..f9d57d0 Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/clips/raw_img_002.jpg differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/clips/raw_img_003.jpg b/temp/1786889838_The_Mysterious_Derinkuyu/clips/raw_img_003.jpg new file mode 100644 index 0000000..ef2740f Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/clips/raw_img_003.jpg differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/clips/raw_vid_000.mp4 b/temp/1786889838_The_Mysterious_Derinkuyu/clips/raw_vid_000.mp4 new file mode 100644 index 0000000..d525b84 Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/clips/raw_vid_000.mp4 differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/clips/raw_vid_001.mp4 b/temp/1786889838_The_Mysterious_Derinkuyu/clips/raw_vid_001.mp4 new file mode 100644 index 0000000..ac38eac Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/clips/raw_vid_001.mp4 differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/script.json b/temp/1786889838_The_Mysterious_Derinkuyu/script.json new file mode 100644 index 0000000..1c3dbb1 --- /dev/null +++ b/temp/1786889838_The_Mysterious_Derinkuyu/script.json @@ -0,0 +1,77 @@ +{ + "titles": [ + "Derinkuyu: The Lost Underground City", + "Unearthed: Derinkuyu’s Hidden Past", + "Derinkuyu: A Mysterious Underground City Revealed" + ], + "hook": "What lies beneath the earth's surface?", + "description": "Discover the enigmatic Derinkuyu Underground City, a marvel of ancient engineering. Dive into its hidden chambers, explore its mysterious origins, and uncover the secrets that have remained buried for centuries. #Documentary #History #Science", + "tags": [ + "documentary", + "history", + "ancient", + "underground city", + "derinkuyu", + "turkey", + "mystery", + "engineering", + "archaeology", + "ancient civilization", + "hidden city", + "underground", + "history" + ], + "script_segments": [ + { + "chapter_title": "Ancient Mystery", + "text": "In the heart of Turkey, an ancient city lies hidden, its secrets buried for millennia. Derinkuyu, a labyrinth of tunnels and chambers, was built to withstand sieges and invasions.", + "visual_prompt": "Dark, stone corridors lit by flickering torches, vast underground spaces with pillars and arches, people in period costumes", + "stock_query": "ancient tunnels", + "on_screen_text": "Depth: 11,034m", + "duration_estimate": 18, + "text_es": "En el corazón de Turquía, una antigua ciudad se oculta, sus secretos sepultados durante milenios. Derinkuyu, un laberinto de túneles y salones, fue construido para resistir asedios e invasiones.", + "chapter_title_es": "Misterio Antiguo", + "on_screen_text_es": "Profundidad: 11,034m" + }, + { + "chapter_title": "Critical Discovery", + "text": "In 1960, local farmers stumbled upon the entrance, unveiling a city that could house thousands. Archaeologists raced to document the findings, piecing together the city’s history.", + "visual_prompt": "Excavation site with archaeologists working, dusty artifacts being uncovered, people in modern clothes standing beside ancient stones", + "stock_query": "archaeological excavation", + "on_screen_text": "Year: 1960", + "duration_estimate": 18, + "text_es": "En 1960, agricultores locales descubrieron el acceso, revelando una ciudad que podría albergar a miles de habitantes. Arqueólogos se apresuraron a documentar los hallazgos, reconstruyendo la historia de la ciudad.", + "chapter_title_es": "Descubrimiento Crítico", + "on_screen_text_es": "Año: 1960" + }, + { + "chapter_title": "Hidden Chambers", + "text": "The city features complex systems for air, water, and food, hinting at a sophisticated society. Each level, with its own unique features, reveals the ingenuity of its builders.", + "visual_prompt": "Close-up of intricate ceiling designs, water storage tanks, ventilation shafts, and living spaces with stone beds and hearths", + "stock_query": "underground city layout", + "on_screen_text": "Levels: 8", + "duration_estimate": 18, + "text_es": "La ciudad cuenta con complejos sistemas de aire, agua y alimentos, sugiriendo una sociedad sofisticada. Cada nivel, con sus propias características únicas, revela la ingeniosidad de sus constructores.", + "chapter_title_es": "Salones Ocultos", + "on_screen_text_es": "Niveles: 8" + }, + { + "chapter_title": "Mysterious Origins", + "text": "Derinkuyu remains a puzzle, with no clear records of its builders. Some theories link it to the Phrygians, Hittites, or even the Knights Templar, adding to its allure.", + "visual_prompt": "Maps showing ancient civilizations, stone inscriptions, and people theorizing and debating, a city skyline in the background", + "stock_query": "ancient theories", + "on_screen_text": "Theories: Many", + "duration_estimate": 18, + "text_es": "Derinkuyu permanece un rompecabezas, sin registros claros de sus constructores. Se han propuesto teorías que lo vinculan con los Frigios, Hititas, o incluso los Caballeros Templarios, añadiendo a su encanto.", + "chapter_title_es": "Orígenes Misteriosos", + "on_screen_text_es": "Teorías: Muchas" + } + ], + "title": "Derinkuyu: The Lost Underground City", + "titles_es": [ + "Derinkuyu: La Ciudad Soterrada Olvidada", + "Descubierto: El Pasado Oculto de Derinkuyu", + "Derinkuyu: Una Ciudad Soterrada Misteriosa Revelada" + ], + "description_es": "Descubre la enigmática Ciudad Soterrada de Derinkuyu, un maravilloso ejemplo de ingeniería antigua. Sumérgete en sus salones ocultos, explora sus orígenes misteriosos e inicies el descubrimiento de secretos que han permanecido enterrados durante siglos. #Documentario #Historia #Ciencia" +} \ No newline at end of file diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/subtitles_en.srt b/temp/1786889838_The_Mysterious_Derinkuyu/subtitles_en.srt new file mode 100644 index 0000000..c34d872 --- /dev/null +++ b/temp/1786889838_The_Mysterious_Derinkuyu/subtitles_en.srt @@ -0,0 +1,76 @@ +1 +00:00:00,000 --> 00:00:01,540 +In the heart of Turkey, an + +2 +00:00:01,540 --> 00:00:03,900 +ancient city lies hidden. Its secrets + +3 +00:00:03,900 --> 00:00:06,800 +buried for millennia. During Kuyu, a + +4 +00:00:06,800 --> 00:00:09,000 +labyrinth of tunnels and chambers was + +5 +00:00:09,000 --> 00:00:11,240 +built to withstand sieges and invasions. + +6 +00:00:11,960 --> 00:00:14,980 +In 1960, local farmers stumbled upon + +7 +00:00:14,980 --> 00:00:17,220 +the entrance, unveiling a city that + +8 +00:00:17,220 --> 00:00:20,340 +could house thousands. Archaeologists race to + +9 +00:00:20,340 --> 00:00:22,660 +document the findings, piecing together the + +10 +00:00:22,660 --> 00:00:25,560 +city's history. The city features complex + +11 +00:00:25,560 --> 00:00:27,860 +systems for air, water, and food, + +12 +00:00:27,860 --> 00:00:31,180 +hinting at a sophisticated society. Each + +13 +00:00:31,180 --> 00:00:32,960 +level, with its own unique features, + +14 +00:00:33,440 --> 00:00:35,240 +reveals the ingenuity of its builders. + +15 +00:00:36,200 --> 00:00:38,180 +During Kuyu remains a puzzle with + +16 +00:00:38,180 --> 00:00:39,740 +no clear records of its builders. + +17 +00:00:40,440 --> 00:00:41,740 +Some theories link it to the + +18 +00:00:41,740 --> 00:00:43,960 +Frigians, Hittites, or even the Knights + +19 +00:00:43,960 --> 00:00:45,840 +Templar, adding to its allure. + diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/subtitles_es.srt b/temp/1786889838_The_Mysterious_Derinkuyu/subtitles_es.srt new file mode 100644 index 0000000..ca3d286 --- /dev/null +++ b/temp/1786889838_The_Mysterious_Derinkuyu/subtitles_es.srt @@ -0,0 +1,84 @@ +1 +00:00:00,000 --> 00:00:01,740 +En el corzán de Turquia, y + +2 +00:00:01,740 --> 00:00:04,680 +una antigua ciudad siacolta sasecrito sepultados + +3 +00:00:04,680 --> 00:00:07,080 +de Rante Milños. Daring cuyo un + +4 +00:00:07,080 --> 00:00:09,120 +laborinto de túneles y salones, fue + +5 +00:00:09,120 --> 00:00:11,740 +construido para resistir asedios y invasiones. + +6 +00:00:12,120 --> 00:00:15,200 +En 1960, agricultores locales descubrieron el + +7 +00:00:15,200 --> 00:00:17,480 +exceso, revelando una ciudad que fue + +8 +00:00:17,480 --> 00:00:19,520 +podria albergar a miles de habitantes. + +9 +00:00:20,060 --> 00:00:22,380 +Arquilógos se aprieraron a documentar los + +10 +00:00:22,380 --> 00:00:24,860 +halazgos, reconstruyendo la historia de la + +11 +00:00:24,860 --> 00:00:26,860 +ciudad. La ciudad que cuyenta con + +12 +00:00:26,860 --> 00:00:28,960 +complejos sistemas de heir, agua y + +13 +00:00:28,960 --> 00:00:31,080 +alimento, sugeriendo un asocio de la + +14 +00:00:31,080 --> 00:00:33,800 +sofisticada. Cada Nivel, con sus propias + +15 +00:00:33,800 --> 00:00:36,600 +características únicas, revela la ingenia ciudad + +16 +00:00:36,600 --> 00:00:39,020 +de sus constructores. Daring cuyo pérmense + +17 +00:00:39,020 --> 00:00:41,480 +en rompecabes, sin registros claros de + +18 +00:00:41,480 --> 00:00:44,300 +sus constructores. Cihem propuso teorias que + +19 +00:00:44,300 --> 00:00:46,480 +lo vinculan con los frijos, heatitas, + +20 +00:00:46,960 --> 00:00:49,200 +o incluso los caballeros templarios, y + +21 +00:00:49,200 --> 00:00:50,380 +de indos su encanto. + diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_A_clean.png b/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_A_clean.png new file mode 100644 index 0000000..fbfaf45 Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_A_clean.png differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_A_en.png b/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_A_en.png new file mode 100644 index 0000000..035e1f6 Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_A_en.png differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_A_es.png b/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_A_es.png new file mode 100644 index 0000000..e076f2a Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_A_es.png differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_B_clean.png b/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_B_clean.png new file mode 100644 index 0000000..431c808 Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_B_clean.png differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_B_en.png b/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_B_en.png new file mode 100644 index 0000000..b4ae42f Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_B_en.png differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_B_es.png b/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_B_es.png new file mode 100644 index 0000000..4dc776f Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_B_es.png differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_C_clean.png b/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_C_clean.png new file mode 100644 index 0000000..d5ce7fa Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_C_clean.png differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_C_en.png b/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_C_en.png new file mode 100644 index 0000000..754871a Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_C_en.png differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_C_es.png b/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_C_es.png new file mode 100644 index 0000000..02692ba Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/thumbs/thumb_C_es.png differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/tts_en_000.wav b/temp/1786889838_The_Mysterious_Derinkuyu/tts_en_000.wav new file mode 100644 index 0000000..ec7f784 Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/tts_en_000.wav differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/tts_en_001.wav b/temp/1786889838_The_Mysterious_Derinkuyu/tts_en_001.wav new file mode 100644 index 0000000..468bb48 Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/tts_en_001.wav differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/tts_en_002.wav b/temp/1786889838_The_Mysterious_Derinkuyu/tts_en_002.wav new file mode 100644 index 0000000..61a2adf Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/tts_en_002.wav differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/tts_en_003.wav b/temp/1786889838_The_Mysterious_Derinkuyu/tts_en_003.wav new file mode 100644 index 0000000..f33fd2b Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/tts_en_003.wav differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/tts_es_000.wav b/temp/1786889838_The_Mysterious_Derinkuyu/tts_es_000.wav new file mode 100644 index 0000000..73405dc Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/tts_es_000.wav differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/tts_es_001.wav b/temp/1786889838_The_Mysterious_Derinkuyu/tts_es_001.wav new file mode 100644 index 0000000..8ffdf35 Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/tts_es_001.wav differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/tts_es_002.wav b/temp/1786889838_The_Mysterious_Derinkuyu/tts_es_002.wav new file mode 100644 index 0000000..246f9b7 Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/tts_es_002.wav differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/tts_es_003.wav b/temp/1786889838_The_Mysterious_Derinkuyu/tts_es_003.wav new file mode 100644 index 0000000..daf4d57 Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/tts_es_003.wav differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/voiceover_en.wav b/temp/1786889838_The_Mysterious_Derinkuyu/voiceover_en.wav new file mode 100644 index 0000000..0498f19 Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/voiceover_en.wav differ diff --git a/temp/1786889838_The_Mysterious_Derinkuyu/voiceover_es.wav b/temp/1786889838_The_Mysterious_Derinkuyu/voiceover_es.wav new file mode 100644 index 0000000..1f5d9c6 Binary files /dev/null and b/temp/1786889838_The_Mysterious_Derinkuyu/voiceover_es.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/background_music.wav b/temp/1786891137_Who_was_Jack_the_Ripper/background_music.wav new file mode 100644 index 0000000..e81f1d8 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/background_music.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_000.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_000.mp4 new file mode 100644 index 0000000..c057747 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_000.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_001.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_001.mp4 new file mode 100644 index 0000000..5b3f118 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_001.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_002.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_002.mp4 new file mode 100644 index 0000000..b733fdb Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_002.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_003.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_003.mp4 new file mode 100644 index 0000000..0aef4bf Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_003.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_004.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_004.mp4 new file mode 100644 index 0000000..921383f Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_004.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_005.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_005.mp4 new file mode 100644 index 0000000..d70973b Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_005.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_006.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_006.mp4 new file mode 100644 index 0000000..c309bb2 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_006.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_007.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_007.mp4 new file mode 100644 index 0000000..cde4b4d Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_007.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_008.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_008.mp4 new file mode 100644 index 0000000..c94e2d4 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_008.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_009.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_009.mp4 new file mode 100644 index 0000000..2e0ed2f Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_009.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_000.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_000.mp4 new file mode 100644 index 0000000..b45de5d Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_000.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_001.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_001.mp4 new file mode 100644 index 0000000..043abdc Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_001.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_002.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_002.mp4 new file mode 100644 index 0000000..b8db38c Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_002.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_003.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_003.mp4 new file mode 100644 index 0000000..23409b1 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_003.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_004.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_004.mp4 new file mode 100644 index 0000000..7ef46c6 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_004.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_005.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_005.mp4 new file mode 100644 index 0000000..f25d98a Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_005.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_006.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_006.mp4 new file mode 100644 index 0000000..6ba8b01 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_006.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_007.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_007.mp4 new file mode 100644 index 0000000..95d7f56 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_007.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_008.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_008.mp4 new file mode 100644 index 0000000..1f7f69c Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_008.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_009.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_009.mp4 new file mode 100644 index 0000000..2ebaf4c Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_en_009.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_000.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_000.mp4 new file mode 100644 index 0000000..b45de5d Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_000.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_001.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_001.mp4 new file mode 100644 index 0000000..c506e3d Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_001.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_002.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_002.mp4 new file mode 100644 index 0000000..f313ebb Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_002.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_003.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_003.mp4 new file mode 100644 index 0000000..dac0a65 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_003.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_004.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_004.mp4 new file mode 100644 index 0000000..7ef46c6 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_004.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_005.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_005.mp4 new file mode 100644 index 0000000..9ea3823 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_005.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_006.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_006.mp4 new file mode 100644 index 0000000..88da5d5 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_006.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_007.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_007.mp4 new file mode 100644 index 0000000..122150a Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_007.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_008.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_008.mp4 new file mode 100644 index 0000000..a8d8a71 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_008.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_009.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_009.mp4 new file mode 100644 index 0000000..0223e0e Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/clip_es_009.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_img_002.jpg b/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_img_002.jpg new file mode 100644 index 0000000..ee72de9 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_img_002.jpg differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_img_003.jpg b/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_img_003.jpg new file mode 100644 index 0000000..cea2551 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_img_003.jpg differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_img_006.jpg b/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_img_006.jpg new file mode 100644 index 0000000..f0deaff Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_img_006.jpg differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_img_007.jpg b/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_img_007.jpg new file mode 100644 index 0000000..f0bb928 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_img_007.jpg differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_vid_000.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_vid_000.mp4 new file mode 100644 index 0000000..ab29624 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_vid_000.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_vid_001.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_vid_001.mp4 new file mode 100644 index 0000000..c01c3ff Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_vid_001.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_vid_004.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_vid_004.mp4 new file mode 100644 index 0000000..1e69eb3 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_vid_004.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_vid_005.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_vid_005.mp4 new file mode 100644 index 0000000..bebf789 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_vid_005.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_vid_008.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_vid_008.mp4 new file mode 100644 index 0000000..e086858 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_vid_008.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_vid_009.mp4 b/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_vid_009.mp4 new file mode 100644 index 0000000..39bb7b2 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/clips/raw_vid_009.mp4 differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/script.json b/temp/1786891137_Who_was_Jack_the_Ripper/script.json new file mode 100644 index 0000000..c296d17 --- /dev/null +++ b/temp/1786891137_Who_was_Jack_the_Ripper/script.json @@ -0,0 +1,144 @@ +{ + "titles": [ + "Jack the Ripper: The Unsolved Mystery", + "Who Was the Real Jack the Ripper?", + "Jack the Ripper: Why Was He Never Caught?" + ], + "hook": "Who was Jack the Ripper, and why did he escape justice?", + "description": "Jack the Ripper remains one of history's most notorious and enigmatic serial killers. Join us on a chilling journey through the fog-drenched streets of Victorian London, uncovering the stories behind the murders, the suspects, and the enduring mystery. #Documentary #History #JackTheRipper", + "tags": [ + "documentary", + "history", + "jack the ripper", + "serial killer", + "crime", + "victorian england", + "unsolved mystery", + "police investigation", + "forensic science", + "mystery", + "true crime", + "urban legend", + "police records", + "19th century" + ], + "script_segments": [ + { + "chapter_title": "The Murders", + "text": "In 1888, the Whitechapel district of London was terrorized by a mysterious figure known as Jack the Ripper. Five women were brutally murdered in a matter of weeks.", + "visual_prompt": "Close-up of a Victorian street at night, with fog rolling in, dimly lit houses and cobblestone streets", + "stock_query": "victorian london streets", + "on_screen_text": "Whitechapel, 1888", + "duration_estimate": 18, + "text_es": "En 1888, el distrito de Whitechapel en Londres fue asolado por una figura misteriosa conocida como Jack el Destripador. Cinco mujeres fueron brutalmente asesinadas en apenas unas semanas.", + "chapter_title_es": "Los Asesinatos", + "on_screen_text_es": "Whitechapel, 1888" + }, + { + "chapter_title": "The Victims", + "text": "The victims were all sex workers, brutally mutilated, their bodies found in alleys and backyards. The case was dubbed 'The Whitechapel Murders'.", + "visual_prompt": "A dark alley with a woman in a red dress, surrounded by shadows, a chilling atmosphere", + "stock_query": "whitechapel alley", + "on_screen_text": "Victims: 5", + "duration_estimate": 18, + "text_es": "Las víctimas eran todas trabajadoras sexuales, mutiladas de manera brutal, sus cuerpos fueron encontrados en callejones y patios traseros. El caso se conoció como 'Los Asesinatos de Whitechapel'.", + "chapter_title_es": "Las Víctimas", + "on_screen_text_es": "Victimas: 5" + }, + { + "chapter_title": "The Suspects", + "text": "Scores of suspects were investigated, including immigrants, doctors, and even a famous doctor, Dr. William H. Palmer. Each was a potential candidate, but all were eventually cleared.", + "visual_prompt": "A crowded room with detectives and suspects in Victorian attire, a tense atmosphere", + "stock_query": "detectives and suspects", + "on_screen_text": "Suspects: Many", + "duration_estimate": 18, + "text_es": "Se investigaron cientos de sospechosos, incluyendo inmigrantes, médicos y hasta un famoso doctor, Dr. William H. Palmer. Cada uno era un candidato potencial, pero todos fueron eventualmente descartados.", + "chapter_title_es": "Los Sospechosos", + "on_screen_text_es": "Sospechosos: Muchos" + }, + { + "chapter_title": "The Letters", + "text": "The killer left two chilling letters, one to the Central News and another to the Whitechapel Vigilance Committee. They contained warnings and taunts, but no concrete evidence.", + "visual_prompt": "A hand writing a letter, with typewriting in the background, a mysterious atmosphere", + "stock_query": "victorian letters", + "on_screen_text": "Letters: 2", + "duration_estimate": 18, + "text_es": "El asesino dejó dos cartas espeluznantes, una a Central News y otra a la Comisión de Vigilancia de Whitechapel. Contenían advertencias y desafíos, pero no evidencia concreta.", + "chapter_title_es": "Las Cartas", + "on_screen_text_es": "Cartas: 2" + }, + { + "chapter_title": "The Investigation", + "text": "The Metropolitan Police, led by Inspector Abberline, conducted a meticulous investigation, but the clues were few and the suspects many.", + "visual_prompt": "Inspector Abberline in Victorian attire, walking through a foggy London street, a determined look on his face", + "stock_query": "victorian police", + "on_screen_text": "Inspector Abberline", + "duration_estimate": 18, + "text_es": "La policía metropolitana, liderada por el Inspector Abberline, llevó a cabo una investigación minuciosa, pero las pistas eran pocas y los sospechosos muchos.", + "chapter_title_es": "La Investigación", + "on_screen_text_es": "Inspector Abberline" + }, + { + "chapter_title": "Theories", + "text": "Theories about Jack the Ripper range from a doctor to a woman to even a supernatural entity. Nothing has been proven, and the case remains open.", + "visual_prompt": "A group of people discussing theories, a library with books on serial killers, a mysterious atmosphere", + "stock_query": "theories on serial killers", + "on_screen_text": "Theories: Many", + "duration_estimate": 18, + "text_es": "Las teorías sobre Jack el Destripador van desde un médico hasta una mujer, incluso hasta una entidad sobrenatural. Nada ha sido probado y el caso permanece abierto.", + "chapter_title_es": "Las Teorías", + "on_screen_text_es": "Teorías: Muchas" + }, + { + "chapter_title": "The Evidence", + "text": "Despite extensive searches, no conclusive evidence was found. The Ripper's signature was never matched, and the case went cold.", + "visual_prompt": "A detective looking at evidence in a laboratory, a microscope and documents in the background, a tense atmosphere", + "stock_query": "evidence in crime", + "on_screen_text": "Evidence: None", + "duration_estimate": 18, + "text_es": "A pesar de las exhaustivas investigaciones, no se encontró evidencia concluyente. El sello del asesino nunca fue identificado, y el caso se enfrío.", + "chapter_title_es": "La Evidencia", + "on_screen_text_es": "Evidencia: Ninguna" + }, + { + "chapter_title": "The Legacy", + "text": "Jack the Ripper has become a symbol of fear and fascination. His name has been the subject of countless books and films, a shadow that haunts the history of London.", + "visual_prompt": "A modern-day film set with actors portraying Jack the Ripper, a mysterious atmosphere, a dark and foreboding setting", + "stock_query": "jack the ripper film", + "on_screen_text": "Legacy: Enduring", + "duration_estimate": 18, + "text_es": "Jack el Destripador se ha convertido en un símbolo de miedo y fascinación. Su nombre ha sido el tema de numerosos libros y películas, una sombra que persigue la historia de Londres.", + "chapter_title_es": "El Legado", + "on_screen_text_es": "Legado: Duradero" + }, + { + "chapter_title": "The Unsolved Mystery", + "text": "Jack the Ripper remains one of the most enduring unsolved mysteries in history. His identity, if ever known, has never been revealed.", + "visual_prompt": "A silhouette of a figure in the fog, a mysterious and eerie atmosphere, a dark and foreboding setting", + "stock_query": "unsolved mysteries", + "on_screen_text": "Jack the Ripper", + "duration_estimate": 18, + "text_es": "Jack el Destripador sigue siendo uno de los misterios sin resolver más duraderos en la historia. Su identidad, si alguna vez se conoció, nunca fue revelada.", + "chapter_title_es": "El Misterio Sin Resolver", + "on_screen_text_es": "Jack el Destripador" + }, + { + "chapter_title": "The Ripper's Escape", + "text": "Jack the Ripper escaped justice, leaving behind a legacy of fear and a mystery that continues to captivate the world.", + "visual_prompt": "A detective looking out a window into the fog, a mysterious and eerie atmosphere, a dark and foreboding setting", + "stock_query": "detective looking out", + "on_screen_text": "Jack the Ripper", + "duration_estimate": 18, + "text_es": "Jack el Destripador escapó de la justicia, dejando tras de sí una legado de miedo y un misterio que continúa atrapando al mundo.", + "chapter_title_es": "El Escape de Jack el Destripador", + "on_screen_text_es": "Jack el Destripador" + } + ], + "title": "Jack the Ripper: The Unsolved Mystery", + "titles_es": [ + "Jack el Destripador: El Misterio Sin Resolver", + "¿Quién Fue el Real Jack el Destripador?", + "Jack el Destripador: ¿Por Qué Nunca Fue Capturado?" + ], + "description_es": "Jack el Destripador sigue siendo uno de los asesinos más notables y enigmáticos de la historia. Únete a nosotros en un viaje inquietante por las calles neblinosas de Londres victoriana, descubriendo las historias detrás de los asesinatos, los sospechosos y el misterio que permanece intacto. #Documental #Historia #JackElDestripador" +} \ No newline at end of file diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/subtitles_en.srt b/temp/1786891137_Who_was_Jack_the_Ripper/subtitles_en.srt new file mode 100644 index 0000000..c39918c --- /dev/null +++ b/temp/1786891137_Who_was_Jack_the_Ripper/subtitles_en.srt @@ -0,0 +1,164 @@ +1 +00:00:00,000 --> 00:00:02,880 +In 1888, the white tecapel district + +2 +00:00:02,880 --> 00:00:04,840 +of London was terrorized by a + +3 +00:00:04,840 --> 00:00:07,060 +mysterious figure known as Jack the + +4 +00:00:07,060 --> 00:00:09,600 +Ripper. Five women were brutally murdered + +5 +00:00:09,600 --> 00:00:11,640 +in a matter of weeks. The + +6 +00:00:11,640 --> 00:00:13,920 +victims were all sex workers, brutally + +7 +00:00:13,920 --> 00:00:16,360 +mutilated, their bodies found in alleys + +8 +00:00:16,360 --> 00:00:18,680 +and backyards. The case was dubbed + +9 +00:00:18,680 --> 00:00:21,500 +the white tecapel murders. Scores of + +10 +00:00:21,500 --> 00:00:24,840 +suspects were investigated, including immigrants, doctors, + +11 +00:00:25,180 --> 00:00:27,060 +and even a famous doctor, Dr. + +12 +00:00:27,280 --> 00:00:29,360 +William H. Palmer. Each was a + +13 +00:00:29,360 --> 00:00:31,620 +potential candidate, but all were eventually + +14 +00:00:31,620 --> 00:00:34,300 +cleared. The killer left two chilling + +15 +00:00:34,300 --> 00:00:36,300 +letters, one to the central news, + +16 +00:00:36,600 --> 00:00:37,960 +and another to the white tecapel + +17 +00:00:37,960 --> 00:00:40,960 +vigilance committee. They contained warnings and + +18 +00:00:40,960 --> 00:00:43,980 +taunts, but no concrete evidence. The + +19 +00:00:43,980 --> 00:00:47,040 +Metropolitan Police, led by Inspector Abberline, + +20 +00:00:47,500 --> 00:00:50,420 +conducted a meticulous investigation. But the + +21 +00:00:50,420 --> 00:00:52,140 +clues were few and the suspects + +22 +00:00:52,140 --> 00:00:54,880 +many. Theories about Jack the Ripper + +23 +00:00:54,880 --> 00:00:56,640 +range from a doctor to a + +24 +00:00:56,640 --> 00:00:58,760 +woman to even a supernatural entity. + +25 +00:00:59,360 --> 00:01:01,240 +Nothing has been proven and the + +26 +00:01:01,240 --> 00:01:04,520 +case remains open. Despite extensive searches, + +27 +00:01:05,020 --> 00:01:07,520 +no conclusive evidence was found. The + +28 +00:01:07,520 --> 00:01:09,680 +Ripper's signature was never matched and + +29 +00:01:09,680 --> 00:01:11,900 +the case went cold. Jack the + +30 +00:01:11,900 --> 00:01:13,460 +Ripper has become a symbol of + +31 +00:01:13,460 --> 00:01:16,300 +fear and fascination. His name has + +32 +00:01:16,300 --> 00:01:18,000 +been the subject of countless books + +33 +00:01:18,000 --> 00:01:20,060 +and films, a shadow that haunts + +34 +00:01:20,060 --> 00:01:22,360 +the history of London. Jack the + +35 +00:01:22,360 --> 00:01:23,740 +Ripper remains one of the most + +36 +00:01:23,740 --> 00:01:26,900 +enduring unsolved mysteries in history. His + +37 +00:01:26,900 --> 00:01:29,340 +identity, if ever known, has never + +38 +00:01:29,340 --> 00:01:31,920 +been revealed. Jack the Ripper escaped + +39 +00:01:31,920 --> 00:01:34,480 +justice, leaving behind a legacy of + +40 +00:01:34,480 --> 00:01:36,420 +fear and a mystery that continues + +41 +00:01:36,420 --> 00:01:37,680 +to captivate the world. + diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/subtitles_es.srt b/temp/1786891137_Who_was_Jack_the_Ripper/subtitles_es.srt new file mode 100644 index 0000000..1ce40cc --- /dev/null +++ b/temp/1786891137_Who_was_Jack_the_Ripper/subtitles_es.srt @@ -0,0 +1,180 @@ +1 +00:00:00,000 --> 00:00:02,820 +En 1888, el distrito de whitecapele + +2 +00:00:02,820 --> 00:00:05,160 +en Londres, Fuea Salado, por unificiero + +3 +00:00:05,160 --> 00:00:07,260 +misteriosa Canása de Camo, Jack L. + +4 +00:00:07,360 --> 00:00:10,740 +Distribidor. Cinco Mujer's Fioran Brutalment asesinadas, + +5 +00:00:11,100 --> 00:00:12,900 +N .A. Pina's Yunas Semanas. Las + +6 +00:00:12,900 --> 00:00:15,960 +víctimas iran totes trabigeras sexuales, mutiladas + +7 +00:00:15,960 --> 00:00:18,300 +de manera brutal, suscupos furan en + +8 +00:00:18,300 --> 00:00:21,420 +contratos y callejones y patiostraseros. El + +9 +00:00:21,420 --> 00:00:23,980 +Caso Sicanosio Camo, los asesinatos de + +10 +00:00:23,980 --> 00:00:26,220 +whitecapele. Si investigar en Tos de + +11 +00:00:26,220 --> 00:00:29,420 +Suspechosos, inclayendo en migrantes, Madeco's White + +12 +00:00:29,420 --> 00:00:31,800 +Haistron Famoso Doctor, Dr. William H. + +13 +00:00:31,960 --> 00:00:34,180 +Palmer. Cada uno era en Candidato + +14 +00:00:34,180 --> 00:00:37,620 +Potential, Piro toduz Fioran eventualmente discartados. + +15 +00:00:38,100 --> 00:00:39,600 +El asesino de Joe Duz Cartas + +16 +00:00:39,600 --> 00:00:42,140 +espelas nantes, Yunas Central News, White + +17 +00:00:42,140 --> 00:00:44,700 +Otra Elacomision de Vigiláncia de Whitecapele. + +18 +00:00:45,100 --> 00:00:47,820 +Continian advertencias y disafios, Piro no + +19 +00:00:47,820 --> 00:00:50,940 +evidente concreta. La Policia Metropolitana, la + +20 +00:00:50,940 --> 00:00:53,040 +hidrada por el Inspector Abberline, Livo + +21 +00:00:53,040 --> 00:00:56,500 +Acaboyuna Investigación Minuciosa, Piro las Pistas + +22 +00:00:56,500 --> 00:00:59,080 +Irán Pocas y Los Suspechosos Muchos. + +23 +00:00:59,480 --> 00:01:01,500 +Las teorias Saber Jack, El Distributor + +24 +00:01:01,500 --> 00:01:03,260 +Vendiz de Un Médico, Haste Una + +25 +00:01:03,260 --> 00:01:05,800 +Mujer, Incluso Haste Una, Entidad Saber + +26 +00:01:05,800 --> 00:01:08,500 +Natural. Nada ha sido probado while + +27 +00:01:08,500 --> 00:01:10,900 +Caso Permins Abberdo. Apesar de las + +28 +00:01:10,900 --> 00:01:13,840 +exhaustivas investigaciones, no se incontro evidente + +29 +00:01:13,840 --> 00:01:16,200 +con cliente. El Celo del asesino + +30 +00:01:16,200 --> 00:01:18,840 +nunca fue identificado while Caso Cienfrio. + +31 +00:01:19,360 --> 00:01:21,220 +Jack el Distributor se ha convertido + +32 +00:01:21,220 --> 00:01:22,900 +en un símbolo de Mido, why + +33 +00:01:22,900 --> 00:01:25,440 +fascinación. Su nombre ha sido el + +34 +00:01:25,440 --> 00:01:27,880 +tema de numerosos libros y películas, + +35 +00:01:28,080 --> 00:01:29,740 +un asombre que perseguió la historia + +36 +00:01:29,740 --> 00:01:31,640 +de los lindos. Jack el Distributor + +37 +00:01:31,640 --> 00:01:33,020 +Sigue sin de uno de los + +38 +00:01:33,020 --> 00:01:35,240 +misterios, sin resolver más de los + +39 +00:01:35,240 --> 00:01:37,460 +raderos y la historia. Su identidad + +40 +00:01:37,460 --> 00:01:39,240 +sea alguna vez si canócio nunca + +41 +00:01:39,240 --> 00:01:41,840 +fue revelada. Jack el Distributor escapó + +42 +00:01:41,840 --> 00:01:43,660 +de la justicia, de Gendo Tras, + +43 +00:01:43,760 --> 00:01:45,000 +de si un alegado de Mido, + +44 +00:01:45,380 --> 00:01:47,460 +why un misterio que continúa atrapando + +45 +00:01:47,460 --> 00:01:47,980 +al mundo. + diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_A_clean.png b/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_A_clean.png new file mode 100644 index 0000000..ea4a2c7 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_A_clean.png differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_A_en.png b/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_A_en.png new file mode 100644 index 0000000..3c25264 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_A_en.png differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_A_es.png b/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_A_es.png new file mode 100644 index 0000000..9cd48b4 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_A_es.png differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_B_clean.png b/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_B_clean.png new file mode 100644 index 0000000..f5b0312 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_B_clean.png differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_B_en.png b/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_B_en.png new file mode 100644 index 0000000..8e3ee44 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_B_en.png differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_B_es.png b/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_B_es.png new file mode 100644 index 0000000..6efa532 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_B_es.png differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_C_clean.png b/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_C_clean.png new file mode 100644 index 0000000..d95aa61 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_C_clean.png differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_C_en.png b/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_C_en.png new file mode 100644 index 0000000..99f26c2 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_C_en.png differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_C_es.png b/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_C_es.png new file mode 100644 index 0000000..04682e1 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/thumbs/thumb_C_es.png differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_000.wav b/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_000.wav new file mode 100644 index 0000000..58afaa2 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_000.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_001.wav b/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_001.wav new file mode 100644 index 0000000..fb4f9a9 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_001.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_002.wav b/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_002.wav new file mode 100644 index 0000000..9c53a44 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_002.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_003.wav b/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_003.wav new file mode 100644 index 0000000..c040ce4 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_003.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_004.wav b/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_004.wav new file mode 100644 index 0000000..5cb3b49 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_004.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_005.wav b/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_005.wav new file mode 100644 index 0000000..40036b6 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_005.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_006.wav b/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_006.wav new file mode 100644 index 0000000..7a4c001 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_006.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_007.wav b/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_007.wav new file mode 100644 index 0000000..49f8639 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_007.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_008.wav b/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_008.wav new file mode 100644 index 0000000..ba6b905 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_008.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_009.wav b/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_009.wav new file mode 100644 index 0000000..100d71c Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/tts_en_009.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_000.wav b/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_000.wav new file mode 100644 index 0000000..6b89162 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_000.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_001.wav b/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_001.wav new file mode 100644 index 0000000..1e9342b Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_001.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_002.wav b/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_002.wav new file mode 100644 index 0000000..68d6b5a Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_002.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_003.wav b/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_003.wav new file mode 100644 index 0000000..3565b85 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_003.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_004.wav b/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_004.wav new file mode 100644 index 0000000..6beb5f4 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_004.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_005.wav b/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_005.wav new file mode 100644 index 0000000..525a51e Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_005.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_006.wav b/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_006.wav new file mode 100644 index 0000000..f2d594e Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_006.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_007.wav b/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_007.wav new file mode 100644 index 0000000..2da277a Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_007.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_008.wav b/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_008.wav new file mode 100644 index 0000000..89c3301 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_008.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_009.wav b/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_009.wav new file mode 100644 index 0000000..7e917d4 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/tts_es_009.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/voiceover_en.wav b/temp/1786891137_Who_was_Jack_the_Ripper/voiceover_en.wav new file mode 100644 index 0000000..90c4762 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/voiceover_en.wav differ diff --git a/temp/1786891137_Who_was_Jack_the_Ripper/voiceover_es.wav b/temp/1786891137_Who_was_Jack_the_Ripper/voiceover_es.wav new file mode 100644 index 0000000..ffc1c25 Binary files /dev/null and b/temp/1786891137_Who_was_Jack_the_Ripper/voiceover_es.wav differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/background_music.wav b/temp/1786891437_The_Lost_Library_of_Alexa/background_music.wav new file mode 100644 index 0000000..762e564 Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/background_music.wav differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/clips/clip_000.mp4 b/temp/1786891437_The_Lost_Library_of_Alexa/clips/clip_000.mp4 new file mode 100644 index 0000000..eecb53d Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/clips/clip_000.mp4 differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/clips/clip_001.mp4 b/temp/1786891437_The_Lost_Library_of_Alexa/clips/clip_001.mp4 new file mode 100644 index 0000000..470ab6d Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/clips/clip_001.mp4 differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/clips/clip_002.mp4 b/temp/1786891437_The_Lost_Library_of_Alexa/clips/clip_002.mp4 new file mode 100644 index 0000000..6eda72a Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/clips/clip_002.mp4 differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/clips/clip_003.mp4 b/temp/1786891437_The_Lost_Library_of_Alexa/clips/clip_003.mp4 new file mode 100644 index 0000000..4733853 Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/clips/clip_003.mp4 differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/clips/raw_img_002.jpg b/temp/1786891437_The_Lost_Library_of_Alexa/clips/raw_img_002.jpg new file mode 100644 index 0000000..301b139 Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/clips/raw_img_002.jpg differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/clips/raw_img_003.jpg b/temp/1786891437_The_Lost_Library_of_Alexa/clips/raw_img_003.jpg new file mode 100644 index 0000000..94e8ea4 Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/clips/raw_img_003.jpg differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/clips/raw_vid_000.mp4 b/temp/1786891437_The_Lost_Library_of_Alexa/clips/raw_vid_000.mp4 new file mode 100644 index 0000000..99e14d8 Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/clips/raw_vid_000.mp4 differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/clips/raw_vid_001.mp4 b/temp/1786891437_The_Lost_Library_of_Alexa/clips/raw_vid_001.mp4 new file mode 100644 index 0000000..f9f9b4d Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/clips/raw_vid_001.mp4 differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/script.json b/temp/1786891437_The_Lost_Library_of_Alexa/script.json new file mode 100644 index 0000000..9ccd757 --- /dev/null +++ b/temp/1786891437_The_Lost_Library_of_Alexa/script.json @@ -0,0 +1,78 @@ +{ + "titles": [ + "The Forgotten Knowledge of Alexandria", + "Uncovering the Lost Library", + "Alexandria's Timeless Secrets" + ], + "hook": "What lies hidden in the sands of time?", + "description": "Dive into the mysterious history of the lost Library of Alexandria, one of the greatest knowledge centers of antiquity. Discover the treasures, tragedies, and enduring legacy of this ancient wonder. #Documentary #History #Science", + "tags": [ + "ancient history", + "lost library", + "alexandria", + "knowledge center", + "bce", + "bce history", + "ancient library", + "egypt", + "mediterranean", + "library of alexandria", + "university", + "ancient books", + "ancient knowledge", + "lost knowledge" + ], + "script_segments": [ + { + "chapter_title": "The Ancient Mystery", + "text": "Amidst the bustling harbor of Alexandria, stood a beacon of learning, the great Library. Founded in 300 BCE, it was a hub of intellectual brilliance, housing over half a million scrolls. Tragically, it burned, but its legacy endured.", + "visual_prompt": "A majestic library building with scholars in flowing robes, surrounded by ancient scrolls and books, cinematic lighting with dramatic shadows, camera angle from below looking up, 8k documentary style", + "stock_query": "ancient library books", + "on_screen_text": "", + "duration_estimate": 10, + "text_es": "En el bullicioso puerto de Alejandría, se alzaba un faro del saber, la gran Biblioteca. Fundada en el 300 a.C., era un centro de brillante intelecto, alojando más de medio millón de rollos. Trágicamente, se incendió, pero su legado sobrevivió.", + "chapter_title_es": "El Misterio Antiguo", + "on_screen_text_es": "" + }, + { + "chapter_title": "The Critical Discovery", + "text": "In 1906, a German archaeologist discovered papyrus fragments in the ruins of the library. These remnants offered glimpses of the vast collection. But the full extent of its loss and treasures remained a mystery.", + "visual_prompt": "A dusty archaeologist carefully examining fragments of papyrus, sunlight streaming through a window, close-up shot, cinematic lighting with highlights, camera angle from above, 8k documentary style", + "stock_query": "papyrus fragments", + "on_screen_text": "", + "duration_estimate": 10, + "text_es": "En 1906, un arqueólogo alemán descubrió fragmentos de papiro en los ruinosos restos de la biblioteca. Estos restos ofrecían vislumbres de la vasta colección. Pero el alcance completo de su pérdida y tesoro permanecieron en el misterio.", + "chapter_title_es": "La Descubierta Crítica", + "on_screen_text_es": "" + }, + { + "chapter_title": "The Great Library's Last Chapter", + "text": "Despite the fire and subsequent invasions, the Library's influence persisted. Its scholars, like Eratosthenes, made groundbreaking discoveries in science and philosophy. Today, the site remains a symbol of the power of knowledge.", + "visual_prompt": "Aerial view of the ruins of Alexandria, with modern buildings in the background, dramatic sky lighting, camera angle from high above, 8k documentary style", + "stock_query": "desert ruins aerial", + "on_screen_text": "", + "duration_estimate": 10, + "text_es": "A pesar del incendio y las posteriores invasiones, la influencia de la Biblioteca persistió. Sus eruditos, como Eratóstenes, realizaron descubrimientos revolucionarios en ciencia y filosofía. Hoy en día, el sitio sigue siendo un símbolo del poder del conocimiento.", + "chapter_title_es": "El Último Capítulo de la Gran Biblioteca", + "on_screen_text_es": "" + }, + { + "chapter_title": "Uncovering the Lost Library", + "text": "Join us on this journey to uncover the secrets of the lost Library of Alexandria. From its rise to its fall, explore the enduring legacy of this intellectual treasure. The quest for knowledge continues.", + "visual_prompt": "Close-up of an ancient scroll being unrolled, dramatic close-up lighting, camera angle from side, 8k documentary style", + "stock_query": "ancient scrolls", + "on_screen_text": "", + "duration_estimate": 5, + "text_es": "Únete a nosotros en esta jornada para descubrir los secretos de la Biblioteca de Alejandría perdida. Desde su ascenso hasta su caída, explora el legado duradero de este tesoro intelectual. La búsqueda del conocimiento continúa.", + "chapter_title_es": "Descubriendo la Perdida Biblioteca", + "on_screen_text_es": "" + } + ], + "title": "The Forgotten Knowledge of Alexandria", + "titles_es": [ + "El Olvidado Conocimiento de Alejandría", + "Descubriendo la Perdida Biblioteca", + "Secretos Eternos de Alejandría" + ], + "description_es": "Sumérgete en la historia misteriosa de la Biblioteca de Alejandría, una de las mayores centrales de conocimientos de la antigüedad. Descubre las tesoros, tragedias y legado eterno de esta antigua maravilla. #Documentario #Historia #Ciencia" +} \ No newline at end of file diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/subtitles_en.srt b/temp/1786891437_The_Lost_Library_of_Alexa/subtitles_en.srt new file mode 100644 index 0000000..3d3c670 --- /dev/null +++ b/temp/1786891437_The_Lost_Library_of_Alexa/subtitles_en.srt @@ -0,0 +1,96 @@ +1 +00:00:00,000 --> 00:00:02,280 +Amidst the bustling harbor of Alexandria + +2 +00:00:02,280 --> 00:00:04,380 +stood a beacon of learning, the + +3 +00:00:04,380 --> 00:00:07,220 +Great Library. Founded in 300 BCE, + +4 +00:00:07,800 --> 00:00:09,060 +it was a hub of intellectual + +5 +00:00:09,060 --> 00:00:11,500 +brilliance, housing over half a million + +6 +00:00:11,500 --> 00:00:14,420 +scrolls. Tragically, it burned, but its + +7 +00:00:14,420 --> 00:00:17,120 +legacy endured. In 1906, + +8 +00:00:17,660 --> 00:00:20,480 +a German archaeologist discovered papyrus fragments + +9 +00:00:20,480 --> 00:00:22,100 +in the ruins of the library. + +10 +00:00:22,660 --> 00:00:24,900 +These remnants offered glimpses of the + +11 +00:00:24,900 --> 00:00:27,200 +vast collection, but the full extent + +12 +00:00:27,200 --> 00:00:29,040 +of its loss and treasures remained + +13 +00:00:29,040 --> 00:00:31,700 +a mystery. Despite the fire and + +14 +00:00:31,700 --> 00:00:35,200 +subsequent invasions, the library's influence persisted. + +15 +00:00:35,720 --> 00:00:38,840 +Its scholars, like Aratosthenes, made groundbreaking + +16 +00:00:38,840 --> 00:00:42,180 +discoveries in science and philosophy. Today, + +17 +00:00:42,600 --> 00:00:44,220 +the site remains a symbol of + +18 +00:00:44,220 --> 00:00:46,480 +the power of knowledge. Join us + +19 +00:00:46,480 --> 00:00:48,080 +on this journey to uncover the + +20 +00:00:48,080 --> 00:00:49,920 +secrets of the lost library of + +21 +00:00:49,920 --> 00:00:52,300 +Alexandria. From its rise to its + +22 +00:00:52,300 --> 00:00:54,780 +fall, explore the enduring legacy of + +23 +00:00:54,780 --> 00:00:57,160 +this intellectual treasure. The quest for + +24 +00:00:57,160 --> 00:00:58,120 +knowledge continues. + diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/subtitles_es.srt b/temp/1786891437_The_Lost_Library_of_Alexa/subtitles_es.srt new file mode 100644 index 0000000..6e61cec --- /dev/null +++ b/temp/1786891437_The_Lost_Library_of_Alexa/subtitles_es.srt @@ -0,0 +1,104 @@ +1 +00:00:00,000 --> 00:00:02,120 +En el bujicioso puerto de Alejandría, + +2 +00:00:02,580 --> 00:00:03,820 +se alzaba un faro del saber, + +3 +00:00:04,280 --> 00:00:06,940 +la Gran Biblioteca. Fundada en el + +4 +00:00:06,940 --> 00:00:09,080 +300 antes de Cristo, era un + +5 +00:00:09,080 --> 00:00:11,660 +centro de brillante intelecto, alojando más + +6 +00:00:11,660 --> 00:00:14,840 +de medio millón de rollos. Trágicamente, + +7 +00:00:15,200 --> 00:00:17,520 +se incendió, pero su legado sobrevivió. + +8 +00:00:18,580 --> 00:00:21,820 +En 1906, un arqueólogo alemán descubrió + +9 +00:00:21,820 --> 00:00:23,580 +fragmentos de papiro en los rinosos + +10 +00:00:23,580 --> 00:00:26,560 +restos de la Biblioteca. Estos restos + +11 +00:00:26,560 --> 00:00:28,740 +ofrecían bislumbres de la vasta colección. + +12 +00:00:28,740 --> 00:00:31,680 +Pero el alcance completo de superdida + +13 +00:00:31,680 --> 00:00:33,820 +y tesoro permanecieron en el misterio. + +14 +00:00:34,860 --> 00:00:36,260 +A pesar del incendio y las + +15 +00:00:36,260 --> 00:00:38,720 +posteriores invasiones, la influencia de la + +16 +00:00:38,720 --> 00:00:41,660 +Biblioteca persistió. Sus eruditos, + +17 +00:00:41,960 --> 00:00:45,280 +como Heratóstenes, realizaron descubrimientos revolucionarios + +18 +00:00:45,280 --> 00:00:48,160 +en ciencia y filosofía. Hoy en + +19 +00:00:48,160 --> 00:00:50,100 +día, el sitio sigue siendo un + +20 +00:00:50,100 --> 00:00:53,280 +símbolo del poder del conocimiento. Unete + +21 +00:00:53,280 --> 00:00:54,880 +a nosotros en esta jornada para + +22 +00:00:54,880 --> 00:00:56,840 +descubrir los secretos de la Biblioteca + +23 +00:00:56,840 --> 00:00:59,880 +de Alejandría perdida. Desde su ascenso + +24 +00:00:59,880 --> 00:01:01,900 +hasta su caída, explora el legado + +25 +00:01:01,900 --> 00:01:04,980 +duradero de este tesoro intelectual. La + +26 +00:01:04,980 --> 00:01:06,800 +búsqueda del conocimiento continúa. + diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_A_clean.png b/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_A_clean.png new file mode 100644 index 0000000..476c67d Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_A_clean.png differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_A_en.png b/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_A_en.png new file mode 100644 index 0000000..593a347 Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_A_en.png differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_A_es.png b/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_A_es.png new file mode 100644 index 0000000..548b698 Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_A_es.png differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_B_clean.png b/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_B_clean.png new file mode 100644 index 0000000..9e62484 Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_B_clean.png differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_B_en.png b/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_B_en.png new file mode 100644 index 0000000..f332a39 Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_B_en.png differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_B_es.png b/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_B_es.png new file mode 100644 index 0000000..48aa314 Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_B_es.png differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_C_clean.png b/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_C_clean.png new file mode 100644 index 0000000..8868cdf Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_C_clean.png differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_C_en.png b/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_C_en.png new file mode 100644 index 0000000..5370d2a Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_C_en.png differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_C_es.png b/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_C_es.png new file mode 100644 index 0000000..2f7cb90 Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/thumbs/thumb_C_es.png differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/tts_en_000.wav b/temp/1786891437_The_Lost_Library_of_Alexa/tts_en_000.wav new file mode 100644 index 0000000..312a87b Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/tts_en_000.wav differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/tts_en_001.wav b/temp/1786891437_The_Lost_Library_of_Alexa/tts_en_001.wav new file mode 100644 index 0000000..33c64e2 Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/tts_en_001.wav differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/tts_en_002.wav b/temp/1786891437_The_Lost_Library_of_Alexa/tts_en_002.wav new file mode 100644 index 0000000..4f53784 Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/tts_en_002.wav differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/tts_en_003.wav b/temp/1786891437_The_Lost_Library_of_Alexa/tts_en_003.wav new file mode 100644 index 0000000..c09f921 Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/tts_en_003.wav differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/tts_es_000.wav b/temp/1786891437_The_Lost_Library_of_Alexa/tts_es_000.wav new file mode 100644 index 0000000..7a9aa2c Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/tts_es_000.wav differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/tts_es_001.wav b/temp/1786891437_The_Lost_Library_of_Alexa/tts_es_001.wav new file mode 100644 index 0000000..d0b50b9 Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/tts_es_001.wav differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/tts_es_002.wav b/temp/1786891437_The_Lost_Library_of_Alexa/tts_es_002.wav new file mode 100644 index 0000000..ad7e8fc Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/tts_es_002.wav differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/tts_es_003.wav b/temp/1786891437_The_Lost_Library_of_Alexa/tts_es_003.wav new file mode 100644 index 0000000..a5a85fe Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/tts_es_003.wav differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/voiceover_en.wav b/temp/1786891437_The_Lost_Library_of_Alexa/voiceover_en.wav new file mode 100644 index 0000000..ef9aee4 Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/voiceover_en.wav differ diff --git a/temp/1786891437_The_Lost_Library_of_Alexa/voiceover_es.wav b/temp/1786891437_The_Lost_Library_of_Alexa/voiceover_es.wav new file mode 100644 index 0000000..d7237f8 Binary files /dev/null and b/temp/1786891437_The_Lost_Library_of_Alexa/voiceover_es.wav differ diff --git a/temp/1786893075_The_Secrets_of_the_Bermud/script.json b/temp/1786893075_The_Secrets_of_the_Bermud/script.json new file mode 100644 index 0000000..68bd007 --- /dev/null +++ b/temp/1786893075_The_Secrets_of_the_Bermud/script.json @@ -0,0 +1,165 @@ +{ + "titles": [ + "Unraveling the Bermuda Triangle's Secrets", + "The Mysterious Bermuda Triangle Revealed", + "What Lies Beneath: Bermuda Triangle" + ], + "hook": "Are you ready to dive into the Bermuda Triangle's mysteries?", + "description": "Join us on a journey through time and mystery as we uncover the secrets of the Bermuda Triangle. From ancient artifacts to modern-day disappearances, explore the enigmatic waters that have puzzled scientists and thrill-seekers alike. #Documentary #History #Science", + "tags": [ + "bermuda triangle", + "mysterious disappearances", + "ancient artifacts", + "ocean mysteries", + "scientific exploration", + "historical enigmas", + "documentary", + "science", + "history", + "mythology", + "nautical mysteries", + "oceanography", + "geography" + ], + "script_segments": [ + { + "chapter_title": "The Mysterious Triangle", + "text": "Imagine a place where ships and aircraft vanish without a trace. That's the Bermuda Triangle, a region in the Western Atlantic Ocean, where strange events have occurred for centuries. It's a place of mystery and speculation, but what secrets does it hold?", + "visual_prompt": "Aerial view of the Bermuda Triangle with ships and planes flying over it, dark clouds and foggy atmosphere", + "stock_query": "bermuda triangle map", + "on_screen_text": "", + "duration_estimate": 20, + "text_es": "Imagina un lugar donde barcos y aeronaves desaparecen sin dejar rastro. Ese es el Triángulo de Bermuda, un área en el Océano Atlántico Occidental, donde han ocurrido eventos extraños durante siglos. Es un lugar de misterio y especulación, pero ¿qué secretos oculta?", + "chapter_title_es": "El Triángulo Misterioso", + "on_screen_text_es": "" + }, + { + "chapter_title": "Early Explorations", + "text": "Early explorers like Christopher Columbus and Sir Francis Drake sailed these waters, but it wasn't until the 20th century that the Triangle gained its reputation for strange occurrences.", + "visual_prompt": "Historical ship sailing on the ocean, with old-fashioned compass and sextant", + "stock_query": "Christopher Columbus", + "on_screen_text": "", + "duration_estimate": 20, + "text_es": "Exploradores tempranos como Cristófer Colón y Sir Francis Drake navegaron estas aguas, pero no fue hasta el siglo XX que el Triángulo ganó su reputación por eventos extraños.", + "chapter_title_es": "Exploraciones Tempranas", + "on_screen_text_es": "" + }, + { + "chapter_title": "First Reports", + "text": "In 1950, a report by journalist Vincent Gaddis first coined the term 'Bermuda Triangle.' It was a small article, but it sparked a fascination that has persisted for decades.", + "visual_prompt": "Newspaper being read by a reporter, old-fashioned typewriter", + "stock_query": "Vincent Gaddis", + "on_screen_text": "", + "duration_estimate": 20, + "text_es": "En 1950, un informe del periodista Vincent Gaddis dio por primera vez el nombre 'Triángulo de Bermuda'. Era un corto artículo, pero lo que despertó una fascinación que ha perdurado durante décadas.", + "chapter_title_es": "Primeras Informaciones", + "on_screen_text_es": "" + }, + { + "chapter_title": "Notable Disappearances", + "text": "The disappearance of Flight 19, a group of five Navy bombers, in 1945, added fuel to the Triangle's legend. A radio operator's mysterious message was the last contact before they vanished into thin air.", + "visual_prompt": "Vintage military aircraft flying over the ocean, with radio antennas", + "stock_query": "Flight 19", + "on_screen_text": "", + "duration_estimate": 20, + "text_es": "La desaparición del vuelo 19, un grupo de cinco bombarderos de la Marina, en 1945, alimentó la leyenda del Triángulo. Un mensaje misterioso del operador de radio fue el último contacto antes de que desaparecieran en el vacío.", + "chapter_title_es": "Desapariciones Notables", + "on_screen_text_es": "" + }, + { + "chapter_title": "The Devil's Triangle", + "text": "The term 'Devil's Triangle' was coined in the 1960s, adding a layer of superstition to the already mysterious region. But what exactly makes the Triangle so dangerous?", + "visual_prompt": "Foggy, dark ocean with lightning in the background", + "stock_query": "Devil's Triangle", + "on_screen_text": "", + "duration_estimate": 20, + "text_es": "El término 'Triángulo del Diablo' fue acuñado en la década de 1960, añadiendo un nuevo nivel de superstición a la ya misteriosa región. Pero, ¿exactamente qué hace al Triángulo tan peligroso?", + "chapter_title_es": "El Triángulo del Diablo", + "on_screen_text_es": "" + }, + { + "chapter_title": "Scientific Theories", + "text": "Scientists propose various theories, from magnetic anomalies to undersea methane hydrates. However, none can fully explain the disappearances. The truth remains elusive.", + "visual_prompt": "Scientist in lab with maps and charts, looking through a microscope", + "stock_query": "magnetic anomalies", + "on_screen_text": "", + "duration_estimate": 20, + "text_es": "Los científicos proponen diversas teorías, desde anomalías magnéticas hasta hidratos de metano subacuáticos. Sin embargo, ninguna puede explicar completamente las desapariciones. La verdad sigue siendo inescrutable.", + "chapter_title_es": "Teorías Científicas", + "on_screen_text_es": "" + }, + { + "chapter_title": "Ancient Artifacts", + "text": "Some theories point to ancient artifacts or lost civilizations. Artifacts like the Voynich Manuscript, found in the Triangle, add another layer of intrigue to the mystery.", + "visual_prompt": "Ancient manuscript with strange symbols, held by an archaeologist", + "stock_query": "Voynich Manuscript", + "on_screen_text": "", + "duration_estimate": 20, + "text_es": "Algunas teorías apuntan a antigüedades o civilizaciones perdidas. Antigüedades como el Manuscrito de Voynich, encontradas en el Triángulo, añaden otro nivel de misterio a la enigma.", + "chapter_title_es": "Antigüedades Antiguas", + "on_screen_text_es": "" + }, + { + "chapter_title": "Underwater Exploration", + "text": "Recent underwater exploration has revealed previously unknown topography, possibly explaining some of the disappearances. But the Triangle's secrets remain buried deep in the ocean.", + "visual_prompt": "Submarine exploring the ocean floor with a robotic arm", + "stock_query": "underwater exploration", + "on_screen_text": "", + "duration_estimate": 20, + "text_es": "Las exploraciones submarinas recientes han revelado topografías desconocidas, posiblemente explicando algunas de las desapariciones. Pero los secretos del Triángulo siguen enterrados profundo en el océano.", + "chapter_title_es": "Exploraciones Submarinas", + "on_screen_text_es": "" + }, + { + "chapter_title": "Modern Disappearances", + "text": "Modern-day events continue to fuel the Triangle's legend. Stories of vessels and planes vanishing without a trace, often under similar conditions, keep the mystery alive.", + "visual_prompt": "Modern ship and plane on the ocean, with a satellite map overlay", + "stock_query": "modern disappearances", + "on_screen_text": "", + "duration_estimate": 20, + "text_es": "Los eventos modernos continúan alimentando la leyenda del Triángulo. Historias de barcos y aviones que desaparecen sin dejar rastro, a menudo bajo condiciones similares, mantienen el misterio vivo.", + "chapter_title_es": "Desapariciones Modernas", + "on_screen_text_es": "" + }, + { + "chapter_title": "Theories and Speculation", + "text": "Speculation about the Triangle ranges from government conspiracies to extraterrestrial activity. But one thing is certain: the Bermuda Triangle remains one of the most perplexing mysteries in the world.", + "visual_prompt": "Satellite view of the Triangle, with mysterious symbols appearing on the screen", + "stock_query": "government conspiracy", + "on_screen_text": "", + "duration_estimate": 20, + "text_es": "Las especulaciones sobre el Triángulo van desde conspiraciones gubernamentales hasta actividad extraterrestre. Pero una cosa está segura: el Triángulo de Bermuda sigue siendo una de las misterios más desconcertantes del mundo.", + "chapter_title_es": "Especulaciones y Teorías", + "on_screen_text_es": "" + }, + { + "chapter_title": "Future Research", + "text": "Future research and exploration may finally unravel the secrets of the Bermuda Triangle. Until then, the mystery continues to draw in adventurers and thrill-seekers from around the world.", + "visual_prompt": "A team of researchers discussing on a ship, with a satellite dish in the background", + "stock_query": "future research", + "on_screen_text": "", + "duration_estimate": 20, + "text_es": "La investigación y exploración futuras podrían finalmente desentrañar los secretos del Triángulo de Bermuda. Hasta entonces, el misterio sigue atraiendo aventureros y buscadores de emociones de todo el mundo.", + "chapter_title_es": "Investigación Futura", + "on_screen_text_es": "" + }, + { + "chapter_title": "Conclusion", + "text": "The Bermuda Triangle remains a mystery, a place of wonder and fear. Whether it's a natural phenomenon or something more, the Triangle's secrets are yet to be fully understood. But for now, it's a reminder of the vast mysteries that lie beneath the ocean's surface.", + "visual_prompt": "Aerial view of the Triangle at sunset, with a mysterious light in the distance", + "stock_query": "conclusion", + "on_screen_text": "", + "duration_estimate": 20, + "text_es": "El Triángulo de Bermuda sigue siendo un misterio, un lugar de maravilla y miedo. Sea un fenómeno natural o algo más, los secretos del Triángulo siguen sin ser completamente comprendidos. Pero por ahora, es un recordatorio de las vastas misterios que se ocultan debajo de la superficie del océano.", + "chapter_title_es": "Conclusión", + "on_screen_text_es": "" + } + ], + "title": "Unraveling the Bermuda Triangle's Secrets", + "titles_es": [ + "Desentrañando los Secretos del Triángulo de Bermuda", + "El Misterioso Triángulo de Bermuda Revelado", + "¿Qué Hay Debajo del Triángulo de Bermuda?" + ], + "description_es": "Únete a nosotros en un viaje a través del tiempo y el misterio mientras desentramos los secretos del Triángulo de Bermuda. Desde antigüedades hasta desapariciones modernas, explora las aguas enigmáticas que han intrigado a científicos y buscadores de emociones por igual. #Documentario #Historia #Ciencia" +} \ No newline at end of file diff --git a/temp/1786893781_What_G_beklitepe_reveals/background_music.wav b/temp/1786893781_What_G_beklitepe_reveals/background_music.wav new file mode 100644 index 0000000..b04101c Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/background_music.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/script.json b/temp/1786893781_What_G_beklitepe_reveals/script.json new file mode 100644 index 0000000..29a586c --- /dev/null +++ b/temp/1786893781_What_G_beklitepe_reveals/script.json @@ -0,0 +1,253 @@ +{ + "titles": [ + "What Göbeklitepe Reveals About Human History", + "Göbeklitepe: The Lost City of Hunters", + "Göbeklitepe's Shocking Discovery" + ], + "hook": "Could ancient hunters build a city before farming began?", + "description": "Explore the enigmatic site of Göbeklitepe, where archaeologists uncover the surprising truth about human history. Discover how this Neolithic settlement challenges our understanding of early human civilization. #Documentary #History #Archaeology", + "tags": [ + "documentary", + "history", + "archaeology", + "ancient civilizations", + "hunter-gatherers", + "Göbeklitepe", + "Neolithic era", + "human settlements", + "prehistory", + "ancient ruins", + "excavation", + "science", + "discovery" + ], + "script_segments": [ + { + "chapter_title": "The Ancient Mystery", + "text": "Beneath the fertile plains of Turkey lies an enigma. Göbeklitepe, a site that defies conventional timelines, whispers secrets of a bygone era.", + "visual_prompt": "Stone pillars set in a circular arrangement, twilight shadows", + "stock_query": "ancient stone structures", + "duration_estimate": 20, + "text_es": "Bajo las fértiles llanuras de Turquía se esconde un enigma. Göbeklitepe, un sitio que desafía los tiempos convencionales, susurra secretos de una era olvidada.", + "chapter_title_es": "El Antiguo Misterio", + "on_screen_text_es": "" + }, + { + "chapter_title": "The Critical Discovery", + "text": "In 1963, a young German archaeologist stumbled upon clues that would change our understanding of human history. Layers of mystery lay hidden beneath the earth.", + "visual_prompt": "Aerial view of the excavation site, dust clouds", + "stock_query": "excavation site", + "duration_estimate": 18, + "text_es": "En 1963, un joven arqueólogo alemán descubrió pistas que cambiarían nuestra comprensión de la historia humana. Capas de misterio se ocultaban bajo la tierra.", + "chapter_title_es": "La Descubierta Crucial", + "on_screen_text_es": "" + }, + { + "chapter_title": "Neolithic Architecture", + "text": "What emerged were not simple shelters, but monumental structures, with intricate carvings and towering pillars. The craftsmanship hints at a sophisticated society.", + "visual_prompt": "Close-up of a stone pillar with detailed carvings", + "stock_query": "stone pillars", + "duration_estimate": 20, + "text_es": "Lo que emergió no eran simples refugios, sino estructuras monumentales, con grabados intrincados y columnas que se alzaban. La artesanía sugiere una sociedad sofisticada.", + "chapter_title_es": "Arquitectura Neolítica", + "on_screen_text_es": "" + }, + { + "chapter_title": "The Astonishing Date", + "text": "Radiocarbon dating revealed a staggering truth. Göbeklitepe was built around 10,000 years ago, predating agriculture by thousands of years.", + "visual_prompt": "Graph showing radiocarbon dating results", + "stock_query": "radiocarbon dating", + "duration_estimate": 18, + "text_es": "La datación por carbono reveló un shock. Göbeklitepe fue construida hace unos 10,000 años, preexistiendo a la agricultura por miles de años.", + "chapter_title_es": "La Sorprendente Fecha", + "on_screen_text_es": "" + }, + { + "chapter_title": "Hunter-Gatherers Unveiled", + "text": "This revelation challenges the notion that early humans were mere nomads. Instead, they were capable of complex social organization and monumental construction.", + "visual_prompt": "Scene of hunter-gatherers with stone tools", + "stock_query": "hunter-gatherers", + "duration_estimate": 20, + "text_es": "Esta revelación cuestiona la idea de que los primeros humanos eran meros nómadas. En cambio, eran capaces de compleja organización social y construcción monumental.", + "chapter_title_es": "Los Caçadores Desvelados", + "on_screen_text_es": "" + }, + { + "chapter_title": "Archaeological Layers", + "text": "Layers of debris and artifacts reveal a site of continuous habitation, with evidence of rituals, feasts, and ceremonies.", + "visual_prompt": "Excavated site with various artifacts displayed", + "stock_query": "excavated site", + "duration_estimate": 18, + "text_es": "Capas de residuos y artefactos revelan un sitio de habitación continua, con evidencias de rituales, banquetes y ceremonias.", + "chapter_title_es": "Capas Arqueológicas", + "on_screen_text_es": "" + }, + { + "chapter_title": "The Priestly Role", + "text": "Pillars adorned with animal and human figures hint at a priestly class, suggesting a structured religious or ceremonial life.", + "visual_prompt": "Scene of animal and human carvings on stone", + "stock_query": "stone carvings", + "duration_estimate": 20, + "text_es": "Columnas adornadas con figuras animales y humanas sugieren una clase sacerdotal, lo que sugiere una vida religiosa o ceremonial estructurada.", + "chapter_title_es": "El Rol Sacerdotal", + "on_screen_text_es": "" + }, + { + "chapter_title": "Social Organization", + "text": "The scale and complexity of Göbeklitepe indicate a highly organized society, possibly the first evidence of centralized power in human history.", + "visual_prompt": "Scene of workers building a stone structure", + "stock_query": "organized society", + "duration_estimate": 18, + "text_es": "El tamaño y la complejidad de Göbeklitepe indican una sociedad altamente organizada, posiblemente la primera evidencia de poder centralizado en la historia humana.", + "chapter_title_es": "Organización Social", + "on_screen_text_es": "" + }, + { + "chapter_title": "The Transition Point", + "text": "When exactly did humans shift from hunter-gatherers to agricultural settlers? Göbeklitepe challenges our understanding of this pivotal transition.", + "visual_prompt": "Scene of a hunter-gathering community", + "stock_query": "hunter-gatherers to farmers", + "duration_estimate": 20, + "text_es": "¿Cuándo exactamente los humanos cambiaron de cazadores-ganaderos a asentamientos agrícolas? Göbeklitepe desafía nuestra comprensión de este tránsito pivotal.", + "chapter_title_es": "El Punto de Transición", + "on_screen_text_es": "" + }, + { + "chapter_title": "Challenging Theories", + "text": "Göbeklitepe forces archaeologists to reconsider their theories, pushing the boundaries of what we thought we knew about human evolution.", + "visual_prompt": "Archaeologists discussing at an excavation site", + "stock_query": "archaeologists discussing", + "duration_estimate": 18, + "text_es": "Göbeklitepe obliga a los arqueólogos a reconsiderar sus teorías, empujando los límites de lo que pensábamos que sabíamos sobre la evolución humana.", + "chapter_title_es": "Desafiando Teorías", + "on_screen_text_es": "" + }, + { + "chapter_title": "The Megalithic Puzzle", + "text": "How did these ancient people construct such massive structures? The sheer scale and complexity of Göbeklitepe remain a mystery.", + "visual_prompt": "Scene of workers moving large stone blocks", + "stock_query": "megalithic structures", + "duration_estimate": 20, + "text_es": "¿Cómo estos antiguos seres construyeron estructuras tan enormes? La escala y la complejidad de Göbeklitepe siguen siendo un misterio.", + "chapter_title_es": "El Misterio Megalítico", + "on_screen_text_es": "" + }, + { + "chapter_title": "Cultural Significance", + "text": "Göbeklitepe is not just a site, but a cultural treasure, offering insights into the spiritual and social lives of our ancestors.", + "visual_prompt": "Scene of a ceremonial dance or ritual", + "stock_query": "ancient rituals", + "duration_estimate": 18, + "text_es": "Göbeklitepe no es solo un sitio, sino un tesoro cultural, ofreciendo insights en las vidas espirituales y sociales de nuestros ancestros.", + "chapter_title_es": "Significado Cultural", + "on_screen_text_es": "" + }, + { + "chapter_title": "The First Farmers?", + "text": "If hunter-gatherers could build such grand monuments, could they have also initiated agriculture? The evidence is complex and intriguing.", + "visual_prompt": "Scene of early farming practices", + "stock_query": "first farmers", + "duration_estimate": 20, + "text_es": "Si los cazadores-ganaderos pudieron construir monumentos tan grandiosos, ¿podrían haber iniciado la agricultura? La evidencia es compleja e intrigante.", + "chapter_title_es": "Los Primeros Agricultores?", + "on_screen_text_es": "" + }, + { + "chapter_title": "The Great Debate", + "text": "Academics and enthusiasts debate the implications of Göbeklitepe. Is it a testament to early human ingenuity, or a fluke in history?", + "visual_prompt": "Scene of a debate between archaeologists", + "stock_query": "archaeological debate", + "duration_estimate": 18, + "text_es": "Los académicos y entusiastas debaten las implicaciones de Göbeklitepe. ¿Es un testimonio de la ingenuidad temprana humana, o un azar en la historia?", + "chapter_title_es": "La Gran Debata", + "on_screen_text_es": "" + }, + { + "chapter_title": "The Megalithic Theory", + "text": "Some suggest the site was a gathering place for distant tribes, a hub of religious or trade activities.", + "visual_prompt": "Scene of people from different backgrounds meeting", + "stock_query": "megalithic gathering", + "duration_estimate": 20, + "text_es": "Algunos sugieren que el sitio fue un lugar de reunión para tribus distantes, un centro de actividades religiosas o comerciales.", + "chapter_title_es": "La Teoría Megalítica", + "on_screen_text_es": "" + }, + { + "chapter_title": "The Religious Hub", + "text": "Perhaps Göbeklitepe was a sacred site, a place where early humans came to worship and seek spiritual guidance.", + "visual_prompt": "Scene of a temple or shrine", + "stock_query": "religious site", + "duration_estimate": 18, + "text_es": "Quizás Göbeklitepe fue un sitio sagrado, un lugar donde los humanos tempranos vinieron a adorar y buscar orientación espiritual.", + "chapter_title_es": "El Centro Religioso", + "on_screen_text_es": "" + }, + { + "chapter_title": "The Future Of Göbeklitepe", + "text": "As research continues, the site of Göbeklitepe remains a source of wonder and scientific inquiry, rewriting the pages of human history.", + "visual_prompt": "Scene of ongoing excavation work", + "stock_query": "excavation work", + "duration_estimate": 20, + "text_es": "Mientras la investigación continúa, el sitio de Göbeklitepe se mantiene una fuente de maravilla e investigación científica, redactando las páginas de la historia humana.", + "chapter_title_es": "El Futuro de Göbeklitepe", + "on_screen_text_es": "" + }, + { + "chapter_title": "Shifting Perspectives", + "text": "Göbeklitepe challenges our understanding of human evolution, pushing us to rethink the timeline and nature of our ancient ancestors.", + "visual_prompt": "Scene of a timeline chart", + "stock_query": "human evolution timeline", + "duration_estimate": 18, + "text_es": "Göbeklitepe desafía nuestra comprensión de la evolución humana, empujándonos a replantearnos la cronología y la naturaleza de nuestros ancestros antiguos.", + "chapter_title_es": "Perspectivas Cambiantes", + "on_screen_text_es": "" + }, + { + "chapter_title": "The Great Leap Forward", + "text": "What does Göbeklitepe tell us about the great leap forward in human history? It may hold the key to unlocking our past.", + "visual_prompt": "Scene of a human civilization evolving over time", + "stock_query": "great leap forward", + "duration_estimate": 20, + "text_es": "¿Qué nos dice Göbeklitepe sobre el gran salto adelante en la historia humana? Puede contener la clave para descifrar nuestro pasado.", + "chapter_title_es": "El Gran Salto Adelante", + "on_screen_text_es": "" + }, + { + "chapter_title": "The Final Chapter", + "text": "As we continue to uncover the mysteries of Göbeklitepe, we are rewriting the story of human history, one stone pillar at a time.", + "visual_prompt": "Scene of the sun setting over the ruins", + "stock_query": "sun setting over ruins", + "duration_estimate": 18, + "text_es": "Mientras seguimos desentrañando las misteriosas piezas de Göbeklitepe, estamos redactando la historia de la humanidad, piedra por piedra.", + "chapter_title_es": "El Epílogo Final", + "on_screen_text_es": "" + }, + { + "chapter_title": "The Legacy", + "text": "Göbeklitepe stands as a testament to the ingenuity and complexity of early human societies, forever changing our understanding of our past.", + "visual_prompt": "Scene of the site under the stars", + "stock_query": "site under stars", + "duration_estimate": 20, + "text_es": "Göbeklitepe es un testimonio de la ingenuidad y la complejidad de las sociedades humanas tempranas, cambiando para siempre nuestra comprensión del pasado.", + "chapter_title_es": "El Legado", + "on_screen_text_es": "" + }, + { + "chapter_title": "Conclusion", + "text": "Göbeklitepe is not just a site, but a revelation, challenging our perceptions and opening new avenues of exploration in human history.", + "visual_prompt": "Scene of the site in the distance", + "stock_query": "site in distance", + "duration_estimate": 18, + "text_es": "Göbeklitepe no es solo un sitio, sino una revelación, desafiando nuestras percepciones y abriendo nuevas vías de exploración en la historia humana.", + "chapter_title_es": "Conclusión", + "on_screen_text_es": "" + } + ], + "title": "What Göbeklitepe Reveals About Human History", + "titles_es": [ + "Lo Que Göbeklitepe Revela Sobre la Historia Humana", + "Göbeklitepe: La Ciudad Olvidada de los Caçadores", + "Göbeklitepe: La Descubierta Sorprendente" + ], + "description_es": "Explore el enigmático sitio de Göbeklitepe, donde los arqueólogos descubren la sorprendente verdad sobre la historia humana. Descubre cómo este asentamiento neolítico desafía nuestra comprensión de la civilización temprana humana. #Documentario #Historia #Arqueología" +} \ No newline at end of file diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_000.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_000.wav new file mode 100644 index 0000000..2f814cc Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_000.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_001.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_001.wav new file mode 100644 index 0000000..b0c9165 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_001.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_002.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_002.wav new file mode 100644 index 0000000..eb1fb83 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_002.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_003.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_003.wav new file mode 100644 index 0000000..dd287ed Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_003.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_004.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_004.wav new file mode 100644 index 0000000..5f6a9ef Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_004.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_005.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_005.wav new file mode 100644 index 0000000..24f4da5 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_005.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_006.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_006.wav new file mode 100644 index 0000000..d97d18b Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_006.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_007.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_007.wav new file mode 100644 index 0000000..3a2eaa8 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_007.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_008.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_008.wav new file mode 100644 index 0000000..decab46 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_008.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_009.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_009.wav new file mode 100644 index 0000000..4baf124 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_009.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_010.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_010.wav new file mode 100644 index 0000000..796e4cd Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_010.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_011.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_011.wav new file mode 100644 index 0000000..f55262b Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_011.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_012.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_012.wav new file mode 100644 index 0000000..9786ae5 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_012.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_013.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_013.wav new file mode 100644 index 0000000..b1fccd4 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_013.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_014.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_014.wav new file mode 100644 index 0000000..e68cee0 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_014.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_015.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_015.wav new file mode 100644 index 0000000..ec99a07 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_015.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_016.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_016.wav new file mode 100644 index 0000000..49ce20d Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_016.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_017.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_017.wav new file mode 100644 index 0000000..407abe4 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_017.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_018.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_018.wav new file mode 100644 index 0000000..4b5e8fa Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_018.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_019.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_019.wav new file mode 100644 index 0000000..436f0e7 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_019.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_020.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_020.wav new file mode 100644 index 0000000..45f716f Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_020.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_en_021.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_en_021.wav new file mode 100644 index 0000000..a4d0b49 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_en_021.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_000.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_000.wav new file mode 100644 index 0000000..f51080b Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_000.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_001.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_001.wav new file mode 100644 index 0000000..ce60e16 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_001.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_002.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_002.wav new file mode 100644 index 0000000..b04c57d Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_002.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_003.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_003.wav new file mode 100644 index 0000000..51b5fc2 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_003.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_004.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_004.wav new file mode 100644 index 0000000..dfb773c Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_004.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_005.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_005.wav new file mode 100644 index 0000000..d234be0 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_005.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_006.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_006.wav new file mode 100644 index 0000000..0f7544d Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_006.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_007.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_007.wav new file mode 100644 index 0000000..0cdec57 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_007.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_008.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_008.wav new file mode 100644 index 0000000..6416d28 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_008.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_009.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_009.wav new file mode 100644 index 0000000..500534a Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_009.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_010.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_010.wav new file mode 100644 index 0000000..5fbf587 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_010.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_011.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_011.wav new file mode 100644 index 0000000..461d52a Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_011.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_012.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_012.wav new file mode 100644 index 0000000..2e600ed Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_012.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_013.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_013.wav new file mode 100644 index 0000000..0159ec1 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_013.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_014.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_014.wav new file mode 100644 index 0000000..0135ef8 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_014.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_015.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_015.wav new file mode 100644 index 0000000..ffccbd6 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_015.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_016.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_016.wav new file mode 100644 index 0000000..a22fd2b Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_016.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_017.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_017.wav new file mode 100644 index 0000000..65f2944 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_017.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_018.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_018.wav new file mode 100644 index 0000000..e891602 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_018.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_019.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_019.wav new file mode 100644 index 0000000..dbb6470 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_019.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_020.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_020.wav new file mode 100644 index 0000000..c82125a Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_020.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/tts_es_021.wav b/temp/1786893781_What_G_beklitepe_reveals/tts_es_021.wav new file mode 100644 index 0000000..ff98a8a Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/tts_es_021.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/voiceover_en.wav b/temp/1786893781_What_G_beklitepe_reveals/voiceover_en.wav new file mode 100644 index 0000000..5beb97d Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/voiceover_en.wav differ diff --git a/temp/1786893781_What_G_beklitepe_reveals/voiceover_es.wav b/temp/1786893781_What_G_beklitepe_reveals/voiceover_es.wav new file mode 100644 index 0000000..9c859b9 Binary files /dev/null and b/temp/1786893781_What_G_beklitepe_reveals/voiceover_es.wav differ diff --git a/youtube_factory.py b/youtube_factory.py new file mode 100755 index 0000000..2c1290a --- /dev/null +++ b/youtube_factory.py @@ -0,0 +1,456 @@ +#!/usr/bin/env python3 +""" +YouTube Factory — Master Orchestrator for 24/7 Faceless Video Generation +Distributed across 3 AI PCs: +- AMDLLM: LLM Scriptwriting, Translation & Trending Ideation (llama.cpp Qwen3.5-7B) +- NvidiaLLM: ComfyUI MiniMax H3 Video Gen, z-image-turbo / SDXL & A/B Thumbnails +- IntelLLM: Kokoro TTS (EN+ES), Faster-Whisper Subtitles & FFmpeg Assembly with Audio Ducking +""" + +import os +import sys +import json +import yaml +import time +import re +import argparse +import subprocess +import logging +from dataclasses import dataclass, field +from typing import Dict, List, Optional, Any + +from pipeline.remote import RemotePC +from pipeline.trending import TrendingFetcher +from pipeline.script_gen import ScriptGen +from pipeline.tts_gen import TTSGen +from pipeline.music_gen import MusicGen +from pipeline.visual_gen import VisualGen +from pipeline.sub_gen import SubGen +from pipeline.thumb_gen import ThumbnailGen +from pipeline.assembler import Assembler +from pipeline.queue_manager import QueueManager +from pipeline.youtube_uploader import YouTubeUploader +from pipeline.dependency_manager import ensure_dependencies + +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s | %(levelname)-8s | %(message)s", + datefmt="%H:%M:%S" +) +logger = logging.getLogger("YTFactory") + +@dataclass +class FactoryConfig: + topic: str = "" + duration_seconds: int = 180 + output_dir: str = "./output" + temp_dir: str = "./temp" + visual_strategy: str = "hybrid" + clip_width: int = 768 + clip_height: int = 432 + voices: Dict[str, str] = field(default_factory=lambda: {"en": "af_heart", "es": "ef_dora"}) + thumbnail_count: int = 3 + music_mood: str = "cinematic" + pexels_api_key: Optional[str] = None + pixabay_api_key: Optional[str] = None + poll_interval_seconds: int = 30 + auto_trending_when_empty: bool = True + trending_niche: str = "" + max_daily_videos: int = 12 + youtube_client_secrets: str = "client_secrets.json" + youtube_token_file: str = "youtube_token.json" + youtube_default_privacy: str = "private" + youtube_auto_upload: bool = False + +def format_timestamp(seconds: float) -> str: + """Format seconds into MM:SS format for YouTube chapter markers.""" + m = int(seconds) // 60 + s = int(seconds) % 60 + return f"{m:02d}:{s:02d}" + +class YouTubeFactory: + def __init__(self, config_path: str = "factory_config.yaml", check_deps: bool = True): + if check_deps: + ensure_dependencies(auto_install=True) + + self.config_path = config_path + self.raw_config = self._load_config(config_path) + self.cfg = self._parse_config(self.raw_config) + self.pcs: Dict[str, RemotePC] = {} + for name, data in self.raw_config.get("pcs", {}).items(): + self.pcs[name] = RemotePC(name, data["host"], data["ssh_user"], data.get("services", {})) + + self.queue = QueueManager(db_path=os.path.join(self.cfg.output_dir, "factory_queue.db")) + self.uploader = YouTubeUploader( + client_secrets_file=self.cfg.youtube_client_secrets, + token_file=self.cfg.youtube_token_file, + default_privacy=self.cfg.youtube_default_privacy + ) + os.makedirs(self.cfg.output_dir, exist_ok=True) + os.makedirs(self.cfg.temp_dir, exist_ok=True) + + def _load_config(self, path: str) -> Dict[str, Any]: + if not os.path.exists(path): + raise FileNotFoundError(f"Config file not found: {path}") + with open(path, "r", encoding="utf-8") as f: + return yaml.safe_load(f) + + def _parse_config(self, raw: Dict[str, Any]) -> FactoryConfig: + p_cfg = raw.get("pipeline", {}) + d_cfg = raw.get("daemon", {}) + y_cfg = raw.get("youtube", {}) + return FactoryConfig( + topic=p_cfg.get("topic", ""), + duration_seconds=p_cfg.get("duration_seconds", 180), + output_dir=p_cfg.get("output_dir", "./output"), + temp_dir=p_cfg.get("temp_dir", "./temp"), + visual_strategy=p_cfg.get("visual_strategy", "hybrid"), + clip_width=p_cfg.get("clip_width", 768), + clip_height=p_cfg.get("clip_height", 432), + voices=p_cfg.get("voices", {"en": "af_heart", "es": "ef_dora"}), + thumbnail_count=p_cfg.get("thumbnail_count", 3), + music_mood=p_cfg.get("music_mood", "cinematic"), + pexels_api_key=p_cfg.get("pexels_api_key") or None, + pixabay_api_key=p_cfg.get("pixabay_api_key") or None, + poll_interval_seconds=d_cfg.get("poll_interval_seconds", 30), + auto_trending_when_empty=d_cfg.get("auto_trending_when_empty", True), + trending_niche=d_cfg.get("trending_niche", ""), + max_daily_videos=d_cfg.get("max_daily_videos", 12), + youtube_client_secrets=y_cfg.get("client_secrets_file", "client_secrets.json"), + youtube_token_file=y_cfg.get("token_file", "youtube_token.json"), + youtube_default_privacy=y_cfg.get("default_privacy", "private"), + youtube_auto_upload=y_cfg.get("auto_upload", False) + ) + + def health(self): + """Check connection and API service availability on all 3 PCs.""" + logger.info("=" * 65) + logger.info("📊 3-PC YouTube Factory Health Check") + logger.info("=" * 65) + all_ok = True + for name, pc in self.pcs.items(): + logger.info(f"Checking PC: {name.upper()} ({pc.host})...") + for svc_name, svc_info in pc.services.items(): + port = svc_info.get("port", 0) + if port > 0: + status = pc.check(port) + icon = "✅ UP " if status else "❌ DOWN" + logger.info(f" {icon} {name}.{svc_name:<12} on port :{port}") + if not status: + all_ok = False + logger.info("=" * 65) + if all_ok: + logger.info("🎉 All AI services are responding and ready.") + else: + logger.warning("⚠️ Some services are currently unreachable. Review above.") + + def run_video_pipeline(self, topic: str, duration: Optional[int] = None, dry_run: bool = False) -> Dict[str, Any]: + """Execute the end-to-end video production pipeline for a single topic.""" + target_dur = duration or self.cfg.duration_seconds + clean_topic_slug = re.sub(r'[^A-Za-z0-9_]', '_', topic[:25]).strip('_') + job_id = f"{int(time.time())}_{clean_topic_slug}" + job_dir = os.path.join(self.cfg.temp_dir, job_id) + os.makedirs(job_dir, exist_ok=True) + + logger.info("═" * 70) + logger.info(f"🎬 NEW VIDEO JOB: \"{topic}\"") + logger.info(f"⏱️ TARGET DURATION: {target_dur}s ({target_dur//60}m {target_dur%60}s)") + logger.info(f"📁 JOB ID: {job_id}") + logger.info("═" * 70) + + timings = {} + def time_stage(name, fn): + t0 = time.time() + res = fn() + elapsed = round(time.time() - t0, 1) + timings[name] = elapsed + logger.info(f"[{name}] Completed in {elapsed}s") + return res + + # ── Step 1: Script Generation & Translation (AMDLLM) ── + script_file = os.path.join(job_dir, "script.json") + if os.path.exists(script_file): + logger.info("[SCRIPT] Loading existing script checkpoint...") + with open(script_file, "r", encoding="utf-8") as f: + script = json.load(f) + else: + script_gen = ScriptGen(self.pcs) + script = time_stage("SCRIPT", lambda: script_gen.generate(topic, target_dur)) + with open(script_file, "w", encoding="utf-8") as f: + json.dump(script, f, indent=2, ensure_ascii=False) + + if dry_run: + logger.info("[DRY-RUN] Script and metadata generated successfully. Stopping before GPU rendering.") + return {"job_id": job_id, "script": script} + + # ── Step 2: Dual Voiceover Synthesis (IntelLLM) ── + tts_gen = TTSGen(self.pcs, self.cfg.voices) + tts_en = time_stage("TTS:EN", lambda: tts_gen.generate(script, job_dir, "en")) + tts_es = time_stage("TTS:ES", lambda: tts_gen.generate(script, job_dir, "es")) + + # ── Step 3: Procedural Background Music Generation ── + music_gen = MusicGen() + music_path = os.path.join(job_dir, "background_music.wav") + max_voice_dur = max(tts_en["total_duration"], tts_es["total_duration"]) + time_stage("MUSIC", lambda: music_gen.generate(max_voice_dur + 5.0, music_path, mood=self.cfg.music_mood)) + + # ── Step 4: Visual Generation & Stock Media (NvidiaLLM & Web) ── + visual_gen = VisualGen(self.pcs, self.cfg) + clips = time_stage("VISUAL", lambda: visual_gen.generate(script, job_dir, segment_timings=tts_en["segments"])) + + # ── Step 5: Subtitle Transcription via Faster-Whisper (IntelLLM) ── + sub_gen = SubGen(self.pcs) + subs_en = time_stage("SUBS:EN", lambda: sub_gen.generate(tts_en["master_wav"], job_dir, "en")) + subs_es = time_stage("SUBS:ES", lambda: sub_gen.generate(tts_es["master_wav"], job_dir, "es")) + + # ── Step 6: A/B Thumbnail Generation (NvidiaLLM) ── + thumb_gen = ThumbnailGen(self.pcs, self.cfg) + thumbs = time_stage("THUMBNAILS", lambda: thumb_gen.generate(script, topic, job_dir)) + + # ── Step 7: Final Master Video Assembly with Audio Ducking (IntelLLM) ── + assembler = Assembler(self.pcs) + out_prefix = os.path.join(self.cfg.output_dir, job_id) + rendered_videos = time_stage("ASSEMBLY", lambda: assembler.assemble( + clips=clips, + audio_map={"en": tts_en["master_wav"], "es": tts_es["master_wav"]}, + music_path=music_path, + subs_map={"en": subs_en, "es": subs_es}, + script=script, + out_prefix=out_prefix + )) + + # ── Step 8: Package Ready-to-Upload Bundles & Copy Assets ── + # Copy thumbnails to output folder + packaged_thumbs = {"en": [], "es": [], "clean": []} + for lang_key in ("en", "es", "clean"): + for t_file in thumbs.get(lang_key, []): + dest = f"{out_prefix}_{os.path.basename(t_file)}" + subprocess.run(["cp", t_file, dest], check=True) + packaged_thumbs[lang_key].append(dest) + + # Copy standalone subtitle tracks to output + packaged_subs = {} + for l_code, s_file in [("en", subs_en), ("es", subs_es)]: + s_dest = f"{out_prefix}_subtitles_{l_code}.srt" + subprocess.run(["cp", s_file, s_dest], check=True) + packaged_subs[l_code] = s_dest + + # Build Formatted Chapters for Descriptions + chapters_en_txt = "\n".join([ + f"{format_timestamp(s['start'])} - {s['chapter_title']}" + for s in tts_en["segments"] + ]) + chapters_es_txt = "\n".join([ + f"{format_timestamp(s['start'])} - {s.get('chapter_title', f'Parte {i+1}')}" + for i, s in enumerate(tts_es["segments"]) + ]) + + desc_en = f"{script.get('description', '')}\n\nTIMESTAMPS / CHAPTERS:\n{chapters_en_txt}\n\n#Documentary #History #Science" + desc_es = f"{script.get('description_es', script.get('description', ''))}\n\nCAPÍTULOS:\n{chapters_es_txt}\n\n#Documental #Historia #Ciencia" + + # Master Metadata Manifest + bundle_meta = { + "job_id": job_id, + "topic": topic, + "titles": script.get("titles", [topic]), + "titles_es": script.get("titles_es", [topic]), + "description": desc_en, + "description_es": desc_es, + "tags": script.get("tags", []), + "chapters_en": tts_en["segments"], + "chapters_es": tts_es["segments"], + "clips": clips, + "files": rendered_videos, + "subtitles": packaged_subs, + "thumbnails": packaged_thumbs, + "timings": timings, + "created_at": time.time() + } + + meta_json_path = f"{out_prefix}_meta.json" + with open(meta_json_path, "w", encoding="utf-8") as f: + json.dump(bundle_meta, f, indent=2, ensure_ascii=False) + + # Upload Text Files (Copy-paste friendly for YouTube Studio) + with open(f"{out_prefix}_upload_EN.txt", "w", encoding="utf-8") as f: + f.write("=" * 60 + "\n") + f.write(f"YOUTUBE UPLOAD BUNDLE — ENGLISH (Topic: {topic})\n") + f.write("=" * 60 + "\n\n") + f.write("TITLES FOR A/B TESTING:\n") + for i, t in enumerate(script.get("titles", [])): + f.write(f" {chr(65+i)}. {t}\n") + f.write(f"\nDESCRIPTION & CHAPTERS:\n{desc_en}\n\n") + f.write(f"TAGS:\n{', '.join(script.get('tags', []))}\n\n") + f.write(f"VIDEO FILE: {rendered_videos.get('en', '')}\n") + f.write(f"SUBTITLES: {packaged_subs.get('en', '')}\n") + f.write("THUMBNAILS:\n") + for t in packaged_thumbs.get("en", []): + f.write(f" - {t}\n") + + with open(f"{out_prefix}_upload_ES.txt", "w", encoding="utf-8") as f: + f.write("=" * 60 + "\n") + f.write(f"PAQUETE DE SUBIDA A YOUTUBE — ESPAÑOL (Tema: {topic})\n") + f.write("=" * 60 + "\n\n") + f.write("TÍTULOS PARA PRUEBA A/B:\n") + for i, t in enumerate(script.get("titles_es", [])): + f.write(f" {chr(65+i)}. {t}\n") + f.write(f"\nDESCRIPCIÓN Y CAPÍTULOS:\n{desc_es}\n\n") + f.write(f"ETIQUETAS / TAGS:\n{', '.join(script.get('tags', []))}\n\n") + f.write(f"ARCHIVO DE VIDEO: {rendered_videos.get('es', '')}\n") + f.write(f"SUBTÍTULOS: {packaged_subs.get('es', '')}\n") + f.write("MINIATURAS:\n") + for t in packaged_thumbs.get("es", []): + f.write(f" - {t}\n") + + logger.info("═" * 70) + logger.info("🎉 VIDEO GENERATION COMPLETE!") + logger.info(f"📹 English Video: {rendered_videos.get('en')}") + logger.info(f"📹 Spanish Video: {rendered_videos.get('es')}") + logger.info(f"🖼️ Thumbnails: {len(packaged_thumbs.get('en', []))} A/B variants") + logger.info(f"📄 Manifest: {meta_json_path}") + logger.info("═" * 70) + + # Optional Auto-Upload + if self.cfg.youtube_auto_upload and self.uploader.is_configured(): + try: + logger.info("[YOUTUBE] Auto-upload enabled. Publishing to YouTube...") + self.uploader.upload_bundle(meta_json_path, lang="en") + except Exception as e: + logger.error(f"[YOUTUBE] Auto-upload failed: {e}") + + return bundle_meta + + def run_daemon(self): + """24/7 Autonomous Daemon Worker Loop.""" + logger.info("=" * 65) + logger.info("🤖 YouTube Factory 24/7 Daemon Worker Started") + logger.info(f" Polling Interval: {self.cfg.poll_interval_seconds}s") + logger.info(f" Auto-Trending: {self.cfg.auto_trending_when_empty}") + logger.info("=" * 65) + + trending_fetcher = TrendingFetcher(self.pcs.get("amdllm")) + + while True: + try: + job = self.queue.get_next_job() + if not job: + if self.cfg.auto_trending_when_empty: + logger.info("[DAEMON] Queue is empty. Fetching next trending viral topic...") + trending_topics = trending_fetcher.get_trending_topics( + niche=self.cfg.trending_niche, + count=1 + ) + if trending_topics: + new_topic = trending_topics[0] + logger.info(f"[DAEMON] Enqueuing trending topic: '{new_topic}'") + self.queue.add_job(new_topic) + continue + + logger.debug(f"[DAEMON] Waiting {self.cfg.poll_interval_seconds}s for jobs...") + time.sleep(self.cfg.poll_interval_seconds) + continue + + # Process active job + job_id = job["job_id"] + topic = job["topic"] + dur = job.get("duration") or self.cfg.duration_seconds + + logger.info(f"[DAEMON] Starting Job: {job_id} -> '{topic}'") + self.queue.update_progress(job_id, "PROCESSING") + + try: + result = self.run_video_pipeline(topic, duration=dur) + self.queue.mark_completed(job_id, result) + except Exception as e: + logger.error(f"[DAEMON] Error processing job {job_id}: {e}", exc_info=True) + self.queue.mark_failed(job_id, str(e)) + + except KeyboardInterrupt: + logger.info("\n[DAEMON] Shutting down 24/7 worker...") + break + except Exception as e: + logger.error(f"[DAEMON] Unexpected worker error: {e}", exc_info=True) + time.sleep(10) + +def main(): + parser = argparse.ArgumentParser(description="YouTube Factory — 3-PC Faceless Video Pipeline") + parser.add_argument("--topic", "-t", help="Single video topic to generate") + parser.add_argument("--duration", "-d", type=int, help="Target duration in seconds") + parser.add_argument("--batch", "-b", nargs="+", help="List of video topics to process sequentially") + parser.add_argument("--batch-file", "-f", help="Text file containing one topic per line") + parser.add_argument("--trending", action="store_true", help="Fetch real-time trending topics and generate videos") + parser.add_argument("--trending-niche", help="Trending niche (history, space, science, tech, mysteries, business)") + parser.add_argument("--trending-count", type=int, default=3, help="Number of trending topics to fetch/queue") + parser.add_argument("--daemon", action="store_true", help="Start 24/7 continuous autonomous generation worker") + parser.add_argument("--queue-add", help="Enqueue a new topic into the background queue") + parser.add_argument("--queue-list", action="store_true", help="Display all pending and completed jobs in queue") + parser.add_argument("--queue-retry", action="store_true", help="Reset all failed jobs back to queued state") + parser.add_argument("--health", "-H", action="store_true", help="Check status of all 3 PCs and their AI services") + parser.add_argument("--setup", action="store_true", help="Check and automatically install all dependencies across environment") + parser.add_argument("--check-deps", action="store_true", help="Verify Python packages, system tools, and SSH connections") + parser.add_argument("--dry-run", action="store_true", help="Generate script and metadata without running heavy GPU video rendering") + parser.add_argument("--upload", help="Upload a completed video bundle meta.json to YouTube") + parser.add_argument("--config", "-c", default="factory_config.yaml", help="Path to custom config YAML") + + args = parser.parse_args() + + if args.setup or args.check_deps: + print("\n🔍 Checking YouTube Factory Dependencies...\n") + ok = ensure_dependencies(auto_install=True, check_remote=True) + if ok: + print("\n✅ All dependencies and remote connections are fully configured!\n") + else: + print("\n⚠️ Some dependencies or remote connections require attention.\n") + sys.exit(0 if ok else 1) + + factory = YouTubeFactory(args.config) + + if args.health: + factory.health() + elif args.upload: + if not factory.uploader.is_configured(): + logger.error("YouTube API credentials not configured. Please place client_secrets.json in this directory.") + sys.exit(1) + factory.uploader.upload_bundle(args.upload) + elif args.queue_add: + factory.queue.add_job(args.queue_add, duration=args.duration) + elif args.queue_list: + jobs = factory.queue.list_jobs() + print("\n" + "=" * 80) + print(f"{'JOB ID':<20} | {'STATUS':<12} | {'STEP':<12} | {'TOPIC'}") + print("-" * 80) + for j in jobs: + print(f"{j['job_id']:<20} | {j['status']:<12} | {j['progress_step']:<12} | {j['topic'][:40]}") + print("=" * 80 + "\n") + elif args.queue_retry: + retried = factory.queue.retry_failed() + logger.info(f"Retried {retried} failed jobs.") + elif args.daemon: + factory.run_daemon() + elif args.trending: + fetcher = TrendingFetcher(factory.pcs.get("amdllm")) + topics = fetcher.get_trending_topics(niche=args.trending_niche, count=args.trending_count) + logger.info(f"Discovered {len(topics)} trending topics: {topics}") + for t in topics: + factory.run_video_pipeline(t, duration=args.duration, dry_run=args.dry_run) + elif args.batch_file: + if not os.path.exists(args.batch_file): + logger.error(f"Batch file not found: {args.batch_file}") + sys.exit(1) + with open(args.batch_file, "r") as f: + topics = [line.strip() for line in f if line.strip() and not line.startswith("#")] + for t in topics: + factory.run_video_pipeline(t, duration=args.duration, dry_run=args.dry_run) + elif args.batch: + for t in args.batch: + factory.run_video_pipeline(t, duration=args.duration, dry_run=args.dry_run) + elif args.topic: + factory.run_video_pipeline(args.topic, duration=args.duration, dry_run=args.dry_run) + else: + # Interactive mode + topic = input("Enter video topic: ").strip() + if topic: + factory.run_video_pipeline(topic, duration=args.duration, dry_run=args.dry_run) + +if __name__ == "__main__": + main()