From bd60ea451fc359c3762abd44626c94e55a8f648b Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sat, 24 May 2025 22:04:03 +0200 Subject: [PATCH] media controls: make cover art download more reliable --- .../modules/mediaControls/MediaControls.qml | 1 + .../modules/mediaControls/PlayerControl.qml | 29 +++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/.config/quickshell/modules/mediaControls/MediaControls.qml b/.config/quickshell/modules/mediaControls/MediaControls.qml index c7e43b80c..0983562b8 100644 --- a/.config/quickshell/modules/mediaControls/MediaControls.qml +++ b/.config/quickshell/modules/mediaControls/MediaControls.qml @@ -88,6 +88,7 @@ Scope { } delegate: PlayerControl { required property MprisPlayer modelData + artDownloadLocation: root.baseCoverArtDir player: modelData } } diff --git a/.config/quickshell/modules/mediaControls/PlayerControl.qml b/.config/quickshell/modules/mediaControls/PlayerControl.qml index b147c2315..b5ca27128 100644 --- a/.config/quickshell/modules/mediaControls/PlayerControl.qml +++ b/.config/quickshell/modules/mediaControls/PlayerControl.qml @@ -19,7 +19,11 @@ Item { // Player instance id: playerController required property MprisPlayer player property var artUrl: player?.trackArtUrl + property string artDownloadLocation: FileUtils.trimFileProtocol(`${XdgDirectories.cache}/media/coverart`) + property string artFileName: Qt.md5(artUrl) + ".jpg" + property string artFilePath: `${artDownloadLocation}/${artFileName}` property color artDominantColor: Appearance.m3colors.m3secondaryContainer + property bool downloaded: false implicitWidth: widgetWidth implicitHeight: widgetHeight @@ -60,8 +64,27 @@ Item { // Player instance playerController.artDominantColor = Appearance.m3colors.m3secondaryContainer return; } - colorQuantizer.targetFile = playerController.artUrl // Yes this binding break is intentional - colorQuantizer.running = true + // console.log("PlayerControl: Art URL changed to", playerController.artUrl) + // console.log("Download cmd:", coverArtDownloader.command.join(" ")) + playerController.downloaded = false + coverArtDownloader.running = true + } + + Process { // Cover art downloader + id: coverArtDownloader + property string targetFile: playerController.artUrl + command: [ "bash", "-c", `[ -f ${artFilePath} ] || curl -sSL '${targetFile}' -o '${artFilePath}'` ] + stdout: SplitParser { + onRead: data => { + // console.log("Color quantizer output:", data) + playerController.artDominantColor = "#" + data + } + } + onExited: (exitCode, exitStatus) => { + colorQuantizer.targetFile = playerController.artUrl // Yes this binding break is intentional + colorQuantizer.running = true + playerController.downloaded = true + } } Process { // Average Color Runner @@ -113,7 +136,7 @@ Item { // Player instance id: blurredArt anchors.fill: parent visible: true - source: playerController.artUrl + source: playerController.downloaded ? Qt.resolvedUrl(artFilePath) : "" sourceSize.width: background.width sourceSize.height: background.height fillMode: Image.PreserveAspectCrop