This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

tools.record: init

+171
+57
5pkgs/system-audio-dump/package.nix
··· 1 + { 2 + lib, 3 + fetchFromGitHub, 4 + swift, 5 + swiftpm, 6 + swiftPackages, 7 + }: 8 + 9 + swiftPackages.stdenv.mkDerivation { 10 + pname = "system-audio-dump"; 11 + version = "0-unstable-2025-09-02"; 12 + 13 + src = fetchFromGitHub { 14 + owner = "sohzm"; 15 + repo = "systemAudioDump"; 16 + rev = "19caa4f6c0661c03a10d1f08c79a11f0b00f251a"; 17 + hash = "sha256-H2TeB7/Meq7EvfW7zLZn5GGFrKwCyZuJvafv61ZWdrA="; 18 + }; 19 + 20 + nativeBuildInputs = [ 21 + swift 22 + swiftpm 23 + ]; 24 + 25 + postPatch = '' 26 + # Downgrade swift-tools-version from 6.0 to 5.10 and macOS from v15 to v14 27 + sed -i 's/swift-tools-version:6.0/swift-tools-version:5.10/' Package.swift 28 + sed -i 's/.macOS(.v15)/.macOS(.v14)/' Package.swift 29 + 30 + # Patch Swift 6 / macOS 15 features in source 31 + # Remove @retroactive attribute (Swift 6 feature for silencing conformance warnings) 32 + sed -i 's/@retroactive //' Sources/SystemAudioDump/main.swift 33 + # Remove captureMicrophone (macOS 15+ only, defaults to false anyway) 34 + sed -i '/captureMicrophone/d' Sources/SystemAudioDump/main.swift 35 + ''; 36 + 37 + buildPhase = '' 38 + runHook preBuild 39 + swift build -c release 40 + runHook postBuild 41 + ''; 42 + 43 + installPhase = '' 44 + runHook preInstall 45 + mkdir -p $out/bin 46 + cp .build/release/SystemAudioDump $out/bin/system-audio-dump 47 + runHook postInstall 48 + ''; 49 + 50 + meta = { 51 + description = "macOS CLI that captures system audio and outputs raw PCM to stdout"; 52 + homepage = "https://github.com/sohzm/systemAudioDump"; 53 + license = lib.licenses.mit; 54 + platforms = lib.platforms.darwin; 55 + mainProgram = "system-audio-dump"; 56 + }; 57 + }
+17
tools/record/flake-module.nix
··· 1 + { ... }: 2 + { 3 + perSystem = 4 + { pkgs, self', ... }: 5 + { 6 + packages.record = pkgs.writeShellApplication { 7 + name = "record"; 8 + runtimeInputs = [ 9 + pkgs.ffmpeg 10 + pkgs.gum 11 + ] 12 + ++ pkgs.lib.optionals pkgs.stdenv.hostPlatform.isLinux [ pkgs.pulseaudio ] 13 + ++ pkgs.lib.optionals pkgs.stdenv.hostPlatform.isDarwin [ self'.packages.system-audio-dump ]; 14 + text = builtins.readFile ./rec.sh; 15 + }; 16 + }; 17 + }
+97
tools/record/rec.sh
··· 1 + #!/usr/bin/env bash 2 + set -euo pipefail 3 + 4 + list_sources() { 5 + if [[ "$OSTYPE" == "darwin"* ]]; then 6 + # macOS: list audio devices via ffmpeg avfoundation 7 + echo "system: System Audio (via ScreenCaptureKit)" 8 + ffmpeg -f avfoundation -list_devices true -i "" 2>&1 | \ 9 + sed -n '/AVFoundation audio devices:/,/^[^[]/p' | \ 10 + grep -E '^\[AVFoundation.*\[[0-9]+\]' | \ 11 + sed 's/.*\[\([0-9]*\)\] \(.*\)/\1: \2/' 12 + else 13 + # Linux: list PulseAudio/PipeWire sources including monitors (for system audio) 14 + # Sources ending in .monitor capture the output of that sink (system audio) 15 + pactl list sources short | awk '{print $2}' | while read -r source; do 16 + if [[ "$source" == *.monitor ]]; then 17 + echo "$source (system audio)" 18 + else 19 + echo "$source" 20 + fi 21 + done 22 + fi 23 + } 24 + 25 + get_source_name() { 26 + # Strip the description suffix for actual recording 27 + local name="$1" 28 + echo "${name% (system audio)}" 29 + } 30 + 31 + record_source() { 32 + local source="$1" 33 + 34 + if [[ "$OSTYPE" == "darwin"* ]]; then 35 + if [[ "$source" == "system" ]]; then 36 + # Use system-audio-dump for system audio (ScreenCaptureKit) 37 + # Output is raw PCM 24kHz 16-bit stereo, convert to WAV for compatibility 38 + system-audio-dump | ffmpeg -f s16le -ar 24000 -ac 2 -i - -f wav -acodec pcm_s16le - 2>/dev/null 39 + else 40 + # Use avfoundation for mic input, source is the device index 41 + ffmpeg -f avfoundation -i ":${source}" -f wav -acodec pcm_s16le - 2>/dev/null 42 + fi 43 + else 44 + # Linux: use pulse 45 + ffmpeg -f pulse -i "$source" -f wav -acodec pcm_s16le - 2>/dev/null 46 + fi 47 + } 48 + 49 + # Show help 50 + if [[ "${1:-}" == "-h" ]] || [[ "${1:-}" == "--help" ]]; then 51 + echo "Usage: record [SOURCE]" 52 + echo "" 53 + echo "Record audio from a source and output WAV to stdout." 54 + echo "If no source is provided, prompts interactively with gum." 55 + echo "" 56 + echo "Options:" 57 + echo " -l, --list List available audio sources" 58 + echo " -h, --help Show this help" 59 + echo "" 60 + echo "System audio:" 61 + echo " Linux: Select a .monitor source (captures sink output)" 62 + echo " macOS: Use 'system' source (requires Screen Recording permission)" 63 + echo "" 64 + echo "Examples:" 65 + echo " record | mpv -" 66 + echo " record system | mpv - # macOS system audio" 67 + echo " record 0 | mpv - # macOS device index" 68 + echo " record alsa_output.pci-xxx.monitor | mpv - # Linux system audio" 69 + exit 0 70 + fi 71 + 72 + # List sources 73 + if [[ "${1:-}" == "-l" ]] || [[ "${1:-}" == "--list" ]]; then 74 + list_sources 75 + exit 0 76 + fi 77 + 78 + # Get source from argument or prompt 79 + if [[ -n "${1:-}" ]]; then 80 + SOURCE="$1" 81 + else 82 + # Use gum to select a source 83 + if [[ "$OSTYPE" == "darwin"* ]]; then 84 + SOURCE=$(list_sources | gum choose --header "Select audio source:" | cut -d: -f1) 85 + else 86 + SELECTION=$(list_sources | gum choose --header "Select audio source:") 87 + SOURCE=$(get_source_name "$SELECTION") 88 + fi 89 + fi 90 + 91 + if [[ -z "$SOURCE" ]]; then 92 + echo "Error: No source selected" >&2 93 + exit 1 94 + fi 95 + 96 + echo "Recording from: $SOURCE (Ctrl+C to stop)" >&2 97 + record_source "$SOURCE"