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.
Files changed (263) hide show
  1. video_compose-0.3.0/.gitignore +14 -0
  2. video_compose-0.3.0/PKG-INFO +150 -0
  3. video_compose-0.3.0/PUBLISH.md +58 -0
  4. video_compose-0.3.0/QUALITY_CHECKLIST.md +71 -0
  5. video_compose-0.3.0/README.md +56 -0
  6. video_compose-0.3.0/examples/demo_all_fx.json +117 -0
  7. video_compose-0.3.0/examples/minimal.json +27 -0
  8. video_compose-0.3.0/examples/sales_report.json +67 -0
  9. video_compose-0.3.0/pyproject.toml +99 -0
  10. video_compose-0.3.0/scripts/gen_preview_placeholders.py +122 -0
  11. video_compose-0.3.0/scripts/render_all_templates.py +340 -0
  12. video_compose-0.3.0/src/video_compose/__init__.py +7 -0
  13. video_compose-0.3.0/src/video_compose/_codec.py +65 -0
  14. video_compose-0.3.0/src/video_compose/_fonts.py +51 -0
  15. video_compose-0.3.0/src/video_compose/api.py +112 -0
  16. video_compose-0.3.0/src/video_compose/assembler/__init__.py +4 -0
  17. video_compose-0.3.0/src/video_compose/assembler/assembler.py +203 -0
  18. video_compose-0.3.0/src/video_compose/assembler/concat.py +33 -0
  19. video_compose-0.3.0/src/video_compose/assembler/encode.py +22 -0
  20. video_compose-0.3.0/src/video_compose/assembler/png_export.py +34 -0
  21. video_compose-0.3.0/src/video_compose/assets/placeholders.py +57 -0
  22. video_compose-0.3.0/src/video_compose/audio/__init__.py +2 -0
  23. video_compose-0.3.0/src/video_compose/audio/mixer.py +119 -0
  24. video_compose-0.3.0/src/video_compose/audio/pipeline.py +63 -0
  25. video_compose-0.3.0/src/video_compose/audio/voiceover.py +88 -0
  26. video_compose-0.3.0/src/video_compose/cli.py +451 -0
  27. video_compose-0.3.0/src/video_compose/data/__init__.py +11 -0
  28. video_compose-0.3.0/src/video_compose/data/api_source.py +74 -0
  29. video_compose-0.3.0/src/video_compose/data/csv_source.py +29 -0
  30. video_compose-0.3.0/src/video_compose/data/excel_source.py +51 -0
  31. video_compose-0.3.0/src/video_compose/data/fetcher.py +179 -0
  32. video_compose-0.3.0/src/video_compose/data/json_source.py +39 -0
  33. video_compose-0.3.0/src/video_compose/data/registry.py +91 -0
  34. video_compose-0.3.0/src/video_compose/data/sql_source.py +45 -0
  35. video_compose-0.3.0/src/video_compose/fonts/Inter-Medium.ttf +0 -0
  36. video_compose-0.3.0/src/video_compose/fonts/Inter-Regular.ttf +0 -0
  37. video_compose-0.3.0/src/video_compose/fonts/Inter-SemiBold.ttf +0 -0
  38. video_compose-0.3.0/src/video_compose/fonts/__init__.py +0 -0
  39. video_compose-0.3.0/src/video_compose/grade/__init__.py +2 -0
  40. video_compose-0.3.0/src/video_compose/grade/apply.py +100 -0
  41. video_compose-0.3.0/src/video_compose/llm/__init__.py +19 -0
  42. video_compose-0.3.0/src/video_compose/llm/prompt_builder.py +326 -0
  43. video_compose-0.3.0/src/video_compose/llm/spec_generator.py +234 -0
  44. video_compose-0.3.0/src/video_compose/llm/spec_validator.py +155 -0
  45. video_compose-0.3.0/src/video_compose/llm/template_instantiator.py +180 -0
  46. video_compose-0.3.0/src/video_compose/llm/template_picker.py +178 -0
  47. video_compose-0.3.0/src/video_compose/overlays/__init__.py +2 -0
  48. video_compose-0.3.0/src/video_compose/overlays/bar.py +99 -0
  49. video_compose-0.3.0/src/video_compose/overlays/compositor.py +125 -0
  50. video_compose-0.3.0/src/video_compose/overlays/stars.py +111 -0
  51. video_compose-0.3.0/src/video_compose/overlays/text.py +255 -0
  52. video_compose-0.3.0/src/video_compose/overlays/web.py +47 -0
  53. video_compose-0.3.0/src/video_compose/renderers/__init__.py +5 -0
  54. video_compose-0.3.0/src/video_compose/renderers/base.py +146 -0
  55. video_compose-0.3.0/src/video_compose/renderers/blank.py +188 -0
  56. video_compose-0.3.0/src/video_compose/renderers/chart.py +60 -0
  57. video_compose-0.3.0/src/video_compose/renderers/dispatcher.py +21 -0
  58. video_compose-0.3.0/src/video_compose/renderers/fractal.py +42 -0
  59. video_compose-0.3.0/src/video_compose/renderers/geomap.py +166 -0
  60. video_compose-0.3.0/src/video_compose/renderers/image.py +152 -0
  61. video_compose-0.3.0/src/video_compose/renderers/mathviz.py +172 -0
  62. video_compose-0.3.0/src/video_compose/renderers/registry.py +63 -0
  63. video_compose-0.3.0/src/video_compose/renderers/shape.py +67 -0
  64. video_compose-0.3.0/src/video_compose/renderers/slide.py +113 -0
  65. video_compose-0.3.0/src/video_compose/renderers/split_screen.py +178 -0
  66. video_compose-0.3.0/src/video_compose/renderers/still.py +240 -0
  67. video_compose-0.3.0/src/video_compose/renderers/video.py +52 -0
  68. video_compose-0.3.0/src/video_compose/schema/__init__.py +4 -0
  69. video_compose-0.3.0/src/video_compose/schema/spec.py +554 -0
  70. video_compose-0.3.0/src/video_compose/schema/tvcs_schema.json +2166 -0
  71. video_compose-0.3.0/src/video_compose/schema/validator.py +411 -0
  72. video_compose-0.3.0/src/video_compose/templates/__init__.py +15 -0
  73. video_compose-0.3.0/src/video_compose/templates/bundled/ambient/ambient_pre_show_loop.json +156 -0
  74. video_compose-0.3.0/src/video_compose/templates/bundled/ambient/fractal_title_card.json +138 -0
  75. video_compose-0.3.0/src/video_compose/templates/bundled/ambient/neon_countdown.json +201 -0
  76. video_compose-0.3.0/src/video_compose/templates/bundled/audio/audiogram_podcast.json +162 -0
  77. video_compose-0.3.0/src/video_compose/templates/bundled/brand/company_logo_reveal.json +150 -0
  78. video_compose-0.3.0/src/video_compose/templates/bundled/business/okr_quarterly_review.json +363 -0
  79. video_compose-0.3.0/src/video_compose/templates/bundled/business/pitch_deck_hook.json +245 -0
  80. video_compose-0.3.0/src/video_compose/templates/bundled/business/pitch_deck_hook_light.json +249 -0
  81. video_compose-0.3.0/src/video_compose/templates/bundled/creator/youtube_channel_intro.json +150 -0
  82. video_compose-0.3.0/src/video_compose/templates/bundled/creator/youtube_channel_intro_portrait.json +155 -0
  83. video_compose-0.3.0/src/video_compose/templates/bundled/creator/youtube_end_screen.json +148 -0
  84. video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_candlestick.json +192 -0
  85. video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_europe_map.json +202 -0
  86. video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_radar_performance.json +211 -0
  87. video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_sankey_flow.json +211 -0
  88. video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_story_bar_chart.json +197 -0
  89. video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_story_bar_chart_light.json +201 -0
  90. video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_story_kpi_dashboard.json +325 -0
  91. video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_story_line_chart.json +156 -0
  92. video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_treemap.json +177 -0
  93. video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_waterfall_bridge.json +185 -0
  94. video_compose-0.3.0/src/video_compose/templates/bundled/data_story/data_world_choropleth.json +211 -0
  95. video_compose-0.3.0/src/video_compose/templates/bundled/entertainment/esports_match_overlay.json +192 -0
  96. video_compose-0.3.0/src/video_compose/templates/bundled/entertainment/movie_end_credits.json +248 -0
  97. video_compose-0.3.0/src/video_compose/templates/bundled/entertainment/music_release_card.json +194 -0
  98. video_compose-0.3.0/src/video_compose/templates/bundled/entertainment/podcast_chapter_card.json +152 -0
  99. video_compose-0.3.0/src/video_compose/templates/bundled/event/event_agenda.json +292 -0
  100. video_compose-0.3.0/src/video_compose/templates/bundled/event/event_speaker_card.json +179 -0
  101. video_compose-0.3.0/src/video_compose/templates/bundled/explainer/bullet_point_list.json +189 -0
  102. video_compose-0.3.0/src/video_compose/templates/bundled/explainer/explainer_funnel.json +171 -0
  103. video_compose-0.3.0/src/video_compose/templates/bundled/explainer/explainer_numbered_steps.json +229 -0
  104. video_compose-0.3.0/src/video_compose/templates/bundled/explainer/explainer_pros_cons.json +282 -0
  105. video_compose-0.3.0/src/video_compose/templates/bundled/explainer/explainer_timeline.json +305 -0
  106. video_compose-0.3.0/src/video_compose/templates/bundled/explainer/faq_qa.json +191 -0
  107. video_compose-0.3.0/src/video_compose/templates/bundled/explainer/numbered_step_list.json +228 -0
  108. video_compose-0.3.0/src/video_compose/templates/bundled/explainer/tutorial_steps.json +206 -0
  109. video_compose-0.3.0/src/video_compose/templates/bundled/financial/annual_report_summary.json +318 -0
  110. video_compose-0.3.0/src/video_compose/templates/bundled/financial/earnings_quarterly.json +243 -0
  111. video_compose-0.3.0/src/video_compose/templates/bundled/lower_third/interview_lower_third.json +119 -0
  112. video_compose-0.3.0/src/video_compose/templates/bundled/lower_third/lower_third_cnn.json +99 -0
  113. video_compose-0.3.0/src/video_compose/templates/bundled/lower_third/lower_third_score_bug.json +119 -0
  114. video_compose-0.3.0/src/video_compose/templates/bundled/lower_third/lower_third_scrolling_ticker.json +98 -0
  115. video_compose-0.3.0/src/video_compose/templates/bundled/news/breaking_news_alert.json +169 -0
  116. video_compose-0.3.0/src/video_compose/templates/bundled/people/team_spotlight.json +235 -0
  117. video_compose-0.3.0/src/video_compose/templates/bundled/people/testimonial_review.json +193 -0
  118. video_compose-0.3.0/src/video_compose/templates/bundled/people/testimonial_review_light.json +197 -0
  119. video_compose-0.3.0/src/video_compose/templates/bundled/people/testimonial_review_portrait.json +198 -0
  120. video_compose-0.3.0/src/video_compose/templates/bundled/presentation/presentation_corporate.json +147 -0
  121. video_compose-0.3.0/src/video_compose/templates/bundled/presentation/presentation_corporate_light.json +150 -0
  122. video_compose-0.3.0/src/video_compose/templates/bundled/product/app_store_review.json +241 -0
  123. video_compose-0.3.0/src/video_compose/templates/bundled/product/before_after_comparison.json +205 -0
  124. video_compose-0.3.0/src/video_compose/templates/bundled/product/pricing_card.json +253 -0
  125. video_compose-0.3.0/src/video_compose/templates/bundled/product/product_feature_split.json +199 -0
  126. video_compose-0.3.0/src/video_compose/templates/bundled/product_launch/product_launch_dark.json +237 -0
  127. video_compose-0.3.0/src/video_compose/templates/bundled/product_launch/product_launch_dark_portrait.json +240 -0
  128. video_compose-0.3.0/src/video_compose/templates/bundled/product_launch/product_launch_minimal.json +137 -0
  129. video_compose-0.3.0/src/video_compose/templates/bundled/product_launch/product_launch_minimal_light.json +139 -0
  130. video_compose-0.3.0/src/video_compose/templates/bundled/real_estate/real_estate_listing.json +222 -0
  131. video_compose-0.3.0/src/video_compose/templates/bundled/social/quote_with_photo.json +161 -0
  132. video_compose-0.3.0/src/video_compose/templates/bundled/social/social_announcement.json +124 -0
  133. video_compose-0.3.0/src/video_compose/templates/bundled/social/social_collab_announcement.json +225 -0
  134. video_compose-0.3.0/src/video_compose/templates/bundled/social/social_countdown.json +124 -0
  135. video_compose-0.3.0/src/video_compose/templates/bundled/social/social_milestone_counter.json +183 -0
  136. video_compose-0.3.0/src/video_compose/templates/bundled/social/social_motivational.json +101 -0
  137. video_compose-0.3.0/src/video_compose/templates/bundled/social/social_motivational_portrait.json +105 -0
  138. video_compose-0.3.0/src/video_compose/templates/bundled/social/social_poll_result.json +194 -0
  139. video_compose-0.3.0/src/video_compose/templates/bundled/social/social_proof_numbers.json +218 -0
  140. video_compose-0.3.0/src/video_compose/templates/bundled/social/social_quote_card.json +111 -0
  141. video_compose-0.3.0/src/video_compose/templates/bundled/social/social_quote_card_portrait.json +116 -0
  142. video_compose-0.3.0/src/video_compose/templates/bundled/social/social_tiktok_hook.json +127 -0
  143. video_compose-0.3.0/src/video_compose/templates/bundled/sports/sports_match_result.json +284 -0
  144. video_compose-0.3.0/src/video_compose/templates/bundled/swedish/swedish_election_map.json +193 -0
  145. video_compose-0.3.0/src/video_compose/templates/bundled/swedish/swedish_news_opener.json +191 -0
  146. video_compose-0.3.0/src/video_compose/templates/bundled/swedish/swedish_regional_kpi.json +217 -0
  147. video_compose-0.3.0/src/video_compose/templates/bundled/swedish/swedish_valdistrikt_map.json +216 -0
  148. video_compose-0.3.0/src/video_compose/templates/config.py +112 -0
  149. video_compose-0.3.0/src/video_compose/templates/engine.py +223 -0
  150. video_compose-0.3.0/src/video_compose/templates/previews/full/ambient_pre_show_loop.jpg +0 -0
  151. video_compose-0.3.0/src/video_compose/templates/previews/full/annual_report_summary.jpg +0 -0
  152. video_compose-0.3.0/src/video_compose/templates/previews/full/audiogram_podcast.jpg +0 -0
  153. video_compose-0.3.0/src/video_compose/templates/previews/full/data_candlestick.jpg +0 -0
  154. video_compose-0.3.0/src/video_compose/templates/previews/full/data_europe_map.jpg +0 -0
  155. video_compose-0.3.0/src/video_compose/templates/previews/full/data_radar_performance.jpg +0 -0
  156. video_compose-0.3.0/src/video_compose/templates/previews/full/data_sankey_flow.jpg +0 -0
  157. video_compose-0.3.0/src/video_compose/templates/previews/full/data_story_bar_chart.jpg +0 -0
  158. video_compose-0.3.0/src/video_compose/templates/previews/full/data_story_kpi_dashboard.jpg +0 -0
  159. video_compose-0.3.0/src/video_compose/templates/previews/full/data_story_line_chart.jpg +0 -0
  160. video_compose-0.3.0/src/video_compose/templates/previews/full/data_treemap.jpg +0 -0
  161. video_compose-0.3.0/src/video_compose/templates/previews/full/data_waterfall_bridge.jpg +0 -0
  162. video_compose-0.3.0/src/video_compose/templates/previews/full/data_world_choropleth.jpg +0 -0
  163. video_compose-0.3.0/src/video_compose/templates/previews/full/earnings_quarterly.jpg +0 -0
  164. video_compose-0.3.0/src/video_compose/templates/previews/full/esports_match_overlay.jpg +0 -0
  165. video_compose-0.3.0/src/video_compose/templates/previews/full/event_agenda.jpg +0 -0
  166. video_compose-0.3.0/src/video_compose/templates/previews/full/event_speaker_card.jpg +0 -0
  167. video_compose-0.3.0/src/video_compose/templates/previews/full/explainer_funnel.jpg +0 -0
  168. video_compose-0.3.0/src/video_compose/templates/previews/full/explainer_numbered_steps.jpg +0 -0
  169. video_compose-0.3.0/src/video_compose/templates/previews/full/explainer_pros_cons.jpg +0 -0
  170. video_compose-0.3.0/src/video_compose/templates/previews/full/explainer_timeline.jpg +0 -0
  171. video_compose-0.3.0/src/video_compose/templates/previews/full/fractal_title_card.jpg +0 -0
  172. video_compose-0.3.0/src/video_compose/templates/previews/full/lower_third_cnn.jpg +0 -0
  173. video_compose-0.3.0/src/video_compose/templates/previews/full/lower_third_score_bug.jpg +0 -0
  174. video_compose-0.3.0/src/video_compose/templates/previews/full/lower_third_scrolling_ticker.jpg +0 -0
  175. video_compose-0.3.0/src/video_compose/templates/previews/full/movie_end_credits.jpg +0 -0
  176. video_compose-0.3.0/src/video_compose/templates/previews/full/music_release_card.jpg +0 -0
  177. video_compose-0.3.0/src/video_compose/templates/previews/full/neon_countdown.jpg +0 -0
  178. video_compose-0.3.0/src/video_compose/templates/previews/full/okr_quarterly_review.jpg +0 -0
  179. video_compose-0.3.0/src/video_compose/templates/previews/full/pitch_deck_hook.jpg +0 -0
  180. video_compose-0.3.0/src/video_compose/templates/previews/full/podcast_chapter_card.jpg +0 -0
  181. video_compose-0.3.0/src/video_compose/templates/previews/full/presentation_corporate.jpg +0 -0
  182. video_compose-0.3.0/src/video_compose/templates/previews/full/product_launch_dark.jpg +0 -0
  183. video_compose-0.3.0/src/video_compose/templates/previews/full/product_launch_minimal.jpg +0 -0
  184. video_compose-0.3.0/src/video_compose/templates/previews/full/real_estate_listing.jpg +0 -0
  185. video_compose-0.3.0/src/video_compose/templates/previews/full/social_announcement.jpg +0 -0
  186. video_compose-0.3.0/src/video_compose/templates/previews/full/social_collab_announcement.jpg +0 -0
  187. video_compose-0.3.0/src/video_compose/templates/previews/full/social_countdown.jpg +0 -0
  188. video_compose-0.3.0/src/video_compose/templates/previews/full/social_milestone_counter.jpg +0 -0
  189. video_compose-0.3.0/src/video_compose/templates/previews/full/social_motivational.jpg +0 -0
  190. video_compose-0.3.0/src/video_compose/templates/previews/full/social_poll_result.jpg +0 -0
  191. video_compose-0.3.0/src/video_compose/templates/previews/full/social_quote_card.jpg +0 -0
  192. video_compose-0.3.0/src/video_compose/templates/previews/full/social_tiktok_hook.jpg +0 -0
  193. video_compose-0.3.0/src/video_compose/templates/previews/full/sports_match_result.jpg +0 -0
  194. video_compose-0.3.0/src/video_compose/templates/previews/full/swedish_election_map.jpg +0 -0
  195. video_compose-0.3.0/src/video_compose/templates/previews/full/swedish_news_opener.jpg +0 -0
  196. video_compose-0.3.0/src/video_compose/templates/previews/full/swedish_regional_kpi.jpg +0 -0
  197. video_compose-0.3.0/src/video_compose/templates/previews/full/swedish_valdistrikt_map.jpg +0 -0
  198. video_compose-0.3.0/src/video_compose/templates/previews/full/team_spotlight.jpg +0 -0
  199. video_compose-0.3.0/src/video_compose/templates/previews/full/testimonial_review.jpg +0 -0
  200. video_compose-0.3.0/src/video_compose/templates/previews/full/youtube_channel_intro.jpg +0 -0
  201. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/ambient_pre_show_loop.jpg +0 -0
  202. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/annual_report_summary.jpg +0 -0
  203. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/audiogram_podcast.jpg +0 -0
  204. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/data_candlestick.jpg +0 -0
  205. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/data_europe_map.jpg +0 -0
  206. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/data_radar_performance.jpg +0 -0
  207. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/data_sankey_flow.jpg +0 -0
  208. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/data_story_bar_chart.jpg +0 -0
  209. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/data_story_kpi_dashboard.jpg +0 -0
  210. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/data_story_line_chart.jpg +0 -0
  211. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/data_treemap.jpg +0 -0
  212. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/data_waterfall_bridge.jpg +0 -0
  213. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/data_world_choropleth.jpg +0 -0
  214. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/earnings_quarterly.jpg +0 -0
  215. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/esports_match_overlay.jpg +0 -0
  216. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/event_agenda.jpg +0 -0
  217. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/event_speaker_card.jpg +0 -0
  218. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/explainer_funnel.jpg +0 -0
  219. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/explainer_numbered_steps.jpg +0 -0
  220. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/explainer_pros_cons.jpg +0 -0
  221. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/explainer_timeline.jpg +0 -0
  222. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/fractal_title_card.jpg +0 -0
  223. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/lower_third_cnn.jpg +0 -0
  224. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/lower_third_score_bug.jpg +0 -0
  225. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/lower_third_scrolling_ticker.jpg +0 -0
  226. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/movie_end_credits.jpg +0 -0
  227. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/music_release_card.jpg +0 -0
  228. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/neon_countdown.jpg +0 -0
  229. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/okr_quarterly_review.jpg +0 -0
  230. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/pitch_deck_hook.jpg +0 -0
  231. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/podcast_chapter_card.jpg +0 -0
  232. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/presentation_corporate.jpg +0 -0
  233. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/product_launch_dark.jpg +0 -0
  234. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/product_launch_minimal.jpg +0 -0
  235. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/real_estate_listing.jpg +0 -0
  236. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/social_announcement.jpg +0 -0
  237. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/social_collab_announcement.jpg +0 -0
  238. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/social_countdown.jpg +0 -0
  239. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/social_milestone_counter.jpg +0 -0
  240. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/social_motivational.jpg +0 -0
  241. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/social_poll_result.jpg +0 -0
  242. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/social_quote_card.jpg +0 -0
  243. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/social_tiktok_hook.jpg +0 -0
  244. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/sports_match_result.jpg +0 -0
  245. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/swedish_election_map.jpg +0 -0
  246. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/swedish_news_opener.jpg +0 -0
  247. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/swedish_regional_kpi.jpg +0 -0
  248. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/swedish_valdistrikt_map.jpg +0 -0
  249. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/team_spotlight.jpg +0 -0
  250. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/testimonial_review.jpg +0 -0
  251. video_compose-0.3.0/src/video_compose/templates/previews/thumbnails/youtube_channel_intro.jpg +0 -0
  252. video_compose-0.3.0/src/video_compose/templates/registry.py +241 -0
  253. video_compose-0.3.0/src/video_compose/tools/__init__.py +0 -0
  254. video_compose-0.3.0/src/video_compose/tools/report.py +167 -0
  255. video_compose-0.3.0/src/video_compose/tools/thumbnail.py +130 -0
  256. video_compose-0.3.0/src/video_compose/transition/__init__.py +2 -0
  257. video_compose-0.3.0/src/video_compose/transition/apply.py +63 -0
  258. video_compose-0.3.0/tests/test_data_adapters.py +227 -0
  259. video_compose-0.3.0/tests/test_data_resolver.py +300 -0
  260. video_compose-0.3.0/tests/test_prompt_builder.py +118 -0
  261. video_compose-0.3.0/tests/test_template_engine.py +228 -0
  262. video_compose-0.3.0/tests/test_template_registry.py +187 -0
  263. video_compose-0.3.0/tests/test_validator.py +275 -0
@@ -0,0 +1,14 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
+ dist/
5
+ build/
6
+ .venv/
7
+ *.mp4
8
+ *.png
9
+ *.wav
10
+ *.mp3
11
+ examples/data/*.csv
12
+ examples/data/*.xlsx
13
+ examples/data/*.db
14
+ .env
@@ -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"]