Last active
December 4, 2021 07:12
-
-
Save marco79cgn/42052277bb7b02ca80cb2484ab46fb9e to your computer and use it in GitHub Desktop.
A scriptable widget that shows a random episode of "Die drei ???" and opens it in Spotify or Sonos
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// insert your Spotify client id and secret here | |
let clientId = "xxx" | |
let clientSecret = "xxx" | |
// optional: the ip of your node-sonos-http-api and room name; use "sonos" as parameter in your widget settings to activate it | |
let sonosUrl = "http://192.168.178.10:5005/Arbeitszimmer" | |
let openWith = args.widgetParameter | |
let widget = new ListWidget() | |
// widget.setPadding(0,0,0,0) | |
widget.backgroundColor = new Color("#000000") | |
let searchToken = await getSpotifySearchToken() | |
await getRandomEpisode() | |
widget.presentSmall() | |
Script.setWidget(widget) | |
Script.complete() | |
// query spotify api | |
async function getRandomEpisode() { | |
let uri = "" | |
let externalUrl = "" | |
let coverUrl = "" | |
if(searchToken != null) { | |
do { | |
let randomEpisodeNumber = getRandomEpisodeNumber(1,207) | |
let result = await searchAlbumAtSpotify(randomEpisodeNumber, "Die drei ???") | |
// console.log(result) | |
if (result != null && result.albums != null && result.albums.items != null && result.albums.items.length == 1) { | |
let item = result.albums.items[0] | |
coverUrl = item.images[0].url | |
uri = item.uri | |
externalUrl = item.external_urls.spotify | |
} | |
} while(coverUrl.length == 0) | |
if(openWith != null && openWith === "sonos") { | |
widget.url = sonosUrl + "/spotify/now/" + uri | |
} else { | |
widget.url = externalUrl | |
} | |
await loadImage(coverUrl) | |
} | |
} | |
// random number, min and max included | |
function getRandomEpisodeNumber(min, max) { | |
let randomNumber = Math.floor(Math.random() * (max - min + 1) + min) | |
return add_zero(randomNumber, 3) | |
} | |
// add leading zeros to a number | |
function add_zero(number, length) { | |
var num = '' + number; | |
while (num.length < length) { | |
num = '0' + num; | |
} | |
return num; | |
} | |
// helper function to download an image | |
async function loadImage(imageUrl) { | |
let req = new Request(imageUrl) | |
let image = await req.loadImage() | |
// widget.backgroundImage = image | |
let widgetImage = widget.addImage(image) | |
widgetImage.imageSize = new Size(150,150) | |
widgetImage.centerAlignImage() | |
widgetImage.cornerRadius = 16 | |
} | |
// gets a spotify search token | |
async function getSpotifySearchToken() { | |
let url = "https://accounts.spotify.com/api/token" | |
let req = new Request(url) | |
req.method = "POST" | |
req.body = "grant_type=client_credentials" | |
let authHeader = "Basic " + btoa(clientId+":"+clientSecret) | |
req.headers = {"Authorization": authHeader, "Content-Type":"application/x-www-form-urlencoded"} | |
let token = await req.loadJSON() | |
return token.access_token | |
} | |
// search for the album at Spotify | |
async function searchAlbumAtSpotify(album, artist) { | |
let searchString = encodeURIComponent("album:" + album +" artist:" + artist) | |
let searchUrl = "https://api.spotify.com/v1/search?q=" + searchString + "&type=album&market=DE&limit=1" | |
req = new Request(searchUrl) | |
req.headers = {"Authorization": "Bearer " + searchToken, "Content-Type":"application/json", "Accept":"application/json"} | |
let result = await req.loadJSON() | |
return result | |
} |
Mega! Das habe ich gesucht - bin aber leider Apple Music Kunde und kann das Widget
So nicht nutzen -> wird es da eine Option geben? :)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Tolle Idee für ein Widget! Scriptable lässt es wahrscheinlich nicht zu, durch weitere zufällig Alben zu wechseln und dieses dann durch Antippen abzuspielen, oder wäre das möglich?