From 1f361b5248337b31d00e2eae9d43875156a9a22d Mon Sep 17 00:00:00 2001 From: Vincent de Saboulin Date: Mon, 2 Jan 2023 21:38:27 +0100 Subject: [PATCH] Hotkey to Spotify Connect to Preferred Device #596 --- .../84CCC97C-8B2B-48BF-B706-86386C40223B.png | Bin 0 -> 8477 bytes .../F1DC5D37-62C5-4644-9EE8-06624A5B8B1B.png | Bin 0 -> 8477 bytes spotify-mini-player/info.plist | 223 +++++++++++++++++- spotify-mini-player/src/action.php | 15 ++ spotify-mini-player/src/functions.php | 85 +++++++ 5 files changed, 322 insertions(+), 1 deletion(-) create mode 100644 spotify-mini-player/84CCC97C-8B2B-48BF-B706-86386C40223B.png create mode 100644 spotify-mini-player/F1DC5D37-62C5-4644-9EE8-06624A5B8B1B.png diff --git a/spotify-mini-player/84CCC97C-8B2B-48BF-B706-86386C40223B.png b/spotify-mini-player/84CCC97C-8B2B-48BF-B706-86386C40223B.png new file mode 100644 index 0000000000000000000000000000000000000000..3fb8a87a19d6b48baf45d18c6b8beb8a77c37644 GIT binary patch literal 8477 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 LNkvXXu0mjfh(;L{ literal 0 HcmV?d00001 diff --git a/spotify-mini-player/F1DC5D37-62C5-4644-9EE8-06624A5B8B1B.png b/spotify-mini-player/F1DC5D37-62C5-4644-9EE8-06624A5B8B1B.png new file mode 100644 index 0000000000000000000000000000000000000000..3fb8a87a19d6b48baf45d18c6b8beb8a77c37644 GIT binary patch literal 8477 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 LNkvXXu0mjfh(;L{ literal 0 HcmV?d00001 diff --git a/spotify-mini-player/info.plist b/spotify-mini-player/info.plist index fc2ac5c0..138bec39 100644 --- a/spotify-mini-player/info.plist +++ b/spotify-mini-player/info.plist @@ -34,6 +34,19 @@ + 048300BE-08F7-4E93-9AC5-B3CE8365DAF9 + + + destinationuid + F54DD2A9-12CA-4E9D-9F03-6D5C18444155 + modifiers + 0 + modifiersubtext + + vitoclose + + + 0554A7C3-1357-4E84-B414-BEA7A183AEE3 @@ -1973,6 +1986,19 @@ + 84CCC97C-8B2B-48BF-B706-86386C40223B + + + destinationuid + F54DD2A9-12CA-4E9D-9F03-6D5C18444155 + modifiers + 0 + modifiersubtext + + vitoclose + + + 85966031-0B63-4629-BF2A-CAE7C92FCDD6 @@ -2431,6 +2457,19 @@ + A27C8F05-4766-429E-A19D-7025B55FDC14 + + + destinationuid + F54DD2A9-12CA-4E9D-9F03-6D5C18444155 + modifiers + 0 + modifiersubtext + + vitoclose + + + A38DD404-DE03-42C2-B0CB-A37891B6F24D @@ -3668,6 +3707,19 @@ + F1DC5D37-62C5-4644-9EE8-06624A5B8B1B + + + destinationuid + F54DD2A9-12CA-4E9D-9F03-6D5C18444155 + modifiers + 0 + modifiersubtext + + vitoclose + + + F23EB343-6D1D-4D17-9CCC-465756A5F513 @@ -12096,6 +12148,119 @@ main($query,"TRACK",""); version 2 + + config + + availableviaurlhandler + + triggerid + switch_to_preferred_spotify_connect_device + + type + alfred.workflow.trigger.external + uid + 048300BE-08F7-4E93-9AC5-B3CE8365DAF9 + version + 1 + + + config + + argument + + argumenttype + 0 + triggerid + com.vdesabou.miniplayer.prefferedspotifyconnectdevice + triggername + Preferred Spotify Connet + workflowonly + + + type + alfred.workflow.trigger.remote + uid + 84CCC97C-8B2B-48BF-B706-86386C40223B + version + 1 + + + config + + concurrently + + escaping + 38 + script + <?php +require './src/action.php'; +$query = serialize(array("", "", "", "", "", "", "", "switch_to_preferred_spotify_connect_device" /* other_action */, "", "", "", "", "", "", "", "" , "", "", "", "", "", "")); +main($query,"TRACK",""); +?> + scriptargtype + 1 + scriptfile + + type + 1 + + type + alfred.workflow.action.script + uid + F54DD2A9-12CA-4E9D-9F03-6D5C18444155 + version + 2 + + + config + + argumenttype + 2 + keyword + {var:c_switch_to_preferred_spotify_connect_device} + subtext + Preferred Spotify Connect device should be set + text + Switch to preferred Spotify Connect device + withspace + + + type + alfred.workflow.input.keyword + uid + F1DC5D37-62C5-4644-9EE8-06624A5B8B1B + version + 1 + + + config + + action + 0 + argument + 0 + focusedappvariable + + focusedappvariablename + + hotkey + 0 + hotmod + 0 + leftcursor + + modsmode + 0 + relatedAppsMode + 0 + + type + alfred.workflow.trigger.hotkey + uid + A27C8F05-4766-429E-A19D-7025B55FDC14 + version + 2 + readme # 🎩 Alfred Spotify Mini Player @@ -12224,6 +12389,13 @@ During that time, you can use the workflow (you'll see the progress at the top o ypos 5530 + 048300BE-08F7-4E93-9AC5-B3CE8365DAF9 + + xpos + 335 + ypos + 16465 + 0554A7C3-1357-4E84-B414-BEA7A183AEE3 xpos @@ -13546,6 +13718,13 @@ During that time, you can use the workflow (you'll see the progress at the top o ypos 6895 + 84CCC97C-8B2B-48BF-B706-86386C40223B + + xpos + 80 + ypos + 16565 + 85966031-0B63-4629-BF2A-CAE7C92FCDD6 xpos @@ -13846,6 +14025,13 @@ During that time, you can use the workflow (you'll see the progress at the top o ypos 7220 + A27C8F05-4766-429E-A19D-7025B55FDC14 + + xpos + 285 + ypos + 16770 + A2C8ACBA-F98F-457A-90E8-11BA2112342C xpos @@ -14618,6 +14804,13 @@ Example: https://open.spotify.com/track/6hxgHNJjadmCHAJPXw6AYL ypos 12270 + F1DC5D37-62C5-4644-9EE8-06624A5B8B1B + + xpos + 35 + ypos + 16720 + F23EB343-6D1D-4D17-9CCC-465756A5F513 xpos @@ -14653,6 +14846,13 @@ Example: https://open.spotify.com/track/6hxgHNJjadmCHAJPXw6AYL ypos 7750 + F54DD2A9-12CA-4E9D-9F03-6D5C18444155 + + xpos + 465 + ypos + 16680 + F55B6C14-1B39-4D5D-92B9-551B7CBECFE6 xpos @@ -16233,6 +16433,27 @@ Example: https://open.spotify.com/track/6hxgHNJjadmCHAJPXw6AYL variable c_add_current_track_to_alfred_playlist + + config + + default + switch_to_preferred_spotify_connect_device + required + + trim + + verticalsize + 3 + + description + switch_to_preferred_spotify_connect_device + label + ⌨️Command to rename + type + textarea + variable + c_switch_to_preferred_spotify_connect_device + config @@ -17588,7 +17809,7 @@ Example: https://open.spotify.com/track/6hxgHNJjadmCHAJPXw6AYL version - 12.4 + 12.5 webaddress https://alfred-spotify-mini-player.com diff --git a/spotify-mini-player/src/action.php b/spotify-mini-player/src/action.php index ecb8f9ac..de5d8cba 100644 --- a/spotify-mini-player/src/action.php +++ b/spotify-mini-player/src/action.php @@ -1123,6 +1123,21 @@ function main($query, $type, $add_to_option) } elseif ($other_action == 'unfollow_playlist') { unfollowThePlaylist($w, $playlist_uri); + return; + } elseif ($other_action == 'switch_to_preferred_spotify_connect_device') { + if ($preferred_spotify_connect_device != '') { + $device_id = getSpotifyConnectPreferredDevice($w); + + if ($device_id != '') { + changeUserDevice($w, $device_id); + } else { + displayNotificationWithArtwork($w, 'Preferred Spotify Connect device id could not be found', './images/warning.png', 'Error!'); + return; + } + } else { + displayNotificationWithArtwork($w, 'No preferred Spotify Connect device configured', './images/warning.png', 'Error!'); + return; + } return; } elseif ($other_action == 'follow_playlist') { followThePlaylist($w, $playlist_uri); diff --git a/spotify-mini-player/src/functions.php b/spotify-mini-player/src/functions.php index 6ca911a1..1831e974 100644 --- a/spotify-mini-player/src/functions.php +++ b/spotify-mini-player/src/functions.php @@ -1709,6 +1709,91 @@ function pauseSpotifyConnect($w, $device_id) } } +/** + * getSpotifyConnectPreferredDevice function. + * + * @param mixed $w + */ +function getSpotifyConnectPreferredDevice($w) +{ + $preferred_spotify_connect_device = getSetting($w, 'preferred_spotify_connect_device'); + + $retry = true; + $nb_retry = 0; + while ($retry) { + try { + $api = getSpotifyWebAPI($w); + $devices = $api->getMyDevices(); + $retry = false; + if (isset($devices->devices)) { + if ($preferred_spotify_connect_device != "") { + foreach ($devices->devices as $device) { + if ($device->name == $preferred_spotify_connect_device) { + return $device->id; + } + } + } + } + return ''; + } catch (SpotifyWebAPI\SpotifyWebAPIException $e) { + if ($e->getMessage() == 'Permissions missing') { + $retry = false; + $w->result(null, serialize(array( + '' /*track_uri*/, + '' /* album_uri */, + '' /* artist_uri */, + '' /* playlist_uri */, + '' /* spotify_command */, + '' /* query */, + '' /* other_settings*/, + 'reset_oauth_settings' /* other_action */, + '' /* artist_name */, + '' /* track_name */, + '' /* album_name */, + '' /* track_artwork_path */, + '' /* artist_artwork_path */, + '' /* album_artwork_path */, + '' /* playlist_name */, + '', /* playlist_artwork_path */ + )), 'The workflow needs more privilages to do this, click to restart authentication', array( + 'Next time you invoke the workflow, you will have to re-authenticate', + 'alt' => '', + 'cmd' => '', + 'shift' => '', + 'fn' => '', + 'ctrl' => '', + ), './images/warning.png', 'yes', null, ''); + } else { + logMsg($w, 'Error(getSpotifyConnectPreferredDevice): retry ' . $nb_retry . ' (exception ' . jTraceEx($e) . ')'); + if ($e->getCode() == 404 || $e->getCode() == 403) { + // skip + break; + } else if (strpos(strtolower($e->getMessage()), 'ssl') !== false) { + // cURL transport error: 35 LibreSSL SSL_connect: SSL_ERROR_SYSCALL error #251 + // https://github.com/vdesabou/alfred-spotify-mini-player/issues/251 + // retry any SSL error + ++$nb_retry; + } else if ($e->getCode() == 500 || $e->getCode() == 502 || $e->getCode() == 503 || $e->getCode() == 202 || $e->getCode() == 400 || $e->getCode() == 504) { + // retry + if ($nb_retry > 3) { + handleSpotifyWebAPIException($w, $e); + $retry = false; + + return false; + } + ++$nb_retry; + sleep(5); + } else { + handleSpotifyWebAPIException($w, $e); + $retry = false; + + return false; + } + } + } + } +} + /** * getSpotifyConnectCurrentDeviceId function. *