agentsclimarketplace

Facebook videos

Skill puntorigen/avatar-skills/facebook-videos

Cloud-based agent skills for creating AI avatar talking-head videos and short-form reels (skills.sh format)

Install
npx -y skills add puntorigen/avatar-skills --skill facebook-videos

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • 28 days oldThe repository was created 28 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
  • 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Download public Facebook videos (a watch link, video permalink, reel, fb.watch short link, or a Page's videos tab) to a local folder, named by upload datetime (YYYY-MM-DD_HH-MM-SS.mp4). Single-engine yt-dlp + ffmpeg; uses --cookies-from-browser for login-walled public videos. Use when the user asks to download a Facebook video or reel, save an FB video locally, grab a video from a facebook.com/watch or fb.watch link, or batch-download a Page's videos.

SKILL.md

6.4 KB, ~1.6k tokens by cl100k_base, as published. Nobody here has run it

Facebook Videos Downloader

Download a public Facebook video (or a Page's videos) into a user-specified folder, named by upload datetime.

Facebook is a single-engine yt-dlp target — like youtube-videos, not instagram-videos. No browser mirror and no third-party fallback API. The one real difference: Facebook is the most login-walled platform, so the primary resilience path is --cookies-from-browser (your own logged-in session), NOT a second engine.

Inputs

ParameterRequiredExample
Facebook URL (watch, video, reel, fb.watch, or Page videos tab)yeshttps://www.facebook.com/watch/?v=10154325234224113
Output directoryyesout/facebook
Max heightno1080 (default)
Timezone for filenamesnoAmerica/Santiago (default)

Accepted URL shapes (the script handles them via yt-dlp):

  • Watch link: facebook.com/watch/?v=ID → single video
  • Video permalink: facebook.com/<page>/videos/ID/ → single video
  • Reel: facebook.com/reel/ID → single video
  • Share short link: fb.watch/xxxx/ → yt-dlp resolves it
  • Page videos tab: facebook.com/<page>/videos → a playlist (use --max 1 for just the first)

Prerequisites

yt-dlp AND ffmpeg must be installed (both present on this machine). ffmpeg is needed when Facebook serves separate video+audio (DASH) streams that must be merged. Keep yt-dlp fresh — an outdated yt-dlp is the #1 cause of Facebook failures:

yt-dlp --version || python3 -m pip install -U yt-dlp
ffmpeg -version | head -1

Workflow checklist

- [ ] Step 1: Verify the video is public
- [ ] Step 2: (optional) Pre-fetch listing to review before downloading
- [ ] Step 3: Run download script
- [ ] Step 4: Report results

Step 1: Verify it's public

Open the URL. If it sits behind a login wall, is friends-only, or is unavailable in the region, this skill can still work if you pass your own cookies (see Step 3 / cookies note). For truly private content you don't have access to, stop.

Step 2 (optional): Pre-fetch the listing

The script lists internally, but for a Page you can inspect first:

yt-dlp --flat-playlist -J "https://www.facebook.com/<page>/videos" > listing.json

listing.json has an entries array of {id, url, title} (dates are resolved during download). Pass it back with --listing-json to download exactly that set.

Step 3: Download and rename

python3 .cursor/skills/facebook-videos/scripts/download_facebook_videos.py \
  --url "https://www.facebook.com/watch/?v=10154325234224113" \
  --output-dir out/facebook \
  --max-height 1080 \
  --timezone America/Santiago

The script:

  1. Lists entries via yt-dlp --flat-playlist (a single watch/video/reel URL → one entry; a Page videos tab → a playlist), dedupes by id/URL
  2. Downloads each video (best ≤ --max-height, falling back to absolute best so Facebook's hd/sd progressive formats always download), merged to mp4
  3. Reads the exact upload timestamp (or upload_date) from each video's info.json
  4. Renames to YYYY-MM-DD_HH-MM-SS.mp4 in the chosen timezone (date-only → ..._00-00-00; no date → unknown_<id>.mp4)
  5. Maintains download-archive.txt in the output dir so re-runs resume instead of re-downloading
  6. Writes {output_dir}/videos_manifest.json (id, url, title, timestamp, uploadDate, height, file)

To grab only the first video of a Page's videos tab, add --max 1.

Useful flags: --max N (cap count), --cookies-from-browser chrome, --max-height 720, --no-archive, --delay-ms.

Collisions: two videos at the same second get _2, _3 suffixes.

Step 4: Report to user

Summarize: URL, output path, count downloaded / skipped / failed, and list filenames sorted newest-first. Datetime naming means a long Facebook caption never becomes the filename (the caption is kept in the manifest title instead).


Login-walled videos (the Facebook gotcha)

If the run prints No videos found or yt-dlp errors with "log in" / "cookies" / "not available", the video is gated to logged-in users. Pass cookies from a browser where you're signed in to Facebook:

python3 .cursor/skills/facebook-videos/scripts/download_facebook_videos.py \
  --url "https://www.facebook.com/watch/?v=ID" \
  --output-dir out/facebook \
  --cookies-from-browser chrome

--cookies-from-browser accepts chrome, firefox, safari, edge, brave. The script auto-appends a hint to error messages reminding you to retry with cookies.

Why no fallback engine

PlatformListingDownloadResilience
Instagrambrowser scrape (Picnob)Picnob/ImgInndirect tools 401
TikTokyt-dlp flat-playlistyt-dlp + tikwm fallbackyt-dlp signing breaks intermittently
YouTubeyt-dlpyt-dlpkeep yt-dlp fresh; cookies for bot-gate
Facebookyt-dlpyt-dlp--cookies-from-browser for login walls

Anti-patterns

  1. Do not hand-scrape the Facebook page HTML — yt-dlp already extracts the video. (Unlike Instagram.)
  2. Do not run with a stale yt-dlp. Update it before blaming the site.
  3. Do not assume failure means impossible — try --cookies-from-browser first; Facebook gates much more aggressively than YouTube.
  4. Do not download private / friends-only content you don't have access to.
  5. Do not forget ffmpeg — without it, DASH merges fail.
  6. Do not commit large out/ video folders — add the output dir to .gitignore.

Utility scripts

ScriptPurpose
scripts/download_facebook_videos.pyList + download (yt-dlp, mp4) + datetime rename + archive resume + manifest (main entry point)

Additional resources

  • Real run example: examples.md
  • For YouTube (channels/playlists/Shorts), use the youtube-videos skill.
  • For TikTok (yt-dlp + tikwm fallback), use the tiktok-videos skill.
  • For Instagram (needs a browser mirror), use the instagram-videos skill.

What ships with it: 2 files

15.8 KB alongside SKILL.md, 1 of them executable

scripts/

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.