refactor(musicRecognition): replace parec/ffmpeg pipeline with songrec listen fix:#3057

Use `songrec listen --audio-device` instead of manually capturing audio
with parec, converting with ffmpeg, and passing to audio-file-to-recognized-song.
Drops temp file handling and simplifies the recognition loop.
This commit is contained in:
Aman
2026-03-01 15:46:02 +05:30
committed by GitHub
parent 1402a19c98
commit 0725edd35d
@@ -1,12 +1,8 @@
#!/bin/bash #!/bin/bash
INTERVAL=2 INTERVAL=10
TOTAL_DURATION=30 TOTAL_DURATION=30
MIN_VALID_RESULT_LENGTH=300
SOURCE_TYPE="monitor" # monitor | input SOURCE_TYPE="monitor" # monitor | input
TMP_PATH="/tmp/quickshell/media/songrec"
TMP_RAW="$TMP_PATH/recording.raw"
TMP_MP3="$TMP_PATH/recording.mp3"
while getopts "i:t:s:" opt; do while getopts "i:t:s:" opt; do
case $opt in case $opt in
@@ -16,47 +12,37 @@ while getopts "i:t:s:" opt; do
*) exit 1 ;; *) exit 1 ;;
esac esac
done done
if ! command -v songrec >/dev/null 2>&1; then
exit 1
fi
if [ "$SOURCE_TYPE" = "monitor" ]; then if [ "$SOURCE_TYPE" = "monitor" ]; then
MONITOR_SOURCE=$(pactl get-default-sink).monitor AUDIO_DEVICE=$(pactl get-default-sink).monitor
elif [ "$SOURCE_TYPE" = "input" ]; then elif [ "$SOURCE_TYPE" = "input" ]; then
MONITOR_SOURCE=$(pactl info | grep "Default Source:" | awk '{print $3}' || true) AUDIO_DEVICE=$(pactl info | grep "Default Source:" | awk '{print $3}' || true)
else else
echo "Invalid source type" echo "Invalid source type"
exit 1 exit 1
fi fi
if ! command -v songrec >/dev/null 2>&1 || ! command -v parec >/dev/null 2>&1 || ! command -v ffmpeg >/dev/null 2>&1; then if [ -z "$AUDIO_DEVICE" ] || ! pactl list short sources | grep -q "$AUDIO_DEVICE"; then
exit 1
fi
if [ -z "$MONITOR_SOURCE" ] || ! pactl list short sources | grep -q "$MONITOR_SOURCE"; then
exit 1 exit 1
fi fi
cleanup() { cleanup() {
rm -f "$TMP_RAW" "$TMP_MP3" kill "$SONGREC_PID" 2>/dev/null || true
pkill -P $$ parec >/dev/null 2>&1 || true
} }
trap cleanup EXIT trap cleanup EXIT
mkdir -p "$TMP_PATH" songrec listen --audio-device "$AUDIO_DEVICE" --request-interval "$INTERVAL" --json --disable-mpris | while IFS= read -r line; do
parec --device="$MONITOR_SOURCE" --format=s16le --rate=44100 --channels=2 > "$TMP_RAW" & if echo "$line" | grep -q '"matches": \['; then
START_TIME=$(date +%s) echo "$line"
kill "$SONGREC_PID" 2>/dev/null || true
while true; do
sleep "$INTERVAL"
CURRENT_TIME=$(date +%s)
ELAPSED=$((CURRENT_TIME - START_TIME))
if (( ELAPSED >= TOTAL_DURATION )); then
exit 0 exit 0
fi fi
done &
SONGREC_PID=$!
ffmpeg -f s16le -ar 44100 -ac 2 -i "$TMP_RAW" -acodec libmp3lame -y -hide_banner -loglevel error "$TMP_MP3" 2>/dev/null sleep "$TOTAL_DURATION"
RESULT=$(songrec audio-file-to-recognized-song "$TMP_MP3" 2>/dev/null || true) exit 0
if echo "$RESULT" | grep -q '"matches": \[' && [ ${#RESULT} -gt $MIN_VALID_RESULT_LENGTH ]; then
echo "$RESULT"
exit 0
fi
done