{"id":50182157,"url":"https://github.com/remvisual/podcast-thumbnail-extractor","last_synced_at":"2026-05-25T07:05:25.804Z","repository":{"id":352978331,"uuid":"1217463137","full_name":"REMvisual/podcast-thumbnail-extractor","owner":"REMvisual","description":"AI-powered thumbnail extractor for podcast and video creators. Automatically picks the best faces, screens, and scenes using computer vision and custom CNN models. 100% local. Windows-friendly.","archived":false,"fork":false,"pushed_at":"2026-04-21T23:14:05.000Z","size":1412,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-04-22T01:23:07.574Z","etag":null,"topics":["ai","cnn","computer-vision","face-detection","flask","image-processing","machine-learning","open-source","opencv","podcast","privacy-friendly","python","pytorch","self-hosted","thumbnail","thumbnail-generator","video","video-processing","windows","youtube"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/REMvisual.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-21T23:06:13.000Z","updated_at":"2026-04-21T23:14:10.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/REMvisual/podcast-thumbnail-extractor","commit_stats":null,"previous_names":["remvisual/podcast-thumbnail-extractor"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/REMvisual/podcast-thumbnail-extractor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/REMvisual%2Fpodcast-thumbnail-extractor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/REMvisual%2Fpodcast-thumbnail-extractor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/REMvisual%2Fpodcast-thumbnail-extractor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/REMvisual%2Fpodcast-thumbnail-extractor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/REMvisual","download_url":"https://codeload.github.com/REMvisual/podcast-thumbnail-extractor/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/REMvisual%2Fpodcast-thumbnail-extractor/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33464014,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-25T06:32:55.349Z","status":"ssl_error","status_checked_at":"2026-05-25T06:32:35.322Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","cnn","computer-vision","face-detection","flask","image-processing","machine-learning","open-source","opencv","podcast","privacy-friendly","python","pytorch","self-hosted","thumbnail","thumbnail-generator","video","video-processing","windows","youtube"],"created_at":"2026-05-25T07:04:57.848Z","updated_at":"2026-05-25T07:05:25.794Z","avatar_url":"https://github.com/REMvisual.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"banner.svg\" alt=\"Thumbnail Extractor — best-frame extraction from any video, local CV, zero cloud. Ten candidate frames ranked by quality score, with the top pick (0.94) highlighted in orange.\" width=\"100%\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003ePodLab | Thumbnail Extractor\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eExtract the best thumbnails from any podcast or video — automatically.\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#quickstart\"\u003eQuickstart\u003c/a\u003e •\n  \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e •\n  \u003ca href=\"#training-your-own-categories\"\u003eTrain\u003c/a\u003e •\n  \u003ca href=\"docs/TRAINING.md\"\u003eDocs\u003c/a\u003e •\n  \u003ca href=\"#license\"\u003eLicense\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n**PodLab Thumbnail Extractor** is an open-source, locally-run AI tool that scans your video and returns the highest-quality faces, screen captures, and hero frames, ranked by a computer-vision quality scorer. Train it on your own taste with the built-in custom model UI. No cloud, no subscription, no upload limits.\n\nUse it to pick YouTube thumbnails for podcast episodes, bulk-generate preview candidates for long recordings, extract screenshot-worthy moments from demo segments, or anything else where the right still matters.\n\n## Quickstart\n\n**Windows (one-click):**\n\n```\ngit clone https://github.com/REMvisual/podcast-thumbnail-extractor\ncd podcast-thumbnail-extractor\ninstall.bat\nrun.bat\n```\n\nThen open \u003chttp://localhost:5000\u003e.\n\n**Linux / macOS:**\n\n```\ngit clone https://github.com/REMvisual/podcast-thumbnail-extractor\ncd podcast-thumbnail-extractor\n./install.sh\nsource venv/bin/activate\npython src/app.py\n```\n\n**Requires:** Python 3.10+, ~2 GB disk (includes starter models), Windows 10/11 (Linux/mac best-effort).\n\n## Features\n\n- **Three detection modes out of the box:** faces, screen captures (UI and art variants), and a catch-all \"everything\" mode.\n- **Quality-ranked output:** each candidate thumbnail gets a 0.0–1.0 score; top 10 are kept per video.\n- **Scene-aware sampling:** doesn't waste cycles on static shots; pulls representative frames from distinct scenes.\n- **Near-duplicate deduplication:** ten unique keepers, not ten copies of the same smile.\n- **Background removal:** optional `rembg`-powered cutout for clean compositing into thumbnail templates.\n- **Train your own categories:** add a `firetrucks` category, give it a folder of good and bad examples, hit Train — a CNN learns your taste.\n- **Fully local:** no telemetry, no cloud, no uploads. Your video never leaves your machine.\n\n## Training your own categories\n\nSee [`docs/TRAINING.md`](docs/TRAINING.md) for the full walkthrough. Short version:\n\n1. Launch `config.bat` — opens the category manager in your browser.\n2. Click \"Add Category\" — give it an ID, a label, an emoji, and a training-data folder with `good/` and `bad/` subfolders of ~50 example images each.\n3. Click \"Train\" — watch the live progress. Training takes 5-15 minutes on a modern CPU; GPU speeds that up.\n4. Your new category shows up on the main page. Pick it when extracting and the CNN ranks frames by how well they match your `good/` examples.\n\n## Image sources for training\n\n[`docs/IMAGE_SOURCES.md`](docs/IMAGE_SOURCES.md) lists free / CC0 sources for building training sets: Pexels, Unsplash, Openverse, and more. Don't use copyrighted images.\n\n## Configuration\n\nAll runtime paths are env-var overridable:\n\n| Variable | Default | Purpose |\n|---|---|---|\n| `THUMBNAIL_EXTRACTOR_UPLOAD_DIR` | `./uploads` | Video scratch |\n| `THUMBNAIL_EXTRACTOR_OUTPUT_DIR` | `./outputs` | Thumbnail output |\n| `THUMBNAIL_EXTRACTOR_MODEL_DIR` | `./models` | CNN model storage |\n| `THUMBNAIL_EXTRACTOR_CONFIG_PATH` | `./config/categories.json` | Category config |\n| `THUMBNAIL_EXTRACTOR_PORT` | `5000` | Flask port |\n\nSee [`docs/CONFIG.md`](docs/CONFIG.md) for the full category config schema.\n\n## How it works\n\n1. Upload a video — stored temporarily in `uploads/`.\n2. Frame sampling — scene-boundary detection + adaptive sampling pulls representative frames.\n3. Per-frame analysis — face detection (OpenCV), heuristic quality scoring (sharpness + brightness + contrast), content classification.\n4. Optional CNN ranking — if a category has a trained `.pth`, it reranks candidates by learned preference.\n5. Near-duplicate filter — visually-similar frames collapse to one representative.\n6. Top-10 export — full-resolution JPGs + optional background-removed variants.\n\nAll processing happens on your machine. No frame ever touches the cloud.\n\n## Related projects\n\nPart of the **PodLab** suite of podcast-production tools (more coming).\n\n## Contributing\n\nPRs welcome. See [CHANGELOG.md](CHANGELOG.md) for release history.\n\n## License\n\n[MIT](LICENSE) — do whatever, but don't sue us.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fremvisual%2Fpodcast-thumbnail-extractor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fremvisual%2Fpodcast-thumbnail-extractor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fremvisual%2Fpodcast-thumbnail-extractor/lists"}