Files
dots-hyprland/dots/.config/quickshell/ii/modules/common/models/gCloud/GCloudVision.qml
T
2026-04-03 19:31:24 +02:00

94 lines
2.7 KiB
QML

pragma ComponentBehavior: Bound
import QtQuick
import Quickshell
import qs.modules.common.functions
import qs.modules.common.utils
import qs.services
import qs.modules.common
import ".."
NestableObject {
id: root
enum State {
Done, Uploading, Processing, Error
}
signal finished()
signal error()
property var outputData
property var state: GCloudVision.State.Done
readonly property string imageBase64FilePath: `${Directories.screenshotTemp}/vision_base64.txt`
readonly property string payloadFilePath: `${Directories.screenshotTemp}/vision_payload.json`
property string uploadEndpoint: "https://uguu.se/upload"
property bool tokenReady: GoogleCloud.tokenReady
property bool onlineImageReady: false
readonly property bool preparationReady: tokenReady && onlineImageReady
function annotateImage(imageUri: string) {
root.state = GCloudVision.State.Uploading;
root.onlineImageReady = false
GoogleCloud.load();
var seq = []; // command sequence
const niceFilePath = StringUtils.shellSingleQuoteEscape(FileUtils.trimFileProtocol(imageUri))
seq = [ //
["bash", "-c", `mkdir -p '${Directories.screenshotTemp}'; base64 '${niceFilePath}' -w 0 > '${imageBase64FilePath}'`], //
(out) => { //
root.onlineImageReady = true; //
}
]
// Execute the base64 conversion & load the token
prepMultiproc.runSequence(seq);
}
onPreparationReadyChanged: {
if (!preparationReady) return;
if (GoogleCloud.tokenError || GoogleCloud.keyError) {
root.state = GCloudVision.State.Error;
root.error();
return;
}
root.state = GCloudVision.State.Processing;
var seq = []; // command sequence
// Construct the JSON payload using jq to read from the base64 file
seq.push([
"bash", "-c",
`jq -n --rawfile content '${imageBase64FilePath}' \
'{"requests": [{"image": {"content": $content}, "features": [{"type": "DOCUMENT_TEXT_DETECTION"}]}]}' \
> '${payloadFilePath}'`
]);
seq.push([
"bash", "-c",
`curl -s -X POST \
-H "Authorization: Bearer ${GoogleCloud.token}" \
-H "x-goog-user-project: ${GoogleCloud.projectId}" \
-H "Content-Type: application/json" \
https://vision.googleapis.com/v1/images:annotate \
-d @'${payloadFilePath}'`
]);
seq.push((out) => {
root.outputData = JSON.parse(out);
root.finished();
root.state = GCloudVision.State.Done;
});
lookMultiproc.runSequence(seq);
}
MultiTurnProcess {
id: prepMultiproc
}
MultiTurnProcess {
id: lookMultiproc
}
}