@koda-sl/baker-cli 0.564.0 → 0.565.0
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.
- package/README.md +1 -0
- package/dist/{ads-HDU7GLOZ.js → ads-MNHPQA4T.js} +5 -5
- package/dist/{analytics-WEHKIKPT.js → analytics-WLPHLFT7.js} +5 -5
- package/dist/{avatars-CFPVQQHB.js → avatars-GZI5KOQN.js} +1 -1
- package/dist/{brief-2ZCKOD2B.js → brief-T7YTJI3B.js} +5 -5
- package/dist/{canvas-HEZLAGL7.js → canvas-Y4QY5XGG.js} +4 -4
- package/dist/{chatgpt-HLIQ7OJZ.js → chatgpt-ZI4GWP6S.js} +2 -2
- package/dist/{chunk-F62BW6DJ.js → chunk-IWNLW7ZC.js} +4 -4
- package/dist/{chunk-7YOCZ27T.js → chunk-LVDYB7RO.js} +6 -6
- package/dist/{chunk-7KLTVL4J.js → chunk-LWYTFXJG.js} +4 -4
- package/dist/{chunk-Q4VZZYMR.js → chunk-XOC5F52C.js} +2 -2
- package/dist/cli.js +16 -16
- package/dist/{conversions-A524MH5C.js → conversions-QZJRF4WN.js} +1 -1
- package/dist/{creatives-FEVOUC2R.js → creatives-URDL6XUQ.js} +4 -4
- package/dist/{find-57WYB4V3.js → find-UGFONLSD.js} +4 -4
- package/dist/{ga4-FCMTGV4S.js → ga4-YVKA3V4V.js} +1 -1
- package/dist/{google-Y4IDMDA4.js → google-UVRF4POY.js} +5 -5
- package/dist/{gsc-A3KB36WH.js → gsc-OJDMSP6H.js} +1 -1
- package/dist/{icon-7WND6UPY.js → icon-THWS5VPO.js} +4 -4
- package/dist/{images-SCTL5MTZ.js → images-7WZM4I6K.js} +6 -6
- package/dist/{inspiration-TQHQNILK.js → inspiration-FPB3IB7X.js} +1 -1
- package/dist/{landing-IAPJPFFW.js → landing-TTKIW7CQ.js} +2 -2
- package/dist/{linkedin-VC2YF6OF.js → linkedin-WB73GQ7E.js} +1 -1
- package/dist/{logo-ODONF6N7.js → logo-ZSSR66WS.js} +3 -3
- package/dist/{make-4QQXDW3F.js → make-ALUBF2U7.js} +17 -17
- package/dist/{media-sources-AI6JDWZD.js → media-sources-5ECRCDXJ.js} +1 -1
- package/dist/{meta-5KQ6CQBT.js → meta-5TRG7RTQ.js} +3 -1
- package/dist/{meta-5KQ6CQBT.js.map → meta-5TRG7RTQ.js.map} +1 -1
- package/dist/{posts-TRQCRLYZ.js → posts-F327IP23.js} +1 -1
- package/dist/{rerun-QGCY5TRB.js → rerun-4SVR7QGC.js} +7 -7
- package/dist/{research-5AO6DRY5.js → research-VPONEQYW.js} +1 -1
- package/dist/{run-5PRW3VXO.js → run-5XN3VZTK.js} +7 -7
- package/dist/{scaffold-static-ad-DULWCCZW.js → scaffold-static-ad-5AWGI5QC.js} +20 -20
- package/dist/{sources-QSKRDIT5.js → sources-FZZRJTQV.js} +1 -1
- package/dist/{stock-WBNGQUZT.js → stock-WEY6RYKP.js} +5 -5
- package/dist/{studio-ZRAZ2C25.js → studio-D2OMFCZZ.js} +1 -1
- package/dist/{testimonials-UOVGKW23.js → testimonials-M4GVNUI7.js} +2 -2
- package/dist/{translate-IXHJUXWD.js → translate-ETC6UFI6.js} +4 -4
- package/dist/{videos-HROOMEHA.js → videos-HBQGC3G6.js} +1 -1
- package/dist/videos-NITQKILV.js +146 -0
- package/dist/videos-NITQKILV.js.map +1 -0
- package/dist/{winning-ads-ZEVLZPOA.js → winning-ads-RIZANJER.js} +1 -1
- package/dist/{x-5OJJOFRB.js → x-WNZNCXG3.js} +1 -1
- package/package.json +1 -1
- /package/dist/{ads-HDU7GLOZ.js.map → ads-MNHPQA4T.js.map} +0 -0
- /package/dist/{analytics-WEHKIKPT.js.map → analytics-WLPHLFT7.js.map} +0 -0
- /package/dist/{avatars-CFPVQQHB.js.map → avatars-GZI5KOQN.js.map} +0 -0
- /package/dist/{brief-2ZCKOD2B.js.map → brief-T7YTJI3B.js.map} +0 -0
- /package/dist/{canvas-HEZLAGL7.js.map → canvas-Y4QY5XGG.js.map} +0 -0
- /package/dist/{chatgpt-HLIQ7OJZ.js.map → chatgpt-ZI4GWP6S.js.map} +0 -0
- /package/dist/{chunk-F62BW6DJ.js.map → chunk-IWNLW7ZC.js.map} +0 -0
- /package/dist/{chunk-7YOCZ27T.js.map → chunk-LVDYB7RO.js.map} +0 -0
- /package/dist/{chunk-7KLTVL4J.js.map → chunk-LWYTFXJG.js.map} +0 -0
- /package/dist/{chunk-Q4VZZYMR.js.map → chunk-XOC5F52C.js.map} +0 -0
- /package/dist/{conversions-A524MH5C.js.map → conversions-QZJRF4WN.js.map} +0 -0
- /package/dist/{creatives-FEVOUC2R.js.map → creatives-URDL6XUQ.js.map} +0 -0
- /package/dist/{find-57WYB4V3.js.map → find-UGFONLSD.js.map} +0 -0
- /package/dist/{ga4-FCMTGV4S.js.map → ga4-YVKA3V4V.js.map} +0 -0
- /package/dist/{google-Y4IDMDA4.js.map → google-UVRF4POY.js.map} +0 -0
- /package/dist/{gsc-A3KB36WH.js.map → gsc-OJDMSP6H.js.map} +0 -0
- /package/dist/{icon-7WND6UPY.js.map → icon-THWS5VPO.js.map} +0 -0
- /package/dist/{images-SCTL5MTZ.js.map → images-7WZM4I6K.js.map} +0 -0
- /package/dist/{inspiration-TQHQNILK.js.map → inspiration-FPB3IB7X.js.map} +0 -0
- /package/dist/{landing-IAPJPFFW.js.map → landing-TTKIW7CQ.js.map} +0 -0
- /package/dist/{linkedin-VC2YF6OF.js.map → linkedin-WB73GQ7E.js.map} +0 -0
- /package/dist/{logo-ODONF6N7.js.map → logo-ZSSR66WS.js.map} +0 -0
- /package/dist/{make-4QQXDW3F.js.map → make-ALUBF2U7.js.map} +0 -0
- /package/dist/{media-sources-AI6JDWZD.js.map → media-sources-5ECRCDXJ.js.map} +0 -0
- /package/dist/{posts-TRQCRLYZ.js.map → posts-F327IP23.js.map} +0 -0
- /package/dist/{rerun-QGCY5TRB.js.map → rerun-4SVR7QGC.js.map} +0 -0
- /package/dist/{research-5AO6DRY5.js.map → research-VPONEQYW.js.map} +0 -0
- /package/dist/{run-5PRW3VXO.js.map → run-5XN3VZTK.js.map} +0 -0
- /package/dist/{scaffold-static-ad-DULWCCZW.js.map → scaffold-static-ad-5AWGI5QC.js.map} +0 -0
- /package/dist/{sources-QSKRDIT5.js.map → sources-FZZRJTQV.js.map} +0 -0
- /package/dist/{stock-WBNGQUZT.js.map → stock-WEY6RYKP.js.map} +0 -0
- /package/dist/{studio-ZRAZ2C25.js.map → studio-D2OMFCZZ.js.map} +0 -0
- /package/dist/{testimonials-UOVGKW23.js.map → testimonials-M4GVNUI7.js.map} +0 -0
- /package/dist/{translate-IXHJUXWD.js.map → translate-ETC6UFI6.js.map} +0 -0
- /package/dist/{videos-HROOMEHA.js.map → videos-HBQGC3G6.js.map} +0 -0
- /package/dist/{winning-ads-ZEVLZPOA.js.map → winning-ads-RIZANJER.js.map} +0 -0
- /package/dist/{x-5OJJOFRB.js.map → x-WNZNCXG3.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/ads/meta/index.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\n\n/**\n * Meta Ads command surface — curated for AI agents, not 1:1 with the Marketing API.\n *\n * Every backend read route has a command except `/currency`: `account` already\n * returns the currency and time zone, so a second command for two of its\n * fields would only be a second place to look.\n *\n * Default behaviors that matter:\n * - Listings (campaigns/adsets/ads) filter to ACTIVE — pass --all-statuses to widen.\n * - Insights filter out non-delivered rows (impressions=0) and sort by spend desc.\n * - Insights pick a smart field bundle via --intent (baseline|revenue|funnel|ranking|video|identity).\n * - Heavy insights queries auto-fall to async (poll loop hidden).\n * - Attribution defaults to 7d_click,1d_view — the only windows still working as of Jan 2026.\n */\nexport const metaCommand = defineCommand({\n meta: {\n name: \"meta\",\n description: `Meta Marketing API — AI-first command surface (Facebook + Instagram ads).\n\nDiscovery:\n baker ads meta accounts — accounts in this company's connected scope\n baker ads meta businesses — Business Manager IDs\n baker ads meta pages — Facebook Pages the selected ad accounts can promote (an ad's identity)\n baker ads meta lead-forms --page-id 100635183117758 — instant (lead) forms on a Page, with lead counts\n baker ads meta lead-forms create --account-id act_123 --page-id 555 --file form.json — stage a new form\n baker ads meta leads --form-id 987654321 — the leads one form collected (contact details masked)\n\nSnapshot a running account (default = ACTIVE only):\n baker ads meta campaigns --account-id act_123\n baker ads meta adsets --campaign-id 6123\n baker ads meta ads --adset-id 6123\n baker ads meta campaigns --account-id act_123 --all-statuses — include paused, archived\n\nBuild targeting (Meta takes ids, never names — look them up first):\n baker ads meta targeting search --account-id act_123 --q \"solar energy\" — interest/behavior/employer… ids\n baker ads meta targeting geo --account-id act_123 --q Madrid — location keys\n baker ads meta targeting validate --account-id act_123 --targeting-file t.json\n baker ads meta targeting estimate --account-id act_123 --targeting-file t.json --optimization-goal LEAD_GENERATION\n baker ads meta targeting describe --account-id act_123 --adset-id 6123 — the audience in Meta's words\n\nIdentities and libraries:\n baker ads meta instagram-accounts --account-id act_123 — the --instagram-user an ad can run as\n baker ads meta apps --account-id act_123 — apps it can promote\n baker ads meta dsa-recommendations --account-id act_123 — EU DSA beneficiary/payor names\n baker ads meta images --account-id act_123 — image hashes already on Meta\n baker ads meta labels --account-id act_123\n baker ads meta catalogs --business-id 601050769212882 — product catalogs; --catalog-id for product sets; products/sets/feeds/diagnostics\n baker ads meta page-photos upload --page-id … --image-id … — a photo on a Page, not posted (Instant Experiences)\n baker ads meta instant-experiences --page-id 904238019441800 — full-screen pages an ad can open (collection ads)\n baker ads meta studies --account-id act_123 — A/B tests; --study-id for results\n baker ads meta high-demand-periods --campaign-id 6123 — budget boosts\n baker ads meta page-posts --page-id 904238019441800 — posts an ad can boost; instagram-media for Instagram\n baker ads meta block-lists --account-id act_123 — sites and apps ads stay off (brand safety)\n baker ads meta reach-frequency --account-id act_123 — reach & frequency quotes; predict | reserve | cancel\n baker ads meta account-settings --account-id act_123 --spending-limit 5000 — account name / spending limit (staged)\n baker ads meta comments --ad-id 120211234567890 — comments on an ad's post\n baker ads meta account-details --account-id act_123 --show users — people, Meta's suggestions, Advantage+ controls, playables, page sets\n\nDrill in:\n baker ads meta account --account-id act_123 — currency, balance, business, whether it can deliver\n baker ads meta creatives --creative-id 9988,9989 — creatives' copy, link and assets, several at once\n baker ads meta audiences --name-contains buyers — one audience and its lookalikes\n baker ads meta custom-conversions --account-id act_123 — the marketer's own conversions (\"my conversions\")\n baker ads meta pixels --account-id act_123 — pixel list\n baker ads meta pixels --pixel-id 9988 --stats --days 7 — firing health\n\nPerformance (the workhorse):\n baker ads meta insights --object act_123 — defaults: level=account, intent=baseline, last_7d\n baker ads meta insights --object act_123 --intent revenue --date-preset last_28d\n baker ads meta insights --object act_123 --level ad --intent ranking — flag creatives to refresh\n baker ads meta insights --object act_123 --level adset --breakdowns publisher_platform,age — placement × age\n baker ads meta insights --object act_123 --level ad --since 2026-01-01 --until 2026-03-31 — auto-async\n baker ads meta insights --list-intents\n\nAutomated rules (run on Meta, unattended, once published):\n baker ads meta rules --account-id act_123 — every rule and what it does\n baker ads meta rules history --rule-id 1132635173044914 — what a rule did and when\n baker ads meta rules create --name \"Stop expensive ads\" --apply-to ad --when \"cost_per_result>20\" --action pause\n\nA/B tests (Meta splits the audience between versions and calls the winner):\n baker ads meta adsets duplicate 6123 --name \"… – lookalike\" — then change ONE thing on the copy\n baker ads meta studies create --name \"Broad vs lookalike\" --adsets 6123,meta_temp_ab12 --start 2026-10-20T08:00Z --days 14\n\nAudit & review:\n baker ads meta activities --account-id act_123 --days 14\n baker ads meta preview --ad-id 9988 --ad-format MOBILE_FEED_STANDARD — SEE the ad: displayed text + a picture\nFull guide: __tooling__/docs/tools/baker/ads-meta.md`,\n },\n subCommands: {\n accounts: () => import(\"./accounts.ts\").then((m) => m.accountsCommand),\n account: () => import(\"./account.ts\").then((m) => m.accountCommand),\n businesses: () => import(\"./businesses.ts\").then((m) => m.businessesCommand),\n pages: () => import(\"./pages.ts\").then((m) => m.pagesCommand),\n \"lead-forms\": () => import(\"./leads.ts\").then((m) => m.leadFormsCommand),\n \"instant-experiences\": () => import(\"./instant-experiences.ts\").then((m) => m.instantExperiencesCommand),\n leads: () => import(\"./leads.ts\").then((m) => m.leadsCommand),\n campaigns: () => import(\"./campaigns.ts\").then((m) => m.campaignsCommand),\n adsets: () => import(\"./adsets.ts\").then((m) => m.adsetsCommand),\n ads: () => import(\"./ads.ts\").then((m) => m.adsListCommand),\n creatives: () => import(\"./creatives.ts\").then((m) => m.creativesCommand),\n audiences: () => import(\"./audiences.ts\").then((m) => m.audiencesCommand),\n \"custom-conversions\": () => import(\"./custom-conversions.ts\").then((m) => m.customConversionsCommand),\n pixels: () => import(\"./pixels.ts\").then((m) => m.pixelsCommand),\n activities: () => import(\"./activities.ts\").then((m) => m.activitiesCommand),\n insights: () => import(\"./insights.ts\").then((m) => m.insightsCommand),\n preview: () => import(\"./preview.ts\").then((m) => m.previewCommand),\n targeting: () => import(\"./targeting.ts\").then((m) => m.targetingCommand),\n \"instagram-accounts\": () => import(\"./account-assets.ts\").then((m) => m.instagramAccountsCommand),\n apps: () => import(\"./account-assets.ts\").then((m) => m.appsCommand),\n \"dsa-recommendations\": () => import(\"./account-assets.ts\").then((m) => m.dsaRecommendationsCommand),\n images: () => import(\"./account-assets.ts\").then((m) => m.imagesCommand),\n labels: () => import(\"./account-assets.ts\").then((m) => m.labelsCommand),\n studies: () => import(\"./studies.ts\").then((m) => m.studiesCommand),\n catalogs: () => import(\"./catalogs.ts\").then((m) => m.catalogsCommand),\n \"page-photos\": () => import(\"./page-photos.ts\").then((m) => m.pagePhotosCommand),\n \"page-posts\": () => import(\"./account-level.ts\").then((m) => m.pagePostsCommand),\n \"instagram-media\": () => import(\"./account-level.ts\").then((m) => m.instagramMediaCommand),\n comments: () => import(\"./account-level.ts\").then((m) => m.commentsCommand),\n \"account-settings\": () => import(\"./account-level.ts\").then((m) => m.accountSettingsCommand),\n \"account-details\": () => import(\"./account-level.ts\").then((m) => m.accountDetailsCommand),\n \"block-lists\": () => import(\"./account-level.ts\").then((m) => m.blockListsCommand),\n \"reach-frequency\": () => import(\"./account-level.ts\").then((m) => m.reachFrequencyCommand),\n \"high-demand-periods\": () => import(\"./account-assets.ts\").then((m) => m.highDemandPeriodsCommand),\n rules: () => import(\"./rules.ts\").then((m) => m.rulesCommand),\n media: () => import(\"./media.ts\").then((m) => m.metaMediaCommand),\n draft: () => import(\"./draft.ts\").then((m) => m.metaDraftCommand),\n },\n});\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/ads/meta/index.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\n\n/**\n * Meta Ads command surface — curated for AI agents, not 1:1 with the Marketing API.\n *\n * Every backend read route has a command except `/currency`: `account` already\n * returns the currency and time zone, so a second command for two of its\n * fields would only be a second place to look.\n *\n * Default behaviors that matter:\n * - Listings (campaigns/adsets/ads) filter to ACTIVE — pass --all-statuses to widen.\n * - Insights filter out non-delivered rows (impressions=0) and sort by spend desc.\n * - Insights pick a smart field bundle via --intent (baseline|revenue|funnel|ranking|video|identity).\n * - Heavy insights queries auto-fall to async (poll loop hidden).\n * - Attribution defaults to 7d_click,1d_view — the only windows still working as of Jan 2026.\n */\nexport const metaCommand = defineCommand({\n meta: {\n name: \"meta\",\n description: `Meta Marketing API — AI-first command surface (Facebook + Instagram ads).\n\nDiscovery:\n baker ads meta accounts — accounts in this company's connected scope\n baker ads meta businesses — Business Manager IDs\n baker ads meta pages — Facebook Pages the selected ad accounts can promote (an ad's identity)\n baker ads meta lead-forms --page-id 100635183117758 — instant (lead) forms on a Page, with lead counts\n baker ads meta lead-forms create --account-id act_123 --page-id 555 --file form.json — stage a new form\n baker ads meta leads --form-id 987654321 — the leads one form collected (contact details masked)\n\nSnapshot a running account (default = ACTIVE only):\n baker ads meta campaigns --account-id act_123\n baker ads meta adsets --campaign-id 6123\n baker ads meta ads --adset-id 6123\n baker ads meta campaigns --account-id act_123 --all-statuses — include paused, archived\n\nBuild targeting (Meta takes ids, never names — look them up first):\n baker ads meta targeting search --account-id act_123 --q \"solar energy\" — interest/behavior/employer… ids\n baker ads meta targeting geo --account-id act_123 --q Madrid — location keys\n baker ads meta targeting validate --account-id act_123 --targeting-file t.json\n baker ads meta targeting estimate --account-id act_123 --targeting-file t.json --optimization-goal LEAD_GENERATION\n baker ads meta targeting describe --account-id act_123 --adset-id 6123 — the audience in Meta's words\n\nIdentities and libraries:\n baker ads meta instagram-accounts --account-id act_123 — the --instagram-user an ad can run as\n baker ads meta apps --account-id act_123 — apps it can promote\n baker ads meta dsa-recommendations --account-id act_123 — EU DSA beneficiary/payor names\n baker ads meta images --account-id act_123 — image hashes already on Meta\n baker ads meta labels --account-id act_123\n baker ads meta catalogs --business-id 601050769212882 — product catalogs; --catalog-id for product sets; products/sets/feeds/diagnostics\n baker ads meta page-photos upload --page-id … --image-id … — a photo on a Page, not posted (Instant Experiences)\n baker ads meta instant-experiences --page-id 904238019441800 — full-screen pages an ad can open (collection ads)\n baker ads meta studies --account-id act_123 — A/B tests; --study-id for results\n baker ads meta high-demand-periods --campaign-id 6123 — budget boosts\n baker ads meta page-posts --page-id 904238019441800 — posts an ad can boost; instagram-media for Instagram\n baker ads meta block-lists --account-id act_123 — sites and apps ads stay off (brand safety)\n baker ads meta reach-frequency --account-id act_123 — reach & frequency quotes; predict | reserve | cancel\n baker ads meta account-settings --account-id act_123 --spending-limit 5000 — account name / spending limit (staged)\n baker ads meta comments --ad-id 120211234567890 — comments on an ad's post\n baker ads meta account-details --account-id act_123 --show users — people, Meta's suggestions, Advantage+ controls, playables, page sets\n\nDrill in:\n baker ads meta account --account-id act_123 — currency, balance, business, whether it can deliver\n baker ads meta creatives --creative-id 9988,9989 — creatives' copy, link and assets, several at once\n baker ads meta audiences --name-contains buyers — one audience and its lookalikes\n baker ads meta custom-conversions --account-id act_123 — the marketer's own conversions (\"my conversions\")\n baker ads meta pixels --account-id act_123 — pixel list\n baker ads meta pixels --pixel-id 9988 --stats --days 7 — firing health\n\nPerformance (the workhorse):\n baker ads meta insights --object act_123 — defaults: level=account, intent=baseline, last_7d\n baker ads meta insights --object act_123 --intent revenue --date-preset last_28d\n baker ads meta insights --object act_123 --level ad --intent ranking — flag creatives to refresh\n baker ads meta insights --object act_123 --level adset --breakdowns publisher_platform,age — placement × age\n baker ads meta insights --object act_123 --level ad --since 2026-01-01 --until 2026-03-31 — auto-async\n baker ads meta insights --list-intents\n\nAutomated rules (run on Meta, unattended, once published):\n baker ads meta rules --account-id act_123 — every rule and what it does\n baker ads meta rules history --rule-id 1132635173044914 — what a rule did and when\n baker ads meta rules create --name \"Stop expensive ads\" --apply-to ad --when \"cost_per_result>20\" --action pause\n\nA/B tests (Meta splits the audience between versions and calls the winner):\n baker ads meta adsets duplicate 6123 --name \"… – lookalike\" — then change ONE thing on the copy\n baker ads meta studies create --name \"Broad vs lookalike\" --adsets 6123,meta_temp_ab12 --start 2026-10-20T08:00Z --days 14\n\nAudit & review:\n baker ads meta activities --account-id act_123 --days 14\n baker ads meta preview --ad-id 9988 --ad-format MOBILE_FEED_STANDARD — SEE the ad: displayed text + a picture\n baker ads meta videos --ad-id 9988,9989 — download the ads' video files (MP4) to watch or cut\nFull guide: __tooling__/docs/tools/baker/ads-meta.md`,\n },\n subCommands: {\n accounts: () => import(\"./accounts.ts\").then((m) => m.accountsCommand),\n account: () => import(\"./account.ts\").then((m) => m.accountCommand),\n businesses: () => import(\"./businesses.ts\").then((m) => m.businessesCommand),\n pages: () => import(\"./pages.ts\").then((m) => m.pagesCommand),\n \"lead-forms\": () => import(\"./leads.ts\").then((m) => m.leadFormsCommand),\n \"instant-experiences\": () => import(\"./instant-experiences.ts\").then((m) => m.instantExperiencesCommand),\n leads: () => import(\"./leads.ts\").then((m) => m.leadsCommand),\n campaigns: () => import(\"./campaigns.ts\").then((m) => m.campaignsCommand),\n adsets: () => import(\"./adsets.ts\").then((m) => m.adsetsCommand),\n ads: () => import(\"./ads.ts\").then((m) => m.adsListCommand),\n creatives: () => import(\"./creatives.ts\").then((m) => m.creativesCommand),\n audiences: () => import(\"./audiences.ts\").then((m) => m.audiencesCommand),\n \"custom-conversions\": () => import(\"./custom-conversions.ts\").then((m) => m.customConversionsCommand),\n pixels: () => import(\"./pixels.ts\").then((m) => m.pixelsCommand),\n activities: () => import(\"./activities.ts\").then((m) => m.activitiesCommand),\n insights: () => import(\"./insights.ts\").then((m) => m.insightsCommand),\n preview: () => import(\"./preview.ts\").then((m) => m.previewCommand),\n videos: () => import(\"./videos.ts\").then((m) => m.videosCommand),\n targeting: () => import(\"./targeting.ts\").then((m) => m.targetingCommand),\n \"instagram-accounts\": () => import(\"./account-assets.ts\").then((m) => m.instagramAccountsCommand),\n apps: () => import(\"./account-assets.ts\").then((m) => m.appsCommand),\n \"dsa-recommendations\": () => import(\"./account-assets.ts\").then((m) => m.dsaRecommendationsCommand),\n images: () => import(\"./account-assets.ts\").then((m) => m.imagesCommand),\n labels: () => import(\"./account-assets.ts\").then((m) => m.labelsCommand),\n studies: () => import(\"./studies.ts\").then((m) => m.studiesCommand),\n catalogs: () => import(\"./catalogs.ts\").then((m) => m.catalogsCommand),\n \"page-photos\": () => import(\"./page-photos.ts\").then((m) => m.pagePhotosCommand),\n \"page-posts\": () => import(\"./account-level.ts\").then((m) => m.pagePostsCommand),\n \"instagram-media\": () => import(\"./account-level.ts\").then((m) => m.instagramMediaCommand),\n comments: () => import(\"./account-level.ts\").then((m) => m.commentsCommand),\n \"account-settings\": () => import(\"./account-level.ts\").then((m) => m.accountSettingsCommand),\n \"account-details\": () => import(\"./account-level.ts\").then((m) => m.accountDetailsCommand),\n \"block-lists\": () => import(\"./account-level.ts\").then((m) => m.blockListsCommand),\n \"reach-frequency\": () => import(\"./account-level.ts\").then((m) => m.reachFrequencyCommand),\n \"high-demand-periods\": () => import(\"./account-assets.ts\").then((m) => m.highDemandPeriodsCommand),\n rules: () => import(\"./rules.ts\").then((m) => m.rulesCommand),\n media: () => import(\"./media.ts\").then((m) => m.metaMediaCommand),\n draft: () => import(\"./draft.ts\").then((m) => m.metaDraftCommand),\n },\n});\n"],"mappings":"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","names":[]}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import {
|
|
2
2
|
executeCanvasRun
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-XZAVBONI.js";
|
|
3
|
+
} from "./chunk-LVDYB7RO.js";
|
|
5
4
|
import "./chunk-J35R2D6B.js";
|
|
5
|
+
import "./chunk-XZAVBONI.js";
|
|
6
6
|
import "./chunk-WN4KX7GE.js";
|
|
7
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-IWNLW7ZC.js";
|
|
8
8
|
import "./chunk-IVIJJXXT.js";
|
|
9
|
-
import "./chunk-Q6ULQMWG.js";
|
|
10
9
|
import "./chunk-KKJ4KJCW.js";
|
|
10
|
+
import "./chunk-Q6ULQMWG.js";
|
|
11
11
|
import "./chunk-KNA3OWJC.js";
|
|
12
12
|
import "./chunk-3ACMDRSE.js";
|
|
13
13
|
import "./chunk-I7OJZ7QE.js";
|
|
14
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-LWYTFXJG.js";
|
|
15
|
+
import "./chunk-7DKJF3Y5.js";
|
|
15
16
|
import "./chunk-ERQZNOKZ.js";
|
|
16
17
|
import "./chunk-EJBLF2LI.js";
|
|
17
18
|
import "./chunk-TJHEMCST.js";
|
|
18
|
-
import "./chunk-7DKJF3Y5.js";
|
|
19
19
|
import "./chunk-T6RZ7ZOM.js";
|
|
20
20
|
import "./chunk-KPXURSDF.js";
|
|
21
21
|
import "./chunk-CP6RFWLW.js";
|
|
@@ -94,4 +94,4 @@ var rerunCommand = defineCommand({
|
|
|
94
94
|
export {
|
|
95
95
|
rerunCommand
|
|
96
96
|
};
|
|
97
|
-
//# sourceMappingURL=rerun-
|
|
97
|
+
//# sourceMappingURL=rerun-4SVR7QGC.js.map
|
|
@@ -3,22 +3,22 @@ import {
|
|
|
3
3
|
executeCanvasRun,
|
|
4
4
|
runCommand,
|
|
5
5
|
stopBeforeKinds
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-XZAVBONI.js";
|
|
6
|
+
} from "./chunk-LVDYB7RO.js";
|
|
8
7
|
import "./chunk-J35R2D6B.js";
|
|
8
|
+
import "./chunk-XZAVBONI.js";
|
|
9
9
|
import "./chunk-WN4KX7GE.js";
|
|
10
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-IWNLW7ZC.js";
|
|
11
11
|
import "./chunk-IVIJJXXT.js";
|
|
12
|
-
import "./chunk-Q6ULQMWG.js";
|
|
13
12
|
import "./chunk-KKJ4KJCW.js";
|
|
13
|
+
import "./chunk-Q6ULQMWG.js";
|
|
14
14
|
import "./chunk-KNA3OWJC.js";
|
|
15
15
|
import "./chunk-3ACMDRSE.js";
|
|
16
16
|
import "./chunk-I7OJZ7QE.js";
|
|
17
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-LWYTFXJG.js";
|
|
18
|
+
import "./chunk-7DKJF3Y5.js";
|
|
18
19
|
import "./chunk-ERQZNOKZ.js";
|
|
19
20
|
import "./chunk-EJBLF2LI.js";
|
|
20
21
|
import "./chunk-TJHEMCST.js";
|
|
21
|
-
import "./chunk-7DKJF3Y5.js";
|
|
22
22
|
import "./chunk-T6RZ7ZOM.js";
|
|
23
23
|
import "./chunk-KPXURSDF.js";
|
|
24
24
|
import "./chunk-CP6RFWLW.js";
|
|
@@ -69,4 +69,4 @@ export {
|
|
|
69
69
|
runCommand,
|
|
70
70
|
stopBeforeKinds
|
|
71
71
|
};
|
|
72
|
-
//# sourceMappingURL=run-
|
|
72
|
+
//# sourceMappingURL=run-5XN3VZTK.js.map
|
|
@@ -19,14 +19,14 @@ import {
|
|
|
19
19
|
} from "./chunk-7JBDVH7L.js";
|
|
20
20
|
import {
|
|
21
21
|
buildBackendClient
|
|
22
|
-
} from "./chunk-
|
|
23
|
-
import "./chunk-XZAVBONI.js";
|
|
22
|
+
} from "./chunk-LVDYB7RO.js";
|
|
24
23
|
import "./chunk-J35R2D6B.js";
|
|
24
|
+
import "./chunk-XZAVBONI.js";
|
|
25
25
|
import "./chunk-WN4KX7GE.js";
|
|
26
|
-
import "./chunk-
|
|
26
|
+
import "./chunk-IWNLW7ZC.js";
|
|
27
27
|
import "./chunk-IVIJJXXT.js";
|
|
28
|
-
import "./chunk-Q6ULQMWG.js";
|
|
29
28
|
import "./chunk-KKJ4KJCW.js";
|
|
29
|
+
import "./chunk-Q6ULQMWG.js";
|
|
30
30
|
import "./chunk-KNA3OWJC.js";
|
|
31
31
|
import "./chunk-3ACMDRSE.js";
|
|
32
32
|
import "./chunk-I7OJZ7QE.js";
|
|
@@ -36,20 +36,8 @@ import {
|
|
|
36
36
|
namesDelivery,
|
|
37
37
|
scaffoldDelivery
|
|
38
38
|
} from "./chunk-S456S5VM.js";
|
|
39
|
-
import
|
|
40
|
-
|
|
41
|
-
NO_FIT_HINT,
|
|
42
|
-
conceptFromFit,
|
|
43
|
-
fetchLibraryReference,
|
|
44
|
-
fitHints,
|
|
45
|
-
libraryReferenceBlock,
|
|
46
|
-
mergeReferenceIntoBlueprint,
|
|
47
|
-
notADesignReference,
|
|
48
|
-
readCachedFit,
|
|
49
|
-
referenceDescribeContext,
|
|
50
|
-
resolveSourcePlatform
|
|
51
|
-
} from "./chunk-2NWVSWGS.js";
|
|
52
|
-
import "./chunk-7KLTVL4J.js";
|
|
39
|
+
import "./chunk-LWYTFXJG.js";
|
|
40
|
+
import "./chunk-7DKJF3Y5.js";
|
|
53
41
|
import "./chunk-ERQZNOKZ.js";
|
|
54
42
|
import "./chunk-EJBLF2LI.js";
|
|
55
43
|
import {
|
|
@@ -78,7 +66,6 @@ import {
|
|
|
78
66
|
titleFromSlug,
|
|
79
67
|
webFontUrl
|
|
80
68
|
} from "./chunk-TJHEMCST.js";
|
|
81
|
-
import "./chunk-7DKJF3Y5.js";
|
|
82
69
|
import {
|
|
83
70
|
describeViewer,
|
|
84
71
|
liveViewerLookups,
|
|
@@ -88,6 +75,19 @@ import "./chunk-KPXURSDF.js";
|
|
|
88
75
|
import "./chunk-CP6RFWLW.js";
|
|
89
76
|
import "./chunk-EKX37C3T.js";
|
|
90
77
|
import "./chunk-Q5DFEVLE.js";
|
|
78
|
+
import {
|
|
79
|
+
LIBRARY_PLATFORMS,
|
|
80
|
+
NO_FIT_HINT,
|
|
81
|
+
conceptFromFit,
|
|
82
|
+
fetchLibraryReference,
|
|
83
|
+
fitHints,
|
|
84
|
+
libraryReferenceBlock,
|
|
85
|
+
mergeReferenceIntoBlueprint,
|
|
86
|
+
notADesignReference,
|
|
87
|
+
readCachedFit,
|
|
88
|
+
referenceDescribeContext,
|
|
89
|
+
resolveSourcePlatform
|
|
90
|
+
} from "./chunk-2NWVSWGS.js";
|
|
91
91
|
import "./chunk-KGAYDZM2.js";
|
|
92
92
|
import "./chunk-OFMFBRSL.js";
|
|
93
93
|
import "./chunk-RNS5MVHS.js";
|
|
@@ -1009,4 +1009,4 @@ export {
|
|
|
1009
1009
|
uploadSourceAsReference,
|
|
1010
1010
|
validateScaffoldedStaticAd
|
|
1011
1011
|
};
|
|
1012
|
-
//# sourceMappingURL=scaffold-static-ad-
|
|
1012
|
+
//# sourceMappingURL=scaffold-static-ad-5AWGI5QC.js.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
parseRequestFlags
|
|
3
3
|
} from "./chunk-4N3Y5QWW.js";
|
|
4
|
-
import {
|
|
5
|
-
activeFilterFlags,
|
|
6
|
-
emptyResultHints
|
|
7
|
-
} from "./chunk-Q6ULQMWG.js";
|
|
8
4
|
import {
|
|
9
5
|
AUTO_INGEST_MAX,
|
|
10
6
|
parseAutoIngest
|
|
11
7
|
} from "./chunk-KKJ4KJCW.js";
|
|
8
|
+
import {
|
|
9
|
+
activeFilterFlags,
|
|
10
|
+
emptyResultHints
|
|
11
|
+
} from "./chunk-Q6ULQMWG.js";
|
|
12
12
|
import {
|
|
13
13
|
OUTPUT_ARGS,
|
|
14
14
|
writeProviderHits
|
|
@@ -209,4 +209,4 @@ export {
|
|
|
209
209
|
partialLibraryHints,
|
|
210
210
|
stockCommand
|
|
211
211
|
};
|
|
212
|
-
//# sourceMappingURL=stock-
|
|
212
|
+
//# sourceMappingURL=stock-WEY6RYKP.js.map
|
|
@@ -23,10 +23,10 @@ Full guide: __tooling__/docs/tools/baker/testimonials.md`
|
|
|
23
23
|
list: () => import("./list-LLLEF6YM.js").then((m) => m.listCommand),
|
|
24
24
|
delete: () => import("./delete-ZHGITRWJ.js").then((m) => m.deleteCommand),
|
|
25
25
|
tags: () => import("./tags-HN67SXIG.js").then((m) => m.tagsCommand),
|
|
26
|
-
sources: () => import("./sources-
|
|
26
|
+
sources: () => import("./sources-FZZRJTQV.js").then((m) => m.sourcesCommand)
|
|
27
27
|
}
|
|
28
28
|
});
|
|
29
29
|
export {
|
|
30
30
|
testimonialsCommand
|
|
31
31
|
};
|
|
32
|
-
//# sourceMappingURL=testimonials-
|
|
32
|
+
//# sourceMappingURL=testimonials-M4GVNUI7.js.map
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
withoutFields
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-XOC5F52C.js";
|
|
4
4
|
import {
|
|
5
5
|
leadVersion,
|
|
6
6
|
runBaker,
|
|
7
7
|
seriesLeadsAbove,
|
|
8
8
|
writeSeriesMemberCanvas
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-LWYTFXJG.js";
|
|
10
10
|
import {
|
|
11
11
|
setDefinitionFields
|
|
12
12
|
} from "./chunk-X3YYZLBH.js";
|
|
13
|
+
import "./chunk-7DKJF3Y5.js";
|
|
13
14
|
import "./chunk-ERQZNOKZ.js";
|
|
14
15
|
import "./chunk-EJBLF2LI.js";
|
|
15
16
|
import {
|
|
@@ -23,7 +24,6 @@ import {
|
|
|
23
24
|
sameTag,
|
|
24
25
|
tagSlug
|
|
25
26
|
} from "./chunk-TJHEMCST.js";
|
|
26
|
-
import "./chunk-7DKJF3Y5.js";
|
|
27
27
|
import "./chunk-T6RZ7ZOM.js";
|
|
28
28
|
import "./chunk-KPXURSDF.js";
|
|
29
29
|
import "./chunk-CP6RFWLW.js";
|
|
@@ -600,4 +600,4 @@ var translateCommand = defineCommand({
|
|
|
600
600
|
export {
|
|
601
601
|
translateCommand
|
|
602
602
|
};
|
|
603
|
-
//# sourceMappingURL=translate-
|
|
603
|
+
//# sourceMappingURL=translate-ETC6UFI6.js.map
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import {
|
|
2
|
+
handleMetaError
|
|
3
|
+
} from "./chunk-5H6N36LS.js";
|
|
4
|
+
import "./chunk-QALAJNBG.js";
|
|
5
|
+
import {
|
|
6
|
+
writeJsonEnvelope
|
|
7
|
+
} from "./chunk-RBCO3C3Q.js";
|
|
8
|
+
import {
|
|
9
|
+
apiGet
|
|
10
|
+
} from "./chunk-QEREDRZO.js";
|
|
11
|
+
import "./chunk-JXTNP3B5.js";
|
|
12
|
+
import "./chunk-45D6WRCJ.js";
|
|
13
|
+
import {
|
|
14
|
+
registerSchema
|
|
15
|
+
} from "./chunk-CCYZJMZ7.js";
|
|
16
|
+
import "./chunk-YQSBHWOI.js";
|
|
17
|
+
|
|
18
|
+
// src/commands/ads/meta/videos.ts
|
|
19
|
+
import { createWriteStream, mkdirSync } from "fs";
|
|
20
|
+
import { join } from "path";
|
|
21
|
+
import { Readable } from "stream";
|
|
22
|
+
import { pipeline } from "stream/promises";
|
|
23
|
+
|
|
24
|
+
// ../api/src/ads-meta/adVideos.ts
|
|
25
|
+
import { z } from "zod";
|
|
26
|
+
var metaAdVideoSchema = z.object({
|
|
27
|
+
videoId: z.string(),
|
|
28
|
+
/** Short-lived MP4 address; null when Meta does not hand the file to this connection. */
|
|
29
|
+
source: z.string().url().nullable(),
|
|
30
|
+
seconds: z.number().nullable(),
|
|
31
|
+
title: z.string().nullable(),
|
|
32
|
+
thumbnail: z.string().url().nullable()
|
|
33
|
+
});
|
|
34
|
+
var metaAdVideosResponseSchema = z.object({
|
|
35
|
+
adId: z.string().nullable(),
|
|
36
|
+
creativeId: z.string(),
|
|
37
|
+
videos: z.array(metaAdVideoSchema)
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// src/commands/ads/meta/videos.ts
|
|
41
|
+
import { defineCommand } from "citty";
|
|
42
|
+
var DEFAULT_OUT_DIR = "/tmp/meta-ad-videos";
|
|
43
|
+
function downloadHints(results) {
|
|
44
|
+
const all = results.flatMap((result) => result.videos);
|
|
45
|
+
const hints = [];
|
|
46
|
+
if (all.length === 0)
|
|
47
|
+
hints.push("No video in these ads: they are image or carousel ads (`creatives --creative-id` shows their assets).");
|
|
48
|
+
if (all.some((video) => video.file === null && video.url === void 0)) {
|
|
49
|
+
hints.push(
|
|
50
|
+
"A video with no file is a copy Meta does not hand to this connection (usually the Page's copy of the same upload); the other video of that ad is the same film."
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
if (all.some((video) => video.file !== null)) {
|
|
54
|
+
hints.push(
|
|
55
|
+
"Watch before judging: a frame strip (`ffmpeg -i <file> -vf fps=2,scale=240:-1,tile=8x2 strip.jpg`) and the 3-second hold rate from `insights --level ad --intent video`."
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
return hints;
|
|
59
|
+
}
|
|
60
|
+
async function download(url, file) {
|
|
61
|
+
const response = await fetch(url);
|
|
62
|
+
if (!response.ok || !response.body) throw new Error(`Meta's video address answered ${response.status}`);
|
|
63
|
+
await pipeline(Readable.fromWeb(response.body), createWriteStream(file));
|
|
64
|
+
return Number(response.headers.get("content-length") ?? 0);
|
|
65
|
+
}
|
|
66
|
+
async function fetchAndSave(params, outDir, save) {
|
|
67
|
+
const data = metaAdVideosResponseSchema.parse(await apiGet("/api/ads/meta/videos", params));
|
|
68
|
+
const owner = data.adId ?? data.creativeId;
|
|
69
|
+
const videos = [];
|
|
70
|
+
for (const video of data.videos) {
|
|
71
|
+
if (!video.source || !save) {
|
|
72
|
+
videos.push({
|
|
73
|
+
videoId: video.videoId,
|
|
74
|
+
file: null,
|
|
75
|
+
...video.source ? { url: video.source } : {},
|
|
76
|
+
seconds: video.seconds,
|
|
77
|
+
megabytes: null
|
|
78
|
+
});
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const file = join(outDir, `${owner}-${video.videoId}.mp4`);
|
|
82
|
+
const bytes = await download(video.source, file);
|
|
83
|
+
videos.push({
|
|
84
|
+
videoId: video.videoId,
|
|
85
|
+
file,
|
|
86
|
+
seconds: video.seconds,
|
|
87
|
+
megabytes: bytes ? Math.round(bytes / 1e5) / 10 : null
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return { adId: data.adId, creativeId: data.creativeId, videos };
|
|
91
|
+
}
|
|
92
|
+
var splitIds = (value) => typeof value === "string" ? value.split(",").map((id) => id.trim()).filter(Boolean) : [];
|
|
93
|
+
registerSchema({
|
|
94
|
+
command: "ads.meta.videos",
|
|
95
|
+
description: "Download the video files of running Meta ads (or creatives) to disk, to watch, cut or analyse them. One call for several ads.",
|
|
96
|
+
args: {
|
|
97
|
+
"ad-id": { type: "string", description: "Ad id, or several comma-separated", required: false },
|
|
98
|
+
"creative-id": { type: "string", description: "Creative id, or several comma-separated", required: false },
|
|
99
|
+
"out-dir": { type: "string", description: `Where the MP4s go (default ${DEFAULT_OUT_DIR})`, required: false },
|
|
100
|
+
"url-only": {
|
|
101
|
+
type: "boolean",
|
|
102
|
+
description: "Return Meta's short-lived addresses instead of files",
|
|
103
|
+
required: false
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
var videosCommand = defineCommand({
|
|
108
|
+
meta: {
|
|
109
|
+
name: "videos",
|
|
110
|
+
description: `Download the video files behind Meta ads, to watch, cut or analyse the company's own ads.
|
|
111
|
+
baker ads meta videos --ad-id 120211234567890,120211234567891 \u2014 MP4s in ${DEFAULT_OUT_DIR}
|
|
112
|
+
baker ads meta videos --creative-id 9988 --out-dir /tmp/ads \u2014 by creative
|
|
113
|
+
Start here when judging video ads: \`insights --level ad --intent video\` names the ads, this gets their files.`
|
|
114
|
+
},
|
|
115
|
+
args: {
|
|
116
|
+
"ad-id": { type: "string", description: "Ad id, or several comma-separated" },
|
|
117
|
+
"creative-id": { type: "string", description: "Creative id, or several comma-separated" },
|
|
118
|
+
"out-dir": { type: "string", description: `Where the MP4s go (default ${DEFAULT_OUT_DIR})` },
|
|
119
|
+
// Not `--no-download`: citty reads any `--no-x` as `x: false`, so that flag would never be set.
|
|
120
|
+
"url-only": { type: "boolean", description: "Return Meta's short-lived addresses instead of files" }
|
|
121
|
+
},
|
|
122
|
+
run: async ({ args }) => {
|
|
123
|
+
const adIds = splitIds(args["ad-id"]);
|
|
124
|
+
const creativeIds = splitIds(args["creative-id"]);
|
|
125
|
+
if (adIds.length + creativeIds.length === 0) {
|
|
126
|
+
writeJsonEnvelope({ ok: false, error: { code: "VALIDATION_ERROR", message: "Name --ad-id or --creative-id" } });
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
const outDir = typeof args["out-dir"] === "string" ? args["out-dir"] : DEFAULT_OUT_DIR;
|
|
130
|
+
const save = !args["url-only"];
|
|
131
|
+
if (save) mkdirSync(outDir, { recursive: true });
|
|
132
|
+
try {
|
|
133
|
+
const results = [];
|
|
134
|
+
for (const id of adIds) results.push(await fetchAndSave({ "ad-id": id }, outDir, save));
|
|
135
|
+
for (const id of creativeIds) results.push(await fetchAndSave({ "creative-id": id }, outDir, save));
|
|
136
|
+
writeJsonEnvelope({ ok: true, data: results, hints: downloadHints(results) });
|
|
137
|
+
} catch (err) {
|
|
138
|
+
handleMetaError(err);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
export {
|
|
143
|
+
downloadHints,
|
|
144
|
+
videosCommand
|
|
145
|
+
};
|
|
146
|
+
//# sourceMappingURL=videos-NITQKILV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/ads/meta/videos.ts","../../api/src/ads-meta/adVideos.ts"],"sourcesContent":["import { createWriteStream, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport type { ReadableStream as WebReadableStream } from \"node:stream/web\";\nimport { type MetaAdVideosResponse, metaAdVideosResponseSchema } from \"@baker/api/ads-meta/adVideos\";\nimport { defineCommand } from \"citty\";\nimport { apiGet } from \"../../../client.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { writeJsonEnvelope } from \"../output.ts\";\nimport { handleMetaError } from \"./shared.ts\";\n\n/**\n * The video files behind running ads, downloaded to disk so the agent can\n * watch, cut and judge the company's own ads. Before this it pulled them out of\n * a preview's HTML in about ten steps per ad.\n */\n\nconst DEFAULT_OUT_DIR = \"/tmp/meta-ad-videos\";\n\nexport interface DownloadedVideo {\n videoId: string;\n file: string | null;\n /** Only with --url-only: Meta's short-lived address, instead of a file. */\n url?: string;\n seconds: number | null;\n megabytes: number | null;\n}\n\n/** One line per video: where it is on disk, or why it is not. */\nexport function downloadHints(results: ReadonlyArray<{ videos: readonly DownloadedVideo[] }>): string[] {\n const all = results.flatMap((result) => result.videos);\n const hints: string[] = [];\n if (all.length === 0)\n hints.push(\"No video in these ads: they are image or carousel ads (`creatives --creative-id` shows their assets).\");\n if (all.some((video) => video.file === null && video.url === undefined)) {\n hints.push(\n \"A video with no file is a copy Meta does not hand to this connection (usually the Page's copy of the same upload); the other video of that ad is the same film.\",\n );\n }\n if (all.some((video) => video.file !== null)) {\n hints.push(\n \"Watch before judging: a frame strip (`ffmpeg -i <file> -vf fps=2,scale=240:-1,tile=8x2 strip.jpg`) and the 3-second hold rate from `insights --level ad --intent video`.\",\n );\n }\n return hints;\n}\n\nasync function download(url: string, file: string): Promise<number> {\n const response = await fetch(url);\n if (!response.ok || !response.body) throw new Error(`Meta's video address answered ${response.status}`);\n await pipeline(Readable.fromWeb(response.body as WebReadableStream<Uint8Array>), createWriteStream(file));\n return Number(response.headers.get(\"content-length\") ?? 0);\n}\n\nasync function fetchAndSave(\n params: Record<string, string>,\n outDir: string,\n save: boolean,\n): Promise<{ adId: string | null; creativeId: string; videos: DownloadedVideo[] }> {\n const data: MetaAdVideosResponse = metaAdVideosResponseSchema.parse(await apiGet(\"/api/ads/meta/videos\", params));\n const owner = data.adId ?? data.creativeId;\n const videos: DownloadedVideo[] = [];\n for (const video of data.videos) {\n if (!video.source || !save) {\n videos.push({\n videoId: video.videoId,\n file: null,\n ...(video.source ? { url: video.source } : {}),\n seconds: video.seconds,\n megabytes: null,\n });\n continue;\n }\n const file = join(outDir, `${owner}-${video.videoId}.mp4`);\n const bytes = await download(video.source, file);\n videos.push({\n videoId: video.videoId,\n file,\n seconds: video.seconds,\n megabytes: bytes ? Math.round(bytes / 1e5) / 10 : null,\n });\n }\n return { adId: data.adId, creativeId: data.creativeId, videos };\n}\n\nconst splitIds = (value: unknown): string[] =>\n typeof value === \"string\"\n ? value\n .split(\",\")\n .map((id) => id.trim())\n .filter(Boolean)\n : [];\n\nregisterSchema({\n command: \"ads.meta.videos\",\n description:\n \"Download the video files of running Meta ads (or creatives) to disk, to watch, cut or analyse them. One call for several ads.\",\n args: {\n \"ad-id\": { type: \"string\", description: \"Ad id, or several comma-separated\", required: false },\n \"creative-id\": { type: \"string\", description: \"Creative id, or several comma-separated\", required: false },\n \"out-dir\": { type: \"string\", description: `Where the MP4s go (default ${DEFAULT_OUT_DIR})`, required: false },\n \"url-only\": {\n type: \"boolean\",\n description: \"Return Meta's short-lived addresses instead of files\",\n required: false,\n },\n },\n});\n\nexport const videosCommand = defineCommand({\n meta: {\n name: \"videos\",\n description: `Download the video files behind Meta ads, to watch, cut or analyse the company's own ads.\n baker ads meta videos --ad-id 120211234567890,120211234567891 — MP4s in ${DEFAULT_OUT_DIR}\n baker ads meta videos --creative-id 9988 --out-dir /tmp/ads — by creative\nStart here when judging video ads: \\`insights --level ad --intent video\\` names the ads, this gets their files.`,\n },\n args: {\n \"ad-id\": { type: \"string\", description: \"Ad id, or several comma-separated\" },\n \"creative-id\": { type: \"string\", description: \"Creative id, or several comma-separated\" },\n \"out-dir\": { type: \"string\", description: `Where the MP4s go (default ${DEFAULT_OUT_DIR})` },\n // Not `--no-download`: citty reads any `--no-x` as `x: false`, so that flag would never be set.\n \"url-only\": { type: \"boolean\", description: \"Return Meta's short-lived addresses instead of files\" },\n },\n run: async ({ args }) => {\n const adIds = splitIds(args[\"ad-id\"]);\n const creativeIds = splitIds(args[\"creative-id\"]);\n if (adIds.length + creativeIds.length === 0) {\n writeJsonEnvelope({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"Name --ad-id or --creative-id\" } });\n process.exit(1);\n }\n const outDir = typeof args[\"out-dir\"] === \"string\" ? args[\"out-dir\"] : DEFAULT_OUT_DIR;\n const save = !args[\"url-only\"];\n if (save) mkdirSync(outDir, { recursive: true });\n try {\n const results = [];\n for (const id of adIds) results.push(await fetchAndSave({ \"ad-id\": id }, outDir, save));\n for (const id of creativeIds) results.push(await fetchAndSave({ \"creative-id\": id }, outDir, save));\n writeJsonEnvelope({ ok: true, data: results, hints: downloadHints(results) });\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n","/**\n * The video files behind a running ad, so an agent can watch and cut the\n * company's own ads instead of scraping them out of a preview.\n *\n * A creative names its videos in three places, and which one depends on how\n * it was built: `video_id` on the creative itself, `object_story_spec.video_data`\n * for a single-video ad, and `asset_feed_spec.videos` for a dynamic creative\n * (Baker builds these itself). `GET /{video_id}?fields=source` then hands back\n * a short-lived MP4 address.\n */\nimport { z } from \"zod\";\n\n/** The parts of a Meta creative that can name a video. */\nexport interface CreativeVideoFields {\n video_id?: string;\n object_story_spec?: { video_data?: { video_id?: string } };\n asset_feed_spec?: { videos?: Array<{ video_id?: string }> };\n}\n\n/** Every video a creative uses, each once, in the order Meta lists them. */\nexport function videoIdsOfCreative(creative: CreativeVideoFields): string[] {\n const ids = [\n creative.video_id,\n creative.object_story_spec?.video_data?.video_id,\n ...(creative.asset_feed_spec?.videos ?? []).map((video) => video.video_id),\n ];\n return [...new Set(ids.filter((id): id is string => typeof id === \"string\" && id.length > 0))];\n}\n\nexport const metaAdVideoSchema = z.object({\n videoId: z.string(),\n /** Short-lived MP4 address; null when Meta does not hand the file to this connection. */\n source: z.string().url().nullable(),\n seconds: z.number().nullable(),\n title: z.string().nullable(),\n thumbnail: z.string().url().nullable(),\n});\nexport type MetaAdVideo = z.infer<typeof metaAdVideoSchema>;\n\nexport const metaAdVideosResponseSchema = z.object({\n adId: z.string().nullable(),\n creativeId: z.string(),\n videos: z.array(metaAdVideoSchema),\n});\nexport type MetaAdVideosResponse = z.infer<typeof metaAdVideosResponseSchema>;\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|