forked from Shinonome/dots-hyprland
add interval to settings, update the script (it was not working as intented)
This commit is contained in:
@@ -378,6 +378,7 @@ Singleton {
|
|||||||
|
|
||||||
property JsonObject musicRecognition: JsonObject {
|
property JsonObject musicRecognition: JsonObject {
|
||||||
property int timeout: 16
|
property int timeout: 16
|
||||||
|
property int interval: 4
|
||||||
}
|
}
|
||||||
|
|
||||||
property JsonObject search: JsonObject {
|
property JsonObject search: JsonObject {
|
||||||
|
|||||||
@@ -63,15 +63,26 @@ ContentPage {
|
|||||||
|
|
||||||
ConfigSpinBox {
|
ConfigSpinBox {
|
||||||
icon: "timer_off"
|
icon: "timer_off"
|
||||||
text: Translation.tr("Music recognition timeout (s)")
|
text: Translation.tr("Total duration timeout (s)")
|
||||||
value: Config.options.musicRecognition.timeout
|
value: Config.options.musicRecognition.timeout
|
||||||
from: 2
|
from: 10
|
||||||
to: 100
|
to: 100
|
||||||
stepSize: 2
|
stepSize: 2
|
||||||
onValueChanged: {
|
onValueChanged: {
|
||||||
Config.options.musicRecognition.timeout = value;
|
Config.options.musicRecognition.timeout = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ConfigSpinBox {
|
||||||
|
icon: "av_timer"
|
||||||
|
text: Translation.tr("Polling interval (s)")
|
||||||
|
value: Config.options.musicRecognition.interval
|
||||||
|
from: 2
|
||||||
|
to: 10
|
||||||
|
stepSize: 1
|
||||||
|
onValueChanged: {
|
||||||
|
Config.options.musicRecognition.interval = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ContentSection {
|
ContentSection {
|
||||||
|
|||||||
+2
-1
@@ -10,9 +10,10 @@ import qs.services
|
|||||||
AndroidQuickToggleButton {
|
AndroidQuickToggleButton {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
property int timeoutInterval: 5
|
property int timeoutInterval: Config.options.musicRecognition.interval
|
||||||
property int timeoutDuration: Config.options.musicRecognition.timeout
|
property int timeoutDuration: Config.options.musicRecognition.timeout
|
||||||
|
|
||||||
|
|
||||||
property string monitorSource: "monitor" // "monitor" (system sound) , "input" (microphone)
|
property string monitorSource: "monitor" // "monitor" (system sound) , "input" (microphone)
|
||||||
|
|
||||||
name: Translation.tr("Identify Music")
|
name: Translation.tr("Identify Music")
|
||||||
|
|||||||
@@ -1,51 +1,55 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
INTERVAL=5
|
INTERVAL=2
|
||||||
TOTAL_DURATION=30
|
TOTAL_DURATION=30
|
||||||
MIN_VALID_RESULT_LENGTH=300
|
MIN_VALID_RESULT_LENGTH=300
|
||||||
SOURCE_TYPE="monitor" # default | "monitor" : system_sound , "input" : microphone
|
SOURCE_TYPE="monitor" # monitor | input
|
||||||
|
TMP_RAW="/tmp/songrec_recording.raw"
|
||||||
|
TMP_MP3="/tmp/songrec_recording.mp3"
|
||||||
|
|
||||||
while getopts "i:t:s:" opt; do
|
while getopts "i:t:s:" opt; do
|
||||||
case $opt in
|
case $opt in
|
||||||
i) INTERVAL=$OPTARG ;;
|
i) INTERVAL=$OPTARG ;;
|
||||||
t) TOTAL_DURATION=$OPTARG ;;
|
t) TOTAL_DURATION=$OPTARG ;;
|
||||||
s) SOURCE_TYPE=$OPTARG ;;
|
s) SOURCE_TYPE=$OPTARG ;;
|
||||||
*) echo "Usage: $0 [-i interval_seconds] [-t total_duration_seconds] [-s monitor|input]"
|
*) exit 1 ;;
|
||||||
exit 1 ;;
|
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
# Kaynağı belirle
|
|
||||||
if [ "$SOURCE_TYPE" = "monitor" ]; then
|
if [ "$SOURCE_TYPE" = "monitor" ]; then
|
||||||
MONITOR_SOURCE=$(pactl list short sources 2>/dev/null | grep -m1 monitor | awk '{print $2}' || true)
|
MONITOR_SOURCE=$(pactl list short sources 2>/dev/null | grep -m1 monitor | awk '{print $2}' || true)
|
||||||
elif [ "$SOURCE_TYPE" = "input" ]; then
|
elif [ "$SOURCE_TYPE" = "input" ]; then
|
||||||
MONITOR_SOURCE=$(pactl info | grep "Default Source:" | awk '{print $3}' || true)
|
MONITOR_SOURCE=$(pactl info | grep "Default Source:" | awk '{print $3}' || true)
|
||||||
else
|
else
|
||||||
echo "Invalid source type: $SOURCE_TYPE. Use 'monitor' or 'input'."
|
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ -z "$MONITOR_SOURCE" ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
rm -f "$TMP_RAW" "$TMP_MP3"
|
||||||
|
pkill -P $$ parec >/dev/null 2>&1 || true
|
||||||
|
}
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
parec --device="$MONITOR_SOURCE" --format=s16le --rate=44100 --channels=2 > "$TMP_RAW" &
|
||||||
START_TIME=$(date +%s)
|
START_TIME=$(date +%s)
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
|
sleep "$INTERVAL"
|
||||||
CURRENT_TIME=$(date +%s)
|
CURRENT_TIME=$(date +%s)
|
||||||
ELAPSED=$((CURRENT_TIME - START_TIME))
|
ELAPSED=$((CURRENT_TIME - START_TIME))
|
||||||
|
|
||||||
if (( ELAPSED >= TOTAL_DURATION )); then
|
if (( ELAPSED >= TOTAL_DURATION )); then
|
||||||
echo "Total duration reached, no music recognized."
|
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
TMP_FILE=$(mktemp /tmp/recording.XXXXXX.wav)
|
ffmpeg -f s16le -ar 44100 -ac 2 -i "$TMP_RAW" -acodec libmp3lame -y -hide_banner -loglevel error "$TMP_MP3" 2>/dev/null
|
||||||
|
|
||||||
parec --device="$MONITOR_SOURCE" --format=s16le --rate=44100 --channels=2 \
|
RESULT=$(songrec audio-file-to-recognized-song "$TMP_MP3" 2>/dev/null || true)
|
||||||
> >(ffmpeg -f s16le -ar 44100 -ac 2 -i - -t $INTERVAL -acodec libmp3lame "$TMP_FILE" -y -hide_banner -loglevel error) \
|
|
||||||
2>/dev/null
|
|
||||||
|
|
||||||
RESULT=$(songrec audio-file-to-recognized-song "$TMP_FILE" 2>/dev/null || true)
|
if echo "$RESULT" | grep -q '"matches": \[' && [ ${#RESULT} -gt $MIN_VALID_RESULT_LENGTH ]; then
|
||||||
rm -f "$TMP_FILE"
|
|
||||||
|
|
||||||
if [ -n "$RESULT" ] && [ ${#RESULT} -gt $MIN_VALID_RESULT_LENGTH ]; then
|
|
||||||
echo "$RESULT"
|
echo "$RESULT"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user