apiVersion: v1 kind: ConfigMap metadata: name: droppedneedle-transcoder-script namespace: default data: transcode.sh: | #!/bin/bash WATCH_DIR="/yarr/media/music" echo "Starting transcoder watch on $WATCH_DIR..." # Listen for files moved into the directory (atomic renames) and direct writes inotifywait -m -r -e moved_to,close_write --format '%w%f' "$WATCH_DIR" | while read FILE do # Case-insensitive check for .flac extension if [[ "${FILE,,}" == *.flac ]]; then echo "Detected new FLAC via import: $FILE" OPUS_FILE="${FILE%.*}.opus" # Transcode (preserves tags natively in newer ffmpeg versions) ffmpeg -y -i "$FILE" -acodec libopus -ac 2 -ab 160k "$OPUS_FILE" if [ $? -eq 0 ]; then echo "Transcode successful. Removing original FLAC..." rm "$FILE" echo "Triggering DroppedNeedle library scan..." # Calls the DroppedNeedle service using internal Kubernetes DNS curl -X POST http://droppedneedle.default.svc.cluster.local:8688/api/v1/library/scan/start else echo "Error: FFmpeg transcode failed for $FILE" fi fi done --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: droppedneedle-transcoder name: droppedneedle-transcoder namespace: default spec: replicas: 1 selector: matchLabels: app: droppedneedle-transcoder template: metadata: labels: app: droppedneedle-transcoder spec: containers: - name: transcoder image: alpine:latest command: ["/bin/sh", "-c"] args: - "apk add --no-cache bash inotify-tools ffmpeg curl && bash /scripts/transcode.sh" volumeMounts: - mountPath: /yarr name: yarr - mountPath: /scripts name: script-volume restartPolicy: Always volumes: - name: yarr nfs: server: robin.home.nest path: /yarr - name: script-volume configMap: name: droppedneedle-transcoder-script