larkup 0.1.46 → 0.1.47

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 (241) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/diagnostics/route-bundle-stats.json +12 -12
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/required-server-files.js +1 -1
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/server/app/_global-error.html +1 -1
  8. package/.next/server/app/_global-error.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/.next/server/app/_not-found.html +1 -1
  16. package/.next/server/app/_not-found.rsc +16 -16
  17. package/.next/server/app/_not-found.segments/_full.segment.rsc +16 -16
  18. package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  19. package/.next/server/app/_not-found.segments/_index.segment.rsc +11 -11
  20. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  21. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  22. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  23. package/.next/server/app/analytics/page_client-reference-manifest.js +1 -1
  24. package/.next/server/app/analytics.html +1 -1
  25. package/.next/server/app/analytics.rsc +17 -17
  26. package/.next/server/app/analytics.segments/_full.segment.rsc +17 -17
  27. package/.next/server/app/analytics.segments/_head.segment.rsc +4 -4
  28. package/.next/server/app/analytics.segments/_index.segment.rsc +11 -11
  29. package/.next/server/app/analytics.segments/_tree.segment.rsc +1 -1
  30. package/.next/server/app/analytics.segments/analytics/__PAGE__.segment.rsc +3 -3
  31. package/.next/server/app/analytics.segments/analytics.segment.rsc +3 -3
  32. package/.next/server/app/api/chat/route.js +9 -9
  33. package/.next/server/app/api/chat/route.js.nft.json +1 -1
  34. package/.next/server/app/api/deploy/ssh/route.js +2 -2
  35. package/.next/server/app/api/deploy/ssh/route.js.nft.json +1 -1
  36. package/.next/server/app/api/doc-editor/edit/route.js +2 -2
  37. package/.next/server/app/api/doc-editor/export/route.js +2 -2
  38. package/.next/server/app/api/doc-editor/extract-text/route.js +2 -2
  39. package/.next/server/app/api/doc-editor/parse/route.js +1 -1
  40. package/.next/server/app/api/doc-editor/restore/route.js +2 -2
  41. package/.next/server/app/api/document/sign/route.js +3 -3
  42. package/.next/server/app/api/marketplace/[toolId]/route.js.nft.json +1 -1
  43. package/.next/server/app/api/marketplace/route.js.nft.json +1 -1
  44. package/.next/server/app/api/media/process/route.js.nft.json +1 -1
  45. package/.next/server/app/api/media/route.js.nft.json +1 -1
  46. package/.next/server/app/api/parse-file/route.js +2 -2
  47. package/.next/server/app/api/server/download/route.js +1 -1
  48. package/.next/server/app/api/server/generate/route.js +2 -2
  49. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  50. package/.next/server/app/chat.html +1 -1
  51. package/.next/server/app/chat.rsc +17 -17
  52. package/.next/server/app/chat.segments/_full.segment.rsc +17 -17
  53. package/.next/server/app/chat.segments/_head.segment.rsc +4 -4
  54. package/.next/server/app/chat.segments/_index.segment.rsc +11 -11
  55. package/.next/server/app/chat.segments/_tree.segment.rsc +1 -1
  56. package/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +3 -3
  57. package/.next/server/app/chat.segments/chat.segment.rsc +3 -3
  58. package/.next/server/app/data/page_client-reference-manifest.js +1 -1
  59. package/.next/server/app/data.html +1 -1
  60. package/.next/server/app/data.rsc +17 -17
  61. package/.next/server/app/data.segments/_full.segment.rsc +17 -17
  62. package/.next/server/app/data.segments/_head.segment.rsc +4 -4
  63. package/.next/server/app/data.segments/_index.segment.rsc +11 -11
  64. package/.next/server/app/data.segments/_tree.segment.rsc +1 -1
  65. package/.next/server/app/data.segments/data/__PAGE__.segment.rsc +3 -3
  66. package/.next/server/app/data.segments/data.segment.rsc +3 -3
  67. package/.next/server/app/index.html +1 -1
  68. package/.next/server/app/index.rsc +16 -16
  69. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  70. package/.next/server/app/index.segments/_full.segment.rsc +16 -16
  71. package/.next/server/app/index.segments/_head.segment.rsc +4 -4
  72. package/.next/server/app/index.segments/_index.segment.rsc +11 -11
  73. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  74. package/.next/server/app/page_client-reference-manifest.js +1 -1
  75. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  76. package/.next/server/app/settings.html +1 -1
  77. package/.next/server/app/settings.rsc +18 -18
  78. package/.next/server/app/settings.segments/_full.segment.rsc +18 -18
  79. package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
  80. package/.next/server/app/settings.segments/_index.segment.rsc +11 -11
  81. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  82. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
  83. package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
  84. package/.next/server/chunks/[root-of-the-server]__05707i3._.js +1 -1
  85. package/.next/server/chunks/[root-of-the-server]__0vmcld0._.js +3 -0
  86. package/.next/{standalone/apps/web/.next/server/chunks/[root-of-the-server]__08f60c7._.js → server/chunks/[root-of-the-server]__1e8p5bd._.js} +2 -2
  87. package/.next/server/chunks/[root-of-the-server]__1ks-3_h._.js +3 -0
  88. package/.next/server/chunks/[root-of-the-server]__1lhfkyh._.js +1 -1
  89. package/.next/server/chunks/packages_marketplace_src_125_g2p._.js +1 -1
  90. package/.next/server/chunks/packages_scraper_src_0kkcv_v._.js +1 -1
  91. package/.next/server/chunks/packages_tools_video-audio_dist_ffmpeg-spawn_0by2bau.js +3 -0
  92. package/.next/server/chunks/ssr/_1yqlx1m._.js +1 -1
  93. package/.next/server/middleware-build-manifest.js +3 -3
  94. package/.next/server/pages/404.html +1 -1
  95. package/.next/server/pages/500.html +1 -1
  96. package/.next/standalone/apps/web/.next/BUILD_ID +1 -1
  97. package/.next/standalone/apps/web/.next/build-manifest.json +3 -3
  98. package/.next/standalone/apps/web/.next/required-server-files.json +1 -1
  99. package/.next/standalone/apps/web/.next/server/app/_global-error.html +1 -1
  100. package/.next/standalone/apps/web/.next/server/app/_global-error.rsc +1 -1
  101. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  102. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  103. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  104. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  105. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  106. package/.next/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  107. package/.next/standalone/apps/web/.next/server/app/_not-found.html +1 -1
  108. package/.next/standalone/apps/web/.next/server/app/_not-found.rsc +16 -16
  109. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc +16 -16
  110. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  111. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc +11 -11
  112. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  113. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  114. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  115. package/.next/standalone/apps/web/.next/server/app/analytics/page_client-reference-manifest.js +1 -1
  116. package/.next/standalone/apps/web/.next/server/app/analytics.html +1 -1
  117. package/.next/standalone/apps/web/.next/server/app/analytics.rsc +17 -17
  118. package/.next/standalone/apps/web/.next/server/app/analytics.segments/_full.segment.rsc +17 -17
  119. package/.next/standalone/apps/web/.next/server/app/analytics.segments/_head.segment.rsc +4 -4
  120. package/.next/standalone/apps/web/.next/server/app/analytics.segments/_index.segment.rsc +11 -11
  121. package/.next/standalone/apps/web/.next/server/app/analytics.segments/_tree.segment.rsc +1 -1
  122. package/.next/standalone/apps/web/.next/server/app/analytics.segments/analytics/__PAGE__.segment.rsc +3 -3
  123. package/.next/standalone/apps/web/.next/server/app/analytics.segments/analytics.segment.rsc +3 -3
  124. package/.next/standalone/apps/web/.next/server/app/api/chat/route.js +9 -9
  125. package/.next/standalone/apps/web/.next/server/app/api/chat/route.js.nft.json +1 -1
  126. package/.next/standalone/apps/web/.next/server/app/api/deploy/ssh/route.js +2 -2
  127. package/.next/standalone/apps/web/.next/server/app/api/deploy/ssh/route.js.nft.json +1 -1
  128. package/.next/standalone/apps/web/.next/server/app/api/doc-editor/edit/route.js +2 -2
  129. package/.next/standalone/apps/web/.next/server/app/api/doc-editor/export/route.js +2 -2
  130. package/.next/standalone/apps/web/.next/server/app/api/doc-editor/extract-text/route.js +2 -2
  131. package/.next/standalone/apps/web/.next/server/app/api/doc-editor/parse/route.js +1 -1
  132. package/.next/standalone/apps/web/.next/server/app/api/doc-editor/restore/route.js +2 -2
  133. package/.next/standalone/apps/web/.next/server/app/api/document/sign/route.js +3 -3
  134. package/.next/standalone/apps/web/.next/server/app/api/marketplace/[toolId]/route.js.nft.json +1 -1
  135. package/.next/standalone/apps/web/.next/server/app/api/marketplace/route.js.nft.json +1 -1
  136. package/.next/standalone/apps/web/.next/server/app/api/media/process/route.js.nft.json +1 -1
  137. package/.next/standalone/apps/web/.next/server/app/api/media/route.js.nft.json +1 -1
  138. package/.next/standalone/apps/web/.next/server/app/api/parse-file/route.js +2 -2
  139. package/.next/standalone/apps/web/.next/server/app/api/server/download/route.js +1 -1
  140. package/.next/standalone/apps/web/.next/server/app/api/server/generate/route.js +2 -2
  141. package/.next/standalone/apps/web/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  142. package/.next/standalone/apps/web/.next/server/app/chat.html +1 -1
  143. package/.next/standalone/apps/web/.next/server/app/chat.rsc +17 -17
  144. package/.next/standalone/apps/web/.next/server/app/chat.segments/_full.segment.rsc +17 -17
  145. package/.next/standalone/apps/web/.next/server/app/chat.segments/_head.segment.rsc +4 -4
  146. package/.next/standalone/apps/web/.next/server/app/chat.segments/_index.segment.rsc +11 -11
  147. package/.next/standalone/apps/web/.next/server/app/chat.segments/_tree.segment.rsc +1 -1
  148. package/.next/standalone/apps/web/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +3 -3
  149. package/.next/standalone/apps/web/.next/server/app/chat.segments/chat.segment.rsc +3 -3
  150. package/.next/standalone/apps/web/.next/server/app/data/page_client-reference-manifest.js +1 -1
  151. package/.next/standalone/apps/web/.next/server/app/data.html +1 -1
  152. package/.next/standalone/apps/web/.next/server/app/data.rsc +17 -17
  153. package/.next/standalone/apps/web/.next/server/app/data.segments/_full.segment.rsc +17 -17
  154. package/.next/standalone/apps/web/.next/server/app/data.segments/_head.segment.rsc +4 -4
  155. package/.next/standalone/apps/web/.next/server/app/data.segments/_index.segment.rsc +11 -11
  156. package/.next/standalone/apps/web/.next/server/app/data.segments/_tree.segment.rsc +1 -1
  157. package/.next/standalone/apps/web/.next/server/app/data.segments/data/__PAGE__.segment.rsc +3 -3
  158. package/.next/standalone/apps/web/.next/server/app/data.segments/data.segment.rsc +3 -3
  159. package/.next/standalone/apps/web/.next/server/app/index.html +1 -1
  160. package/.next/standalone/apps/web/.next/server/app/index.rsc +16 -16
  161. package/.next/standalone/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  162. package/.next/standalone/apps/web/.next/server/app/index.segments/_full.segment.rsc +16 -16
  163. package/.next/standalone/apps/web/.next/server/app/index.segments/_head.segment.rsc +4 -4
  164. package/.next/standalone/apps/web/.next/server/app/index.segments/_index.segment.rsc +11 -11
  165. package/.next/standalone/apps/web/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  166. package/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  167. package/.next/standalone/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  168. package/.next/standalone/apps/web/.next/server/app/settings.html +1 -1
  169. package/.next/standalone/apps/web/.next/server/app/settings.rsc +18 -18
  170. package/.next/standalone/apps/web/.next/server/app/settings.segments/_full.segment.rsc +18 -18
  171. package/.next/standalone/apps/web/.next/server/app/settings.segments/_head.segment.rsc +4 -4
  172. package/.next/standalone/apps/web/.next/server/app/settings.segments/_index.segment.rsc +11 -11
  173. package/.next/standalone/apps/web/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  174. package/.next/standalone/apps/web/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
  175. package/.next/standalone/apps/web/.next/server/app/settings.segments/settings.segment.rsc +3 -3
  176. package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__05707i3._.js +1 -1
  177. package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__0vmcld0._.js +3 -0
  178. package/.next/{server/chunks/[root-of-the-server]__08f60c7._.js → standalone/apps/web/.next/server/chunks/[root-of-the-server]__1e8p5bd._.js} +2 -2
  179. package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__1ks-3_h._.js +3 -0
  180. package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__1lhfkyh._.js +1 -1
  181. package/.next/standalone/apps/web/.next/server/chunks/packages_marketplace_src_125_g2p._.js +1 -1
  182. package/.next/standalone/apps/web/.next/server/chunks/packages_scraper_src_0kkcv_v._.js +1 -1
  183. package/.next/standalone/apps/web/.next/server/chunks/packages_tools_video-audio_dist_ffmpeg-spawn_0by2bau.js +3 -0
  184. package/.next/standalone/apps/web/.next/server/chunks/ssr/_1yqlx1m._.js +1 -1
  185. package/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +3 -3
  186. package/.next/standalone/apps/web/.next/server/pages/404.html +1 -1
  187. package/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
  188. package/.next/standalone/apps/web/.next/static/chunks/{0wy4vhj2gft06.js → 2azppfcsqga3r.js} +1 -1
  189. package/.next/standalone/apps/web/CHANGELOG.md +9 -0
  190. package/.next/standalone/apps/web/components/update-banner.tsx +2 -2
  191. package/.next/standalone/apps/web/package.json +1 -1
  192. package/.next/standalone/apps/web/server.js +1 -1
  193. package/.next/standalone/packages/tools/video-audio/CHANGELOG.md +6 -0
  194. package/.next/standalone/packages/tools/video-audio/dist/audio-processor.js +30 -32
  195. package/.next/standalone/packages/tools/video-audio/dist/ffmpeg-spawn.js +127 -0
  196. package/.next/standalone/packages/tools/video-audio/dist/video-processor.js +95 -113
  197. package/.next/standalone/packages/tools/video-audio/package.json +2 -7
  198. package/.next/standalone/packages/tools/video-audio/src/audio-processor.ts +30 -31
  199. package/.next/standalone/packages/tools/video-audio/src/ffmpeg-spawn.ts +176 -0
  200. package/.next/standalone/packages/tools/video-audio/src/video-processor.ts +88 -116
  201. package/.next/static/chunks/{0wy4vhj2gft06.js → 2azppfcsqga3r.js} +1 -1
  202. package/CHANGELOG.md +9 -0
  203. package/LICENSE +176 -0
  204. package/components/update-banner.tsx +2 -2
  205. package/package.json +4 -4
  206. package/.next/server/chunks/[externals]__1_tvo45._.js +0 -3
  207. package/.next/server/chunks/[root-of-the-server]__010rwkn._.js +0 -3
  208. package/.next/server/chunks/[root-of-the-server]__0xbvdcw._.js +0 -3
  209. package/.next/server/chunks/node_modules__pnpm_0ddqx71._.js +0 -3
  210. package/.next/standalone/apps/web/.next/server/chunks/[externals]__1_tvo45._.js +0 -3
  211. package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__010rwkn._.js +0 -3
  212. package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__0xbvdcw._.js +0 -3
  213. package/.next/standalone/apps/web/.next/server/chunks/node_modules__pnpm_0ddqx71._.js +0 -3
  214. package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/capabilities.js +0 -665
  215. package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/ffprobe.js +0 -261
  216. package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/fluent-ffmpeg.js +0 -226
  217. package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/options/audio.js +0 -178
  218. package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/options/custom.js +0 -212
  219. package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/options/inputs.js +0 -178
  220. package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/options/misc.js +0 -41
  221. package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/options/output.js +0 -162
  222. package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/options/video.js +0 -184
  223. package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/options/videosize.js +0 -291
  224. package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/presets/divx.js +0 -14
  225. package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/presets/flashvideo.js +0 -16
  226. package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/presets/podcast.js +0 -16
  227. package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/processor.js +0 -662
  228. package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/recipes.js +0 -456
  229. package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/utils.js +0 -455
  230. package/.next/standalone/node_modules/.pnpm/which@1.3.1/node_modules/which/CHANGELOG.md +0 -152
  231. package/.next/standalone/node_modules/.pnpm/which@1.3.1/node_modules/which/LICENSE +0 -15
  232. package/.next/standalone/node_modules/.pnpm/which@1.3.1/node_modules/which/README.md +0 -51
  233. package/.next/standalone/node_modules/.pnpm/which@1.3.1/node_modules/which/bin/which +0 -52
  234. package/.next/standalone/node_modules/.pnpm/which@1.3.1/node_modules/which/package.json +0 -30
  235. package/.next/standalone/node_modules/.pnpm/which@1.3.1/node_modules/which/which.js +0 -135
  236. /package/.next/standalone/apps/web/.next/static/{HU74sZ8oKr0VlhdDfm98x → PM7-3u8cSkShjD80zaJ4l}/_buildManifest.js +0 -0
  237. /package/.next/standalone/apps/web/.next/static/{HU74sZ8oKr0VlhdDfm98x → PM7-3u8cSkShjD80zaJ4l}/_clientMiddlewareManifest.js +0 -0
  238. /package/.next/standalone/apps/web/.next/static/{HU74sZ8oKr0VlhdDfm98x → PM7-3u8cSkShjD80zaJ4l}/_ssgManifest.js +0 -0
  239. /package/.next/static/{HU74sZ8oKr0VlhdDfm98x → PM7-3u8cSkShjD80zaJ4l}/_buildManifest.js +0 -0
  240. /package/.next/static/{HU74sZ8oKr0VlhdDfm98x → PM7-3u8cSkShjD80zaJ4l}/_clientMiddlewareManifest.js +0 -0
  241. /package/.next/static/{HU74sZ8oKr0VlhdDfm98x → PM7-3u8cSkShjD80zaJ4l}/_ssgManifest.js +0 -0
