diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index c266c9d..5d54204 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,7 +1,7 @@ blank_issues_enabled: false contact_links: - name: 🛟 Support - url: https://github.com/linuxmatters/jivedrop/blob/HEAD/SUPPORT.md + url: https://github.com/linuxmatters/jive-encoder/blob/HEAD/SUPPORT.md about: Check the support guide before opening an issue. # - name: Code of Conduct Report # url: https://yourproject.org/community-report/ diff --git a/.github/jive-encoder.gif b/.github/jive-encoder.gif new file mode 100644 index 0000000..7258d1d Binary files /dev/null and b/.github/jive-encoder.gif differ diff --git a/.github/jivedrop.gif b/.github/jivedrop.gif deleted file mode 100644 index 6f273e7..0000000 Binary files a/.github/jivedrop.gif and /dev/null differ diff --git a/.github/workflows/builder.yml b/.github/workflows/builder.yml index 1b46f2b..3dd32d2 100644 --- a/.github/workflows/builder.yml +++ b/.github/workflows/builder.yml @@ -212,15 +212,15 @@ jobs: run: | VERSION=$(git describe --tags --always --dirty 2>/dev/null || echo "dev") echo "version=$VERSION" >> "$GITHUB_OUTPUT" - echo "Building jivedrop $VERSION for ${{ matrix.os }}/${{ matrix.arch }}" + echo "Building jive-encoder $VERSION for ${{ matrix.os }}/${{ matrix.arch }}" - name: Build binary run: | - go build -ldflags="-X main.version=${{ steps.version.outputs.version }}" -o jivedrop-${{ matrix.os }}-${{ matrix.arch }} ./cmd/jivedrop + go build -ldflags="-X main.version=${{ steps.version.outputs.version }}" -o jive-encoder-${{ matrix.os }}-${{ matrix.arch }} ./cmd/jive-encoder - name: Upload artifact uses: actions/upload-artifact@v7 with: - name: jivedrop-${{ matrix.os }}-${{ matrix.arch }} - path: jivedrop-${{ matrix.os }}-${{ matrix.arch }} + name: jive-encoder-${{ matrix.os }}-${{ matrix.arch }} + path: jive-encoder-${{ matrix.os }}-${{ matrix.arch }} release: name: Release 📦 @@ -257,12 +257,12 @@ jobs: ```bash # Linux (amd64) - chmod +x jivedrop-linux-amd64 - sudo mv jivedrop-linux-amd64 /usr/local/bin/jivedrop + chmod +x jive-encoder-linux-amd64 + sudo mv jive-encoder-linux-amd64 /usr/local/bin/jive-encoder # macOS (Apple Silicon) - chmod +x jivedrop-darwin-arm64 - sudo mv jivedrop-darwin-arm64 /usr/local/bin/jivedrop + chmod +x jive-encoder-darwin-arm64 + sudo mv jive-encoder-darwin-arm64 /usr/local/bin/jive-encoder ``` ## Checksums @@ -275,7 +275,7 @@ jobs: uses: actions/download-artifact@v8 with: path: artifacts - pattern: jivedrop-* + pattern: jive-encoder-* merge-multiple: false - name: Create release uses: softprops/action-gh-release@v3 @@ -283,8 +283,8 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: ${{ steps.version.outputs.version }} - name: Jivedrop ${{ steps.version.outputs.version }} + name: Jive Encoder ${{ steps.version.outputs.version }} body_path: CHANGELOG.md draft: false prerelease: false - files: artifacts/jivedrop-*/jivedrop-* + files: artifacts/jive-encoder-*/jive-encoder-* diff --git a/.gitignore b/.gitignore index eb09d95..5f22320 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ .direnv -/jivedrop +/jive-encoder testdata/ *.mp3 *.opus diff --git a/.harper-dictionary.txt b/.harper-dictionary.txt new file mode 100644 index 0000000..015bbcb --- /dev/null +++ b/.harper-dictionary.txt @@ -0,0 +1,2 @@ +Jivedrop +jive-encoder diff --git a/AGENTS.md b/AGENTS.md index bb75d25..0da9afe 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -25,7 +25,7 @@ just clean # Remove build artifacts and test outputs (*.mp3) ## Architecture ``` -cmd/jivedrop/ +cmd/jive-encoder/ main.go # CLI entry, mode detection (Hugo vs Standalone), argument validation workflow.go # Workflow interface + CLIOptions struct passed to each workflow hugo.go # Hugo-mode workflow (frontmatter-driven) @@ -52,8 +52,8 @@ third_party/ffmpeg-statigo/ # Git submodule: FFmpeg 8.1 static bindings ### Dual-Mode CLI -- **Hugo mode**: `jivedrop audio.flac episode.md`: reads metadata from Hugo frontmatter -- **Standalone mode**: `jivedrop audio.flac --title X --num N --cover Y`: explicit flags +- **Hugo mode**: `jive-encoder audio.flac episode.md`: reads metadata from Hugo frontmatter +- **Standalone mode**: `jive-encoder audio.flac --title X --num N --cover Y`: explicit flags - Mode detection: second argument ending in `.md` triggers Hugo mode - `--format mp3|opus|aac` selects one format per invocation (single value, default `mp3`); Kong rejects unknown values at parse time. Each invocation emits one file with the preset extension @@ -61,7 +61,7 @@ third_party/ffmpeg-statigo/ # Git submodule: FFmpeg 8.1 static bindings - Required fields in episode markdown: `episode`, `title`, `episode_image` - `episode` must be a non-empty, non-negative integer (validated by `encoder.ParseEpisodeNumber`); same rule applies to the standalone `--num` flag -- After encoding, Jivedrop calculates `podcast_duration` and `podcast_bytes` +- After encoding, Jive Encoder calculates `podcast_duration` and `podcast_bytes` - Write-back is format-agnostic: the stats reflect the single encoded file, whatever format was chosen - Prompts user to update frontmatter if values differ or are missing diff --git a/README.md b/README.md index 0ffa9f0..b3cc60c 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,16 @@ -# Jivedrop 🪩 +# Jive Encoder 🪩 + +*Formerly known as Jivedrop.* > Drop your podcast .wav into a shiny MP3, AAC, or Opus with metadata, cover art, and all ## The Groove -Jivedrop 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. +Jive 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. ### Example Output -
Jivedrop Demo
+
Jive Encoder Demo
### What's Cooking @@ -33,7 +35,7 @@ Jivedrop takes your mixed podcast audio (WAV/FLAC) and outputs RSS-ready podcast ### Hugo Mode (Integrated Workflow) -For podcasts using Hugo static site generator and the something like [Castanet](https://github.com/mattstratton/castanet), Jivedrop reads metadata from episode markdown: +For podcasts using Hugo static site generator and the something like [Castanet](https://github.com/mattstratton/castanet), Jive Encoder reads metadata from episode markdown: **Hugo mode automatically:** - Reads episode title and number from frontmatter @@ -44,13 +46,13 @@ For podcasts using Hugo static site generator and the something like [Castanet]( ```bash # Basic encoding (MP3 by default) -jivedrop LMP67.flac episode/67.md +jive-encoder LMP67.flac episode/67.md # Encode as AAC for Apple-recommended distribution -jivedrop LMP67.flac episode/67.md --format aac +jive-encoder LMP67.flac episode/67.md --format aac # Override Hugo defaults -jivedrop LMP67.flac episode/67.md --artist "Ubuntu Podcast" --comment "https://ubuntupodcast.org" +jive-encoder LMP67.flac episode/67.md --artist "Ubuntu Podcast" --comment "https://ubuntupodcast.org" ``` ### Standalone Mode (Universal Workflow) @@ -64,20 +66,20 @@ For podcasts without Hugo, specify metadata via flags: ```bash # Minimal (title, episode number, and cover art required) -jivedrop audio.flac \ +jive-encoder audio.flac \ --title "Terminal Full of Sparkles" \ --num 66 \ --cover artwork.png # Encode as Opus (note: Opus is not accepted by Apple Podcasts) -jivedrop audio.flac \ +jive-encoder audio.flac \ --title "Terminal Full of Sparkles" \ --num 66 \ --cover artwork.png \ --format opus # Full metadata -jivedrop audio.flac \ +jive-encoder audio.flac \ --title "Terminal Full of Sparkles" \ --num 66 \ --artist "Linux Matters" \ @@ -93,9 +95,9 @@ jivedrop audio.flac \ ``` Usage: Hugo mode: - jivedrop [flags] + jive-encoder [flags] Standalone mode: - jivedrop --title TEXT --num NUMBER --cover PATH [flags] + jive-encoder --title TEXT --num NUMBER --cover PATH [flags] Arguments: @@ -155,7 +157,7 @@ Same text fields as MP3. Cover art is not embedded in Opus files. ## Build -Jivedrop uses [ffmpeg-statigo](https://github.com/linuxmatters/ffmpeg-statigo) for FFmpeg static bindings. +Jive Encoder uses [ffmpeg-statigo](https://github.com/linuxmatters/ffmpeg-statigo) for FFmpeg static bindings. ```bash # Setup or update ffmpeg-statigo submodule and library @@ -167,8 +169,8 @@ just test # Run tests just test-encoder # Test encoder ``` -## Why Jivedrop? +## Why Jive Encoder? FFmpeg'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. -Jivedrop 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. +Jive 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. diff --git a/SECURITY.md b/SECURITY.md index 6379bc0..333e9f0 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -8,7 +8,7 @@ Only the latest release is supported. Security fixes are released as patch versi **Do not open a public issue for security vulnerabilities.** -[Report vulnerabilities privately](https://github.com/linuxmatters/jivedrop/security/advisories/new). Include: +[Report vulnerabilities privately](https://github.com/linuxmatters/jive-encoder/security/advisories/new). Include: - Steps to reproduce - Affected versions diff --git a/cmd/jivedrop/hugo.go b/cmd/jive-encoder/hugo.go similarity index 96% rename from cmd/jivedrop/hugo.go rename to cmd/jive-encoder/hugo.go index 4904af8..a3b9a5b 100644 --- a/cmd/jivedrop/hugo.go +++ b/cmd/jive-encoder/hugo.go @@ -5,9 +5,9 @@ import ( "os" "strings" - "github.com/linuxmatters/jivedrop/internal/cli" - "github.com/linuxmatters/jivedrop/internal/encoder" - "github.com/linuxmatters/jivedrop/internal/id3" + "github.com/linuxmatters/jive-encoder/internal/cli" + "github.com/linuxmatters/jive-encoder/internal/encoder" + "github.com/linuxmatters/jive-encoder/internal/id3" ) // Hugo mode metadata defaults for the Linux Matters podcast. diff --git a/cmd/jivedrop/hugo_test.go b/cmd/jive-encoder/hugo_test.go similarity index 100% rename from cmd/jivedrop/hugo_test.go rename to cmd/jive-encoder/hugo_test.go diff --git a/cmd/jivedrop/main.go b/cmd/jive-encoder/main.go similarity index 98% rename from cmd/jivedrop/main.go rename to cmd/jive-encoder/main.go index 6af72e8..95e2d6c 100644 --- a/cmd/jivedrop/main.go +++ b/cmd/jive-encoder/main.go @@ -9,10 +9,10 @@ import ( tea "charm.land/bubbletea/v2" "github.com/alecthomas/kong" "github.com/charmbracelet/x/term" - "github.com/linuxmatters/jivedrop/internal/cli" - "github.com/linuxmatters/jivedrop/internal/encoder" - "github.com/linuxmatters/jivedrop/internal/id3" - "github.com/linuxmatters/jivedrop/internal/ui" + "github.com/linuxmatters/jive-encoder/internal/cli" + "github.com/linuxmatters/jive-encoder/internal/encoder" + "github.com/linuxmatters/jive-encoder/internal/id3" + "github.com/linuxmatters/jive-encoder/internal/ui" ) // version is set via ldflags at build time: "dev" for local builds, the git @@ -325,7 +325,7 @@ func main() { func run() int { ctx := kong.Parse(&CLI, - kong.Name("jivedrop"), + kong.Name("jive-encoder"), kong.Description("Drop the mix, ship the show—metadata, cover art, and all."), kong.Vars{"version": version}, kong.UsageOnError(), diff --git a/cmd/jivedrop/main_test.go b/cmd/jive-encoder/main_test.go similarity index 98% rename from cmd/jivedrop/main_test.go rename to cmd/jive-encoder/main_test.go index bdde6c0..f4958dc 100644 --- a/cmd/jivedrop/main_test.go +++ b/cmd/jive-encoder/main_test.go @@ -705,21 +705,21 @@ func TestDetectMode_Integration(t *testing.T) { audioFile: "LMP67.flac", episodeMD: "content/episodes/67.md", expected: HugoMode, - description: "User runs: jivedrop LMP67.flac content/episodes/67.md", + description: "User runs: jive-encoder LMP67.flac content/episodes/67.md", }, { name: "real standalone workflow", audioFile: "podcast.wav", episodeMD: "", expected: StandaloneMode, - description: "User runs: jivedrop podcast.wav --title 'Ep 1' --num 1 --cover art.png", + description: "User runs: jive-encoder podcast.wav --title 'Ep 1' --num 1 --cover art.png", }, { name: "common mistake: user passes non-md file in hugo mode", audioFile: "episode.flac", episodeMD: "episode.txt", expected: StandaloneMode, - description: "User runs: jivedrop episode.flac episode.txt (should be .md not .txt)", + description: "User runs: jive-encoder episode.flac episode.txt (should be .md not .txt)", }, { name: "edge: .md file with uppercase extension", diff --git a/cmd/jivedrop/standalone.go b/cmd/jive-encoder/standalone.go similarity index 93% rename from cmd/jivedrop/standalone.go rename to cmd/jive-encoder/standalone.go index d5f1239..e25c201 100644 --- a/cmd/jivedrop/standalone.go +++ b/cmd/jive-encoder/standalone.go @@ -4,8 +4,8 @@ import ( "fmt" "os" - "github.com/linuxmatters/jivedrop/internal/encoder" - "github.com/linuxmatters/jivedrop/internal/id3" + "github.com/linuxmatters/jive-encoder/internal/encoder" + "github.com/linuxmatters/jive-encoder/internal/id3" ) // StandaloneWorkflow implements the Workflow interface for standalone mode. diff --git a/cmd/jivedrop/standalone_test.go b/cmd/jive-encoder/standalone_test.go similarity index 98% rename from cmd/jivedrop/standalone_test.go rename to cmd/jive-encoder/standalone_test.go index ac61808..72767f3 100644 --- a/cmd/jivedrop/standalone_test.go +++ b/cmd/jive-encoder/standalone_test.go @@ -263,7 +263,7 @@ func TestStandaloneWorkflowValidate_Integration(t *testing.T) { num: "66", cover: "artwork.png", wantErr: false, - description: "User runs: jivedrop audio.flac --title 'Terminal Full of Sparkles' --num 66 --cover artwork.png", + description: "User runs: jive-encoder audio.flac --title 'Terminal Full of Sparkles' --num 66 --cover artwork.png", }, { name: "common mistake: forgot --title flag", diff --git a/cmd/jivedrop/workflow.go b/cmd/jive-encoder/workflow.go similarity index 92% rename from cmd/jivedrop/workflow.go rename to cmd/jive-encoder/workflow.go index 8d69563..a2f563e 100644 --- a/cmd/jivedrop/workflow.go +++ b/cmd/jive-encoder/workflow.go @@ -3,9 +3,9 @@ package main import ( "fmt" - "github.com/linuxmatters/jivedrop/internal/cli" - "github.com/linuxmatters/jivedrop/internal/encoder" - "github.com/linuxmatters/jivedrop/internal/id3" + "github.com/linuxmatters/jive-encoder/internal/cli" + "github.com/linuxmatters/jive-encoder/internal/encoder" + "github.com/linuxmatters/jive-encoder/internal/id3" ) // Workflow defines the mode-specific operations for Hugo and Standalone workflows. diff --git a/go.mod b/go.mod index ee24625..8afdef0 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/linuxmatters/jivedrop +module github.com/linuxmatters/jive-encoder go 1.26 diff --git a/internal/cli/help.go b/internal/cli/help.go index 7cf336a..86628a6 100644 --- a/internal/cli/help.go +++ b/internal/cli/help.go @@ -43,7 +43,7 @@ func StyledHelpPrinter(options kong.HelpOptions) kong.HelpPrinter { var sb strings.Builder // Title and description - sb.WriteString(TitleStyle.Render("Jivedrop 🪩")) + sb.WriteString(TitleStyle.Render("Jive Encoder 🪩")) sb.WriteString("\n") sb.WriteString(helpDescStyle.Render("Drop your podcast .wav into a shiny MP3, AAC, or Opus with metadata, cover art, and all.")) sb.WriteString("\n") diff --git a/internal/cli/styles.go b/internal/cli/styles.go index 781e48e..da6b54f 100644 --- a/internal/cli/styles.go +++ b/internal/cli/styles.go @@ -53,7 +53,7 @@ var ( // PrintVersion prints version information func PrintVersion(version string) { - fmt.Println(TitleStyle.Render("Jivedrop 🪩")) + fmt.Println(TitleStyle.Render("Jive Encoder 🪩")) fmt.Printf("%s %s\n", KeyStyle.Render("Version:"), ValueStyle.Render(version)) fmt.Println() } diff --git a/internal/encoder/encoder_test.go b/internal/encoder/encoder_test.go index fb73c5a..f80cde0 100644 --- a/internal/encoder/encoder_test.go +++ b/internal/encoder/encoder_test.go @@ -9,7 +9,7 @@ import ( "sync" "testing" - "github.com/linuxmatters/jivedrop/internal/id3" + "github.com/linuxmatters/jive-encoder/internal/id3" ) // TestNewFormatResolution verifies that New defaults an empty Format to the diff --git a/internal/ui/encode.go b/internal/ui/encode.go index 0e9b7c6..17a79b1 100644 --- a/internal/ui/encode.go +++ b/internal/ui/encode.go @@ -9,7 +9,7 @@ import ( "charm.land/bubbles/v2/progress" tea "charm.land/bubbletea/v2" "github.com/charmbracelet/harmonica" - "github.com/linuxmatters/jivedrop/internal/encoder" + "github.com/linuxmatters/jive-encoder/internal/encoder" ) // ProgressUpdate represents a progress update from the encoder diff --git a/internal/ui/encode_test.go b/internal/ui/encode_test.go index 3618394..0730370 100644 --- a/internal/ui/encode_test.go +++ b/internal/ui/encode_test.go @@ -5,7 +5,7 @@ import ( "testing" tea "charm.land/bubbletea/v2" - "github.com/linuxmatters/jivedrop/internal/encoder" + "github.com/linuxmatters/jive-encoder/internal/encoder" ) // newTestModel builds a minimal EncodeModel for exercising Update in isolation. diff --git a/internal/ui/styles.go b/internal/ui/styles.go index 32851bb..5593cd6 100644 --- a/internal/ui/styles.go +++ b/internal/ui/styles.go @@ -2,7 +2,7 @@ package ui import ( "charm.land/lipgloss/v2" - "github.com/linuxmatters/jivedrop/internal/cli" + "github.com/linuxmatters/jive-encoder/internal/cli" ) // Import shared colour palette from cli package diff --git a/internal/ui/views.go b/internal/ui/views.go index d9b8c3f..2c58f3c 100644 --- a/internal/ui/views.go +++ b/internal/ui/views.go @@ -5,7 +5,7 @@ import ( "strings" "charm.land/lipgloss/v2" - "github.com/linuxmatters/jivedrop/internal/encoder" + "github.com/linuxmatters/jive-encoder/internal/encoder" ) // progressView renders the encoding progress UI diff --git a/jivedrop.tape b/jive-encoder.tape similarity index 94% rename from jivedrop.tape rename to jive-encoder.tape index 73441b2..951222c 100644 --- a/jivedrop.tape +++ b/jive-encoder.tape @@ -55,9 +55,9 @@ # Hide Hide the subsequent commands from the output # Show Show the subsequent commands in the output -Output .github/jivedrop.gif +Output .github/jive-encoder.gif -Require ./jivedrop +Require ./jive-encoder Set Shell "fish" Set FontSize 13 @@ -69,9 +69,9 @@ Set WindowBarSize 32 Set TypingSpeed 27ms Set Theme catppuccin-mocha -Type "./jivedrop testdata/LMP67.flac testdata/67.md" Sleep 250ms Enter +Type "./jive-encoder testdata/LMP67.flac testdata/67.md" Sleep 250ms Enter Sleep 4s -#Type "./jivedrop testdata/LMP80.flac testdata/80.md" Sleep 250ms Enter +#Type "./jive-encoder testdata/LMP80.flac testdata/80.md" Sleep 250ms Enter #Sleep 10s Type "n" Sleep 250ms Enter diff --git a/justfile b/justfile index 097f1f3..f15a208 100644 --- a/justfile +++ b/justfile @@ -1,4 +1,4 @@ -# Jivedrop - Just Commands +# Jive Encoder - Just Commands # List commands default: @@ -86,30 +86,30 @@ setup: echo "Don't forget to commit: git commit -m 'chore: update ffmpeg-statigo to $TAG'" fi -# Build jivedrop +# Build jive-encoder build: _check-submodule #!/usr/bin/env bash VERSION=$(git describe --tags --always --dirty 2>/dev/null || echo "dev") - echo "Building jivedrop version: $VERSION" - CGO_ENABLED=1 go build -ldflags="-X main.version=$VERSION" -o jivedrop ./cmd/jivedrop + echo "Building jive-encoder version: $VERSION" + CGO_ENABLED=1 go build -ldflags="-X main.version=$VERSION" -o jive-encoder ./cmd/jive-encoder # Clean build artifacts clean: - rm -fv jivedrop 2>/dev/null || true + rm -fv jive-encoder 2>/dev/null || true @rm testdata/*.mp3 2>/dev/null || true @rm testdata/*.m4a 2>/dev/null || true @rm testdata/*.opus 2>/dev/null || true -# Install jivedrop to ~/.local/bin +# Install jive-encoder to ~/.local/bin install: build @mkdir -p ~/.local/bin 2>/dev/null || true - @mv ./jivedrop ~/.local/bin/jivedrop - @echo "Installed jivedrop to ~/.local/bin/jivedrop" + @mv ./jive-encoder ~/.local/bin/jive-encoder + @echo "Installed jive-encoder to ~/.local/bin/jive-encoder" @echo "Make sure ~/.local/bin is in your PATH" # Record gif vhs: build - @vhs ./jivedrop.tape + @vhs ./jive-encoder.tape rm LMP67.mp3 2>/dev/null || true # Show current version (from git tags or "dev" if no tags) @@ -200,12 +200,12 @@ test-encoder: build rm -f "$file" # Decline the frontmatter-update prompt. Gate on the encode exit status, - # not the SIGPIPE that "echo n" may receive once jivedrop stops reading. + # not the SIGPIPE that "echo n" may receive once jive-encoder stops reading. set +o pipefail - echo n | ./jivedrop "$flac" "$meta" --format "$fmt" --output-path "$out/" >/dev/null + echo n | ./jive-encoder "$flac" "$meta" --format "$fmt" --output-path "$out/" >/dev/null rc=${PIPESTATUS[1]} set -o pipefail - [ "$rc" -eq 0 ] || fail "$fmt: jivedrop exited $rc" + [ "$rc" -eq 0 ] || fail "$fmt: jive-encoder exited $rc" [ -f "$file" ] || fail "$fmt: expected output $file not created" got_codec=$(ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of "default=noprint_wrappers=1:nokey=1" "$file")