video-compose 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- video_compose-0.3.0/.gitignore +14 -0
- video_compose-0.3.0/PKG-INFO +150 -0
- video_compose-0.3.0/PUBLISH.md +58 -0
- video_compose-0.3.0/QUALITY_CHECKLIST.md +71 -0
- video_compose-0.3.0/README.md +56 -0
- video_compose-0.3.0/examples/demo_all_fx.json +117 -0
- video_compose-0.3.0/examples/minimal.json +27 -0
- video_compose-0.3.0/examples/sales_report.json +67 -0
- video_compose-0.3.0/pyproject.toml +99 -0
- video_compose-0.3.0/scripts/gen_preview_placeholders.py +122 -0
- video_compose-0.3.0/scripts/render_all_templates.py +340 -0
- video_compose-0.3.0/src/video_compose/__init__.py +7 -0
- video_compose-0.3.0/src/video_compose/_codec.py +65 -0
- video_compose-0.3.0/src/video_compose/_fonts.py +51 -0
- video_compose-0.3.0/src/video_compose/api.py +112 -0
- video_compose-0.3.0/src/video_compose/assembler/__init__.py +4 -0
- video_compose-0.3.0/src/video_compose/assembler/assembler.py +203 -0
- video_compose-0.3.0/src/video_compose/assembler/concat.py +33 -0
- video_compose-0.3.0/src/video_compose/assembler/encode.py +22 -0
- video_compose-0.3.0/src/video_compose/assembler/png_export.py +34 -0
- video_compose-0.3.0/src/video_compose/assets/placeholders.py +57 -0
- video_compose-0.3.0/src/video_compose/audio/__init__.py +2 -0
- video_compose-0.3.0/src/video_compose/audio/mixer.py +119 -0
- video_compose-0.3.0/src/video_compose/audio/pipeline.py +63 -0
- video_compose-0.3.0/src/video_compose/audio/voiceover.py +88 -0
- video_compose-0.3.0/src/video_compose/cli.py +451 -0
- video_compose-0.3.0/src/video_compose/data/__init__.py +11 -0
- video_compose-0.3.0/src/video_compose/data/api_source.py +74 -0
- video_compose-0.3.0/src/video_compose/data/csv_source.py +29 -0
- video_compose-0.3.0/src/video_compose/data/excel_source.py +51 -0
- video_compose-0.3.0/src/video_compose/data/fetcher.py +179 -0
- video_compose-0.3.0/src/video_compose/data/json_source.py +39 -0
- video_compose-0.3.0/src/video_compose/data/registry.py +91 -0
- video_compose-0.3.0/src/video_compose/data/sql_source.py +45 -0
- video_compose-0.3.0/src/video_compose/fonts/Inter-Medium.ttf +0 -0
- video_compose-0.3.0/src/video_compose/fonts/Inter-Regular.ttf +0 -0
- video_compose-0.3.0/src/video_compose/fonts/Inter-SemiBold.ttf +0 -0
- video_compose-0.3.0/src/video_compose/fonts/__init__.py +0 -0
- video_compose-0.3.0/src/video_compose/grade/__init__.py +2 -0
- video_compose-0.3.0/src/video_compose/grade/apply.py +100 -0
- video_compose-0.3.0/src/video_compose/llm/__init__.py +19 -0
- video_compose-0.3.0/src/video_compose/llm/prompt_builder.py +326 -0
- video_compose-0.3.0/src/video_compose/llm/spec_generator.py +234 -0
- video_compose-0.3.0/src/video_compose/llm/spec_validator.py +155 -0
- video_compose-0.3.0/src/video_compose/llm/template_instantiator.py +180 -0
- video_compose-0.3.0/src/video_compose/llm/template_picker.py +178 -0
- video_compose-0.3.0/src/video_compose/overlays/__init__.py +2 -0
- video_compose-0.3.0/src/video_compose/overlays/bar.py +99 -0
- video_compose-0.3.0/src/video_compose/overlays/compositor.py +125 -0
- video_compose-0.3.0/src/video_compose/overlays/stars.py +111 -0
- video_compose-0.3.0/src/video_compose/overlays/text.py +255 -0
- video_compose-0.3.0/src/video_compose/overlays/web.py +47 -0
- video_compose-0.3.0/src/video_compose/renderers/__init__.py +5 -0
- video_compose-0.3.0/src/video_compose/renderers/base.py +146 -0
- video_compose-0.3.0/src/video_compose/renderers/blank.py +188 -0
- video_compose-0.3.0/src/video_compose/renderers/chart.py +60 -0
- video_compose-0.3.0/src/video_compose/renderers/dispatcher.py +21 -0
- video_compose-0.3.0/src/video_compose/renderers/fractal.py +42 -0
- video_compose-0.3.0/src/video_compose/renderers/geomap.py +166 -0
- video_compose-0.3.0/src/video_compose/renderers/image.py +152 -0
- video_compose-0.3.0/src/video_compose/renderers/mathviz.py +172 -0
- video_compose-0.3.0/src/video_compose/renderers/registry.py +63 -0
- video_compose-0.3.0/src/video_compose/renderers/shape.py +67 -0
- video_compose-0.3.0/src/video_compose/renderers/slide.py +113 -0
- video_compose-0.3.0/src/video_compose/renderers/split_screen.py +178 -0
- video_compose-0.3.0/src/video_compose/renderers/still.py +240 -0
- video_compose-0.3.0/src/video_compose/renderers/video.py +52 -0
- video_compose-0.3.0/src/video_compose/schema/__init__.py +4 -0
- video_compose-0.3.0/src/video_compose/schema/spec.py +554 -0
- video_compose-0.3.0/src/video_compose/schema/tvcs_schema.json +2166 -0
- video_compose-0.3.0/src/video_compose/schema/validator.py +411 -0
- video_compose-0.3.0/src/video_compose/templates/__init__.py +15 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/ambient/ambient_pre_show_loop.json +156 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/ambient/fractal_title_card.json +138 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/ambient/neon_countdown.json +201 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/audio/audiogram_podcast.json +162 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/brand/company_logo_reveal.json +150 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/business/okr_quarterly_review.json +363 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/business/pitch_deck_hook.json +245 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/business/pitch_deck_hook_light.json +249 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/creator/youtube_channel_intro.json +150 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/creator/youtube_channel_intro_portrait.json +155 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/creator/youtube_end_screen.json +148 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_candlestick.json +192 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_europe_map.json +202 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_radar_performance.json +211 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_sankey_flow.json +211 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_story_bar_chart.json +197 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_story_bar_chart_light.json +201 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_story_kpi_dashboard.json +325 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_story_line_chart.json +156 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_treemap.json +177 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_waterfall_bridge.json +185 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_world_choropleth.json +211 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/entertainment/esports_match_overlay.json +192 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/entertainment/movie_end_credits.json +248 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/entertainment/music_release_card.json +194 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/entertainment/podcast_chapter_card.json +152 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/event/event_agenda.json +292 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/event/event_speaker_card.json +179 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/explainer/bullet_point_list.json +189 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/explainer/explainer_funnel.json +171 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/explainer/explainer_numbered_steps.json +229 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/explainer/explainer_pros_cons.json +282 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/explainer/explainer_timeline.json +305 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/explainer/faq_qa.json +191 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/explainer/numbered_step_list.json +228 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/explainer/tutorial_steps.json +206 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/financial/annual_report_summary.json +318 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/financial/earnings_quarterly.json +243 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/lower_third/interview_lower_third.json +119 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/lower_third/lower_third_cnn.json +99 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/lower_third/lower_third_score_bug.json +119 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/lower_third/lower_third_scrolling_ticker.json +98 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/news/breaking_news_alert.json +169 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/people/team_spotlight.json +235 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/people/testimonial_review.json +193 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/people/testimonial_review_light.json +197 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/people/testimonial_review_portrait.json +198 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/presentation/presentation_corporate.json +147 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/presentation/presentation_corporate_light.json +150 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/product/app_store_review.json +241 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/product/before_after_comparison.json +205 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/product/pricing_card.json +253 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/product/product_feature_split.json +199 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/product_launch/product_launch_dark.json +237 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/product_launch/product_launch_dark_portrait.json +240 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/product_launch/product_launch_minimal.json +137 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/product_launch/product_launch_minimal_light.json +139 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/real_estate/real_estate_listing.json +222 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/social/quote_with_photo.json +161 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/social/social_announcement.json +124 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/social/social_collab_announcement.json +225 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/social/social_countdown.json +124 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/social/social_milestone_counter.json +183 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/social/social_motivational.json +101 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/social/social_motivational_portrait.json +105 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/social/social_poll_result.json +194 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/social/social_proof_numbers.json +218 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/social/social_quote_card.json +111 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/social/social_quote_card_portrait.json +116 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/social/social_tiktok_hook.json +127 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/sports/sports_match_result.json +284 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/swedish/swedish_election_map.json +193 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/swedish/swedish_news_opener.json +191 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/swedish/swedish_regional_kpi.json +217 -0
- video_compose-0.3.0/src/video_compose/templates/bundled/swedish/swedish_valdistrikt_map.json +216 -0
- video_compose-0.3.0/src/video_compose/templates/config.py +112 -0
- video_compose-0.3.0/src/video_compose/templates/engine.py +223 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/ambient_pre_show_loop.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/annual_report_summary.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/audiogram_podcast.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/data_candlestick.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/data_europe_map.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/data_radar_performance.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/data_sankey_flow.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/data_story_bar_chart.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/data_story_kpi_dashboard.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/data_story_line_chart.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/data_treemap.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/data_waterfall_bridge.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/data_world_choropleth.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/earnings_quarterly.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/esports_match_overlay.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/event_agenda.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/event_speaker_card.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/explainer_funnel.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/explainer_numbered_steps.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/explainer_pros_cons.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/explainer_timeline.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/fractal_title_card.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/lower_third_cnn.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/lower_third_score_bug.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/lower_third_scrolling_ticker.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/movie_end_credits.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/music_release_card.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/neon_countdown.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/okr_quarterly_review.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/pitch_deck_hook.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/podcast_chapter_card.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/presentation_corporate.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/product_launch_dark.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/product_launch_minimal.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/real_estate_listing.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/social_announcement.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/social_collab_announcement.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/social_countdown.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/social_milestone_counter.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/social_motivational.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/social_poll_result.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/social_quote_card.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/social_tiktok_hook.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/sports_match_result.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/swedish_election_map.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/swedish_news_opener.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/swedish_regional_kpi.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/swedish_valdistrikt_map.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/team_spotlight.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/testimonial_review.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/full/youtube_channel_intro.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/ambient_pre_show_loop.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/annual_report_summary.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/audiogram_podcast.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/data_candlestick.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/data_europe_map.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/data_radar_performance.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/data_sankey_flow.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/data_story_bar_chart.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/data_story_kpi_dashboard.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/data_story_line_chart.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/data_treemap.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/data_waterfall_bridge.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/data_world_choropleth.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/earnings_quarterly.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/esports_match_overlay.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/event_agenda.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/event_speaker_card.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/explainer_funnel.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/explainer_numbered_steps.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/explainer_pros_cons.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/explainer_timeline.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/fractal_title_card.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/lower_third_cnn.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/lower_third_score_bug.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/lower_third_scrolling_ticker.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/movie_end_credits.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/music_release_card.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/neon_countdown.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/okr_quarterly_review.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/pitch_deck_hook.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/podcast_chapter_card.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/presentation_corporate.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/product_launch_dark.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/product_launch_minimal.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/real_estate_listing.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/social_announcement.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/social_collab_announcement.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/social_countdown.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/social_milestone_counter.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/social_motivational.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/social_poll_result.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/social_quote_card.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/social_tiktok_hook.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/sports_match_result.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/swedish_election_map.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/swedish_news_opener.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/swedish_regional_kpi.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/swedish_valdistrikt_map.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/team_spotlight.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/testimonial_review.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/youtube_channel_intro.jpg +0 -0
- video_compose-0.3.0/src/video_compose/templates/registry.py +241 -0
- video_compose-0.3.0/src/video_compose/tools/__init__.py +0 -0
- video_compose-0.3.0/src/video_compose/tools/report.py +167 -0
- video_compose-0.3.0/src/video_compose/tools/thumbnail.py +130 -0
- video_compose-0.3.0/src/video_compose/transition/__init__.py +2 -0
- video_compose-0.3.0/src/video_compose/transition/apply.py +63 -0
- video_compose-0.3.0/tests/test_data_adapters.py +227 -0
- video_compose-0.3.0/tests/test_data_resolver.py +300 -0
- video_compose-0.3.0/tests/test_prompt_builder.py +118 -0
- video_compose-0.3.0/tests/test_template_engine.py +228 -0
- video_compose-0.3.0/tests/test_template_registry.py +187 -0
- video_compose-0.3.0/tests/test_validator.py +275 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: video-compose
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: JSON-driven video composition engine for the Trollfabriken FX ecosystem
|
|
5
|
+
Project-URL: Homepage, https://github.com/tomastimelock/trollfabriken-video-compose-bootstrap
|
|
6
|
+
Project-URL: Repository, https://github.com/tomastimelock/trollfabriken-video-compose-bootstrap
|
|
7
|
+
Project-URL: Issues, https://github.com/tomastimelock/trollfabriken-video-compose-bootstrap/issues
|
|
8
|
+
Author-email: Trollfabriken <tomasamlov@gmail.com>
|
|
9
|
+
License: MIT
|
|
10
|
+
Keywords: composition,ffmpeg,json2video,presentation,tvcs,video
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Topic :: Multimedia :: Video
|
|
18
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
19
|
+
Requires-Python: >=3.11
|
|
20
|
+
Requires-Dist: click>=8.1
|
|
21
|
+
Requires-Dist: numpy>=1.24
|
|
22
|
+
Requires-Dist: pillow>=10.0
|
|
23
|
+
Requires-Dist: pydantic>=2.0
|
|
24
|
+
Provides-Extra: all
|
|
25
|
+
Requires-Dist: audio-arrange; extra == 'all'
|
|
26
|
+
Requires-Dist: chart-fx; extra == 'all'
|
|
27
|
+
Requires-Dist: color-fx; extra == 'all'
|
|
28
|
+
Requires-Dist: cut-fx; extra == 'all'
|
|
29
|
+
Requires-Dist: fractal-fx; extra == 'all'
|
|
30
|
+
Requires-Dist: geo-map-fx; extra == 'all'
|
|
31
|
+
Requires-Dist: jmespath>=1.0; extra == 'all'
|
|
32
|
+
Requires-Dist: mathviz-fx; extra == 'all'
|
|
33
|
+
Requires-Dist: openai>=1.0; extra == 'all'
|
|
34
|
+
Requires-Dist: openpyxl>=3.1; extra == 'all'
|
|
35
|
+
Requires-Dist: pandas>=2.0; extra == 'all'
|
|
36
|
+
Requires-Dist: playwright; extra == 'all'
|
|
37
|
+
Requires-Dist: shape-fx; extra == 'all'
|
|
38
|
+
Requires-Dist: slide-render; extra == 'all'
|
|
39
|
+
Requires-Dist: sqlalchemy>=2.0; extra == 'all'
|
|
40
|
+
Requires-Dist: still-motion; extra == 'all'
|
|
41
|
+
Requires-Dist: talk-cast; extra == 'all'
|
|
42
|
+
Requires-Dist: text-fx; extra == 'all'
|
|
43
|
+
Requires-Dist: web-overlay; extra == 'all'
|
|
44
|
+
Provides-Extra: audio
|
|
45
|
+
Requires-Dist: audio-arrange; extra == 'audio'
|
|
46
|
+
Requires-Dist: talk-cast; extra == 'audio'
|
|
47
|
+
Provides-Extra: chart
|
|
48
|
+
Requires-Dist: chart-fx; extra == 'chart'
|
|
49
|
+
Provides-Extra: cut
|
|
50
|
+
Requires-Dist: cut-fx; extra == 'cut'
|
|
51
|
+
Provides-Extra: data
|
|
52
|
+
Requires-Dist: jmespath>=1.0; extra == 'data'
|
|
53
|
+
Requires-Dist: openpyxl>=3.1; extra == 'data'
|
|
54
|
+
Requires-Dist: pandas>=2.0; extra == 'data'
|
|
55
|
+
Requires-Dist: sqlalchemy>=2.0; extra == 'data'
|
|
56
|
+
Provides-Extra: dev
|
|
57
|
+
Requires-Dist: hatch; extra == 'dev'
|
|
58
|
+
Requires-Dist: pytest-cov; extra == 'dev'
|
|
59
|
+
Requires-Dist: pytest>=7.0; extra == 'dev'
|
|
60
|
+
Requires-Dist: ruff; extra == 'dev'
|
|
61
|
+
Provides-Extra: fractal
|
|
62
|
+
Requires-Dist: fractal-fx; extra == 'fractal'
|
|
63
|
+
Provides-Extra: fx
|
|
64
|
+
Requires-Dist: chart-fx; extra == 'fx'
|
|
65
|
+
Requires-Dist: color-fx; extra == 'fx'
|
|
66
|
+
Requires-Dist: cut-fx; extra == 'fx'
|
|
67
|
+
Requires-Dist: fractal-fx; extra == 'fx'
|
|
68
|
+
Requires-Dist: geo-map-fx; extra == 'fx'
|
|
69
|
+
Requires-Dist: mathviz-fx; extra == 'fx'
|
|
70
|
+
Requires-Dist: shape-fx; extra == 'fx'
|
|
71
|
+
Requires-Dist: still-motion; extra == 'fx'
|
|
72
|
+
Requires-Dist: text-fx; extra == 'fx'
|
|
73
|
+
Provides-Extra: geomap
|
|
74
|
+
Requires-Dist: geo-map-fx; extra == 'geomap'
|
|
75
|
+
Provides-Extra: grade
|
|
76
|
+
Requires-Dist: color-fx; extra == 'grade'
|
|
77
|
+
Provides-Extra: llm
|
|
78
|
+
Requires-Dist: openai>=1.0; extra == 'llm'
|
|
79
|
+
Provides-Extra: mathviz
|
|
80
|
+
Requires-Dist: mathviz-fx; extra == 'mathviz'
|
|
81
|
+
Provides-Extra: shape
|
|
82
|
+
Requires-Dist: shape-fx; extra == 'shape'
|
|
83
|
+
Provides-Extra: slide
|
|
84
|
+
Requires-Dist: playwright; extra == 'slide'
|
|
85
|
+
Requires-Dist: slide-render; extra == 'slide'
|
|
86
|
+
Provides-Extra: still
|
|
87
|
+
Requires-Dist: still-motion; extra == 'still'
|
|
88
|
+
Provides-Extra: text
|
|
89
|
+
Requires-Dist: text-fx; extra == 'text'
|
|
90
|
+
Provides-Extra: web
|
|
91
|
+
Requires-Dist: playwright; extra == 'web'
|
|
92
|
+
Requires-Dist: web-overlay; extra == 'web'
|
|
93
|
+
Description-Content-Type: text/markdown
|
|
94
|
+
|
|
95
|
+
# video-compose
|
|
96
|
+
|
|
97
|
+
JSON-driven video composition engine for the Trollfabriken FX ecosystem.
|
|
98
|
+
|
|
99
|
+
Define a presentation or video as a **TVCS** (Trollfabriken Video Composition Spec) JSON file and render it to MP4 or PNG frames. The JSON can be authored by hand or generated by an AI via the APISuite `VideoComposeProvider`.
|
|
100
|
+
|
|
101
|
+
## Quick start
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
pip install video-compose[all]
|
|
105
|
+
video-compose render my_presentation.json
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Spec example
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"tvcs": "1.0",
|
|
113
|
+
"output": { "width": 1280, "height": 720, "fps": 30, "formats": ["mp4"] },
|
|
114
|
+
"theme": { "palette": "neon", "background": "#0d0d1a" },
|
|
115
|
+
"segments": [
|
|
116
|
+
{ "id": "intro", "type": "mathviz", "duration": 4.0, "effect": "matrix_rain" },
|
|
117
|
+
{ "id": "chart", "type": "chart", "duration": 6.0, "chart_type": "bar",
|
|
118
|
+
"data": { "title": "Revenue", "categories": ["Q1","Q2"], "series": [{"name":"2024","values":[420,580]}] } }
|
|
119
|
+
],
|
|
120
|
+
"transitions": { "default": { "type": "dissolve", "duration": 0.5 } }
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## CLI
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
video-compose render spec.json Render to MP4
|
|
128
|
+
video-compose validate spec.json Validate without rendering
|
|
129
|
+
video-compose preview spec.json intro Render single segment
|
|
130
|
+
video-compose schema Print full JSON Schema
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Optional dependencies
|
|
134
|
+
|
|
135
|
+
| Extra | Enables |
|
|
136
|
+
|---|---|
|
|
137
|
+
| `[mathviz]` | mathviz-fx background generators |
|
|
138
|
+
| `[chart]` | chart-fx animated charts |
|
|
139
|
+
| `[geomap]` | geo-map-fx choropleth maps |
|
|
140
|
+
| `[shape]` | shape-fx particle/geometric effects |
|
|
141
|
+
| `[fractal]` | fractal-fx generative backgrounds |
|
|
142
|
+
| `[audio]` | talk-cast voiceover + audio-arrange mixing |
|
|
143
|
+
| `[data]` | CSV, Excel, SQL, REST API data sources |
|
|
144
|
+
| `[web]` | web-overlay HTML overlays (requires Playwright) |
|
|
145
|
+
| `[all]` | Everything above |
|
|
146
|
+
|
|
147
|
+
## Ecosystem
|
|
148
|
+
|
|
149
|
+
`video-compose` is the composition layer for the Trollfabriken FX suite. It orchestrates:
|
|
150
|
+
`mathviz-fx` · `chart-fx` · `geo-map-fx` · `shape-fx` · `fractal-fx` · `text-fx` · `color-fx` · `cut-fx` · `talk-cast` · `audio-arrange` · `slide-render` · `still-motion` · `web-overlay`
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Publishing video-compose to PyPI
|
|
2
|
+
|
|
3
|
+
## Setup (one-time)
|
|
4
|
+
|
|
5
|
+
### 1. Register trusted publisher on pypi.org
|
|
6
|
+
|
|
7
|
+
Go to: https://pypi.org/manage/account/publishing/
|
|
8
|
+
|
|
9
|
+
Add a new trusted publisher:
|
|
10
|
+
|
|
11
|
+
| Field | Value |
|
|
12
|
+
|-------------|----------------------------------------------|
|
|
13
|
+
| Project | `video-compose` |
|
|
14
|
+
| Owner | `tomastimelock` |
|
|
15
|
+
| Repository | `trollfabriken-video-compose-bootstrap` |
|
|
16
|
+
| Workflow | `publish.yml` |
|
|
17
|
+
| Environment | `pypi` |
|
|
18
|
+
|
|
19
|
+
### 2. GitHub environment
|
|
20
|
+
|
|
21
|
+
The `pypi` environment has already been created on the repo.
|
|
22
|
+
No additional secrets or protection rules required — OIDC handles auth.
|
|
23
|
+
|
|
24
|
+
## Release
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# From the video-compose/ subdirectory
|
|
28
|
+
git tag v0.1.0
|
|
29
|
+
git push origin v0.1.0
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The `publish.yml` workflow triggers on `v*` tags, builds the wheel + sdist,
|
|
33
|
+
publishes to PyPI via OIDC trusted publishing (no API token needed), and
|
|
34
|
+
creates a GitHub release with the dist artifacts.
|
|
35
|
+
|
|
36
|
+
## Install extras
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# Core only (blank/image/video segments — no fx packages)
|
|
40
|
+
pip install video-compose
|
|
41
|
+
|
|
42
|
+
# Core FX stack (mathviz + chart + geomap + shape + fractal + grade + cut + text + still)
|
|
43
|
+
pip install "video-compose[fx]"
|
|
44
|
+
|
|
45
|
+
# With audio (talk-cast voiceover + audio-arrange mixing)
|
|
46
|
+
pip install "video-compose[fx,audio]"
|
|
47
|
+
|
|
48
|
+
# Everything
|
|
49
|
+
pip install "video-compose[all]"
|
|
50
|
+
|
|
51
|
+
# Data sources (CSV / JSON / Excel / SQL / REST API)
|
|
52
|
+
pip install "video-compose[data]"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Daily limit note
|
|
56
|
+
|
|
57
|
+
PyPI enforces a daily limit on new project registrations (~5/day per account).
|
|
58
|
+
If you hit it, wait until UTC midnight and retry.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Video Compose — Professional Broadcast Quality Checklist
|
|
2
|
+
|
|
3
|
+
Reviewed from frames of all 51 rendered templates. Each item has a STATUS (PASS/FAIL/PARTIAL)
|
|
4
|
+
and a SEVERITY (CRITICAL/SERIOUS/DESIGN/TECHNICAL). Items prefixed [FIXED] are implemented.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## TIER 1 — Showstoppers (nothing looks right without these)
|
|
9
|
+
|
|
10
|
+
| ID | Description | Status | Severity |
|
|
11
|
+
|----|-------------|--------|----------|
|
|
12
|
+
| QC-001 | **Compositor alpha**: text overlays must composite OVER background video, not replace it with black | [FIXED] | CRITICAL |
|
|
13
|
+
| QC-002 | **Compositor timing**: animation must start from frame 0 of effect when overlay begins (setpts delay missing) | [FIXED] | CRITICAL |
|
|
14
|
+
| QC-003 | **No pure-black frames**: resolved by QC-001+002; all segments must show content at all times | FIXED | CRITICAL |
|
|
15
|
+
| QC-007 | **White rectangle artifact**: unicode star "★★★★★" or other unicode fails, text-fx emits white fallback canvas | [FIXED] | CRITICAL |
|
|
16
|
+
|
|
17
|
+
## TIER 2 — Quality killers (output works but looks cheap/amateur)
|
|
18
|
+
|
|
19
|
+
| ID | Description | Status | Severity |
|
|
20
|
+
|----|-------------|--------|----------|
|
|
21
|
+
| QC-004 | **Font size resolution-aware**: base 72px at 720p = 10% frame height; must scale with video height | [FIXED] | SERIOUS |
|
|
22
|
+
| QC-005 | **Mathviz depth**: voronoi_cells/plasma/etc. render as flat fully-saturated geometry; need vignette + slight desaturation | [FIXED] | SERIOUS |
|
|
23
|
+
| QC-006 | **Frame rate**: 15fps batch cap causes choppy motion artifacts; minimum 24fps | [FIXED] | SERIOUS |
|
|
24
|
+
| QC-013 | **Video bitrate**: 217–239 kbps at 720p is too low for sharp text edges; compositor CRF too high | [FIXED] | SERIOUS |
|
|
25
|
+
| QC-008 | **Typography hierarchy**: all text elements at similar size; title >> subtitle >> body needed | PENDING | SERIOUS |
|
|
26
|
+
| QC-010 | **Vertical stagger**: multiple "bottom" overlays stack on same Y coordinate | PENDING | SERIOUS |
|
|
27
|
+
| QC-014 | **Transition smoothness**: dissolve quality not verified; cut-fx render path untested | PENDING | SERIOUS |
|
|
28
|
+
|
|
29
|
+
## TIER 3 — Design (broadcast-quality polish)
|
|
30
|
+
|
|
31
|
+
| ID | Description | Status | Severity |
|
|
32
|
+
|----|-------------|--------|----------|
|
|
33
|
+
| QC-009 | **Overlay layering**: multiple overlays must be visible simultaneously (not just last one) | FIXED via QC-001 | DESIGN |
|
|
34
|
+
| QC-011 | **Background depth**: gradient segments look good; mathviz needs cinematic grading | PARTIAL | DESIGN |
|
|
35
|
+
| QC-012 | **Film grain**: subtle and visible in blank segments — acceptable | PASS | DESIGN |
|
|
36
|
+
| QC-015 | **Audio bed**: ambient music audibility not verifiable from frames; need playback test | UNTESTED | DESIGN |
|
|
37
|
+
| QC-016 | **Text shadow quality**: shadows must separate text from background in all color combos | PENDING | DESIGN |
|
|
38
|
+
| QC-017 | **Safe zones**: 5% safe-area margins respected for broadcast compatibility | PENDING | DESIGN |
|
|
39
|
+
| QC-018 | **Accent elements**: no graphic dividers, bars, or decorative elements — pure text-on-bg | PENDING | DESIGN |
|
|
40
|
+
| QC-019 | **Motion blur on fast text effects**: impact_slam/kinetic_pop need motion blur to feel physical | PENDING | DESIGN |
|
|
41
|
+
| QC-020 | **Consistent color temperature**: warm and cold accent colors mixed inconsistently across templates | PENDING | DESIGN |
|
|
42
|
+
|
|
43
|
+
## TIER 4 — VFX & technical (director/VFX artist level)
|
|
44
|
+
|
|
45
|
+
| ID | Description | Status | Severity |
|
|
46
|
+
|----|-------------|--------|----------|
|
|
47
|
+
| QC-021 | **Easing quality**: all text animations should use ease-out or ease-in-out; linear easing looks robotic | PENDING | TECHNICAL |
|
|
48
|
+
| QC-022 | **Still image compositing**: placeholder image shows as letterboxed with border; fill/crop must cover full frame | PENDING | TECHNICAL |
|
|
49
|
+
| QC-023 | **Geomap rendering quality**: tight_layout UserWarning suggests clipped content | PARTIAL | TECHNICAL |
|
|
50
|
+
| QC-024 | **Audio sync**: text animation start times must match any audio beat if audio is present | PENDING | TECHNICAL |
|
|
51
|
+
| QC-025 | **Codec profile**: H.264 output should use High Profile for best quality | PENDING | TECHNICAL |
|
|
52
|
+
| QC-026 | **Color space**: ensure BT.709 colorspace tag is set on all outputs for broadcast delivery | PENDING | TECHNICAL |
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Validation Procedure for Next Render
|
|
57
|
+
|
|
58
|
+
Run after every batch render to gate quality:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
python scripts/validate_quality.py E:/VideoCompose
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Checks:
|
|
65
|
+
- [ ] No video has more than 3 consecutive black frames (outside fade-in)
|
|
66
|
+
- [ ] Every video has audio track with non-zero RMS
|
|
67
|
+
- [ ] Mean bitrate ≥ 800 kbps at 720p
|
|
68
|
+
- [ ] Frame 3 (t≈0.1s) is not pure black (#000000)
|
|
69
|
+
- [ ] Frame at 50% duration has visible text pixels (luminance > 10 in any region)
|
|
70
|
+
- [ ] No white rectangle in top-left quadrant at any frame after t=1.0s
|
|
71
|
+
- [ ] Video duration matches template sum of segment durations ±0.5s
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# video-compose
|
|
2
|
+
|
|
3
|
+
JSON-driven video composition engine for the Trollfabriken FX ecosystem.
|
|
4
|
+
|
|
5
|
+
Define a presentation or video as a **TVCS** (Trollfabriken Video Composition Spec) JSON file and render it to MP4 or PNG frames. The JSON can be authored by hand or generated by an AI via the APISuite `VideoComposeProvider`.
|
|
6
|
+
|
|
7
|
+
## Quick start
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pip install video-compose[all]
|
|
11
|
+
video-compose render my_presentation.json
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Spec example
|
|
15
|
+
|
|
16
|
+
```json
|
|
17
|
+
{
|
|
18
|
+
"tvcs": "1.0",
|
|
19
|
+
"output": { "width": 1280, "height": 720, "fps": 30, "formats": ["mp4"] },
|
|
20
|
+
"theme": { "palette": "neon", "background": "#0d0d1a" },
|
|
21
|
+
"segments": [
|
|
22
|
+
{ "id": "intro", "type": "mathviz", "duration": 4.0, "effect": "matrix_rain" },
|
|
23
|
+
{ "id": "chart", "type": "chart", "duration": 6.0, "chart_type": "bar",
|
|
24
|
+
"data": { "title": "Revenue", "categories": ["Q1","Q2"], "series": [{"name":"2024","values":[420,580]}] } }
|
|
25
|
+
],
|
|
26
|
+
"transitions": { "default": { "type": "dissolve", "duration": 0.5 } }
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## CLI
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
video-compose render spec.json Render to MP4
|
|
34
|
+
video-compose validate spec.json Validate without rendering
|
|
35
|
+
video-compose preview spec.json intro Render single segment
|
|
36
|
+
video-compose schema Print full JSON Schema
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Optional dependencies
|
|
40
|
+
|
|
41
|
+
| Extra | Enables |
|
|
42
|
+
|---|---|
|
|
43
|
+
| `[mathviz]` | mathviz-fx background generators |
|
|
44
|
+
| `[chart]` | chart-fx animated charts |
|
|
45
|
+
| `[geomap]` | geo-map-fx choropleth maps |
|
|
46
|
+
| `[shape]` | shape-fx particle/geometric effects |
|
|
47
|
+
| `[fractal]` | fractal-fx generative backgrounds |
|
|
48
|
+
| `[audio]` | talk-cast voiceover + audio-arrange mixing |
|
|
49
|
+
| `[data]` | CSV, Excel, SQL, REST API data sources |
|
|
50
|
+
| `[web]` | web-overlay HTML overlays (requires Playwright) |
|
|
51
|
+
| `[all]` | Everything above |
|
|
52
|
+
|
|
53
|
+
## Ecosystem
|
|
54
|
+
|
|
55
|
+
`video-compose` is the composition layer for the Trollfabriken FX suite. It orchestrates:
|
|
56
|
+
`mathviz-fx` · `chart-fx` · `geo-map-fx` · `shape-fx` · `fractal-fx` · `text-fx` · `color-fx` · `cut-fx` · `talk-cast` · `audio-arrange` · `slide-render` · `still-motion` · `web-overlay`
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tvcs": "1.0",
|
|
3
|
+
"meta": {
|
|
4
|
+
"title": "Full FX Demo",
|
|
5
|
+
"description": "Demonstrates all TVCS segment types and overlay options",
|
|
6
|
+
"author": "Trollfabriken"
|
|
7
|
+
},
|
|
8
|
+
"output": {
|
|
9
|
+
"width": 1920,
|
|
10
|
+
"height": 1080,
|
|
11
|
+
"fps": 30,
|
|
12
|
+
"path": "./output/demo_all_fx.mp4"
|
|
13
|
+
},
|
|
14
|
+
"theme": {
|
|
15
|
+
"palette": "neon",
|
|
16
|
+
"background": "#0d0d1a",
|
|
17
|
+
"text_color": "#ffffff"
|
|
18
|
+
},
|
|
19
|
+
"segments": [
|
|
20
|
+
{
|
|
21
|
+
"id": "opener",
|
|
22
|
+
"type": "blank",
|
|
23
|
+
"duration": 2.0,
|
|
24
|
+
"color": "#0d0d1a",
|
|
25
|
+
"overlays": [
|
|
26
|
+
{
|
|
27
|
+
"type": "text",
|
|
28
|
+
"text": "Trollfabriken FX Demo",
|
|
29
|
+
"effect": "fade_in",
|
|
30
|
+
"position": "center",
|
|
31
|
+
"timing": {"start": 0.3, "end": 1.8}
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "mathviz_segment",
|
|
37
|
+
"type": "mathviz",
|
|
38
|
+
"duration": 4.0,
|
|
39
|
+
"effect": "matrix_rain",
|
|
40
|
+
"config": {}
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"id": "chart_inline",
|
|
44
|
+
"type": "chart",
|
|
45
|
+
"duration": 5.0,
|
|
46
|
+
"chart_type": "bar",
|
|
47
|
+
"data": {
|
|
48
|
+
"title": "Monthly Revenue",
|
|
49
|
+
"x_categories": ["Jan", "Feb", "Mar", "Apr"],
|
|
50
|
+
"series": [
|
|
51
|
+
{"name": "Revenue", "values": [120, 145, 138, 162]}
|
|
52
|
+
],
|
|
53
|
+
"y_label": "MSEK"
|
|
54
|
+
},
|
|
55
|
+
"config": {}
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": "shape_segment",
|
|
59
|
+
"type": "shape",
|
|
60
|
+
"duration": 3.0,
|
|
61
|
+
"effect": "constellation",
|
|
62
|
+
"config": {}
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "fractal_segment",
|
|
66
|
+
"type": "fractal",
|
|
67
|
+
"duration": 3.0,
|
|
68
|
+
"effect": "mandelbrot",
|
|
69
|
+
"config": {}
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"id": "still_segment",
|
|
73
|
+
"type": "still",
|
|
74
|
+
"duration": 4.0,
|
|
75
|
+
"source": "./assets/hero.jpg",
|
|
76
|
+
"motion": "ken_burns",
|
|
77
|
+
"motion_config": {}
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": "image_segment",
|
|
81
|
+
"type": "image",
|
|
82
|
+
"duration": 3.0,
|
|
83
|
+
"source": "./assets/logo.png",
|
|
84
|
+
"fit": "contain",
|
|
85
|
+
"motion": "static"
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"id": "video_segment",
|
|
89
|
+
"type": "video",
|
|
90
|
+
"duration": 5.0,
|
|
91
|
+
"source": "./assets/clip.mp4",
|
|
92
|
+
"mute": false,
|
|
93
|
+
"loop": false
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"id": "credits",
|
|
97
|
+
"type": "blank",
|
|
98
|
+
"duration": 2.0,
|
|
99
|
+
"color": "#000000",
|
|
100
|
+
"overlays": [
|
|
101
|
+
{
|
|
102
|
+
"type": "text",
|
|
103
|
+
"text": "Rendered with video-compose",
|
|
104
|
+
"effect": "fade_in",
|
|
105
|
+
"position": "bottom",
|
|
106
|
+
"timing": {"start": 0.5}
|
|
107
|
+
}
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
],
|
|
111
|
+
"transitions": {
|
|
112
|
+
"default": {
|
|
113
|
+
"type": "dissolve_ii",
|
|
114
|
+
"duration": 0.5
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tvcs": "1.0",
|
|
3
|
+
"meta": {
|
|
4
|
+
"title": "Minimal Example",
|
|
5
|
+
"description": "Two blank segments — no FX dependencies required"
|
|
6
|
+
},
|
|
7
|
+
"output": {
|
|
8
|
+
"width": 1280,
|
|
9
|
+
"height": 720,
|
|
10
|
+
"fps": 30,
|
|
11
|
+
"path": "./output/minimal.mp4"
|
|
12
|
+
},
|
|
13
|
+
"segments": [
|
|
14
|
+
{
|
|
15
|
+
"id": "intro",
|
|
16
|
+
"type": "blank",
|
|
17
|
+
"duration": 2.0,
|
|
18
|
+
"color": "#0d0d1a"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "outro",
|
|
22
|
+
"type": "blank",
|
|
23
|
+
"duration": 1.5,
|
|
24
|
+
"color": "#1a0d0d"
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tvcs": "1.0",
|
|
3
|
+
"meta": {
|
|
4
|
+
"title": "Q4 Sales Report",
|
|
5
|
+
"description": "Data-driven sales summary — chart + blank segments",
|
|
6
|
+
"author": "Trollfabriken"
|
|
7
|
+
},
|
|
8
|
+
"output": {
|
|
9
|
+
"width": 1920,
|
|
10
|
+
"height": 1080,
|
|
11
|
+
"fps": 30,
|
|
12
|
+
"path": "./output/sales_report.mp4"
|
|
13
|
+
},
|
|
14
|
+
"data_sources": {
|
|
15
|
+
"sales": {
|
|
16
|
+
"type": "json",
|
|
17
|
+
"path": "./data/sales_q4.json"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"theme": {
|
|
21
|
+
"palette": "corporate",
|
|
22
|
+
"background": "#0a0a1e",
|
|
23
|
+
"font": "default",
|
|
24
|
+
"text_color": "#ffffff"
|
|
25
|
+
},
|
|
26
|
+
"segments": [
|
|
27
|
+
{
|
|
28
|
+
"id": "title_card",
|
|
29
|
+
"type": "blank",
|
|
30
|
+
"duration": 3.0,
|
|
31
|
+
"color": "#0a0a1e",
|
|
32
|
+
"overlays": [
|
|
33
|
+
{
|
|
34
|
+
"type": "text",
|
|
35
|
+
"text": "Q4 2025 Sales Report",
|
|
36
|
+
"effect": "fade_in",
|
|
37
|
+
"position": "center",
|
|
38
|
+
"timing": {"start": 0.2, "end": 2.8}
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"id": "revenue_chart",
|
|
44
|
+
"type": "chart",
|
|
45
|
+
"duration": 5.0,
|
|
46
|
+
"chart_type": "bar",
|
|
47
|
+
"data": "$sources.sales",
|
|
48
|
+
"config": {
|
|
49
|
+
"title": "Revenue by Region",
|
|
50
|
+
"x_field": "region",
|
|
51
|
+
"y_field": "revenue"
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"id": "closing",
|
|
56
|
+
"type": "blank",
|
|
57
|
+
"duration": 2.0,
|
|
58
|
+
"color": "#0a0a1e"
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
"transitions": {
|
|
62
|
+
"default": {
|
|
63
|
+
"type": "dissolve_ii",
|
|
64
|
+
"duration": 0.5
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "video-compose"
|
|
7
|
+
version = "0.3.0"
|
|
8
|
+
description = "JSON-driven video composition engine for the Trollfabriken FX ecosystem"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.11"
|
|
11
|
+
license = { text = "MIT" }
|
|
12
|
+
authors = [{ name = "Trollfabriken", email = "tomasamlov@gmail.com" }]
|
|
13
|
+
keywords = ["video", "composition", "json2video", "ffmpeg", "presentation", "tvcs"]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Development Status :: 3 - Alpha",
|
|
16
|
+
"Intended Audience :: Developers",
|
|
17
|
+
"License :: OSI Approved :: MIT License",
|
|
18
|
+
"Programming Language :: Python :: 3.11",
|
|
19
|
+
"Programming Language :: Python :: 3.12",
|
|
20
|
+
"Programming Language :: Python :: 3.13",
|
|
21
|
+
"Topic :: Multimedia :: Video",
|
|
22
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
# Core dependencies — only stdlib-equivalent; everything fx-related is optional
|
|
26
|
+
dependencies = [
|
|
27
|
+
"numpy>=1.24",
|
|
28
|
+
"pillow>=10.0",
|
|
29
|
+
"click>=8.1",
|
|
30
|
+
"pydantic>=2.0",
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
[project.optional-dependencies]
|
|
34
|
+
# Individual FX packages
|
|
35
|
+
mathviz = ["mathviz-fx"]
|
|
36
|
+
chart = ["chart-fx"]
|
|
37
|
+
geomap = ["geo-map-fx"]
|
|
38
|
+
shape = ["shape-fx"]
|
|
39
|
+
fractal = ["fractal-fx"]
|
|
40
|
+
grade = ["color-fx"]
|
|
41
|
+
cut = ["cut-fx"]
|
|
42
|
+
text = ["text-fx"]
|
|
43
|
+
still = ["still-motion"]
|
|
44
|
+
slide = ["slide-render", "playwright"]
|
|
45
|
+
audio = ["talk-cast", "audio-arrange"]
|
|
46
|
+
web = ["web-overlay", "playwright"]
|
|
47
|
+
|
|
48
|
+
# LLM-powered spec generation and template AI
|
|
49
|
+
llm = ["openai>=1.0"]
|
|
50
|
+
|
|
51
|
+
# Data source adapters
|
|
52
|
+
data = [
|
|
53
|
+
"pandas>=2.0",
|
|
54
|
+
"openpyxl>=3.1",
|
|
55
|
+
"sqlalchemy>=2.0",
|
|
56
|
+
"jmespath>=1.0",
|
|
57
|
+
]
|
|
58
|
+
|
|
59
|
+
# Convenience bundles
|
|
60
|
+
fx = ["video-compose[mathviz,chart,geomap,shape,fractal,grade,cut,text,still]"]
|
|
61
|
+
all = ["video-compose[fx,slide,audio,web,data,llm]"]
|
|
62
|
+
|
|
63
|
+
# Development
|
|
64
|
+
dev = [
|
|
65
|
+
"pytest>=7.0",
|
|
66
|
+
"pytest-cov",
|
|
67
|
+
"ruff",
|
|
68
|
+
"hatch",
|
|
69
|
+
]
|
|
70
|
+
|
|
71
|
+
[project.urls]
|
|
72
|
+
Homepage = "https://github.com/tomastimelock/trollfabriken-video-compose-bootstrap"
|
|
73
|
+
Repository = "https://github.com/tomastimelock/trollfabriken-video-compose-bootstrap"
|
|
74
|
+
Issues = "https://github.com/tomastimelock/trollfabriken-video-compose-bootstrap/issues"
|
|
75
|
+
|
|
76
|
+
[project.scripts]
|
|
77
|
+
video-compose = "video_compose.cli:main"
|
|
78
|
+
vc-thumbnail = "video_compose.tools.thumbnail:main"
|
|
79
|
+
vc-report = "video_compose.tools.report:main"
|
|
80
|
+
|
|
81
|
+
[tool.hatch.build.targets.wheel]
|
|
82
|
+
packages = ["src/video_compose"]
|
|
83
|
+
|
|
84
|
+
[tool.hatch.build.targets.wheel.force-include]
|
|
85
|
+
"src/video_compose/assets/placeholders" = "video_compose/assets/placeholders"
|
|
86
|
+
|
|
87
|
+
[tool.hatch.version]
|
|
88
|
+
path = "src/video_compose/__init__.py"
|
|
89
|
+
|
|
90
|
+
[tool.ruff]
|
|
91
|
+
line-length = 100
|
|
92
|
+
target-version = "py311"
|
|
93
|
+
|
|
94
|
+
[tool.ruff.lint]
|
|
95
|
+
select = ["E", "F", "W", "I"]
|
|
96
|
+
ignore = ["E501"]
|
|
97
|
+
|
|
98
|
+
[tool.pytest.ini_options]
|
|
99
|
+
testpaths = ["tests"]
|