From 60f055f07d9793314091bb56fbe94187d96bc884 Mon Sep 17 00:00:00 2001 From: vaguesyntax Date: Sun, 26 Oct 2025 02:46:39 +0300 Subject: [PATCH 01/13] initial commit of musicRecognition --- .../quickshell/ii/modules/common/Config.qml | 1 + .../common/widgets/notification_utils.js | 3 + .../ii/modules/settings/ServicesConfig.qml | 11 +++ .../quickToggles/AndroidQuickPanel.qml | 2 +- .../androidStyle/AndroidEasyEffectsToggle.qml | 2 +- .../androidStyle/AndroidMusicRecognition.qml | 77 +++++++++++++++++++ .../AndroidToggleDelegateChooser.qml | 13 ++++ .../musicRecognition/musicRecognition.sh | 43 +++++++++++ 8 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml create mode 100755 dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh diff --git a/dots/.config/quickshell/ii/modules/common/Config.qml b/dots/.config/quickshell/ii/modules/common/Config.qml index f496f7bab..83fda7cee 100644 --- a/dots/.config/quickshell/ii/modules/common/Config.qml +++ b/dots/.config/quickshell/ii/modules/common/Config.qml @@ -374,6 +374,7 @@ Singleton { property JsonObject resources: JsonObject { property int updateInterval: 3000 + property int musicRecognitionTimeout: 16 } property JsonObject search: JsonObject { diff --git a/dots/.config/quickshell/ii/modules/common/widgets/notification_utils.js b/dots/.config/quickshell/ii/modules/common/widgets/notification_utils.js index 7ab21c3bb..fb32a5d51 100644 --- a/dots/.config/quickshell/ii/modules/common/widgets/notification_utils.js +++ b/dots/.config/quickshell/ii/modules/common/widgets/notification_utils.js @@ -17,13 +17,16 @@ function findSuitableMaterialSymbol(summary = "") { 'time': 'scheduleb', 'installed': 'download', 'configuration reloaded': 'reset_wrench', + 'unable': 'indeterminate_question_box', 'config': 'reset_wrench', 'update': 'update', 'ai response': 'neurology', 'control': 'settings', 'upsca': 'compare', + 'music': 'music_note', 'install': 'deployed_code_update', 'startswith:file': 'folder_copy', // Declarative startsWith check + }; const lowerSummary = summary.toLowerCase(); diff --git a/dots/.config/quickshell/ii/modules/settings/ServicesConfig.qml b/dots/.config/quickshell/ii/modules/settings/ServicesConfig.qml index fae5bf4de..64c015ff2 100644 --- a/dots/.config/quickshell/ii/modules/settings/ServicesConfig.qml +++ b/dots/.config/quickshell/ii/modules/settings/ServicesConfig.qml @@ -54,6 +54,17 @@ ContentPage { Config.options.resources.updateInterval = value; } } + ConfigSpinBox { + icon: "timer_off" + text: Translation.tr("Music recognition timeout (s)") + value: Config.options.resources.musicRecognitionTimeout + from: 2 + to: 100 + stepSize: 2 + onValueChanged: { + Config.options.resources.musicRecognitionTimeout = value; + } + } } ContentSection { diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/AndroidQuickPanel.qml b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/AndroidQuickPanel.qml index a7d743585..5d450adec 100644 --- a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/AndroidQuickPanel.qml +++ b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/AndroidQuickPanel.qml @@ -29,7 +29,7 @@ AbstractQuickPanel { readonly property real baseCellHeight: 56 // Toggles - readonly property list availableToggleTypes: ["network", "bluetooth", "idleInhibitor", "easyEffects", "nightLight", "darkMode", "cloudflareWarp", "gameMode", "screenSnip", "colorPicker", "onScreenKeyboard", "mic", "audio", "notifications", "powerProfile"] + readonly property list availableToggleTypes: ["network", "bluetooth", "idleInhibitor", "easyEffects", "nightLight", "darkMode", "cloudflareWarp", "gameMode", "screenSnip", "colorPicker", "onScreenKeyboard", "mic", "audio", "notifications", "powerProfile","musicrecognition"] readonly property int columns: Config.options.sidebar.quickToggles.android.columns readonly property list toggles: Config.ready ? Config.options.sidebar.quickToggles.android.toggles : [] readonly property list toggleRows: toggleRowsForList(toggles) diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidEasyEffectsToggle.qml b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidEasyEffectsToggle.qml index c907abf77..86605becd 100644 --- a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidEasyEffectsToggle.qml +++ b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidEasyEffectsToggle.qml @@ -10,7 +10,7 @@ AndroidQuickToggleButton { name: Translation.tr("EasyEffects") toggled: EasyEffects.active - buttonIcon: "graphic_eq" + buttonIcon: "instant_mix" Component.onCompleted: { EasyEffects.fetchActiveState() diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml new file mode 100644 index 000000000..30487453d --- /dev/null +++ b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml @@ -0,0 +1,77 @@ +import qs +import qs.modules.common +import qs.modules.common.widgets +import QtQuick +import Quickshell +import Quickshell.Io +import qs.services + + +AndroidQuickToggleButton { + id: root + + property int timeoutInterval: 5 + property int timeoutDuration: Config.options.resources.musicRecognitionTimeout + property string resultsJSON + + property string recognizedTrackTitle + property string recognizedTrackSubtitle + property string recognizedTrackURL + + name: Translation.tr("Identify Music") + statusText: toggled ? Translation.tr("Listening...") : Translation.tr("Inactive") + toggled: false + buttonIcon: toggled ? "cadence" : "graphic_eq" + onClicked: { + if (!toggled){ + recognizeMusicProc.running = true + } else { + recognizeMusicProc.running = false + } + + root.toggled = !root.toggled + } + + Process { + id: recognizeMusicProc + running: false + command: [`${Directories.scriptPath}/musicRecognition/musicRecognition.sh`, "-i", root.timeoutInterval, "-t", root.timeoutDuration] + stdout: StdioCollector { + onStreamFinished: { + root.resultsJSON = this.text + if (this.text.length < 100) { + Quickshell.execDetached(["notify-send", "No music recognized", "Please make sure your music is playing and try again", "-a", "Shell"]) + toggled = false + return + } + var obj = JSON.parse(root.resultsJSON) + root.recognizedTrackTitle = obj.track.title + root.recognizedTrackSubtitle = obj.track.subtitle + root.recognizedTrackURL = obj.track.url + musicReconizedProc.running = true + toggled = false + } + } + } + + + Process { + id: musicReconizedProc + running: false + command: [ "notify-send" , "Music Recognized" , root.recognizedTrackTitle + " by " + root.recognizedTrackSubtitle , "-A" , "Shazam Link" , "-a" , "Shell"] + stdout: StdioCollector { + onStreamFinished: { + if (this.text !== ""){ + Qt.openUrlExternally(root.recognizedTrackURL); + } + } + } + } + + + + StyledToolTip { + //text: Translation.tr("Identifies the song that’s playing right now") + text: "Identifies the song that’s playing right now" + } +} diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidToggleDelegateChooser.qml b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidToggleDelegateChooser.qml index a8f79c843..b97243d6b 100644 --- a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidToggleDelegateChooser.qml +++ b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidToggleDelegateChooser.qml @@ -232,4 +232,17 @@ DelegateChooser { cellSize: modelData.size } } + DelegateChoice { roleValue: "musicrecognition"; AndroidMusicRecognition { + required property int index + required property var modelData + buttonIndex: root.startingIndex + index + buttonData: modelData + editMode: root.editMode + expandedSize: modelData.size > 1 + baseCellWidth: root.baseCellWidth + baseCellHeight: root.baseCellHeight + cellSpacing: root.spacing + cellSize: modelData.size + } } + } diff --git a/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh b/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh new file mode 100755 index 000000000..6bb671d5a --- /dev/null +++ b/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +MONITOR_SOURCE="alsa_output.pci-0000_00_1f.3.analog-stereo.monitor" + +# Default değerler +INTERVAL=5 +TOTAL_DURATION=30 + +# Parametreleri oku +while getopts "i:t:" opt; do + case $opt in + i) INTERVAL=$OPTARG ;; + t) TOTAL_DURATION=$OPTARG ;; + *) echo "Usage: $0 [-i interval_seconds] [-t total_duration_seconds]" + exit 1 ;; + esac +done + +START_TIME=$(date +%s) + +while true; do + CURRENT_TIME=$(date +%s) + ELAPSED=$((CURRENT_TIME - START_TIME)) + + if (( ELAPSED >= TOTAL_DURATION )); then + echo "Total duration reached. Exiting." + exit 0 + fi + + TMP_FILE=$(mktemp /tmp/recording.XXXXXX.wav) + + parec --device="$MONITOR_SOURCE" --format=s16le --rate=44100 --channels=2 \ + > >(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) + rm -f "$TMP_FILE" + + if [ -n "$RESULT" ] && [ ${#RESULT} -gt 300 ]; then + echo "$RESULT" + exit 0 + fi +done From cf159f611283b71c7708c4263e43e4dfd774c43b Mon Sep 17 00:00:00 2001 From: vaguesyntax Date: Sun, 26 Oct 2025 03:45:43 +0300 Subject: [PATCH 02/13] some typos --- .../ii/modules/sidebarRight/quickToggles/AndroidQuickPanel.qml | 2 +- .../quickToggles/androidStyle/AndroidMusicRecognition.qml | 2 +- .../quickToggles/androidStyle/AndroidToggleDelegateChooser.qml | 2 +- .../quickshell/ii/scripts/musicRecognition/musicRecognition.sh | 1 - 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/AndroidQuickPanel.qml b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/AndroidQuickPanel.qml index 5d450adec..b5e49d3b0 100644 --- a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/AndroidQuickPanel.qml +++ b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/AndroidQuickPanel.qml @@ -29,7 +29,7 @@ AbstractQuickPanel { readonly property real baseCellHeight: 56 // Toggles - readonly property list availableToggleTypes: ["network", "bluetooth", "idleInhibitor", "easyEffects", "nightLight", "darkMode", "cloudflareWarp", "gameMode", "screenSnip", "colorPicker", "onScreenKeyboard", "mic", "audio", "notifications", "powerProfile","musicrecognition"] + readonly property list availableToggleTypes: ["network", "bluetooth", "idleInhibitor", "easyEffects", "nightLight", "darkMode", "cloudflareWarp", "gameMode", "screenSnip", "colorPicker", "onScreenKeyboard", "mic", "audio", "notifications", "powerProfile","musicRecognition"] readonly property int columns: Config.options.sidebar.quickToggles.android.columns readonly property list toggles: Config.ready ? Config.options.sidebar.quickToggles.android.toggles : [] readonly property list toggleRows: toggleRowsForList(toggles) diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml index 30487453d..a472093e6 100644 --- a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml +++ b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml @@ -40,7 +40,7 @@ AndroidQuickToggleButton { onStreamFinished: { root.resultsJSON = this.text if (this.text.length < 100) { - Quickshell.execDetached(["notify-send", "No music recognized", "Please make sure your music is playing and try again", "-a", "Shell"]) + Quickshell.execDetached(["notify-send", "Unable to recognize music", "Please make sure your music is playing and try again", "-a", "Shell"]) toggled = false return } diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidToggleDelegateChooser.qml b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidToggleDelegateChooser.qml index b97243d6b..aa5356e2e 100644 --- a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidToggleDelegateChooser.qml +++ b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidToggleDelegateChooser.qml @@ -232,7 +232,7 @@ DelegateChooser { cellSize: modelData.size } } - DelegateChoice { roleValue: "musicrecognition"; AndroidMusicRecognition { + DelegateChoice { roleValue: "musicRecognition"; AndroidMusicRecognition { required property int index required property var modelData buttonIndex: root.startingIndex + index diff --git a/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh b/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh index 6bb671d5a..671688cbd 100755 --- a/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh +++ b/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh @@ -6,7 +6,6 @@ MONITOR_SOURCE="alsa_output.pci-0000_00_1f.3.analog-stereo.monitor" INTERVAL=5 TOTAL_DURATION=30 -# Parametreleri oku while getopts "i:t:" opt; do case $opt in i) INTERVAL=$OPTARG ;; From b137feac16e838c254686badcfd20bd90d9a887e Mon Sep 17 00:00:00 2001 From: vaguesyntax Date: Sun, 26 Oct 2025 12:24:35 +0300 Subject: [PATCH 03/13] fix: recognized notif not getting pushed --- .../androidStyle/AndroidMusicRecognition.qml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml index a472093e6..924ec936c 100644 --- a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml +++ b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml @@ -49,6 +49,7 @@ AndroidQuickToggleButton { root.recognizedTrackSubtitle = obj.track.subtitle root.recognizedTrackURL = obj.track.url musicReconizedProc.running = true + recognizedMusicKiller.running = true toggled = false } } @@ -68,10 +69,14 @@ AndroidQuickToggleButton { } } - + Timer { + id: recognizedMusicKiller + running: false; repeat: false + interval: 5000 + onTriggered: musicReconizedProc.running = false + } StyledToolTip { - //text: Translation.tr("Identifies the song that’s playing right now") - text: "Identifies the song that’s playing right now" + text: Translation.tr("Identifies the song that’s playing right now") } } From 496225ab9d4767e78b3d96b8b847db42c7ece2a9 Mon Sep 17 00:00:00 2001 From: vaguesyntax Date: Sun, 26 Oct 2025 14:04:52 +0300 Subject: [PATCH 04/13] refactor code --- .../androidStyle/AndroidMusicRecognition.qml | 75 +++++++++---------- .../musicRecognition/musicRecognition.sh | 9 ++- 2 files changed, 40 insertions(+), 44 deletions(-) diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml index 924ec936c..c3aeff1a6 100644 --- a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml +++ b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml @@ -12,24 +12,37 @@ AndroidQuickToggleButton { property int timeoutInterval: 5 property int timeoutDuration: Config.options.resources.musicRecognitionTimeout - property string resultsJSON - - property string recognizedTrackTitle - property string recognizedTrackSubtitle - property string recognizedTrackURL - name: Translation.tr("Identify Music") - statusText: toggled ? Translation.tr("Listening...") : Translation.tr("Inactive") + statusText: toggled ? Translation.tr("Listening...") : Translation.tr("Inactive") toggled: false buttonIcon: toggled ? "cadence" : "graphic_eq" - onClicked: { - if (!toggled){ - recognizeMusicProc.running = true - } else { - recognizeMusicProc.running = false + + property var recognizedTrack: ({ title:"", subtitle:"", url:""}) + + function handleRecognition(jsonText) { + try { + var obj = JSON.parse(jsonText) + root.recognizedTrack = { + title: obj.track.title, + subtitle: obj.track.subtitle, + url: obj.track.url + } + musicReconizedProc.running = true + } catch(e) { + Quickshell.execDetached(["notify-send", "Unable to recognize music", "Please make sure your music is playing and try again", "-a", "Shell"]) + } finally { + root.toggled = false } - + } + + StyledToolTip { + text: Translation.tr("Identifies the song that’s currently playing") + } + + onClicked: { root.toggled = !root.toggled + recognizeMusicProc.running = root.toggled + musicReconizedProc.running = false } Process { @@ -38,45 +51,27 @@ AndroidQuickToggleButton { command: [`${Directories.scriptPath}/musicRecognition/musicRecognition.sh`, "-i", root.timeoutInterval, "-t", root.timeoutDuration] stdout: StdioCollector { onStreamFinished: { - root.resultsJSON = this.text - if (this.text.length < 100) { - Quickshell.execDetached(["notify-send", "Unable to recognize music", "Please make sure your music is playing and try again", "-a", "Shell"]) - toggled = false - return - } - var obj = JSON.parse(root.resultsJSON) - root.recognizedTrackTitle = obj.track.title - root.recognizedTrackSubtitle = obj.track.subtitle - root.recognizedTrackURL = obj.track.url - musicReconizedProc.running = true - recognizedMusicKiller.running = true - toggled = false + handleRecognition(this.text) } } } - Process { id: musicReconizedProc running: false - command: [ "notify-send" , "Music Recognized" , root.recognizedTrackTitle + " by " + root.recognizedTrackSubtitle , "-A" , "Shazam Link" , "-a" , "Shell"] + command: [ + "notify-send", + Translation.tr("Music Recognized"), + root.recognizedTrack.title + " - " + root.recognizedTrack.subtitle, + "-A", "Shazam", + "-a", "Shell" + ] stdout: StdioCollector { onStreamFinished: { if (this.text !== ""){ - Qt.openUrlExternally(root.recognizedTrackURL); + Qt.openUrlExternally(root.recognizedTrack.url); } } } } - - Timer { - id: recognizedMusicKiller - running: false; repeat: false - interval: 5000 - onTriggered: musicReconizedProc.running = false - } - - StyledToolTip { - text: Translation.tr("Identifies the song that’s playing right now") - } } diff --git a/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh b/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh index 671688cbd..810635814 100755 --- a/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh +++ b/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh @@ -1,10 +1,11 @@ #!/bin/bash -MONITOR_SOURCE="alsa_output.pci-0000_00_1f.3.analog-stereo.monitor" +## can be added manually if not chosen automatically with running this on terminal 'pw-cli list-objects | grep node.name' +MONITOR_SOURCE=$(pactl list short sources 2>/dev/null | grep -m1 monitor | awk '{print $2}' || true) -# Default değerler INTERVAL=5 TOTAL_DURATION=30 +MIN_VALID_RESULT_LENGTH=300 while getopts "i:t:" opt; do case $opt in @@ -22,7 +23,7 @@ while true; do ELAPSED=$((CURRENT_TIME - START_TIME)) if (( ELAPSED >= TOTAL_DURATION )); then - echo "Total duration reached. Exiting." + echo "Total duration reached, no music recognized." exit 0 fi @@ -35,7 +36,7 @@ while true; do RESULT=$(songrec audio-file-to-recognized-song "$TMP_FILE" 2>/dev/null || true) rm -f "$TMP_FILE" - if [ -n "$RESULT" ] && [ ${#RESULT} -gt 300 ]; then + if [ -n "$RESULT" ] && [ ${#RESULT} -gt $MIN_VALID_RESULT_LENGTH ]; then echo "$RESULT" exit 0 fi From a05b041d691bb89482cdf7b17fd3fdd95ad80bc1 Mon Sep 17 00:00:00 2001 From: vaguesyntax Date: Sun, 26 Oct 2025 14:12:04 +0300 Subject: [PATCH 05/13] fixes and youtube button --- .../ii/modules/common/widgets/notification_utils.js | 2 +- .../quickToggles/androidStyle/AndroidMusicRecognition.qml | 8 ++++++-- .../ii/scripts/musicRecognition/musicRecognition.sh | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/dots/.config/quickshell/ii/modules/common/widgets/notification_utils.js b/dots/.config/quickshell/ii/modules/common/widgets/notification_utils.js index fb32a5d51..dbdeebde9 100644 --- a/dots/.config/quickshell/ii/modules/common/widgets/notification_utils.js +++ b/dots/.config/quickshell/ii/modules/common/widgets/notification_utils.js @@ -23,7 +23,7 @@ function findSuitableMaterialSymbol(summary = "") { 'ai response': 'neurology', 'control': 'settings', 'upsca': 'compare', - 'music': 'music_note', + 'music': 'queue_music', 'install': 'deployed_code_update', 'startswith:file': 'folder_copy', // Declarative startsWith check diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml index c3aeff1a6..57efb17e7 100644 --- a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml +++ b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml @@ -29,7 +29,7 @@ AndroidQuickToggleButton { } musicReconizedProc.running = true } catch(e) { - Quickshell.execDetached(["notify-send", "Unable to recognize music", "Please make sure your music is playing and try again", "-a", "Shell"]) + Quickshell.execDetached(["notify-send", Translation.tr("Unable to recognize music"), Translation.tr("Please make sure your music is playing and try again"), "-a", "Shell"]) } finally { root.toggled = false } @@ -64,12 +64,16 @@ AndroidQuickToggleButton { Translation.tr("Music Recognized"), root.recognizedTrack.title + " - " + root.recognizedTrack.subtitle, "-A", "Shazam", + "-A", "YouTube", "-a", "Shell" ] stdout: StdioCollector { onStreamFinished: { - if (this.text !== ""){ + if (this.text === "") return + if (this.text == 0){ Qt.openUrlExternally(root.recognizedTrack.url); + } else { + Qt.openUrlExternally("https://www.youtube.com/results?search_query=" + root.recognizedTrack.title + " - " + root.recognizedTrack.subtitle); } } } diff --git a/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh b/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh index 810635814..fb805b4ac 100755 --- a/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh +++ b/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh @@ -1,6 +1,6 @@ #!/bin/bash -## can be added manually if not chosen automatically with running this on terminal 'pw-cli list-objects | grep node.name' +## can be added manually if not chosen automatically with running this on terminal 'pw-cli list-objects | grep node.name' and manually choose the one you want. MONITOR_SOURCE=$(pactl list short sources 2>/dev/null | grep -m1 monitor | awk '{print $2}' || true) INTERVAL=5 From 28e956e55c193ff6015bfc0ad8e3cf1dc5cad247 Mon Sep 17 00:00:00 2001 From: vaguesyntax Date: Sun, 26 Oct 2025 16:00:49 +0300 Subject: [PATCH 06/13] togglable monitor-source --- .../androidStyle/AndroidMusicRecognition.qml | 19 ++++++++++++++--- .../musicRecognition/musicRecognition.sh | 21 +++++++++++++------ 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml index 57efb17e7..e674660b3 100644 --- a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml +++ b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml @@ -12,8 +12,11 @@ AndroidQuickToggleButton { property int timeoutInterval: 5 property int timeoutDuration: Config.options.resources.musicRecognitionTimeout + + property string monitorSource: "monitor" // "monitor" (system sound) , "input" (microphone) + name: Translation.tr("Identify Music") - statusText: toggled ? Translation.tr("Listening...") : Translation.tr("Inactive") + statusText: toggled ? Translation.tr("Listening...") : monitorSource === "monitor" ? Translation.tr("System sound") : Translation.tr("Microphone") toggled: false buttonIcon: toggled ? "cadence" : "graphic_eq" @@ -34,9 +37,10 @@ AndroidQuickToggleButton { root.toggled = false } } + StyledToolTip { - text: Translation.tr("Identifies the song that’s currently playing") + text: Translation.tr("Identifies currently playing song | Right-click to change monitor source") } onClicked: { @@ -44,11 +48,20 @@ AndroidQuickToggleButton { recognizeMusicProc.running = root.toggled musicReconizedProc.running = false } + altAction: () => { + if (root.monitorSource === "monitor"){ + root.monitorSource = "input" + return + }else { + root.monitorSource = "monitor" + } + + } Process { id: recognizeMusicProc running: false - command: [`${Directories.scriptPath}/musicRecognition/musicRecognition.sh`, "-i", root.timeoutInterval, "-t", root.timeoutDuration] + command: [`${Directories.scriptPath}/musicRecognition/musicRecognition.sh`, "-i", root.timeoutInterval, "-t", root.timeoutDuration, "-s", root.monitorSource] stdout: StdioCollector { onStreamFinished: { handleRecognition(this.text) diff --git a/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh b/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh index fb805b4ac..f0b7c20a3 100755 --- a/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh +++ b/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh @@ -1,21 +1,30 @@ #!/bin/bash -## can be added manually if not chosen automatically with running this on terminal 'pw-cli list-objects | grep node.name' and manually choose the one you want. -MONITOR_SOURCE=$(pactl list short sources 2>/dev/null | grep -m1 monitor | awk '{print $2}' || true) - INTERVAL=5 TOTAL_DURATION=30 -MIN_VALID_RESULT_LENGTH=300 +MIN_VALID_RESULT_LENGTH=300 +SOURCE_TYPE="monitor" # default | "monitor" : system_sound , "input" : microphone -while getopts "i:t:" opt; do +while getopts "i:t:s:" opt; do case $opt in i) INTERVAL=$OPTARG ;; t) TOTAL_DURATION=$OPTARG ;; - *) echo "Usage: $0 [-i interval_seconds] [-t total_duration_seconds]" + s) SOURCE_TYPE=$OPTARG ;; + *) echo "Usage: $0 [-i interval_seconds] [-t total_duration_seconds] [-s monitor|input]" exit 1 ;; esac done +# Kaynağı belirle +if [ "$SOURCE_TYPE" = "monitor" ]; then + MONITOR_SOURCE=$(pactl list short sources 2>/dev/null | grep -m1 monitor | awk '{print $2}' || true) +elif [ "$SOURCE_TYPE" = "input" ]; then + MONITOR_SOURCE=$(pactl info | grep "Default Source:" | awk '{print $3}' || true) +else + echo "Invalid source type: $SOURCE_TYPE. Use 'monitor' or 'input'." + exit 1 +fi + START_TIME=$(date +%s) while true; do From 901aa820e5c5051b3b18a44657ea537e73922545 Mon Sep 17 00:00:00 2001 From: vaguesyntax Date: Mon, 27 Oct 2025 19:33:17 +0300 Subject: [PATCH 07/13] fix config and icons --- dots/.config/quickshell/ii/modules/common/Config.qml | 5 ++++- .../quickshell/ii/modules/settings/ServicesConfig.qml | 11 +++++++++-- .../androidStyle/AndroidEasyEffectsToggle.qml | 2 +- .../androidStyle/AndroidMusicRecognition.qml | 4 ++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/dots/.config/quickshell/ii/modules/common/Config.qml b/dots/.config/quickshell/ii/modules/common/Config.qml index 83fda7cee..70cca4275 100644 --- a/dots/.config/quickshell/ii/modules/common/Config.qml +++ b/dots/.config/quickshell/ii/modules/common/Config.qml @@ -374,7 +374,10 @@ Singleton { property JsonObject resources: JsonObject { property int updateInterval: 3000 - property int musicRecognitionTimeout: 16 + } + + property JsonObject musicRecognition: JsonObject { + property int timeout: 16 } property JsonObject search: JsonObject { diff --git a/dots/.config/quickshell/ii/modules/settings/ServicesConfig.qml b/dots/.config/quickshell/ii/modules/settings/ServicesConfig.qml index 64c015ff2..d1fb137c5 100644 --- a/dots/.config/quickshell/ii/modules/settings/ServicesConfig.qml +++ b/dots/.config/quickshell/ii/modules/settings/ServicesConfig.qml @@ -54,15 +54,22 @@ ContentPage { Config.options.resources.updateInterval = value; } } + + } + + ContentSection { + icon: "music_cast" + title: Translation.tr("Music Recognition") + ConfigSpinBox { icon: "timer_off" text: Translation.tr("Music recognition timeout (s)") - value: Config.options.resources.musicRecognitionTimeout + value: Config.options.musicRecognition.timeout from: 2 to: 100 stepSize: 2 onValueChanged: { - Config.options.resources.musicRecognitionTimeout = value; + Config.options.musicRecognition.timeout = value; } } } diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidEasyEffectsToggle.qml b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidEasyEffectsToggle.qml index 86605becd..c907abf77 100644 --- a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidEasyEffectsToggle.qml +++ b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidEasyEffectsToggle.qml @@ -10,7 +10,7 @@ AndroidQuickToggleButton { name: Translation.tr("EasyEffects") toggled: EasyEffects.active - buttonIcon: "instant_mix" + buttonIcon: "graphic_eq" Component.onCompleted: { EasyEffects.fetchActiveState() diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml index e674660b3..585b784f7 100644 --- a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml +++ b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml @@ -11,14 +11,14 @@ AndroidQuickToggleButton { id: root property int timeoutInterval: 5 - property int timeoutDuration: Config.options.resources.musicRecognitionTimeout + property int timeoutDuration: Config.options.musicRecognition.timeout property string monitorSource: "monitor" // "monitor" (system sound) , "input" (microphone) name: Translation.tr("Identify Music") statusText: toggled ? Translation.tr("Listening...") : monitorSource === "monitor" ? Translation.tr("System sound") : Translation.tr("Microphone") toggled: false - buttonIcon: toggled ? "cadence" : "graphic_eq" + buttonIcon: toggled ? "music_cast" : "music_note" property var recognizedTrack: ({ title:"", subtitle:"", url:""}) From 035e51b36e56cf44f758f864f1ce3ae3f3e83965 Mon Sep 17 00:00:00 2001 From: vaguesyntax Date: Mon, 27 Oct 2025 20:39:45 +0300 Subject: [PATCH 08/13] add interval to settings, update the script (it was not working as intented) --- .../quickshell/ii/modules/common/Config.qml | 1 + .../ii/modules/settings/ServicesConfig.qml | 15 +++++++- .../androidStyle/AndroidMusicRecognition.qml | 3 +- .../musicRecognition/musicRecognition.sh | 38 ++++++++++--------- 4 files changed, 37 insertions(+), 20 deletions(-) diff --git a/dots/.config/quickshell/ii/modules/common/Config.qml b/dots/.config/quickshell/ii/modules/common/Config.qml index 70cca4275..7a66d90f6 100644 --- a/dots/.config/quickshell/ii/modules/common/Config.qml +++ b/dots/.config/quickshell/ii/modules/common/Config.qml @@ -378,6 +378,7 @@ Singleton { property JsonObject musicRecognition: JsonObject { property int timeout: 16 + property int interval: 4 } property JsonObject search: JsonObject { diff --git a/dots/.config/quickshell/ii/modules/settings/ServicesConfig.qml b/dots/.config/quickshell/ii/modules/settings/ServicesConfig.qml index d1fb137c5..11fc82966 100644 --- a/dots/.config/quickshell/ii/modules/settings/ServicesConfig.qml +++ b/dots/.config/quickshell/ii/modules/settings/ServicesConfig.qml @@ -63,15 +63,26 @@ ContentPage { ConfigSpinBox { icon: "timer_off" - text: Translation.tr("Music recognition timeout (s)") + text: Translation.tr("Total duration timeout (s)") value: Config.options.musicRecognition.timeout - from: 2 + from: 10 to: 100 stepSize: 2 onValueChanged: { 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 { diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml index 585b784f7..f7e475547 100644 --- a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml +++ b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml @@ -10,9 +10,10 @@ import qs.services AndroidQuickToggleButton { id: root - property int timeoutInterval: 5 + property int timeoutInterval: Config.options.musicRecognition.interval property int timeoutDuration: Config.options.musicRecognition.timeout + property string monitorSource: "monitor" // "monitor" (system sound) , "input" (microphone) name: Translation.tr("Identify Music") diff --git a/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh b/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh index f0b7c20a3..4f129f29d 100755 --- a/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh +++ b/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh @@ -1,51 +1,55 @@ #!/bin/bash -INTERVAL=5 +INTERVAL=2 TOTAL_DURATION=30 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 case $opt in i) INTERVAL=$OPTARG ;; t) TOTAL_DURATION=$OPTARG ;; s) SOURCE_TYPE=$OPTARG ;; - *) echo "Usage: $0 [-i interval_seconds] [-t total_duration_seconds] [-s monitor|input]" - exit 1 ;; + *) exit 1 ;; esac done - -# Kaynağı belirle if [ "$SOURCE_TYPE" = "monitor" ]; then MONITOR_SOURCE=$(pactl list short sources 2>/dev/null | grep -m1 monitor | awk '{print $2}' || true) elif [ "$SOURCE_TYPE" = "input" ]; then MONITOR_SOURCE=$(pactl info | grep "Default Source:" | awk '{print $3}' || true) else - echo "Invalid source type: $SOURCE_TYPE. Use 'monitor' or 'input'." exit 1 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) while true; do + sleep "$INTERVAL" CURRENT_TIME=$(date +%s) ELAPSED=$((CURRENT_TIME - START_TIME)) - + if (( ELAPSED >= TOTAL_DURATION )); then - echo "Total duration reached, no music recognized." exit 0 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 \ - > >(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_MP3" 2>/dev/null || true) - RESULT=$(songrec audio-file-to-recognized-song "$TMP_FILE" 2>/dev/null || true) - rm -f "$TMP_FILE" - - if [ -n "$RESULT" ] && [ ${#RESULT} -gt $MIN_VALID_RESULT_LENGTH ]; then + if echo "$RESULT" | grep -q '"matches": \[' && [ ${#RESULT} -gt $MIN_VALID_RESULT_LENGTH ]; then echo "$RESULT" exit 0 fi From 06d12fb8ecdcebb964fb684d98c7ddb420f0beaa Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Tue, 28 Oct 2025 08:48:57 +0100 Subject: [PATCH 09/13] music recognition: add check for songrec command existence --- .../androidStyle/AndroidMusicRecognition.qml | 11 +++++++++-- .../ii/scripts/musicRecognition/musicRecognition.sh | 3 +-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml index f7e475547..621bf7cf0 100644 --- a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml +++ b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml @@ -41,14 +41,15 @@ AndroidQuickToggleButton { StyledToolTip { - text: Translation.tr("Identifies currently playing song | Right-click to change monitor source") + text: Translation.tr("Recognize music | Right-click to toggle source") } - onClicked: { + onClicked: { root.toggled = !root.toggled recognizeMusicProc.running = root.toggled musicReconizedProc.running = false } + altAction: () => { if (root.monitorSource === "monitor"){ root.monitorSource = "input" @@ -68,6 +69,12 @@ AndroidQuickToggleButton { handleRecognition(this.text) } } + onExited: (exitCode, exitStatus) => { + if (exitCode === 1) { + Quickshell.execDetached(["notify-send", Translation.tr("Couldn't recognize music"), Translation.tr("Make sure you have songrec installed"), "-a", "Shell"]) + root.toggled = false + } + } } Process { diff --git a/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh b/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh index 4f129f29d..2f988f145 100755 --- a/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh +++ b/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh @@ -23,7 +23,7 @@ else exit 1 fi -if [ -z "$MONITOR_SOURCE" ]; then +if [ -z "$MONITOR_SOURCE" ] || ! command -v songrec >/dev/null 2>&1; then exit 1 fi @@ -46,7 +46,6 @@ while true; do fi ffmpeg -f s16le -ar 44100 -ac 2 -i "$TMP_RAW" -acodec libmp3lame -y -hide_banner -loglevel error "$TMP_MP3" 2>/dev/null - RESULT=$(songrec audio-file-to-recognized-song "$TMP_MP3" 2>/dev/null || true) if echo "$RESULT" | grep -q '"matches": \[' && [ ${#RESULT} -gt $MIN_VALID_RESULT_LENGTH ]; then From 9df78087f05a638cc2cb50d2811070fa562ff24e Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Tue, 28 Oct 2025 08:51:18 +0100 Subject: [PATCH 10/13] music recognition: add different icon for microphone source --- .../quickToggles/androidStyle/AndroidMusicRecognition.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml index 621bf7cf0..d3757071a 100644 --- a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml +++ b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml @@ -19,7 +19,7 @@ AndroidQuickToggleButton { name: Translation.tr("Identify Music") statusText: toggled ? Translation.tr("Listening...") : monitorSource === "monitor" ? Translation.tr("System sound") : Translation.tr("Microphone") toggled: false - buttonIcon: toggled ? "music_cast" : "music_note" + buttonIcon: toggled ? "music_cast" : (monitorSource === "monitor" ? "music_note" : "frame_person_mic") property var recognizedTrack: ({ title:"", subtitle:"", url:""}) From 7b42efd37ae348ab78bbae3f62e50e2a6a56b5ac Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Tue, 28 Oct 2025 08:52:58 +0100 Subject: [PATCH 11/13] rename music recognition script to be consistent w/ other scripts --- .../quickToggles/androidStyle/AndroidMusicRecognition.qml | 2 +- .../{musicRecognition.sh => recognize-music.sh} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename dots/.config/quickshell/ii/scripts/musicRecognition/{musicRecognition.sh => recognize-music.sh} (100%) diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml index d3757071a..18b90f6ff 100644 --- a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml +++ b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml @@ -63,7 +63,7 @@ AndroidQuickToggleButton { Process { id: recognizeMusicProc running: false - command: [`${Directories.scriptPath}/musicRecognition/musicRecognition.sh`, "-i", root.timeoutInterval, "-t", root.timeoutDuration, "-s", root.monitorSource] + command: [`${Directories.scriptPath}/musicRecognition/recognize-music.sh`, "-i", root.timeoutInterval, "-t", root.timeoutDuration, "-s", root.monitorSource] stdout: StdioCollector { onStreamFinished: { handleRecognition(this.text) diff --git a/dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh b/dots/.config/quickshell/ii/scripts/musicRecognition/recognize-music.sh similarity index 100% rename from dots/.config/quickshell/ii/scripts/musicRecognition/musicRecognition.sh rename to dots/.config/quickshell/ii/scripts/musicRecognition/recognize-music.sh From 107dc8cc2495a3fcd4f612a172443e97afe560aa Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Tue, 28 Oct 2025 08:57:51 +0100 Subject: [PATCH 12/13] music recognition: move tmp path to a cleaner place --- .../ii/scripts/musicRecognition/recognize-music.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/dots/.config/quickshell/ii/scripts/musicRecognition/recognize-music.sh b/dots/.config/quickshell/ii/scripts/musicRecognition/recognize-music.sh index 2f988f145..09b0361af 100755 --- a/dots/.config/quickshell/ii/scripts/musicRecognition/recognize-music.sh +++ b/dots/.config/quickshell/ii/scripts/musicRecognition/recognize-music.sh @@ -4,8 +4,9 @@ INTERVAL=2 TOTAL_DURATION=30 MIN_VALID_RESULT_LENGTH=300 SOURCE_TYPE="monitor" # monitor | input -TMP_RAW="/tmp/songrec_recording.raw" -TMP_MP3="/tmp/songrec_recording.mp3" +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 case $opt in @@ -20,6 +21,7 @@ if [ "$SOURCE_TYPE" = "monitor" ]; then elif [ "$SOURCE_TYPE" = "input" ]; then MONITOR_SOURCE=$(pactl info | grep "Default Source:" | awk '{print $3}' || true) else + echo "Invalid source type" exit 1 fi @@ -33,6 +35,7 @@ cleanup() { } trap cleanup EXIT +mkdir -p "$TMP_PATH" parec --device="$MONITOR_SOURCE" --format=s16le --rate=44100 --channels=2 > "$TMP_RAW" & START_TIME=$(date +%s) From 066971e7207b2672f886493f6d8822d3bd52d11f Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Tue, 28 Oct 2025 09:02:19 +0100 Subject: [PATCH 13/13] music recognition: adjust message and icon --- .../quickshell/ii/modules/common/widgets/notification_utils.js | 3 ++- .../quickToggles/androidStyle/AndroidMusicRecognition.qml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/dots/.config/quickshell/ii/modules/common/widgets/notification_utils.js b/dots/.config/quickshell/ii/modules/common/widgets/notification_utils.js index dbdeebde9..f817a460b 100644 --- a/dots/.config/quickshell/ii/modules/common/widgets/notification_utils.js +++ b/dots/.config/quickshell/ii/modules/common/widgets/notification_utils.js @@ -17,7 +17,8 @@ function findSuitableMaterialSymbol(summary = "") { 'time': 'scheduleb', 'installed': 'download', 'configuration reloaded': 'reset_wrench', - 'unable': 'indeterminate_question_box', + 'unable': 'question_mark', + "couldn't": 'question_mark', 'config': 'reset_wrench', 'update': 'update', 'ai response': 'neurology', diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml index 18b90f6ff..a1b9c6738 100644 --- a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml +++ b/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml @@ -33,7 +33,7 @@ AndroidQuickToggleButton { } musicReconizedProc.running = true } catch(e) { - Quickshell.execDetached(["notify-send", Translation.tr("Unable to recognize music"), Translation.tr("Please make sure your music is playing and try again"), "-a", "Shell"]) + Quickshell.execDetached(["notify-send", Translation.tr("Couldn't recognize music"), Translation.tr("Perhaps what you're listening to is too niche"), "-a", "Shell"]) } finally { root.toggled = false }