nix-configs

Personal NixOS and home-manager configuration files
Log | Files | Refs

commit fcf89d2e6c8622b06563db1f5679751698809f9d
parent e9afb953de18b6ff2be2ae85eb7435b2f1ea5ee9
Author: breadcat <breadcat@users.noreply.github.com>
Date:   Fri,  6 Feb 2026 22:07:12 +0000

First revision of audiobook script

Diffstat:
Mmachines/atlas.nix | 1+
Mmachines/ilias.nix | 1+
Ascripts/taudiobooker.nix | 146+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 148 insertions(+), 0 deletions(-)

diff --git a/machines/atlas.nix b/machines/atlas.nix @@ -31,6 +31,7 @@ let machine = "atlas"; in { ../scripts/duupmove.nix ../scripts/restic.nix ../scripts/seedy.nix + ../scripts/taudiobooker.nix ../scripts/vidyascape.nix ../scripts/xdb.nix ]; diff --git a/machines/ilias.nix b/machines/ilias.nix @@ -40,6 +40,7 @@ let machine = "ilias"; in { ../scripts/startpage-sort.nix ../scripts/tank-log.nix ../scripts/tank-sort.nix + ../scripts/taudiobooker.nix ../scripts/watchedlist.nix ../scripts/xdb.nix ../scripts/youtube-id-rss.nix diff --git a/scripts/taudiobooker.nix b/scripts/taudiobooker.nix @@ -0,0 +1,146 @@ +{ pkgs, ... }: + +{ + environment.systemPackages = [ + (pkgs.writeShellScriptBin "taudiobooker" '' + set -euo pipefail + + # variables + codec="libopus" + bitrate="48k" + compression="10" + output="" + + # functions + strip_chars() { awk '{gsub(/^[ \t-]+|[ \t-]+$/,""); print $0}'; } + + process_opus_file() { + local file="$1" + output="$file" + + echo "Tagging OPUS file: $file" + + ${pkgs.opustags}/bin/opustags -i -D "$output" + ${pkgs.opustags}/bin/opustags -i -s "GENRE=Audiobook" "$output" + + artist=$(printf "%s" "$output" | + awk -F"-" '{print $1}' | + strip_chars) + + ${pkgs.opustags}/bin/opustags -i -s "ARTIST=$artist" "$output" + + if [[ "$output" == *"#"* ]]; then + # Series format + album=$(printf "%s" "$output" | + awk -F"-" '{print $2}' | + awk -F"#" '{print $1}' | + strip_chars) + + track=$(printf "%s" "$output" | + awk -F"-" '{print $2}' | + awk -F"#" '{print $2}' | + awk '{gsub("^0*",""); print}' | + strip_chars) + + title=$(printf "%s" "$output" | + awk -F"-" '{gsub(".opus",""); print $3}' | + strip_chars) + + ${pkgs.opustags}/bin/opustags -i -s "ALBUM=$album" "$output" + ${pkgs.opustags}/bin/opustags -i -s "TRACKNUMBER=$track" "$output" + ${pkgs.opustags}/bin/opustags -i -s "TITLE=$title" "$output" + + else + # Single file + title=$(printf "%s" "$output" | + awk -F"-" '{gsub(".opus",""); print $2}' | + strip_chars) + + ${pkgs.opustags}/bin/opustags -i -s "TITLE=$title" "$output" + fi + } + + process_other_file() { + local file="$1" + local base="''${file%.*}" + output="''${base}.opus" + + echo "Encoding file to OPUS: $file → $output" + + ${pkgs.ffmpeg}/bin/ffmpeg -hide_banner -loglevel error -nostats \ + -i "$file" \ + -acodec "$codec" \ + -ac 1 \ + -b:a "$bitrate" \ + -vbr on \ + -compression_level "$compression" \ + "$output" + + echo "Done: $output" + } + + analyze_directory() { + local dir="$1" + echo "Analyzing and concatenating directory: $dir" + + # Find most common extension + local extension + extension=$(find "$dir" -type f -printf '%f\n' \ + | sed -E 's/.*\.([^.]+)$/\1/' \ + | sort | uniq -c | sort -nr | awk 'NR==1{print $2}') + + if [[ -z "''${extension}" ]]; then + echo "No files found in directory." + exit 1 + fi + + echo "Most common filetype: .$extension" + + # Output filename based on directory name + local name + name=$(basename "$dir") + output="''${name}.opus" + + echo "Concatenating all .$extension files → $output" + + ${pkgs.ffmpeg}/bin/ffmpeg -f concat -safe 0 \ + -i <(for f in "$dir"/*."$extension"; do + echo "file '$PWD/$f'" + done) \ + -acodec "$codec" \ + -ac 1 \ + -b:a "$bitrate" \ + -vbr on \ + -compression_level "$compression" \ + "$output" + + echo "Created: $output" + } + + # main logic + + if [[ $# -ne 1 ]]; then + echo "Usage: $0 <file-or-directory>" + exit 1 + fi + + input="$1" + + if [[ -d "$input" ]]; then + analyze_directory "$input" + elif [[ -f "$input" ]]; then + ext="''${input##*.}" + shopt -s nocasematch + if [[ "$ext" == "opus" ]]; then + process_opus_file "$input" + else + process_other_file "$input" + fi + shopt -u nocasematch + else + echo "Error: '$input' is not a valid file or directory" + exit 1 + fi + '') + ]; +}