@@ -1,261 +0,0 @@
1
- /*jshint node:true, laxcomma:true*/
2
- 'use strict';
3
-
4
- var spawn = require('child_process').spawn;
5
-
6
-
7
- function legacyTag(key) { return key.match(/^TAG:/); }
8
- function legacyDisposition(key) { return key.match(/^DISPOSITION:/); }
9
-
10
- function parseFfprobeOutput(out) {
11
- var lines = out.split(/\r\n|\r|\n/);
12
-
13
- lines = lines.filter(function (line) {
14
- return line.length > 0;
15
- });
16
-
17
- var data = {
18
- streams: [],
19
- format: {},
20
- chapters: []
21
- };
22
-
23
- function parseBlock(name) {
24
- var data = {};
25
-
26
- var line = lines.shift();
27
- while (typeof line !== 'undefined') {
28
- if (line.toLowerCase() == '[/'+name+']') {
29
- return data;
30
- } else if (line.match(/^\[/)) {
31
- line = lines.shift();
32
- continue;
33
- }
34
-
35
- var kv = line.match(/^([^=]+)=(.*)$/);
36
- if (kv) {
37
- if (!(kv[1].match(/^TAG:/)) && kv[2].match(/^[0-9]+(\.[0-9]+)?$/)) {
38
- data[kv[1]] = Number(kv[2]);
39
- } else {
40
- data[kv[1]] = kv[2];
41
- }
42
- }
43
-
44
- line = lines.shift();
45
- }
46
-
47
- return data;
48
- }
49
-
50
- var line = lines.shift();
51
- while (typeof line !== 'undefined') {
52
- if (line.match(/^\[stream/i)) {
53
- var stream = parseBlock('stream');
54
- data.streams.push(stream);
55
- } else if (line.match(/^\[chapter/i)) {
56
- var chapter = parseBlock('chapter');
57
- data.chapters.push(chapter);
58
- } else if (line.toLowerCase() === '[format]') {
59
- data.format = parseBlock('format');
60
- }
61
-
62
- line = lines.shift();
63
- }
64
-
65
- return data;
66
- }
67
-
68
-
69
-
70
- module.exports = function(proto) {
71
- /**
72
- * A callback passed to the {@link FfmpegCommand#ffprobe} method.
73
- *
74
- * @callback FfmpegCommand~ffprobeCallback
75
- *
76
- * @param {Error|null} err error object or null if no error happened
77
- * @param {Object} ffprobeData ffprobe output data; this object
78
- * has the same format as what the following command returns:
79
- *
80
- * `ffprobe -print_format json -show_streams -show_format INPUTFILE`
81
- * @param {Array} ffprobeData.streams stream information
82
- * @param {Object} ffprobeData.format format information
83
- */
84
-
85
- /**
86
- * Run ffprobe on last specified input
87
- *
88
- * @method FfmpegCommand#ffprobe
89
- * @category Metadata
90
- *
91
- * @param {?Number} [index] 0-based index of input to probe (defaults to last input)
92
- * @param {?String[]} [options] array of output options to return
93
- * @param {FfmpegCommand~ffprobeCallback} callback callback function
94
- *
95
- */
96
- proto.ffprobe = function() {
97
- var input, index = null, options = [], callback;
98
-
99
- // the last argument should be the callback
100
- var callback = arguments[arguments.length - 1];
101
-
102
- var ended = false
103
- function handleCallback(err, data) {
104
- if (!ended) {
105
- ended = true;
106
- callback(err, data);
107
- }
108
- };
109
-
110
- // map the arguments to the correct variable names
111
- switch (arguments.length) {
112
- case 3:
113
- index = arguments[0];
114
- options = arguments[1];
115
- break;
116
- case 2:
117
- if (typeof arguments[0] === 'number') {
118
- index = arguments[0];
119
- } else if (Array.isArray(arguments[0])) {
120
- options = arguments[0];
121
- }
122
- break;
123
- }
124
-
125
-
126
- if (index === null) {
127
- if (!this._currentInput) {
128
- return handleCallback(new Error('No input specified'));
129
- }
130
-
131
- input = this._currentInput;
132
- } else {
133
- input = this._inputs[index];
134
-
135
- if (!input) {
136
- return handleCallback(new Error('Invalid input index'));
137
- }
138
- }
139
-
140
- // Find ffprobe
141
- this._getFfprobePath(function(err, path) {
142
- if (err) {
143
- return handleCallback(err);
144
- } else if (!path) {
145
- return handleCallback(new Error('Cannot find ffprobe'));
146
- }
147
-
148
- var stdout = '';
149
- var stdoutClosed = false;
150
- var stderr = '';
151
- var stderrClosed = false;
152
-
153
- // Spawn ffprobe
154
- var src = input.isStream ? 'pipe:0' : input.source;
155
- var ffprobe = spawn(path, ['-show_streams', '-show_format'].concat(options, src), {windowsHide: true});
156
-
157
- if (input.isStream) {
158
- // Skip errors on stdin. These get thrown when ffprobe is complete and
159
- // there seems to be no way hook in and close stdin before it throws.
160
- ffprobe.stdin.on('error', function(err) {
161
- if (['ECONNRESET', 'EPIPE', 'EOF'].indexOf(err.code) >= 0) { return; }
162
- handleCallback(err);
163
- });
164
-
165
- // Once ffprobe's input stream closes, we need no more data from the
166
- // input
167
- ffprobe.stdin.on('close', function() {
168
- input.source.pause();
169
- input.source.unpipe(ffprobe.stdin);
170
- });
171
-
172
- input.source.pipe(ffprobe.stdin);
173
- }
174
-
175
- ffprobe.on('error', callback);
176
-
177
- // Ensure we wait for captured streams to end before calling callback
178
- var exitError = null;
179
- function handleExit(err) {
180
- if (err) {
181
- exitError = err;
182
- }
183
-
184
- if (processExited && stdoutClosed && stderrClosed) {
185
- if (exitError) {
186
- if (stderr) {
187
- exitError.message += '\n' + stderr;
188
- }
189
-
190
- return handleCallback(exitError);
191
- }
192
-
193
- // Process output
194
- var data = parseFfprobeOutput(stdout);
195
-
196
- // Handle legacy output with "TAG:x" and "DISPOSITION:x" keys
197
- [data.format].concat(data.streams).forEach(function(target) {
198
- if (target) {
199
- var legacyTagKeys = Object.keys(target).filter(legacyTag);
200
-
201
- if (legacyTagKeys.length) {
202
- target.tags = target.tags || {};
203
-
204
- legacyTagKeys.forEach(function(tagKey) {
205
- target.tags[tagKey.substr(4)] = target[tagKey];
206
- delete target[tagKey];
207
- });
208
- }
209
-
210
- var legacyDispositionKeys = Object.keys(target).filter(legacyDisposition);
211
-
212
- if (legacyDispositionKeys.length) {
213
- target.disposition = target.disposition || {};
214
-
215
- legacyDispositionKeys.forEach(function(dispositionKey) {
216
- target.disposition[dispositionKey.substr(12)] = target[dispositionKey];
217
- delete target[dispositionKey];
218
- });
219
- }
220
- }
221
- });
222
-
223
- handleCallback(null, data);
224
- }
225
- }
226
-
227
- // Handle ffprobe exit
228
- var processExited = false;
229
- ffprobe.on('exit', function(code, signal) {
230
- processExited = true;
231
-
232
- if (code) {
233
- handleExit(new Error('ffprobe exited with code ' + code));
234
- } else if (signal) {
235
- handleExit(new Error('ffprobe was killed with signal ' + signal));
236
- } else {
237
- handleExit();
238
- }
239
- });
240
-
241
- // Handle stdout/stderr streams
242
- ffprobe.stdout.on('data', function(data) {
243
- stdout += data;
244
- });
245
-
246
- ffprobe.stdout.on('close', function() {
247
- stdoutClosed = true;
248
- handleExit();
249
- });
250
-
251
- ffprobe.stderr.on('data', function(data) {
252
- stderr += data;
253
- });
254
-
255
- ffprobe.stderr.on('close', function() {
256
- stderrClosed = true;
257
- handleExit();
258
- });
259
- });
260
- };
261
- };
@@ -1,226 +0,0 @@
1
- /*jshint node:true*/
2
- 'use strict';
3
-
4
- var path = require('path');
5
- var util = require('util');
6
- var EventEmitter = require('events').EventEmitter;
7
-
8
- var utils = require('./utils');
9
- var ARGLISTS = ['_global', '_audio', '_audioFilters', '_video', '_videoFilters', '_sizeFilters', '_complexFilters'];
10
-
11
-
12
- /**
13
- * Create an ffmpeg command
14
- *
15
- * Can be called with or without the 'new' operator, and the 'input' parameter
16
- * may be specified as 'options.source' instead (or passed later with the
17
- * addInput method).
18
- *
19
- * @constructor
20
- * @param {String|ReadableStream} [input] input file path or readable stream
21
- * @param {Object} [options] command options
22
- * @param {Object} [options.logger=<no logging>] logger object with 'error', 'warning', 'info' and 'debug' methods
23
- * @param {Number} [options.niceness=0] ffmpeg process niceness, ignored on Windows
24
- * @param {Number} [options.priority=0] alias for `niceness`
25
- * @param {String} [options.presets="fluent-ffmpeg/lib/presets"] directory to load presets from
26
- * @param {String} [options.preset="fluent-ffmpeg/lib/presets"] alias for `presets`
27
- * @param {String} [options.stdoutLines=100] maximum lines of ffmpeg output to keep in memory, use 0 for unlimited
28
- * @param {Number} [options.timeout=<no timeout>] ffmpeg processing timeout in seconds
29
- * @param {String|ReadableStream} [options.source=<no input>] alias for the `input` parameter
30
- */
31
- function FfmpegCommand(input, options) {
32
- // Make 'new' optional
33
- if (!(this instanceof FfmpegCommand)) {
34
- return new FfmpegCommand(input, options);
35
- }
36
-
37
- EventEmitter.call(this);
38
-
39
- if (typeof input === 'object' && !('readable' in input)) {
40
- // Options object passed directly
41
- options = input;
42
- } else {
43
- // Input passed first
44
- options = options || {};
45
- options.source = input;
46
- }
47
-
48
- // Add input if present
49
- this._inputs = [];
50
- if (options.source) {
51
- this.input(options.source);
52
- }
53
-
54
- // Add target-less output for backwards compatibility
55
- this._outputs = [];
56
- this.output();
57
-
58
- // Create argument lists
59
- var self = this;
60
- ['_global', '_complexFilters'].forEach(function(prop) {
61
- self[prop] = utils.args();
62
- });
63
-
64
- // Set default option values
65
- options.stdoutLines = 'stdoutLines' in options ? options.stdoutLines : 100;
66
- options.presets = options.presets || options.preset || path.join(__dirname, 'presets');
67
- options.niceness = options.niceness || options.priority || 0;
68
-
69
- // Save options
70
- this.options = options;
71
-
72
- // Setup logger
73
- this.logger = options.logger || {
74
- debug: function() {},
75
- info: function() {},
76
- warn: function() {},
77
- error: function() {}
78
- };
79
- }
80
- util.inherits(FfmpegCommand, EventEmitter);
81
- module.exports = FfmpegCommand;
82
-
83
-
84
- /**
85
- * Clone an ffmpeg command
86
- *
87
- * This method is useful when you want to process the same input multiple times.
88
- * It returns a new FfmpegCommand instance with the exact same options.
89
- *
90
- * All options set _after_ the clone() call will only be applied to the instance
91
- * it has been called on.
92
- *
93
- * @example
94
- * var command = ffmpeg('/path/to/source.avi')
95
- * .audioCodec('libfaac')
96
- * .videoCodec('libx264')
97
- * .format('mp4');
98
- *
99
- * command.clone()
100
- * .size('320x200')
101
- * .save('/path/to/output-small.mp4');
102
- *
103
- * command.clone()
104
- * .size('640x400')
105
- * .save('/path/to/output-medium.mp4');
106
- *
107
- * command.save('/path/to/output-original-size.mp4');
108
- *
109
- * @method FfmpegCommand#clone
110
- * @return FfmpegCommand
111
- */
112
- FfmpegCommand.prototype.clone = function() {
113
- var clone = new FfmpegCommand();
114
- var self = this;
115
-
116
- // Clone options and logger
117
- clone.options = this.options;
118
- clone.logger = this.logger;
119
-
120
- // Clone inputs
121
- clone._inputs = this._inputs.map(function(input) {
122
- return {
123
- source: input.source,
124
- options: input.options.clone()
125
- };
126
- });
127
-
128
- // Create first output
129
- if ('target' in this._outputs[0]) {
130
- // We have outputs set, don't clone them and create first output
131
- clone._outputs = [];
132
- clone.output();
133
- } else {
134
- // No outputs set, clone first output options
135
- clone._outputs = [
136
- clone._currentOutput = {
137
- flags: {}
138
- }
139
- ];
140
-
141
- ['audio', 'audioFilters', 'video', 'videoFilters', 'sizeFilters', 'options'].forEach(function(key) {
142
- clone._currentOutput[key] = self._currentOutput[key].clone();
143
- });
144
-
145
- if (this._currentOutput.sizeData) {
146
- clone._currentOutput.sizeData = {};
147
- utils.copy(this._currentOutput.sizeData, clone._currentOutput.sizeData);
148
- }
149
-
150
- utils.copy(this._currentOutput.flags, clone._currentOutput.flags);
151
- }
152
-
153
- // Clone argument lists
154
- ['_global', '_complexFilters'].forEach(function(prop) {
155
- clone[prop] = self[prop].clone();
156
- });
157
-
158
- return clone;
159
- };
160
-
161
-
162
- /* Add methods from options submodules */
163
-
164
- require('./options/inputs')(FfmpegCommand.prototype);
165
- require('./options/audio')(FfmpegCommand.prototype);
166
- require('./options/video')(FfmpegCommand.prototype);
167
- require('./options/videosize')(FfmpegCommand.prototype);
168
- require('./options/output')(FfmpegCommand.prototype);
169
- require('./options/custom')(FfmpegCommand.prototype);
170
- require('./options/misc')(FfmpegCommand.prototype);
171
-
172
-
173
- /* Add processor methods */
174
-
175
- require('./processor')(FfmpegCommand.prototype);
176
-
177
-
178
- /* Add capabilities methods */
179
-
180
- require('./capabilities')(FfmpegCommand.prototype);
181
-
182
- FfmpegCommand.setFfmpegPath = function(path) {
183
- (new FfmpegCommand()).setFfmpegPath(path);
184
- };
185
-
186
- FfmpegCommand.setFfprobePath = function(path) {
187
- (new FfmpegCommand()).setFfprobePath(path);
188
- };
189
-
190
- FfmpegCommand.setFlvtoolPath = function(path) {
191
- (new FfmpegCommand()).setFlvtoolPath(path);
192
- };
193
-
194
- FfmpegCommand.availableFilters =
195
- FfmpegCommand.getAvailableFilters = function(callback) {
196
- (new FfmpegCommand()).availableFilters(callback);
197
- };
198
-
199
- FfmpegCommand.availableCodecs =
200
- FfmpegCommand.getAvailableCodecs = function(callback) {
201
- (new FfmpegCommand()).availableCodecs(callback);
202
- };
203
-
204
- FfmpegCommand.availableFormats =
205
- FfmpegCommand.getAvailableFormats = function(callback) {
206
- (new FfmpegCommand()).availableFormats(callback);
207
- };
208
-
209
- FfmpegCommand.availableEncoders =
210
- FfmpegCommand.getAvailableEncoders = function(callback) {
211
- (new FfmpegCommand()).availableEncoders(callback);
212
- };
213
-
214
-
215
- /* Add ffprobe methods */
216
-
217
- require('./ffprobe')(FfmpegCommand.prototype);
218
-
219
- FfmpegCommand.ffprobe = function(file) {
220
- var instance = new FfmpegCommand(file);
221
- instance.ffprobe.apply(instance, Array.prototype.slice.call(arguments, 1));
222
- };
223
-
224
- /* Add processing recipes */
225
-
226
- require('./recipes')(FfmpegCommand.prototype);
@@ -1,178 +0,0 @@
1
- /*jshint node:true*/
2
- 'use strict';
3
-
4
- var utils = require('../utils');
5
-
6
-
7
- /*
8
- *! Audio-related methods
9
- */
10
-
11
- module.exports = function(proto) {
12
- /**
13
- * Disable audio in the output
14
- *
15
- * @method FfmpegCommand#noAudio
16
- * @category Audio
17
- * @aliases withNoAudio
18
- * @return FfmpegCommand
19
- */
20
- proto.withNoAudio =
21
- proto.noAudio = function() {
22
- this._currentOutput.audio.clear();
23
- this._currentOutput.audioFilters.clear();
24
- this._currentOutput.audio('-an');
25
-
26
- return this;
27
- };
28
-
29
-
30
- /**
31
- * Specify audio codec
32
- *
33
- * @method FfmpegCommand#audioCodec
34
- * @category Audio
35
- * @aliases withAudioCodec
36
- *
37
- * @param {String} codec audio codec name
38
- * @return FfmpegCommand
39
- */
40
- proto.withAudioCodec =
41
- proto.audioCodec = function(codec) {
42
- this._currentOutput.audio('-acodec', codec);
43
-
44
- return this;
45
- };
46
-
47
-
48
- /**
49
- * Specify audio bitrate
50
- *
51
- * @method FfmpegCommand#audioBitrate
52
- * @category Audio
53
- * @aliases withAudioBitrate
54
- *
55
- * @param {String|Number} bitrate audio bitrate in kbps (with an optional 'k' suffix)
56
- * @return FfmpegCommand
57
- */
58
- proto.withAudioBitrate =
59
- proto.audioBitrate = function(bitrate) {
60
- this._currentOutput.audio('-b:a', ('' + bitrate).replace(/k?$/, 'k'));
61
- return this;
62
- };
63
-
64
-
65
- /**
66
- * Specify audio channel count
67
- *
68
- * @method FfmpegCommand#audioChannels
69
- * @category Audio
70
- * @aliases withAudioChannels
71
- *
72
- * @param {Number} channels channel count
73
- * @return FfmpegCommand
74
- */
75
- proto.withAudioChannels =
76
- proto.audioChannels = function(channels) {
77
- this._currentOutput.audio('-ac', channels);
78
- return this;
79
- };
80
-
81
-
82
- /**
83
- * Specify audio frequency
84
- *
85
- * @method FfmpegCommand#audioFrequency
86
- * @category Audio
87
- * @aliases withAudioFrequency
88
- *
89
- * @param {Number} freq audio frequency in Hz
90
- * @return FfmpegCommand
91
- */
92
- proto.withAudioFrequency =
93
- proto.audioFrequency = function(freq) {
94
- this._currentOutput.audio('-ar', freq);
95
- return this;
96
- };
97
-
98
-
99
- /**
100
- * Specify audio quality
101
- *
102
- * @method FfmpegCommand#audioQuality
103
- * @category Audio
104
- * @aliases withAudioQuality
105
- *
106
- * @param {Number} quality audio quality factor
107
- * @return FfmpegCommand
108
- */
109
- proto.withAudioQuality =
110
- proto.audioQuality = function(quality) {
111
- this._currentOutput.audio('-aq', quality);
112
- return this;
113
- };
114
-
115
-
116
- /**
117
- * Specify custom audio filter(s)
118
- *
119
- * Can be called both with one or many filters, or a filter array.
120
- *
121
- * @example
122
- * command.audioFilters('filter1');
123
- *
124
- * @example
125
- * command.audioFilters('filter1', 'filter2=param1=value1:param2=value2');
126
- *
127
- * @example
128
- * command.audioFilters(['filter1', 'filter2']);
129
- *
130
- * @example
131
- * command.audioFilters([
132
- * {
133
- * filter: 'filter1'
134
- * },
135
- * {
136
- * filter: 'filter2',
137
- * options: 'param=value:param=value'
138
- * }
139
- * ]);
140
- *
141
- * @example
142
- * command.audioFilters(
143
- * {
144
- * filter: 'filter1',
145
- * options: ['value1', 'value2']
146
- * },
147
- * {
148
- * filter: 'filter2',
149
- * options: { param1: 'value1', param2: 'value2' }
150
- * }
151
- * );
152
- *
153
- * @method FfmpegCommand#audioFilters
154
- * @aliases withAudioFilter,withAudioFilters,audioFilter
155
- * @category Audio
156
- *
157
- * @param {...String|String[]|Object[]} filters audio filter strings, string array or
158
- * filter specification array, each with the following properties:
159
- * @param {String} filters.filter filter name
160
- * @param {String|String[]|Object} [filters.options] filter option string, array, or object
161
- * @return FfmpegCommand
162
- */
163
- proto.withAudioFilter =
164
- proto.withAudioFilters =
165
- proto.audioFilter =
166
- proto.audioFilters = function(filters) {
167
- if (arguments.length > 1) {
168
- filters = [].slice.call(arguments);
169
- }
170
-
171
- if (!Array.isArray(filters)) {
172
- filters = [filters];
173
- }
174
-
175
- this._currentOutput.audioFilters(utils.makeFilterStrings(filters));
176
- return this;
177
- };
178
- };