overview: add music recognition button to search bar

This commit is contained in:
end-4
2025-10-30 23:08:30 +01:00
parent b3f06049be
commit 480966f978
5 changed files with 161 additions and 81 deletions
@@ -0,0 +1,103 @@
pragma Singleton
pragma ComponentBehavior: Bound
import qs.modules.common
import QtQuick
import Quickshell
import Quickshell.Io
Singleton {
id: root
enum MonitorSource { Monitor, Input }
property var monitorSource: SongRec.MonitorSource.Monitor
property int timeoutInterval: Config.options.musicRecognition.interval
property int timeoutDuration: Config.options.musicRecognition.timeout
readonly property bool running: recognizeMusicProc.running
function toggleRunning(running) {
if (recognizeMusicProc.running && !running === true) root.manuallyStopped = true;
if (running != undefined) {
recognizeMusicProc.running = running
} else {
recognizeMusicProc.running = !root.running
}
musicReconizedProc.running = false
}
function toggleMonitorSource(source) {
if (source !== undefined) {
root.monitorSource = source
return
}
root.monitorSource = (root.monitorSource === SongRec.MonitorSource.Monitor) ? SongRec.MonitorSource.Input : SongRec.MonitorSource.Monitor
}
function monitorSourceToString(source) {
if (source === SongRec.MonitorSource.Monitor) {
return "monitor"
} else {
return "input"
}
}
readonly property string monitorSourceString: monitorSourceToString(monitorSource)
property var recognizedTrack: ({ title:"", subtitle:"", url:""})
property bool manuallyStopped: false
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", Translation.tr("Couldn't recognize music"), Translation.tr("Perhaps what you're listening to is too niche"), "-a", "Shell"])
}
}
Process {
id: recognizeMusicProc
running: false
command: [`${Directories.scriptPath}/musicRecognition/recognize-music.sh`, "-i", root.timeoutInterval, "-t", root.timeoutDuration, "-s", root.monitorSourceString]
stdout: StdioCollector {
onStreamFinished: {
if (root.manuallyStopped) {
root.manuallyStopped = false
return
}
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"])
}
}
}
Process {
id: musicReconizedProc
running: false
command: [
"notify-send",
Translation.tr("Music Recognized"),
root.recognizedTrack.title + " - " + root.recognizedTrack.subtitle,
"-A", "Shazam",
"-A", "YouTube",
"-a", "Shell"
]
stdout: StdioCollector {
onStreamFinished: {
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);
}
}
}
}
}