stillmade-sdk 0.1.41 → 0.1.43

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 (285) hide show
  1. package/.stillmade/sdk-baseline.json +19 -21
  2. package/AGENTS.md +17 -12
  3. package/FRAME_VIEWS.md +113 -0
  4. package/INTERFACE_DESIGN.md +67 -22
  5. package/MOBILE_UI.md +4 -2
  6. package/MODULES.md +152 -6
  7. package/PASTE_TO_LLM.md +42 -32
  8. package/README.md +3 -2
  9. package/SDK.md +1028 -563
  10. package/UI_AESTHETIC.md +30 -3
  11. package/blocks/generate/package.js +1 -0
  12. package/blocks/generate/versions/1.0.0/package.js +463 -0
  13. package/docs/build/audio-to-editor.md +36 -0
  14. package/docs/build/block-builder-contract.md +150 -0
  15. package/docs/build/comfyui.md +227 -0
  16. package/docs/build/concepts.md +40 -0
  17. package/docs/build/context.md +159 -0
  18. package/docs/build/cookbook.md +57 -0
  19. package/docs/build/custom-interface.md +617 -0
  20. package/docs/build/data-types.md +83 -0
  21. package/docs/build/frame-views.md +259 -0
  22. package/docs/build/generate-media.md +59 -0
  23. package/docs/build/github-applications.md +314 -0
  24. package/docs/build/hosted-images.md +214 -0
  25. package/docs/build/hosted-music.md +39 -0
  26. package/docs/build/hosted-speech.md +157 -0
  27. package/docs/build/hosted-text.md +246 -0
  28. package/docs/build/image-description.md +49 -0
  29. package/docs/build/interface-design.md +343 -0
  30. package/docs/build/javascript.md +63 -0
  31. package/docs/build/local-preview.md +61 -0
  32. package/docs/build/media-analysis.md +27 -0
  33. package/docs/build/media.md +400 -0
  34. package/docs/build/mobile-ui.md +106 -0
  35. package/docs/build/modules.md +487 -0
  36. package/docs/build/original-blocks.md +70 -0
  37. package/docs/build/outside-apis.md +128 -0
  38. package/docs/build/production-context-templates.md +12 -0
  39. package/docs/build/project-storage.md +94 -0
  40. package/docs/build/quickstart.md +48 -0
  41. package/docs/build/recipes.md +103 -0
  42. package/docs/build/script-handoff.md +45 -0
  43. package/docs/build/script-writer.md +34 -0
  44. package/docs/build/state.md +223 -0
  45. package/docs/build/testing.md +112 -0
  46. package/docs/build/timeline-edits.md +116 -0
  47. package/docs/build/timeline-proposals.md +76 -0
  48. package/docs/build/transcription.md +59 -0
  49. package/docs/build/triggers.md +59 -0
  50. package/docs/build/tutorial.md +52 -0
  51. package/docs/build/typescript.md +34 -0
  52. package/docs/build/video-generation.md +61 -0
  53. package/docs/build/web-reading.md +37 -0
  54. package/docs/build/with-your-ai.md +27 -0
  55. package/docs/changelog.md +9 -0
  56. package/docs/creators.md +21 -0
  57. package/docs/distribute/discovery.md +43 -0
  58. package/docs/distribute/imports.md +58 -0
  59. package/docs/distribute/publishing.md +29 -0
  60. package/docs/distribute/sdk-versions.md +36 -0
  61. package/docs/distribute/selling.md +14 -0
  62. package/docs/distribute/teams.md +60 -0
  63. package/docs/distribute/versioning.md +28 -0
  64. package/docs/examples.md +23 -0
  65. package/docs/gallery.md +26 -0
  66. package/docs/index.md +50 -0
  67. package/docs/native-mcp.md +307 -0
  68. package/docs/project-types/automation.md +43 -0
  69. package/docs/project-types/batches.md +50 -0
  70. package/docs/project-types/build.md +42 -0
  71. package/docs/project-types/completion.md +15 -0
  72. package/docs/project-types/conditions.md +21 -0
  73. package/docs/project-types/hosted-review.md +115 -0
  74. package/docs/project-types/onboarding.md +75 -0
  75. package/docs/project-types/running.md +309 -0
  76. package/docs/project-types/testing.md +72 -0
  77. package/docs/reference/application-artifacts.md +87 -0
  78. package/docs/reference/authoring-guide.md +134 -0
  79. package/docs/reference/browser-applications.md +267 -0
  80. package/docs/reference/capabilities.md +45 -0
  81. package/docs/reference/cli.md +71 -0
  82. package/docs/reference/connection-api.md +59 -0
  83. package/docs/reference/cooperative-jobs.md +13 -0
  84. package/docs/reference/desktop-capabilities.md +172 -0
  85. package/docs/reference/desktop-execution.md +77 -0
  86. package/docs/reference/errors.md +233 -0
  87. package/docs/reference/execution.md +800 -0
  88. package/docs/reference/first-party-blocks.md +40 -0
  89. package/docs/reference/generation-models.md +59 -0
  90. package/docs/reference/limits.md +306 -0
  91. package/docs/reference/manifest-kinds-controls.md +36 -0
  92. package/docs/reference/manifest.md +181 -0
  93. package/docs/reference/operations.md +36 -0
  94. package/docs/reference/package-jobs.md +35 -0
  95. package/docs/reference/parity.md +55 -0
  96. package/docs/reference/permissions.md +86 -0
  97. package/docs/reference/ports.md +26 -0
  98. package/docs/reference/types.md +268 -0
  99. package/docs/reference/universal-resolver.md +303 -0
  100. package/docs/reference/view-bridge.md +60 -0
  101. package/docs/reference/view-rules.md +15 -0
  102. package/docs/reference/workspace-sync.md +25 -0
  103. package/docs/sdk.md +34 -0
  104. package/docs/tools/block-remix.md +211 -0
  105. package/docs/tools/llm.md +2213 -0
  106. package/docs/tools/repository-adaptation.md +613 -0
  107. package/examples/check-clip.stillmade.json +8 -1
  108. package/examples/clean-text.stillmade.json +4 -0
  109. package/examples/custom-interface.stillmade.json +4 -0
  110. package/examples/describe-image.stillmade.json +4 -0
  111. package/examples/foley-cue.stillmade.json +4 -0
  112. package/examples/generate-image.stillmade.json +4 -0
  113. package/examples/generate-video.stillmade.json +10 -2
  114. package/examples/module-word-stats/stillmade.block.json +4 -0
  115. package/examples/narrate-script.stillmade.json +4 -0
  116. package/examples/numbered-takes.stillmade.json +4 -0
  117. package/examples/research-topic.stillmade.json +9 -1
  118. package/examples/score-a-scene.stillmade.json +4 -0
  119. package/examples/script-draft.stillmade.json +4 -0
  120. package/examples/summarize-page.stillmade.json +4 -0
  121. package/examples/text-workflow.stillmade.json +7 -32
  122. package/examples/thicken-lines.stillmade.json +4 -0
  123. package/examples/timeline-polish.stillmade.json +15 -3
  124. package/examples/transcribe-audio.stillmade.json +15 -3
  125. package/examples/word-count.stillmade.json +4 -0
  126. package/package.json +1 -1
  127. package/packages/block-cli/cli.js +13 -6
  128. package/packages/block-cli/dev-host/assets/host.js +81 -38
  129. package/packages/block-cli/dev-host/assets/index.css +1 -1
  130. package/packages/block-cli/format.js +1 -1
  131. package/packages/block-cli/ready-gate.js +4 -0
  132. package/packages/block-cli/templates.js +37 -19
  133. package/packages/block-cli/type-packages.js +119 -0
  134. package/packages/block-platform/block-readiness.js +8 -1
  135. package/packages/block-platform/canvas.js +2 -1
  136. package/packages/block-platform/catalog.js +27 -48
  137. package/packages/block-platform/native-host-inventory.js +0 -226
  138. package/packages/block-platform/plain-descriptions.js +1 -25
  139. package/packages/block-platform/project-type-starters.js +13 -53
  140. package/packages/block-platform/script-handoff.js +2 -4
  141. package/packages/block-platform/type-workspace.js +2 -0
  142. package/packages/block-sdk/appearance.js +3 -1
  143. package/packages/block-sdk/audio-generation-example.js +2 -2
  144. package/packages/block-sdk/block-tier.js +1 -1
  145. package/packages/block-sdk/builder-contract.js +13 -11
  146. package/packages/block-sdk/capabilities.js +1 -1
  147. package/packages/block-sdk/capability-example.js +1 -1
  148. package/packages/block-sdk/contracts.js +6 -2
  149. package/packages/block-sdk/examples.js +3 -3
  150. package/packages/block-sdk/first-party-identities.js +1 -84
  151. package/packages/block-sdk/first-party-packages.js +3 -85
  152. package/packages/block-sdk/generation-catalog.js +15 -3
  153. package/packages/block-sdk/image-description-example.js +1 -1
  154. package/packages/block-sdk/image-generation-example.js +1 -1
  155. package/packages/block-sdk/index.d.ts +2 -1
  156. package/packages/block-sdk/media-analysis-example.js +2 -2
  157. package/packages/block-sdk/mock-host.js +7 -1
  158. package/packages/block-sdk/module-example.js +1 -1
  159. package/packages/block-sdk/module-host-calls.js +35 -10
  160. package/packages/block-sdk/module-hosted.js +15 -2
  161. package/packages/block-sdk/module-media-access.js +71 -0
  162. package/packages/block-sdk/module-node.js +1 -1
  163. package/packages/block-sdk/portable-media-actions.js +1 -1
  164. package/packages/block-sdk/runtime.js +1 -1
  165. package/packages/block-sdk/speech-example.js +1 -1
  166. package/packages/block-sdk/state-example.js +1 -1
  167. package/packages/block-sdk/timeline-proposal-example.js +1 -1
  168. package/packages/block-sdk/transcription-example.js +1 -1
  169. package/packages/block-sdk/trigger-examples.js +2 -2
  170. package/packages/block-sdk/video-generation-example.js +1 -1
  171. package/packages/block-sdk/view-bridge.js +4 -1
  172. package/packages/block-sdk/view-design.js +44 -15
  173. package/packages/block-sdk/web-example.js +2 -2
  174. package/packages/design-system/block-kit.css +53 -12
  175. package/packages/design-system/block-kit.html +3 -2
  176. package/blocks/mcp-motion-planner/versions/1.1.0/package.js +0 -97
  177. package/blocks/motion-designer/versions/1.0.1/package.js +0 -173318
  178. package/blocks/motion-designer/versions/1.0.2/package.js +0 -173318
  179. package/blocks/motion-frame-review/versions/1.1.1/package.js +0 -465
  180. package/blocks/motion-frame-review/versions/1.1.2/package.snapshot.js +0 -572
  181. package/blocks/narration/package.js +0 -1
  182. package/blocks/narration/versions/1.0.0/package.js +0 -221
  183. package/blocks/narration/versions/1.0.1/package.js +0 -221
  184. package/blocks/native/sm.animated-scene/versions/2.0.0/package.js +0 -475
  185. package/blocks/native/sm.animated-scene/versions/2.1.0/package.js +0 -498
  186. package/blocks/native/sm.animated-scene/versions/2.2.0/package.js +0 -524
  187. package/blocks/native/sm.animated-scene/versions/2.3.0/package.js +0 -618
  188. package/blocks/native/sm.animated-scene/versions/2.3.1/package.js +0 -618
  189. package/blocks/native/sm.animated-scene/versions/2.3.2/package.js +0 -723
  190. package/blocks/native/sm.animated-scene/versions/2.3.3/package.js +0 -723
  191. package/blocks/native/sm.animated-scene/versions/2.3.4/package.js +0 -676
  192. package/blocks/native/sm.animated-scene/versions/2.3.5/package.js +0 -693
  193. package/blocks/native/sm.animated-scene/versions/2.3.6/package.js +0 -700
  194. package/blocks/native/sm.animated-scene/versions/2.3.7/package.js +0 -747
  195. package/blocks/native/sm.animated-scene/versions/2.3.8/package.js +0 -769
  196. package/blocks/native/sm.animated-scene/versions/2.3.9/package.js +0 -769
  197. package/blocks/native/sm.animated-scene-assistant/versions/1.0.0/package.js +0 -183
  198. package/blocks/native/sm.blueprint/versions/2.0.0/package.js +0 -358
  199. package/blocks/native/sm.blueprint/versions/2.1.0/package.js +0 -358
  200. package/blocks/native/sm.blueprint/versions/2.1.1/package.js +0 -358
  201. package/blocks/native/sm.blueprint/versions/2.1.2/package.js +0 -358
  202. package/blocks/native/sm.blueprint/versions/2.1.3/package.js +0 -381
  203. package/blocks/native/sm.blueprint/versions/2.1.4/package.js +0 -381
  204. package/blocks/native/sm.blueprint/versions/2.1.5/package.js +0 -339
  205. package/blocks/native/sm.blueprint/versions/2.1.6/package.js +0 -356
  206. package/blocks/native/sm.blueprint/versions/2.1.7/package.js +0 -363
  207. package/blocks/native/sm.blueprint/versions/2.1.8/package.js +0 -410
  208. package/blocks/native/sm.blueprint/versions/2.1.9/package.js +0 -422
  209. package/blocks/native/sm.blueprint-assistant/versions/1.0.0/package.js +0 -172
  210. package/blocks/native/sm.chat/versions/2.0.0/package.js +0 -144
  211. package/blocks/native/sm.chat/versions/2.0.1/package.js +0 -97
  212. package/blocks/native/sm.chat/versions/2.0.2/package.js +0 -100
  213. package/blocks/native/sm.chat/versions/2.0.3/package.js +0 -100
  214. package/blocks/native/sm.continue-if/versions/1.0.0/package.js +0 -168
  215. package/blocks/native/sm.describe-media/versions/2.0.0/package.js +0 -153
  216. package/blocks/native/sm.describe-media/versions/2.0.1/package.js +0 -156
  217. package/blocks/native/sm.describe-media/versions/2.1.0/package.js +0 -140
  218. package/blocks/native/sm.image-editor/versions/2.0.0/package.js +0 -183
  219. package/blocks/native/sm.image-editor/versions/2.0.1/package.js +0 -190
  220. package/blocks/native/sm.new-items/versions/1.0.0/package.js +0 -191
  221. package/blocks/native/sm.pick-photos/versions/1.0.0/package.js +0 -334
  222. package/blocks/native/sm.quality-audit/versions/1.0.0/package.js +0 -192
  223. package/blocks/native/sm.quality-audit/versions/1.0.1/package.js +0 -192
  224. package/blocks/native/sm.quality-audit/versions/1.0.2/package.js +0 -195
  225. package/blocks/native/sm.research/versions/2.0.0/package.js +0 -175
  226. package/blocks/native/sm.research/versions/2.0.1/package.js +0 -184
  227. package/blocks/native/sm.research/versions/2.0.2/package.js +0 -187
  228. package/blocks/native/sm.script/versions/2.0.0/package.js +0 -144
  229. package/blocks/native/sm.script/versions/2.1.0/package.js +0 -144
  230. package/blocks/native/sm.script/versions/2.1.1/package.js +0 -144
  231. package/blocks/native/sm.script/versions/2.1.2/package.js +0 -105
  232. package/blocks/native/sm.script/versions/2.1.3/package.js +0 -152
  233. package/blocks/native/sm.script/versions/2.1.4/package.js +0 -156
  234. package/blocks/native/sm.script/versions/2.1.5/package.js +0 -156
  235. package/blocks/native/sm.shot-plan/versions/2.0.0/package.js +0 -301
  236. package/blocks/native/sm.shot-plan/versions/2.1.0/package.js +0 -528
  237. package/blocks/native/sm.shot-plan/versions/2.1.1/package.js +0 -528
  238. package/blocks/native/sm.shot-plan/versions/2.1.2/package.js +0 -528
  239. package/blocks/native/sm.shot-plan/versions/2.1.3/package.js +0 -536
  240. package/blocks/native/sm.shot-plan/versions/2.2.0/package.js +0 -800
  241. package/blocks/native/sm.shot-plan/versions/2.2.1/package.js +0 -920
  242. package/blocks/native/sm.shot-plan-assistant/versions/1.0.0/package.js +0 -173
  243. package/blocks/native/sm.stock-search/versions/2.0.0/package.js +0 -174
  244. package/blocks/native/sm.thumbnail/versions/2.0.0/package.js +0 -137
  245. package/blocks/native/sm.thumbnail/versions/2.0.1/package.js +0 -140
  246. package/blocks/native/sm.transcribe/versions/2.0.0/package.js +0 -163
  247. package/blocks/native/sm.transcribe/versions/2.0.1/package.js +0 -168
  248. package/blocks/native/sm.whiteboard-assistant/versions/1.0.0/package.js +0 -175
  249. package/blocks/native/sm.youtube/versions/2.0.0/package.js +0 -217
  250. package/blocks/occasion-story/package.js +0 -1
  251. package/blocks/occasion-story/versions/1.0.0/package.js +0 -1658
  252. package/blocks/occasion-story/versions/1.0.1/package.js +0 -1699
  253. package/blocks/occasion-story/versions/1.0.2/package.js +0 -1682
  254. package/blocks/photo-reel-composer/versions/1.0.0/package.js +0 -3043
  255. package/blocks/photo-reel-composer/versions/1.0.1/package.js +0 -3026
  256. package/blocks/photo-reel-composer/versions/1.0.2/package.js +0 -4149
  257. package/blocks/product-ad-variants/versions/1.0.0/package.js +0 -2911
  258. package/blocks/product-launch-director/versions/1.0.0/package.js +0 -103
  259. package/blocks/release-visuals/package.js +0 -1
  260. package/blocks/release-visuals/versions/1.0.0/package.js +0 -1492
  261. package/blocks/release-visuals/versions/1.0.1/package.js +0 -1517
  262. package/blocks/release-visuals/versions/1.0.2/package.js +0 -1500
  263. package/blocks/screen-recorder/package.js +0 -1
  264. package/blocks/screen-recorder/versions/1.0.0/package.js +0 -223
  265. package/blocks/screen-recorder/versions/1.0.1/package.js +0 -223
  266. package/blocks/short-form-finish/package.js +0 -1
  267. package/blocks/short-form-finish/versions/1.0.0/package.js +0 -1043
  268. package/blocks/short-form-finish/versions/1.0.1/package.js +0 -1043
  269. package/blocks/short-form-finish/versions/1.0.2/package.js +0 -1043
  270. package/blocks/short-form-finish/versions/1.0.3/package.js +0 -1026
  271. package/examples/saas-product-launch-reviewed-source.stillmade.json +0 -383
  272. package/examples/saas-product-launch.stillmade.json +0 -304
  273. package/packages/block-platform/dealer-inventory-video-project-type.js +0 -38
  274. package/packages/block-platform/first-revenue-project-types.js +0 -46
  275. package/packages/block-platform/fixture-starters.js +0 -13
  276. package/packages/block-platform/launch-project-source.js +0 -10
  277. package/packages/block-platform/launch-project.js +0 -30
  278. package/packages/block-platform/motion-project-types.js +0 -55
  279. package/packages/block-platform/motion-starters.js +0 -14
  280. package/packages/block-platform/product-ad-variants-project-type.js +0 -30
  281. package/packages/block-platform/product-launch-updated.js +0 -90
  282. package/packages/block-platform/revenue-review-project-types.js +0 -36
  283. package/packages/block-platform/revenue-review-starters.js +0 -13
  284. package/packages/block-platform/script-writer.js +0 -29
  285. package/packages/block-platform/website-source-block.js +0 -14
