{"id":51472343,"url":"https://github.com/linuxmatters/jive-encoder","last_synced_at":"2026-07-06T19:01:01.696Z","repository":{"id":326384522,"uuid":"1092751165","full_name":"linuxmatters/jive-encoder","owner":"linuxmatters","description":"Drop your podcast .wav into a shiny MP3, AAC or Opus with metadata, cover art, and all 🪩","archived":false,"fork":false,"pushed_at":"2026-07-04T18:49:35.000Z","size":5585,"stargazers_count":8,"open_issues_count":1,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-04T20:13:06.569Z","etag":null,"topics":["aac","coverart","encoder","id3v2","linux","macos","mp3","opus","podcast"],"latest_commit_sha":null,"homepage":"https://linuxmatters.sh","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/linuxmatters.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":"SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":"flexiondotorg","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"custom":null}},"created_at":"2025-11-09T08:28:31.000Z","updated_at":"2026-07-04T10:11:39.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/linuxmatters/jive-encoder","commit_stats":null,"previous_names":["linuxmatters/jivedrop","linuxmatters/jive-encoder"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/linuxmatters/jive-encoder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxmatters%2Fjive-encoder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxmatters%2Fjive-encoder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxmatters%2Fjive-encoder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxmatters%2Fjive-encoder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/linuxmatters","download_url":"https://codeload.github.com/linuxmatters/jive-encoder/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxmatters%2Fjive-encoder/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35202786,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-06T02:00:07.184Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["aac","coverart","encoder","id3v2","linux","macos","mp3","opus","podcast"],"created_at":"2026-07-06T19:01:00.916Z","updated_at":"2026-07-06T19:01:01.689Z","avatar_url":"https://github.com/linuxmatters.png","language":"Go","funding_links":["https://github.com/sponsors/flexiondotorg"],"categories":[],"sub_categories":[],"readme":"# Jive Encoder 🗜️\n\n*Formerly known as Jivedrop.*\n\n\u003e Drop your podcast .wav into a shiny MP3, AAC, or Opus with metadata, cover art, and all\n\n## The Groove\n\nJive Encoder takes your mixed podcast audio (WAV/FLAC) and outputs RSS-ready podcast files with optimised encoding, embedded artwork, and complete metadata. Choose MP3 for universal compatibility, AAC for Apple-recommended quality, or Opus for modern Android and web delivery. One command, distribution-ready output.\n\n### Example Output\n\n\u003cdiv align=\"center\"\u003e\u003cimg alt=\"Jive Encoder Demo\" src=\".github/jive-encoder.gif\" width=\"600\" /\u003e\u003c/div\u003e\n\n### What's Cooking\n\n- 🎵 **Multi-format output** via `--format mp3|aac|opus` (default: mp3)\n  - 🎸 **MP3** CBR 112kbps mono / 192kbps stereo, 44.1kHz, LAME quality 3, 20.5kHz lowpass\n  - 🍏 **AAC** CBR 64kbps mono / 128kbps stereo, 44.1kHz, `.m4a` (Apple-recommended)\n  - 🔊 **Opus** VBR ~32kbps mono / ~48kbps stereo, 48kHz, `.opus` (Android/web)\n- 🏷️ **Format-native metadata** - correct tags for each container\n  - MP3: ID3v2.4 tags with embedded cover art\n  - AAC: iTunes MP4 atoms with embedded cover art\n  - Opus: Vorbis comments (text tags; no embedded cover)\n  - Episode title, number, album, artist, date, comment\n  - Podcast enclosure stats for duration and bytes\n- ♊ **Dual-mode workflow**\n  - 📝 **Hugo mode** read metadata from episode markdown\n  - 🎙️ **Standalone mode** specify metadata via flags\n- 🚀 **Single binary** Just drop and encode\n  - 🐧 **Linux** (amd64 and aarch64)\n  - 🍏 **macOS** (x86 and Apple Silicon)\n\n## Usage\n\n### Hugo Mode (Integrated Workflow)\n\nFor podcasts using the Hugo static site generator and a theme like [Castanet](https://github.com/mattstratton/castanet), Jive Encoder reads metadata from episode markdown:\n\n**Hugo mode automatically:**\n- Reads episode title and number from frontmatter\n- Locates cover art from `episode_image` field\n- Applies Linux Matters defaults (artist, album, comment)\n- Outputs frontmatter-ready values for `podcast_duration` and `podcast_bytes`\n- Prompts to update Hugo frontmatter\n\n```bash\n# Basic encoding (MP3 by default)\njive-encoder LMP67.flac episode/67.md\n\n# Encode as AAC for Apple-recommended distribution\njive-encoder LMP67.flac episode/67.md --format aac\n\n# Override Hugo defaults\njive-encoder LMP67.flac episode/67.md --artist \"Ubuntu Podcast\" --comment \"https://ubuntupodcast.org\"\n```\n### Standalone Mode (Universal Workflow)\n\n**Standalone mode features:**\n- Required flags: `--title`, `--num`, and `--cover`\n- Optional metadata: `--artist`, `--album`, `--date`, `--comment`, `--format`\n- Smart filename generation: `{artist}-{num}.{ext}` or `episode-{num}.{ext}`\n- Album defaults to artist value if not specified\n\nFor podcasts without Hugo, specify metadata via flags:\n\n```bash\n# Minimal (title, episode number, and cover art required)\njive-encoder audio.flac \\\n  --title \"Terminal Full of Sparkles\" \\\n  --num 66 \\\n  --cover artwork.png\n\n# Encode as Opus (note: Opus is not accepted by Apple Podcasts)\njive-encoder audio.flac \\\n  --title \"Terminal Full of Sparkles\" \\\n  --num 66 \\\n  --cover artwork.png \\\n  --format opus\n\n# Full metadata\njive-encoder audio.flac \\\n  --title \"Terminal Full of Sparkles\" \\\n  --num 66 \\\n  --artist \"Linux Matters\" \\\n  --album \"All Seasons\" \\\n  --date \"2025-10\" \\\n  --comment \"https://linuxmatters.sh/66\" \\\n  --cover artwork.png \\\n  --format aac\n```\n\n## CLI Reference\n\n```\nUsage:\n  Hugo mode:\n    jive-encoder \u003caudio-file\u003e \u003cepisode-md\u003e [flags]\n  Standalone mode:\n    jive-encoder \u003caudio-file\u003e --title TEXT --num NUMBER --cover PATH [flags]\n\n\nArguments:\n  [\u003caudio-file\u003e]  Path to audio file (WAV, FLAC)\n  [\u003cepisode-md\u003e]  Path to episode markdown file (Hugo mode)\n\n\nFlags:\n  -h, --help     Show context-sensitive help.\n  --num          Episode number, must be a non-negative integer (required in standalone mode)\n  --title        Episode title (required in standalone mode)\n  --artist       Artist name (defaults to 'Linux Matters' in Hugo mode)\n  --album        Album name (defaults to artist value if omitted)\n  --date         Release date (YYYY-MM-DD format)\n  --comment      Comment URL (defaults to 'https://linuxmatters.sh' in Hugo mode)\n  --cover        Cover art path (required in standalone mode)\n  --output-path  Output file or directory path\n  --format       Output format: mp3, aac, or opus (default: mp3)\n  --stereo       Encode as stereo at 192kbps (default: mono at 112kbps)\n  --version      Show version information\n```\n\n### Output\n- Hugo mode:        `LMP{num}.{ext}` (or `{artist}-{num}.{ext}` with `--artist` override)\n- Standalone mode:  `{artist}-{num}.{ext}` (or `episode-{num}.{ext}` without `--artist`)\n\nWhere `{ext}` is `.mp3`, `.m4a`, or `.opus` depending on `--format`.\n\nIf `--output-path` names a file, its extension must match `--format`.\n\n### Encoding settings\n\n| Format | Mono | Stereo | Sample rate | Notes |\n|--------|------|--------|-------------|-------|\n| MP3 (default) | 112 kbps CBR | 192 kbps CBR | 44.1 kHz | LAME quality 3, 20.5 kHz lowpass |\n| AAC | 64 kbps CBR | 128 kbps CBR | 44.1 kHz | AAC-LC, `.m4a` (ipod muxer), no lowpass |\n| Opus | ~32 kbps VBR | ~48 kbps VBR | 48 kHz | libopus, `.opus`, no lowpass; 48 kHz is Opus's native rate |\n\n### Metadata tags\n\nTags are written natively by the muxer for each format.\n\n**MP3: ID3v2.4**\n- `TIT2`: `{num}: {title}`\n- `TALB`: `{album}` (omitted if not provided)\n- `TRCK`: `{num}`\n- `TPE1`: `{artist}` (omitted if not provided)\n- `TDRC`: `{date}` (defaults to current YYYY-MM)\n- `COMM`: `{comment}` (omitted if not provided)\n- `APIC`: Cover art (PNG, front cover)\n\n**AAC: iTunes MP4 atoms**\n\nSame fields as MP3, written as MP4 atoms. Cover art embedded.\n\n**Opus: Vorbis comments**\n\nSame text fields as MP3. Cover art is not embedded in Opus files.\n\n## Build\n\nJive Encoder uses [ffmpeg-statigo](https://github.com/linuxmatters/ffmpeg-statigo) for FFmpeg static bindings.\n\n```bash\n# Setup or update ffmpeg-statigo submodule and library\njust setup\n\n# Build and test\njust build        # Build binary\njust test         # Run tests\njust test-encoder # Test encoder\n```\n\n## Why Jive Encoder?\n\nFFmpeg's CLI can absolutely encode podcast-ready audio with metadata. But getting the incantation right for CBR encoding, mono downmix, format-native tags, embedded artwork, and correct lowpass filtering requires a sprawling command line you'll never remember. Switch from MP3 to AAC and every option changes. Add Hugo frontmatter parsing on top and you're writing a script.\n\nJive Encoder wraps the fiddly bits into a single binary that speaks Hugo natively. Drop your WAV, point at your episode markdown, pick your format, and get distribution-ready output with duration and byte counts ready to paste back into your frontmatter.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinuxmatters%2Fjive-encoder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flinuxmatters%2Fjive-encoder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinuxmatters%2Fjive-encoder/lists"}