@@ -1,1500 +0,0 @@
1
- // Generated from independently owned versioned source.
2
- export default {
3
- "manifest": {
4
- "schemaVersion": 1,
5
- "sdkVersion": "0.1.0",
6
- "id": "stillmade.release-visuals",
7
- "version": "1.0.2",
8
- "name": "Release Visuals",
9
- "description": "Build an editable social release teaser or timed lyric excerpt from original cover art and a supplied recording.",
10
- "kind": "task",
11
- "runtime": "javascript",
12
- "entry": "src/run.js",
13
- "license": "MIT",
14
- "inputs": {
15
- "assets": {
16
- "type": "asset[]",
17
- "default": [],
18
- "description": "One cover image and one audio recording.",
19
- "primary": true,
20
- "required": true,
21
- "semantic": "legacy.asset-list.assets",
22
- "sources": [
23
- "upstream",
24
- "user"
25
- ]
26
- },
27
- "purpose": {
28
- "type": "text",
29
- "default": "release-teaser",
30
- "description": "Release teaser or lyric excerpt.",
31
- "semantic": "stillmade.release_visuals.purpose",
32
- "sources": [
33
- "user",
34
- "default"
35
- ],
36
- "required": false
37
- },
38
- "title": {
39
- "type": "text",
40
- "default": "",
41
- "description": "Exact release title, up to 56 characters.",
42
- "required": true,
43
- "semantic": "stillmade.release_visuals.title",
44
- "sources": [
45
- "user",
46
- "default"
47
- ]
48
- },
49
- "artist": {
50
- "type": "text",
51
- "default": "",
52
- "description": "Exact artist name, up to 56 characters.",
53
- "required": true,
54
- "semantic": "stillmade.release_visuals.artist",
55
- "sources": [
56
- "user",
57
- "default"
58
- ]
59
- },
60
- "cta": {
61
- "type": "text",
62
- "default": "",
63
- "description": "Approved release message or destination. Teasers only; lyrics occupy this space.",
64
- "semantic": "stillmade.release_visuals.cta",
65
- "sources": [
66
- "user",
67
- "default"
68
- ],
69
- "required": false
70
- },
71
- "duration": {
72
- "type": "number",
73
- "default": 20,
74
- "description": "Excerpt duration, 8–60 seconds.",
75
- "min": 8,
76
- "max": 60,
77
- "semantic": "stillmade.release_visuals.duration",
78
- "sources": [
79
- "user",
80
- "default"
81
- ],
82
- "required": false
83
- },
84
- "songVolume": {
85
- "type": "number",
86
- "default": 100,
87
- "description": "Song volume, 1–100. Lower for additional headroom; this is not loudness normalization.",
88
- "min": 1,
89
- "max": 100,
90
- "semantic": "stillmade.release_visuals.songvolume",
91
- "sources": [
92
- "user",
93
- "default"
94
- ],
95
- "required": false
96
- },
97
- "offset": {
98
- "type": "number",
99
- "default": 0,
100
- "description": "Start time within the original song, in seconds.",
101
- "min": 0,
102
- "max": 7200,
103
- "semantic": "stillmade.release_visuals.offset",
104
- "sources": [
105
- "user",
106
- "default"
107
- ],
108
- "required": false
109
- },
110
- "lyrics": {
111
- "type": "text",
112
- "default": "",
113
- "description": "Reviewed lyric lines relative to this excerpt: 0-3.5 | exact words. One line per phrase; no automatic alignment.",
114
- "semantic": "stillmade.release_visuals.lyrics",
115
- "sources": [
116
- "user",
117
- "default"
118
- ],
119
- "required": false
120
- },
121
- "aspect": {
122
- "type": "text",
123
- "default": "9:16",
124
- "description": "Output frame shape.",
125
- "semantic": "stillmade.release_visuals.aspect",
126
- "sources": [
127
- "user",
128
- "default"
129
- ],
130
- "required": false
131
- },
132
- "disclosure": {
133
- "type": "text",
134
- "default": "",
135
- "description": "Optional source or demonstration disclosure.",
136
- "semantic": "stillmade.release_visuals.disclosure",
137
- "sources": [
138
- "user",
139
- "default"
140
- ],
141
- "required": false
142
- }
143
- },
144
- "outputs": {
145
- "timeline": {
146
- "type": "timeline",
147
- "primary": true,
148
- "semantic": "legacy.timeline.updatededitor",
149
- "description": "Complete editable timeline using original source media."
150
- },
151
- "review": {
152
- "type": "json",
153
- "semantic": "stillmade.release_visuals.review",
154
- "description": "Production scope and remaining human review.",
155
- "schema": {
156
- "schemaVersion": "integer",
157
- "state": "string",
158
- "humanApproved": "boolean",
159
- "purpose": "string",
160
- "durationSec": "number",
161
- "sourceOffset": "number",
162
- "lyricCount": "integer",
163
- "providerCalls": "integer",
164
- "warnings": "string[]"
165
- }
166
- }
167
- },
168
- "permissions": {
169
- "project": [
170
- "asset.read"
171
- ],
172
- "network": [],
173
- "filesystem": [],
174
- "secrets": []
175
- },
176
- "ui": [
177
- {
178
- "port": "songVolume",
179
- "control": "slider",
180
- "min": 1,
181
- "max": 100,
182
- "step": 1
183
- },
184
- {
185
- "port": "purpose",
186
- "control": "select",
187
- "options": [
188
- "release-teaser",
189
- "lyric-excerpt"
190
- ]
191
- },
192
- {
193
- "port": "duration",
194
- "control": "slider",
195
- "min": 8,
196
- "max": 60,
197
- "step": 1
198
- },
199
- {
200
- "port": "aspect",
201
- "control": "select",
202
- "options": [
203
- "9:16",
204
- "16:9",
205
- "1:1"
206
- ]
207
- }
208
- ],
209
- "platforms": {
210
- "phone": {
211
- "supported": true
212
- },
213
- "browser": {
214
- "supported": true
215
- },
216
- "desktop": {
217
- "supported": true
218
- }
219
- },
220
- "provenance": {
221
- "notice": "Original source (authorship declared by the packager)\nLicense: MIT\nChanges: Original implementation declared by the packager; no reused repository or dependency code.\nFiles: LICENSE, src/run.js\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and \nassociated documentation files (the \"Software\"), to deal in the Software without restriction, including \nwithout limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell \ncopies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the \nfollowing conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial \nportions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT \nLIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO \nEVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER \nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE \nUSE OR OTHER DEALINGS IN THE SOFTWARE.\n",
222
- "portableSources": [
223
- {
224
- "kind": "original",
225
- "license": "MIT",
226
- "paths": [
227
- "LICENSE",
228
- "src/run.js"
229
- ],
230
- "evidence": [
231
- "upstream/0/LICENSE",
232
- "upstream/0/src/run.js"
233
- ],
234
- "changes": "Original implementation declared by the packager; no reused repository or dependency code."
235
- }
236
- ]
237
- },
238
- "semantics": [
239
- {
240
- "name": "stillmade.release_visuals.purpose",
241
- "description": "Release teaser or lyric excerpt.",
242
- "parents": []
243
- },
244
- {
245
- "name": "stillmade.release_visuals.title",
246
- "description": "Exact release title, up to 56 characters.",
247
- "parents": []
248
- },
249
- {
250
- "name": "stillmade.release_visuals.artist",
251
- "description": "Exact artist name, up to 56 characters.",
252
- "parents": []
253
- },
254
- {
255
- "name": "stillmade.release_visuals.cta",
256
- "description": "Approved release message or destination. Teasers only; lyrics occupy this space.",
257
- "parents": []
258
- },
259
- {
260
- "name": "stillmade.release_visuals.duration",
261
- "description": "Excerpt duration, 8–60 seconds.",
262
- "parents": []
263
- },
264
- {
265
- "name": "stillmade.release_visuals.songvolume",
266
- "description": "Song volume, 1–100. Lower for additional headroom; this is not loudness normalization.",
267
- "parents": []
268
- },
269
- {
270
- "name": "stillmade.release_visuals.offset",
271
- "description": "Start time within the original song, in seconds.",
272
- "parents": []
273
- },
274
- {
275
- "name": "stillmade.release_visuals.lyrics",
276
- "description": "Reviewed lyric lines relative to this excerpt: 0-3.5 | exact words. One line per phrase; no automatic alignment.",
277
- "parents": []
278
- },
279
- {
280
- "name": "stillmade.release_visuals.aspect",
281
- "description": "Output frame shape.",
282
- "parents": []
283
- },
284
- {
285
- "name": "stillmade.release_visuals.disclosure",
286
- "description": "Optional source or demonstration disclosure.",
287
- "parents": []
288
- },
289
- {
290
- "name": "stillmade.release_visuals.review",
291
- "description": "Production scope and remaining human review.",
292
- "parents": []
293
- }
294
- ]
295
- },
296
- "code": "// Original release-art and lyric-excerpt composition. No inference or I/O.\nconst copy=x=>JSON.parse(JSON.stringify(x)),check=(ok,message)=>{if(!ok)throw Error(message);};\nconst short=(v,label,n=80)=>{check(typeof v==='string'&&v.length<=n&&!/[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]/.test(v),label+' must be short plain text.');return v.trim();};\n\nconst songVolume=input.songVolume??100;check(Number.isFinite(songVolume)&&songVolume>=1&&songVolume<=100,'Song volume must be 1–100.');\nconst assets=input.assets;check(Array.isArray(assets)&&assets.length===2,'Choose exactly one cover image and one audio recording.');\nconst cover=assets.find(a=>a.kind==='image'),song=assets.find(a=>a.kind==='audio');check(cover&&song,'Supply one original cover image and one audio recording.');\nfor(const a of assets)check(typeof a.assetId==='string'&&a.assetId&&typeof a.versionId==='string'&&a.versionId&&typeof a.url==='string'&&/^(https:\\/\\/|http:\\/\\/(localhost|127\\.0\\.0\\.1)(:\\d+)?\\/|\\/api\\/media\\/|sm-media:|blob:)/.test(a.url)&&!/^https?:\\/\\/[^/?#]*@/.test(a.url),'Use exact saved media references.');\ncheck(Number.isFinite(cover.width)&&cover.width>0&&Number.isFinite(cover.height)&&cover.height>0,'Upload cover art again to record its dimensions.');\ncheck(Number.isFinite(song.duration)&&song.duration>0,'Upload the recording again to measure its duration.');\nconst duration=input.duration??20,offset=input.offset??0;\ncheck(Number.isFinite(duration)&&duration>=8&&duration<=60&&Number.isFinite(offset)&&offset>=0&&offset+duration<=song.duration+.02,'Choose an available 8–60 second song excerpt.');\nconst title=short(input.title||'','Release title',56),artist=short(input.artist||'','Artist',56),cta=short(input.cta||'','Release message',64),disclosure=short(input.disclosure||'','Disclosure',100);check(title&&artist,'Supply the release title and artist.');\nconst aspect=input.aspect||'9:16';check(['9:16','1:1','16:9'].includes(aspect),'Choose an output frame shape.');\nconst purpose=input.purpose||'release-teaser';check(['release-teaser','lyric-excerpt'].includes(purpose),'Choose a release teaser or lyric excerpt.');\nconst raw=input.lyrics||'';check(typeof raw==='string'&&raw.length<=8000,'Use up to 8,000 characters of timed lyrics.');\n// Human-approved lyric timing is relative to this excerpt, not the full song.\nconst lyrics=raw.trim()?raw.trim().split('\\n').map(line=>{const m=line.match(/^(\\d+(?:\\.\\d+)?)\\s*-\\s*(\\d+(?:\\.\\d+)?)\\s*\\|\\s*(.+)$/);check(m,'Use lyric lines like 0-3.5 | exact words');const from=+m[1],to=+m[2],value=short(m[3],'Lyric line',100);check(to>from&&from>=0&&to<=duration,'A lyric line is outside the excerpt.');return{from,to,text:value};}):[];\ncheck(lyrics.length<=40,'Use at most 40 lyric lines.');for(let i=1;i<lyrics.length;i++)check(lyrics[i].from>=lyrics[i-1].to,'Lyric lines must be ordered without overlap.');check(purpose!=='lyric-excerpt'||lyrics.length,'Supply reviewed timed lyrics for a lyric excerpt.');\nconst portrait=aspect==='9:16',square=aspect==='1:1',W=369*Number(aspect.split(':')[0])/Number(aspect.split(':')[1]);\nconst fit=Math.min(W/cover.width,369/cover.height),scale=Math.min(W*.84/(cover.width*fit),369*(portrait?.46:.6)/(cover.height*fit));\nconst clips=[{id:'original-cover',kind:'image',trackId:'art',asset:copy(cover),assetId:cover.assetId,versionId:cover.versionId,url:cover.url,title:cover.name||'Original artwork',start:0,duration,trimStart:0,volume:0,speed:1,transform:{fit:'contain',scale,x:0,y:portrait?-22:-10,rotation:0,opacity:1},motion:{type:'zoom',intensity:100,zoomAmount:1.035,zoomDirection:'in',zoomAnchor:'center',easing:'ease-in-out',loop:false,['window']:[0,100]},transition:{type:'Cut',duration:0}}];\nconst overlays=[],stickers=[];\nconst add=(id,value,start,end,y,size,color='#F7F0DB')=>{if(value)overlays.push({id,type:'text',trackId:'copy',text:value,start,end,font:'Hanken Grotesk',size,color,background:'none',width:.84,x:50,y,position:'center',animation:'fade',animIn:.25,animOut:.2});};\nadd('artist',artist,0,duration,portrait?13:9,portrait?10:14);\nadd('release-title',title,0,duration,portrait?70:79,portrait?21:25);\nadd('release-message',lyrics.length?'':cta,0,duration,portrait?86:92,portrait?10:13);\nfor(const [i,line]of lyrics.entries())add('lyric-'+i,line.text,line.from,line.to,portrait?82:91,portrait?12:15);\n// The progress row indicates excerpt time only; it makes no beat-detection claim.\nfor(let i=0;i<16;i++)stickers.push({id:'progress-'+i,trackId:'detail',shape:'underline',color:'#F7F0DB',x:20+i*4,y:portrait?92:97,scale:.04,stretchX:.55,stretchY:.4,opacity:.75,rotation:0,start:duration*i/16,end:duration});\nadd('disclosure',disclosure,0,duration,97,portrait?5:7);\nconst audioItems=[{id:'original-song',trackId:'song',asset:copy(song),assetId:song.assetId,versionId:song.versionId,url:song.url,title:song.name||'Original song',start:0,duration,sourceOffset:offset,trimStart:offset,volume:songVolume,rate:1,fadeIn:.15,fadeOut:.7}];\nconst timeline={schemaVersion:1,activeTimelineId:'release-visuals',name:title,aspect,aspectRatio:aspect,previewH:369,backgroundColor:'#0A0A0A',tracks:[{id:'art',type:'video',label:'Original artwork'},{id:'song',type:'audio',label:'Original recording'},{id:'copy',type:'text',label:'Release copy and lyrics'},{id:'detail',type:'overlay',label:'Excerpt progress'}],trackOrder:['art','song','detail','copy'],clips,audioItems,textOverlays:overlays,captions:[],stickers,effects:[],audio:copy(audioItems),overlays:copy(overlays),targetDuration:duration,exportSettings:{aspect,fps:30,resolution:'1080p',quality:'high'}};\nreturn {timeline,review:{schemaVersion:1,state:'needs-human-review',humanApproved:false,purpose,durationSec:duration,sourceOffset:offset,lyricCount:lyrics.length,providerCalls:0,warnings:['Listen to the export and review the artwork, names, date, exact lyric text and timing.','This is a social release visual, not a generated music video or a certified Spotify/Apple Music asset.','No beat detection, automatic lyric alignment, generated vocals or music licensing is included.']}};\n",
297
- "tests": [
298
- {
299
- "name": "Release Visuals original-media example 1",
300
- "input": {
301
- "assets": [
302
- {
303
- "kind": "image",
304
- "assetId": "photo-1",
305
- "versionId": "v1",
306
- "url": "https://media.example/photo-1.jpg",
307
- "width": 1600,
308
- "height": 1200
309
- },
310
- {
311
- "kind": "audio",
312
- "assetId": "original-song",
313
- "versionId": "v1",
314
- "url": "https://media.example/song.wav",
315
- "duration": 180
316
- }
317
- ],
318
- "title": "A new chapter",
319
- "artist": "Example artist",
320
- "cta": "Listen to the release",
321
- "lyrics": "0-5 | This is an original demo line\n5-10 | Not a copied song",
322
- "duration": 20
323
- },
324
- "expected": {
325
- "timeline": {
326
- "schemaVersion": 1,
327
- "activeTimelineId": "release-visuals",
328
- "name": "A new chapter",
329
- "aspect": "9:16",
330
- "aspectRatio": "9:16",
331
- "previewH": 369,
332
- "backgroundColor": "#0A0A0A",
333
- "tracks": [
334
- {
335
- "id": "art",
336
- "type": "video",
337
- "label": "Original artwork"
338
- },
339
- {
340
- "id": "song",
341
- "type": "audio",
342
- "label": "Original recording"
343
- },
344
- {
345
- "id": "copy",
346
- "type": "text",
347
- "label": "Release copy and lyrics"
348
- },
349
- {
350
- "id": "detail",
351
- "type": "overlay",
352
- "label": "Excerpt progress"
353
- }
354
- ],
355
- "trackOrder": [
356
- "art",
357
- "song",
358
- "detail",
359
- "copy"
360
- ],
361
- "clips": [
362
- {
363
- "id": "original-cover",
364
- "kind": "image",
365
- "trackId": "art",
366
- "asset": {
367
- "kind": "image",
368
- "assetId": "photo-1",
369
- "versionId": "v1",
370
- "url": "https://media.example/photo-1.jpg",
371
- "width": 1600,
372
- "height": 1200
373
- },
374
- "assetId": "photo-1",
375
- "versionId": "v1",
376
- "url": "https://media.example/photo-1.jpg",
377
- "title": "Original artwork",
378
- "start": 0,
379
- "duration": 20,
380
- "trimStart": 0,
381
- "volume": 0,
382
- "speed": 1,
383
- "transform": {
384
- "fit": "contain",
385
- "scale": 0.84,
386
- "x": 0,
387
- "y": -22,
388
- "rotation": 0,
389
- "opacity": 1
390
- },
391
- "motion": {
392
- "type": "zoom",
393
- "intensity": 100,
394
- "zoomAmount": 1.035,
395
- "zoomDirection": "in",
396
- "zoomAnchor": "center",
397
- "easing": "ease-in-out",
398
- "loop": false,
399
- "window": [
400
- 0,
401
- 100
402
- ]
403
- },
404
- "transition": {
405
- "type": "Cut",
406
- "duration": 0
407
- }
408
- }
409
- ],
410
- "audioItems": [
411
- {
412
- "id": "original-song",
413
- "trackId": "song",
414
- "asset": {
415
- "kind": "audio",
416
- "assetId": "original-song",
417
- "versionId": "v1",
418
- "url": "https://media.example/song.wav",
419
- "duration": 180
420
- },
421
- "assetId": "original-song",
422
- "versionId": "v1",
423
- "url": "https://media.example/song.wav",
424
- "title": "Original song",
425
- "start": 0,
426
- "duration": 20,
427
- "sourceOffset": 0,
428
- "trimStart": 0,
429
- "volume": 100,
430
- "rate": 1,
431
- "fadeIn": 0.15,
432
- "fadeOut": 0.7
433
- }
434
- ],
435
- "textOverlays": [
436
- {
437
- "id": "artist",
438
- "type": "text",
439
- "trackId": "copy",
440
- "text": "Example artist",
441
- "start": 0,
442
- "end": 20,
443
- "font": "Hanken Grotesk",
444
- "size": 10,
445
- "color": "#F7F0DB",
446
- "background": "none",
447
- "width": 0.84,
448
- "x": 50,
449
- "y": 13,
450
- "position": "center",
451
- "animation": "fade",
452
- "animIn": 0.25,
453
- "animOut": 0.2
454
- },
455
- {
456
- "id": "release-title",
457
- "type": "text",
458
- "trackId": "copy",
459
- "text": "A new chapter",
460
- "start": 0,
461
- "end": 20,
462
- "font": "Hanken Grotesk",
463
- "size": 21,
464
- "color": "#F7F0DB",
465
- "background": "none",
466
- "width": 0.84,
467
- "x": 50,
468
- "y": 70,
469
- "position": "center",
470
- "animation": "fade",
471
- "animIn": 0.25,
472
- "animOut": 0.2
473
- },
474
- {
475
- "id": "lyric-0",
476
- "type": "text",
477
- "trackId": "copy",
478
- "text": "This is an original demo line",
479
- "start": 0,
480
- "end": 5,
481
- "font": "Hanken Grotesk",
482
- "size": 12,
483
- "color": "#F7F0DB",
484
- "background": "none",
485
- "width": 0.84,
486
- "x": 50,
487
- "y": 82,
488
- "position": "center",
489
- "animation": "fade",
490
- "animIn": 0.25,
491
- "animOut": 0.2
492
- },
493
- {
494
- "id": "lyric-1",
495
- "type": "text",
496
- "trackId": "copy",
497
- "text": "Not a copied song",
498
- "start": 5,
499
- "end": 10,
500
- "font": "Hanken Grotesk",
501
- "size": 12,
502
- "color": "#F7F0DB",
503
- "background": "none",
504
- "width": 0.84,
505
- "x": 50,
506
- "y": 82,
507
- "position": "center",
508
- "animation": "fade",
509
- "animIn": 0.25,
510
- "animOut": 0.2
511
- }
512
- ],
513
- "captions": [],
514
- "stickers": [
515
- {
516
- "id": "progress-0",
517
- "trackId": "detail",
518
- "shape": "underline",
519
- "color": "#F7F0DB",
520
- "x": 20,
521
- "y": 92,
522
- "scale": 0.04,
523
- "stretchX": 0.55,
524
- "stretchY": 0.4,
525
- "opacity": 0.75,
526
- "rotation": 0,
527
- "start": 0,
528
- "end": 20
529
- },
530
- {
531
- "id": "progress-1",
532
- "trackId": "detail",
533
- "shape": "underline",
534
- "color": "#F7F0DB",
535
- "x": 24,
536
- "y": 92,
537
- "scale": 0.04,
538
- "stretchX": 0.55,
539
- "stretchY": 0.4,
540
- "opacity": 0.75,
541
- "rotation": 0,
542
- "start": 1.25,
543
- "end": 20
544
- },
545
- {
546
- "id": "progress-2",
547
- "trackId": "detail",
548
- "shape": "underline",
549
- "color": "#F7F0DB",
550
- "x": 28,
551
- "y": 92,
552
- "scale": 0.04,
553
- "stretchX": 0.55,
554
- "stretchY": 0.4,
555
- "opacity": 0.75,
556
- "rotation": 0,
557
- "start": 2.5,
558
- "end": 20
559
- },
560
- {
561
- "id": "progress-3",
562
- "trackId": "detail",
563
- "shape": "underline",
564
- "color": "#F7F0DB",
565
- "x": 32,
566
- "y": 92,
567
- "scale": 0.04,
568
- "stretchX": 0.55,
569
- "stretchY": 0.4,
570
- "opacity": 0.75,
571
- "rotation": 0,
572
- "start": 3.75,
573
- "end": 20
574
- },
575
- {
576
- "id": "progress-4",
577
- "trackId": "detail",
578
- "shape": "underline",
579
- "color": "#F7F0DB",
580
- "x": 36,
581
- "y": 92,
582
- "scale": 0.04,
583
- "stretchX": 0.55,
584
- "stretchY": 0.4,
585
- "opacity": 0.75,
586
- "rotation": 0,
587
- "start": 5,
588
- "end": 20
589
- },
590
- {
591
- "id": "progress-5",
592
- "trackId": "detail",
593
- "shape": "underline",
594
- "color": "#F7F0DB",
595
- "x": 40,
596
- "y": 92,
597
- "scale": 0.04,
598
- "stretchX": 0.55,
599
- "stretchY": 0.4,
600
- "opacity": 0.75,
601
- "rotation": 0,
602
- "start": 6.25,
603
- "end": 20
604
- },
605
- {
606
- "id": "progress-6",
607
- "trackId": "detail",
608
- "shape": "underline",
609
- "color": "#F7F0DB",
610
- "x": 44,
611
- "y": 92,
612
- "scale": 0.04,
613
- "stretchX": 0.55,
614
- "stretchY": 0.4,
615
- "opacity": 0.75,
616
- "rotation": 0,
617
- "start": 7.5,
618
- "end": 20
619
- },
620
- {
621
- "id": "progress-7",
622
- "trackId": "detail",
623
- "shape": "underline",
624
- "color": "#F7F0DB",
625
- "x": 48,
626
- "y": 92,
627
- "scale": 0.04,
628
- "stretchX": 0.55,
629
- "stretchY": 0.4,
630
- "opacity": 0.75,
631
- "rotation": 0,
632
- "start": 8.75,
633
- "end": 20
634
- },
635
- {
636
- "id": "progress-8",
637
- "trackId": "detail",
638
- "shape": "underline",
639
- "color": "#F7F0DB",
640
- "x": 52,
641
- "y": 92,
642
- "scale": 0.04,
643
- "stretchX": 0.55,
644
- "stretchY": 0.4,
645
- "opacity": 0.75,
646
- "rotation": 0,
647
- "start": 10,
648
- "end": 20
649
- },
650
- {
651
- "id": "progress-9",
652
- "trackId": "detail",
653
- "shape": "underline",
654
- "color": "#F7F0DB",
655
- "x": 56,
656
- "y": 92,
657
- "scale": 0.04,
658
- "stretchX": 0.55,
659
- "stretchY": 0.4,
660
- "opacity": 0.75,
661
- "rotation": 0,
662
- "start": 11.25,
663
- "end": 20
664
- },
665
- {
666
- "id": "progress-10",
667
- "trackId": "detail",
668
- "shape": "underline",
669
- "color": "#F7F0DB",
670
- "x": 60,
671
- "y": 92,
672
- "scale": 0.04,
673
- "stretchX": 0.55,
674
- "stretchY": 0.4,
675
- "opacity": 0.75,
676
- "rotation": 0,
677
- "start": 12.5,
678
- "end": 20
679
- },
680
- {
681
- "id": "progress-11",
682
- "trackId": "detail",
683
- "shape": "underline",
684
- "color": "#F7F0DB",
685
- "x": 64,
686
- "y": 92,
687
- "scale": 0.04,
688
- "stretchX": 0.55,
689
- "stretchY": 0.4,
690
- "opacity": 0.75,
691
- "rotation": 0,
692
- "start": 13.75,
693
- "end": 20
694
- },
695
- {
696
- "id": "progress-12",
697
- "trackId": "detail",
698
- "shape": "underline",
699
- "color": "#F7F0DB",
700
- "x": 68,
701
- "y": 92,
702
- "scale": 0.04,
703
- "stretchX": 0.55,
704
- "stretchY": 0.4,
705
- "opacity": 0.75,
706
- "rotation": 0,
707
- "start": 15,
708
- "end": 20
709
- },
710
- {
711
- "id": "progress-13",
712
- "trackId": "detail",
713
- "shape": "underline",
714
- "color": "#F7F0DB",
715
- "x": 72,
716
- "y": 92,
717
- "scale": 0.04,
718
- "stretchX": 0.55,
719
- "stretchY": 0.4,
720
- "opacity": 0.75,
721
- "rotation": 0,
722
- "start": 16.25,
723
- "end": 20
724
- },
725
- {
726
- "id": "progress-14",
727
- "trackId": "detail",
728
- "shape": "underline",
729
- "color": "#F7F0DB",
730
- "x": 76,
731
- "y": 92,
732
- "scale": 0.04,
733
- "stretchX": 0.55,
734
- "stretchY": 0.4,
735
- "opacity": 0.75,
736
- "rotation": 0,
737
- "start": 17.5,
738
- "end": 20
739
- },
740
- {
741
- "id": "progress-15",
742
- "trackId": "detail",
743
- "shape": "underline",
744
- "color": "#F7F0DB",
745
- "x": 80,
746
- "y": 92,
747
- "scale": 0.04,
748
- "stretchX": 0.55,
749
- "stretchY": 0.4,
750
- "opacity": 0.75,
751
- "rotation": 0,
752
- "start": 18.75,
753
- "end": 20
754
- }
755
- ],
756
- "effects": [],
757
- "audio": [
758
- {
759
- "id": "original-song",
760
- "trackId": "song",
761
- "asset": {
762
- "kind": "audio",
763
- "assetId": "original-song",
764
- "versionId": "v1",
765
- "url": "https://media.example/song.wav",
766
- "duration": 180
767
- },
768
- "assetId": "original-song",
769
- "versionId": "v1",
770
- "url": "https://media.example/song.wav",
771
- "title": "Original song",
772
- "start": 0,
773
- "duration": 20,
774
- "sourceOffset": 0,
775
- "trimStart": 0,
776
- "volume": 100,
777
- "rate": 1,
778
- "fadeIn": 0.15,
779
- "fadeOut": 0.7
780
- }
781
- ],
782
- "overlays": [
783
- {
784
- "id": "artist",
785
- "type": "text",
786
- "trackId": "copy",
787
- "text": "Example artist",
788
- "start": 0,
789
- "end": 20,
790
- "font": "Hanken Grotesk",
791
- "size": 10,
792
- "color": "#F7F0DB",
793
- "background": "none",
794
- "width": 0.84,
795
- "x": 50,
796
- "y": 13,
797
- "position": "center",
798
- "animation": "fade",
799
- "animIn": 0.25,
800
- "animOut": 0.2
801
- },
802
- {
803
- "id": "release-title",
804
- "type": "text",
805
- "trackId": "copy",
806
- "text": "A new chapter",
807
- "start": 0,
808
- "end": 20,
809
- "font": "Hanken Grotesk",
810
- "size": 21,
811
- "color": "#F7F0DB",
812
- "background": "none",
813
- "width": 0.84,
814
- "x": 50,
815
- "y": 70,
816
- "position": "center",
817
- "animation": "fade",
818
- "animIn": 0.25,
819
- "animOut": 0.2
820
- },
821
- {
822
- "id": "lyric-0",
823
- "type": "text",
824
- "trackId": "copy",
825
- "text": "This is an original demo line",
826
- "start": 0,
827
- "end": 5,
828
- "font": "Hanken Grotesk",
829
- "size": 12,
830
- "color": "#F7F0DB",
831
- "background": "none",
832
- "width": 0.84,
833
- "x": 50,
834
- "y": 82,
835
- "position": "center",
836
- "animation": "fade",
837
- "animIn": 0.25,
838
- "animOut": 0.2
839
- },
840
- {
841
- "id": "lyric-1",
842
- "type": "text",
843
- "trackId": "copy",
844
- "text": "Not a copied song",
845
- "start": 5,
846
- "end": 10,
847
- "font": "Hanken Grotesk",
848
- "size": 12,
849
- "color": "#F7F0DB",
850
- "background": "none",
851
- "width": 0.84,
852
- "x": 50,
853
- "y": 82,
854
- "position": "center",
855
- "animation": "fade",
856
- "animIn": 0.25,
857
- "animOut": 0.2
858
- }
859
- ],
860
- "targetDuration": 20,
861
- "exportSettings": {
862
- "aspect": "9:16",
863
- "fps": 30,
864
- "resolution": "1080p",
865
- "quality": "high"
866
- }
867
- },
868
- "review": {
869
- "schemaVersion": 1,
870
- "state": "needs-human-review",
871
- "humanApproved": false,
872
- "purpose": "release-teaser",
873
- "durationSec": 20,
874
- "sourceOffset": 0,
875
- "lyricCount": 2,
876
- "providerCalls": 0,
877
- "warnings": [
878
- "Listen to the export and review the artwork, names, date, exact lyric text and timing.",
879
- "This is a social release visual, not a generated music video or a certified Spotify/Apple Music asset.",
880
- "No beat detection, automatic lyric alignment, generated vocals or music licensing is included."
881
- ]
882
- }
883
- }
884
- },
885
- {
886
- "name": "Release Visuals original-media example 2",
887
- "input": {
888
- "assets": [
889
- {
890
- "kind": "image",
891
- "assetId": "photo-1",
892
- "versionId": "v1",
893
- "url": "https://media.example/photo-1.jpg",
894
- "width": 1600,
895
- "height": 1200
896
- },
897
- {
898
- "kind": "audio",
899
- "assetId": "original-song",
900
- "versionId": "v1",
901
- "url": "https://media.example/song.wav",
902
- "duration": 180
903
- }
904
- ],
905
- "title": "A new chapter",
906
- "artist": "Example artist",
907
- "purpose": "lyric-excerpt",
908
- "lyrics": "0-5 | This is an original demo line\n5-10 | Not a copied song",
909
- "duration": 20
910
- },
911
- "expected": {
912
- "timeline": {
913
- "schemaVersion": 1,
914
- "activeTimelineId": "release-visuals",
915
- "name": "A new chapter",
916
- "aspect": "9:16",
917
- "aspectRatio": "9:16",
918
- "previewH": 369,
919
- "backgroundColor": "#0A0A0A",
920
- "tracks": [
921
- {
922
- "id": "art",
923
- "type": "video",
924
- "label": "Original artwork"
925
- },
926
- {
927
- "id": "song",
928
- "type": "audio",
929
- "label": "Original recording"
930
- },
931
- {
932
- "id": "copy",
933
- "type": "text",
934
- "label": "Release copy and lyrics"
935
- },
936
- {
937
- "id": "detail",
938
- "type": "overlay",
939
- "label": "Excerpt progress"
940
- }
941
- ],
942
- "trackOrder": [
943
- "art",
944
- "song",
945
- "detail",
946
- "copy"
947
- ],
948
- "clips": [
949
- {
950
- "id": "original-cover",
951
- "kind": "image",
952
- "trackId": "art",
953
- "asset": {
954
- "kind": "image",
955
- "assetId": "photo-1",
956
- "versionId": "v1",
957
- "url": "https://media.example/photo-1.jpg",
958
- "width": 1600,
959
- "height": 1200
960
- },
961
- "assetId": "photo-1",
962
- "versionId": "v1",
963
- "url": "https://media.example/photo-1.jpg",
964
- "title": "Original artwork",
965
- "start": 0,
966
- "duration": 20,
967
- "trimStart": 0,
968
- "volume": 0,
969
- "speed": 1,
970
- "transform": {
971
- "fit": "contain",
972
- "scale": 0.84,
973
- "x": 0,
974
- "y": -22,
975
- "rotation": 0,
976
- "opacity": 1
977
- },
978
- "motion": {
979
- "type": "zoom",
980
- "intensity": 100,
981
- "zoomAmount": 1.035,
982
- "zoomDirection": "in",
983
- "zoomAnchor": "center",
984
- "easing": "ease-in-out",
985
- "loop": false,
986
- "window": [
987
- 0,
988
- 100
989
- ]
990
- },
991
- "transition": {
992
- "type": "Cut",
993
- "duration": 0
994
- }
995
- }
996
- ],
997
- "audioItems": [
998
- {
999
- "id": "original-song",
1000
- "trackId": "song",
1001
- "asset": {
1002
- "kind": "audio",
1003
- "assetId": "original-song",
1004
- "versionId": "v1",
1005
- "url": "https://media.example/song.wav",
1006
- "duration": 180
1007
- },
1008
- "assetId": "original-song",
1009
- "versionId": "v1",
1010
- "url": "https://media.example/song.wav",
1011
- "title": "Original song",
1012
- "start": 0,
1013
- "duration": 20,
1014
- "sourceOffset": 0,
1015
- "trimStart": 0,
1016
- "volume": 100,
1017
- "rate": 1,
1018
- "fadeIn": 0.15,
1019
- "fadeOut": 0.7
1020
- }
1021
- ],
1022
- "textOverlays": [
1023
- {
1024
- "id": "artist",
1025
- "type": "text",
1026
- "trackId": "copy",
1027
- "text": "Example artist",
1028
- "start": 0,
1029
- "end": 20,
1030
- "font": "Hanken Grotesk",
1031
- "size": 10,
1032
- "color": "#F7F0DB",
1033
- "background": "none",
1034
- "width": 0.84,
1035
- "x": 50,
1036
- "y": 13,
1037
- "position": "center",
1038
- "animation": "fade",
1039
- "animIn": 0.25,
1040
- "animOut": 0.2
1041
- },
1042
- {
1043
- "id": "release-title",
1044
- "type": "text",
1045
- "trackId": "copy",
1046
- "text": "A new chapter",
1047
- "start": 0,
1048
- "end": 20,
1049
- "font": "Hanken Grotesk",
1050
- "size": 21,
1051
- "color": "#F7F0DB",
1052
- "background": "none",
1053
- "width": 0.84,
1054
- "x": 50,
1055
- "y": 70,
1056
- "position": "center",
1057
- "animation": "fade",
1058
- "animIn": 0.25,
1059
- "animOut": 0.2
1060
- },
1061
- {
1062
- "id": "lyric-0",
1063
- "type": "text",
1064
- "trackId": "copy",
1065
- "text": "This is an original demo line",
1066
- "start": 0,
1067
- "end": 5,
1068
- "font": "Hanken Grotesk",
1069
- "size": 12,
1070
- "color": "#F7F0DB",
1071
- "background": "none",
1072
- "width": 0.84,
1073
- "x": 50,
1074
- "y": 82,
1075
- "position": "center",
1076
- "animation": "fade",
1077
- "animIn": 0.25,
1078
- "animOut": 0.2
1079
- },
1080
- {
1081
- "id": "lyric-1",
1082
- "type": "text",
1083
- "trackId": "copy",
1084
- "text": "Not a copied song",
1085
- "start": 5,
1086
- "end": 10,
1087
- "font": "Hanken Grotesk",
1088
- "size": 12,
1089
- "color": "#F7F0DB",
1090
- "background": "none",
1091
- "width": 0.84,
1092
- "x": 50,
1093
- "y": 82,
1094
- "position": "center",
1095
- "animation": "fade",
1096
- "animIn": 0.25,
1097
- "animOut": 0.2
1098
- }
1099
- ],
1100
- "captions": [],
1101
- "stickers": [
1102
- {
1103
- "id": "progress-0",
1104
- "trackId": "detail",
1105
- "shape": "underline",
1106
- "color": "#F7F0DB",
1107
- "x": 20,
1108
- "y": 92,
1109
- "scale": 0.04,
1110
- "stretchX": 0.55,
1111
- "stretchY": 0.4,
1112
- "opacity": 0.75,
1113
- "rotation": 0,
1114
- "start": 0,
1115
- "end": 20
1116
- },
1117
- {
1118
- "id": "progress-1",
1119
- "trackId": "detail",
1120
- "shape": "underline",
1121
- "color": "#F7F0DB",
1122
- "x": 24,
1123
- "y": 92,
1124
- "scale": 0.04,
1125
- "stretchX": 0.55,
1126
- "stretchY": 0.4,
1127
- "opacity": 0.75,
1128
- "rotation": 0,
1129
- "start": 1.25,
1130
- "end": 20
1131
- },
1132
- {
1133
- "id": "progress-2",
1134
- "trackId": "detail",
1135
- "shape": "underline",
1136
- "color": "#F7F0DB",
1137
- "x": 28,
1138
- "y": 92,
1139
- "scale": 0.04,
1140
- "stretchX": 0.55,
1141
- "stretchY": 0.4,
1142
- "opacity": 0.75,
1143
- "rotation": 0,
1144
- "start": 2.5,
1145
- "end": 20
1146
- },
1147
- {
1148
- "id": "progress-3",
1149
- "trackId": "detail",
1150
- "shape": "underline",
1151
- "color": "#F7F0DB",
1152
- "x": 32,
1153
- "y": 92,
1154
- "scale": 0.04,
1155
- "stretchX": 0.55,
1156
- "stretchY": 0.4,
1157
- "opacity": 0.75,
1158
- "rotation": 0,
1159
- "start": 3.75,
1160
- "end": 20
1161
- },
1162
- {
1163
- "id": "progress-4",
1164
- "trackId": "detail",
1165
- "shape": "underline",
1166
- "color": "#F7F0DB",
1167
- "x": 36,
1168
- "y": 92,
1169
- "scale": 0.04,
1170
- "stretchX": 0.55,
1171
- "stretchY": 0.4,
1172
- "opacity": 0.75,
1173
- "rotation": 0,
1174
- "start": 5,
1175
- "end": 20
1176
- },
1177
- {
1178
- "id": "progress-5",
1179
- "trackId": "detail",
1180
- "shape": "underline",
1181
- "color": "#F7F0DB",
1182
- "x": 40,
1183
- "y": 92,
1184
- "scale": 0.04,
1185
- "stretchX": 0.55,
1186
- "stretchY": 0.4,
1187
- "opacity": 0.75,
1188
- "rotation": 0,
1189
- "start": 6.25,
1190
- "end": 20
1191
- },
1192
- {
1193
- "id": "progress-6",
1194
- "trackId": "detail",
1195
- "shape": "underline",
1196
- "color": "#F7F0DB",
1197
- "x": 44,
1198
- "y": 92,
1199
- "scale": 0.04,
1200
- "stretchX": 0.55,
1201
- "stretchY": 0.4,
1202
- "opacity": 0.75,
1203
- "rotation": 0,
1204
- "start": 7.5,
1205
- "end": 20
1206
- },
1207
- {
1208
- "id": "progress-7",
1209
- "trackId": "detail",
1210
- "shape": "underline",
1211
- "color": "#F7F0DB",
1212
- "x": 48,
1213
- "y": 92,
1214
- "scale": 0.04,
1215
- "stretchX": 0.55,
1216
- "stretchY": 0.4,
1217
- "opacity": 0.75,
1218
- "rotation": 0,
1219
- "start": 8.75,
1220
- "end": 20
1221
- },
1222
- {
1223
- "id": "progress-8",
1224
- "trackId": "detail",
1225
- "shape": "underline",
1226
- "color": "#F7F0DB",
1227
- "x": 52,
1228
- "y": 92,
1229
- "scale": 0.04,
1230
- "stretchX": 0.55,
1231
- "stretchY": 0.4,
1232
- "opacity": 0.75,
1233
- "rotation": 0,
1234
- "start": 10,
1235
- "end": 20
1236
- },
1237
- {
1238
- "id": "progress-9",
1239
- "trackId": "detail",
1240
- "shape": "underline",
1241
- "color": "#F7F0DB",
1242
- "x": 56,
1243
- "y": 92,
1244
- "scale": 0.04,
1245
- "stretchX": 0.55,
1246
- "stretchY": 0.4,
1247
- "opacity": 0.75,
1248
- "rotation": 0,
1249
- "start": 11.25,
1250
- "end": 20
1251
- },
1252
- {
1253
- "id": "progress-10",
1254
- "trackId": "detail",
1255
- "shape": "underline",
1256
- "color": "#F7F0DB",
1257
- "x": 60,
1258
- "y": 92,
1259
- "scale": 0.04,
1260
- "stretchX": 0.55,
1261
- "stretchY": 0.4,
1262
- "opacity": 0.75,
1263
- "rotation": 0,
1264
- "start": 12.5,
1265
- "end": 20
1266
- },
1267
- {
1268
- "id": "progress-11",
1269
- "trackId": "detail",
1270
- "shape": "underline",
1271
- "color": "#F7F0DB",
1272
- "x": 64,
1273
- "y": 92,
1274
- "scale": 0.04,
1275
- "stretchX": 0.55,
1276
- "stretchY": 0.4,
1277
- "opacity": 0.75,
1278
- "rotation": 0,
1279
- "start": 13.75,
1280
- "end": 20
1281
- },
1282
- {
1283
- "id": "progress-12",
1284
- "trackId": "detail",
1285
- "shape": "underline",
1286
- "color": "#F7F0DB",
1287
- "x": 68,
1288
- "y": 92,
1289
- "scale": 0.04,
1290
- "stretchX": 0.55,
1291
- "stretchY": 0.4,
1292
- "opacity": 0.75,
1293
- "rotation": 0,
1294
- "start": 15,
1295
- "end": 20
1296
- },
1297
- {
1298
- "id": "progress-13",
1299
- "trackId": "detail",
1300
- "shape": "underline",
1301
- "color": "#F7F0DB",
1302
- "x": 72,
1303
- "y": 92,
1304
- "scale": 0.04,
1305
- "stretchX": 0.55,
1306
- "stretchY": 0.4,
1307
- "opacity": 0.75,
1308
- "rotation": 0,
1309
- "start": 16.25,
1310
- "end": 20
1311
- },
1312
- {
1313
- "id": "progress-14",
1314
- "trackId": "detail",
1315
- "shape": "underline",
1316
- "color": "#F7F0DB",
1317
- "x": 76,
1318
- "y": 92,
1319
- "scale": 0.04,
1320
- "stretchX": 0.55,
1321
- "stretchY": 0.4,
1322
- "opacity": 0.75,
1323
- "rotation": 0,
1324
- "start": 17.5,
1325
- "end": 20
1326
- },
1327
- {
1328
- "id": "progress-15",
1329
- "trackId": "detail",
1330
- "shape": "underline",
1331
- "color": "#F7F0DB",
1332
- "x": 80,
1333
- "y": 92,
1334
- "scale": 0.04,
1335
- "stretchX": 0.55,
1336
- "stretchY": 0.4,
1337
- "opacity": 0.75,
1338
- "rotation": 0,
1339
- "start": 18.75,
1340
- "end": 20
1341
- }
1342
- ],
1343
- "effects": [],
1344
- "audio": [
1345
- {
1346
- "id": "original-song",
1347
- "trackId": "song",
1348
- "asset": {
1349
- "kind": "audio",
1350
- "assetId": "original-song",
1351
- "versionId": "v1",
1352
- "url": "https://media.example/song.wav",
1353
- "duration": 180
1354
- },
1355
- "assetId": "original-song",
1356
- "versionId": "v1",
1357
- "url": "https://media.example/song.wav",
1358
- "title": "Original song",
1359
- "start": 0,
1360
- "duration": 20,
1361
- "sourceOffset": 0,
1362
- "trimStart": 0,
1363
- "volume": 100,
1364
- "rate": 1,
1365
- "fadeIn": 0.15,
1366
- "fadeOut": 0.7
1367
- }
1368
- ],
1369
- "overlays": [
1370
- {
1371
- "id": "artist",
1372
- "type": "text",
1373
- "trackId": "copy",
1374
- "text": "Example artist",
1375
- "start": 0,
1376
- "end": 20,
1377
- "font": "Hanken Grotesk",
1378
- "size": 10,
1379
- "color": "#F7F0DB",
1380
- "background": "none",
1381
- "width": 0.84,
1382
- "x": 50,
1383
- "y": 13,
1384
- "position": "center",
1385
- "animation": "fade",
1386
- "animIn": 0.25,
1387
- "animOut": 0.2
1388
- },
1389
- {
1390
- "id": "release-title",
1391
- "type": "text",
1392
- "trackId": "copy",
1393
- "text": "A new chapter",
1394
- "start": 0,
1395
- "end": 20,
1396
- "font": "Hanken Grotesk",
1397
- "size": 21,
1398
- "color": "#F7F0DB",
1399
- "background": "none",
1400
- "width": 0.84,
1401
- "x": 50,
1402
- "y": 70,
1403
- "position": "center",
1404
- "animation": "fade",
1405
- "animIn": 0.25,
1406
- "animOut": 0.2
1407
- },
1408
- {
1409
- "id": "lyric-0",
1410
- "type": "text",
1411
- "trackId": "copy",
1412
- "text": "This is an original demo line",
1413
- "start": 0,
1414
- "end": 5,
1415
- "font": "Hanken Grotesk",
1416
- "size": 12,
1417
- "color": "#F7F0DB",
1418
- "background": "none",
1419
- "width": 0.84,
1420
- "x": 50,
1421
- "y": 82,
1422
- "position": "center",
1423
- "animation": "fade",
1424
- "animIn": 0.25,
1425
- "animOut": 0.2
1426
- },
1427
- {
1428
- "id": "lyric-1",
1429
- "type": "text",
1430
- "trackId": "copy",
1431
- "text": "Not a copied song",
1432
- "start": 5,
1433
- "end": 10,
1434
- "font": "Hanken Grotesk",
1435
- "size": 12,
1436
- "color": "#F7F0DB",
1437
- "background": "none",
1438
- "width": 0.84,
1439
- "x": 50,
1440
- "y": 82,
1441
- "position": "center",
1442
- "animation": "fade",
1443
- "animIn": 0.25,
1444
- "animOut": 0.2
1445
- }
1446
- ],
1447
- "targetDuration": 20,
1448
- "exportSettings": {
1449
- "aspect": "9:16",
1450
- "fps": 30,
1451
- "resolution": "1080p",
1452
- "quality": "high"
1453
- }
1454
- },
1455
- "review": {
1456
- "schemaVersion": 1,
1457
- "state": "needs-human-review",
1458
- "humanApproved": false,
1459
- "purpose": "lyric-excerpt",
1460
- "durationSec": 20,
1461
- "sourceOffset": 0,
1462
- "lyricCount": 2,
1463
- "providerCalls": 0,
1464
- "warnings": [
1465
- "Listen to the export and review the artwork, names, date, exact lyric text and timing.",
1466
- "This is a social release visual, not a generated music video or a certified Spotify/Apple Music asset.",
1467
- "No beat detection, automatic lyric alignment, generated vocals or music licensing is included."
1468
- ]
1469
- }
1470
- }
1471
- }
1472
- ],
1473
- "portable": {
1474
- "format": "stillmade-block/1",
1475
- "dependencies": [],
1476
- "sources": [
1477
- {
1478
- "kind": "original",
1479
- "license": "MIT",
1480
- "paths": [
1481
- "LICENSE",
1482
- "src/run.js"
1483
- ],
1484
- "evidence": [
1485
- "upstream/0/LICENSE",
1486
- "upstream/0/src/run.js"
1487
- ],
1488
- "changes": "Original implementation declared by the packager; no reused repository or dependency code."
1489
- }
1490
- ],
1491
- "files": {
1492
- "upstream/0/LICENSE": "MIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and \nassociated documentation files (the \"Software\"), to deal in the Software without restriction, including \nwithout limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell \ncopies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the \nfollowing conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial \nportions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT \nLIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO \nEVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER \nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE \nUSE OR OTHER DEALINGS IN THE SOFTWARE.\n",
1493
- "upstream/0/src/run.js": "// Original release-art and lyric-excerpt composition. No inference or I/O.\nconst copy=x=>JSON.parse(JSON.stringify(x)),check=(ok,message)=>{if(!ok)throw Error(message);};\nconst short=(v,label,n=80)=>{check(typeof v==='string'&&v.length<=n&&!/[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]/.test(v),label+' must be short plain text.');return v.trim();};\n\nconst songVolume=input.songVolume??100;check(Number.isFinite(songVolume)&&songVolume>=1&&songVolume<=100,'Song volume must be 1–100.');\nconst assets=input.assets;check(Array.isArray(assets)&&assets.length===2,'Choose exactly one cover image and one audio recording.');\nconst cover=assets.find(a=>a.kind==='image'),song=assets.find(a=>a.kind==='audio');check(cover&&song,'Supply one original cover image and one audio recording.');\nfor(const a of assets)check(typeof a.assetId==='string'&&a.assetId&&typeof a.versionId==='string'&&a.versionId&&typeof a.url==='string'&&/^(https:\\/\\/|http:\\/\\/(localhost|127\\.0\\.0\\.1)(:\\d+)?\\/|\\/api\\/media\\/|sm-media:|blob:)/.test(a.url)&&!/^https?:\\/\\/[^/?#]*@/.test(a.url),'Use exact saved media references.');\ncheck(Number.isFinite(cover.width)&&cover.width>0&&Number.isFinite(cover.height)&&cover.height>0,'Upload cover art again to record its dimensions.');\ncheck(Number.isFinite(song.duration)&&song.duration>0,'Upload the recording again to measure its duration.');\nconst duration=input.duration??20,offset=input.offset??0;\ncheck(Number.isFinite(duration)&&duration>=8&&duration<=60&&Number.isFinite(offset)&&offset>=0&&offset+duration<=song.duration+.02,'Choose an available 8–60 second song excerpt.');\nconst title=short(input.title||'','Release title',56),artist=short(input.artist||'','Artist',56),cta=short(input.cta||'','Release message',64),disclosure=short(input.disclosure||'','Disclosure',100);check(title&&artist,'Supply the release title and artist.');\nconst aspect=input.aspect||'9:16';check(['9:16','1:1','16:9'].includes(aspect),'Choose an output frame shape.');\nconst purpose=input.purpose||'release-teaser';check(['release-teaser','lyric-excerpt'].includes(purpose),'Choose a release teaser or lyric excerpt.');\nconst raw=input.lyrics||'';check(typeof raw==='string'&&raw.length<=8000,'Use up to 8,000 characters of timed lyrics.');\n// Human-approved lyric timing is relative to this excerpt, not the full song.\nconst lyrics=raw.trim()?raw.trim().split('\\n').map(line=>{const m=line.match(/^(\\d+(?:\\.\\d+)?)\\s*-\\s*(\\d+(?:\\.\\d+)?)\\s*\\|\\s*(.+)$/);check(m,'Use lyric lines like 0-3.5 | exact words');const from=+m[1],to=+m[2],value=short(m[3],'Lyric line',100);check(to>from&&from>=0&&to<=duration,'A lyric line is outside the excerpt.');return{from,to,text:value};}):[];\ncheck(lyrics.length<=40,'Use at most 40 lyric lines.');for(let i=1;i<lyrics.length;i++)check(lyrics[i].from>=lyrics[i-1].to,'Lyric lines must be ordered without overlap.');check(purpose!=='lyric-excerpt'||lyrics.length,'Supply reviewed timed lyrics for a lyric excerpt.');\nconst portrait=aspect==='9:16',square=aspect==='1:1',W=369*Number(aspect.split(':')[0])/Number(aspect.split(':')[1]);\nconst fit=Math.min(W/cover.width,369/cover.height),scale=Math.min(W*.84/(cover.width*fit),369*(portrait?.46:.6)/(cover.height*fit));\nconst clips=[{id:'original-cover',kind:'image',trackId:'art',asset:copy(cover),assetId:cover.assetId,versionId:cover.versionId,url:cover.url,title:cover.name||'Original artwork',start:0,duration,trimStart:0,volume:0,speed:1,transform:{fit:'contain',scale,x:0,y:portrait?-22:-10,rotation:0,opacity:1},motion:{type:'zoom',intensity:100,zoomAmount:1.035,zoomDirection:'in',zoomAnchor:'center',easing:'ease-in-out',loop:false,['window']:[0,100]},transition:{type:'Cut',duration:0}}];\nconst overlays=[],stickers=[];\nconst add=(id,value,start,end,y,size,color='#F7F0DB')=>{if(value)overlays.push({id,type:'text',trackId:'copy',text:value,start,end,font:'Hanken Grotesk',size,color,background:'none',width:.84,x:50,y,position:'center',animation:'fade',animIn:.25,animOut:.2});};\nadd('artist',artist,0,duration,portrait?13:9,portrait?10:14);\nadd('release-title',title,0,duration,portrait?70:79,portrait?21:25);\nadd('release-message',lyrics.length?'':cta,0,duration,portrait?86:92,portrait?10:13);\nfor(const [i,line]of lyrics.entries())add('lyric-'+i,line.text,line.from,line.to,portrait?82:91,portrait?12:15);\n// The progress row indicates excerpt time only; it makes no beat-detection claim.\nfor(let i=0;i<16;i++)stickers.push({id:'progress-'+i,trackId:'detail',shape:'underline',color:'#F7F0DB',x:20+i*4,y:portrait?92:97,scale:.04,stretchX:.55,stretchY:.4,opacity:.75,rotation:0,start:duration*i/16,end:duration});\nadd('disclosure',disclosure,0,duration,97,portrait?5:7);\nconst audioItems=[{id:'original-song',trackId:'song',asset:copy(song),assetId:song.assetId,versionId:song.versionId,url:song.url,title:song.name||'Original song',start:0,duration,sourceOffset:offset,trimStart:offset,volume:songVolume,rate:1,fadeIn:.15,fadeOut:.7}];\nconst timeline={schemaVersion:1,activeTimelineId:'release-visuals',name:title,aspect,aspectRatio:aspect,previewH:369,backgroundColor:'#0A0A0A',tracks:[{id:'art',type:'video',label:'Original artwork'},{id:'song',type:'audio',label:'Original recording'},{id:'copy',type:'text',label:'Release copy and lyrics'},{id:'detail',type:'overlay',label:'Excerpt progress'}],trackOrder:['art','song','detail','copy'],clips,audioItems,textOverlays:overlays,captions:[],stickers,effects:[],audio:copy(audioItems),overlays:copy(overlays),targetDuration:duration,exportSettings:{aspect,fps:30,resolution:'1080p',quality:'high'}};\nreturn {timeline,review:{schemaVersion:1,state:'needs-human-review',humanApproved:false,purpose,durationSec:duration,sourceOffset:offset,lyricCount:lyrics.length,providerCalls:0,warnings:['Listen to the export and review the artwork, names, date, exact lyric text and timing.','This is a social release visual, not a generated music video or a certified Spotify/Apple Music asset.','No beat detection, automatic lyric alignment, generated vocals or music licensing is included.']}};\n"
1494
- },
1495
- "lineage": {
1496
- "parents": [],
1497
- "changes": "Packaged original Block source for StillMade."
1498
- }
1499
- }
1500
- };