Created
May 25, 2022 22:33
-
-
Save VelocityRa/895316d6d49034df510137fe870a68e5 to your computer and use it in GitHub Desktop.
Discord Last.fm Rich Presence
This file contains 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
// modified from https://github.com/PvtTyphoon/lfm-rich-presence | |
const rpc = require("discord-rpc"); | |
const rp = new rpc.Client({ | |
transport: "ipc", | |
}); | |
const fetch = require("request-promise"); | |
const prettyMilliseconds = require("pretty-ms"); | |
function formatNumber(number) { | |
var x = number.split("."); | |
var x1 = x[0]; | |
var x2 = x.length > 1 ? "." + x[1] : ""; | |
var rgx = /(\d+)(\d{3})/; | |
while (rgx.test(x1)) { | |
x1 = x1.replace(rgx, "$1" + "," + "$2"); | |
} | |
return x1 + x2; | |
} | |
const { stdin, stdout } = process; | |
function prompt(question) { | |
return new Promise((resolve, reject) => { | |
stdin.resume(); | |
stdout.write(question); | |
stdin.on("data", (data) => resolve(data.toString().trim())); | |
stdin.on("error", (err) => reject(err)); | |
}); | |
} | |
const apiKey = "615322f0047e12aedbc610d9d71f7430"; // If you wish to compile this yourself | |
rp.on("ready", async () => { | |
const username = await prompt( | |
"Type out your last.fm username and then hit enter: " | |
); | |
//const username = "Vel0cityX"; | |
console.log("Connecting."); | |
updateStatus(); | |
setInterval(function () { | |
updateStatus(); | |
}, 30000); | |
console.log("Discord rich presence established."); | |
async function updateStatus() { | |
var data = await fetchCurrentScrobble(username); | |
const hasSmallImage = (data.scrobbleStatus != ""); | |
const hasLargeImage = (data.cover !== undefined && data.cover != ""); | |
const newActivity = { | |
largeImageKey: hasLargeImage ? data.cover : "empty", | |
largeImageText: `${data.playcount} plays`, | |
smallImageKey: hasSmallImage ? (data.whenScrobbled ? "play" : "stop") : undefined, | |
smallImageText: hasSmallImage ? data.scrobbleStatus : undefined, | |
details: data.trackName, | |
state: `by ${data.artist} | on ${data.album}`, | |
buttons: [ | |
{ | |
// label: `${formatNumber(data.scrobbles)} total scrobbles.`, | |
// label: `Last.fm Profile (${username})`, | |
label: `Last.fm Profile`, | |
url: `https://www.last.fm/user/${username}`, | |
}, | |
], | |
}; | |
console.log("setting activity to:"); | |
console.log(newActivity); | |
rp.setActivity(newActivity); | |
console.log(`Discord status updated.`); | |
} | |
}); | |
rp.login({ | |
// clientId: "868813214740271135", | |
clientId: "925883373208100946", | |
}); | |
async function fetchCurrentScrobble(user) { | |
var optionsGetTrack = { | |
uri: "http://ws.audioscrobbler.com/2.0/", | |
json: true, | |
qs: { | |
method: "user.getrecenttracks", | |
user: user, | |
api_key: apiKey, | |
format: "json", | |
limit: "1", | |
}, | |
}; | |
const lastTrack = await fetch(optionsGetTrack); | |
if (!lastTrack) | |
return console.log( | |
"An error occured, you may have provided an invalid username or last.fm may be facing issues, retrying in 30 seconds." | |
); | |
let lastArtist = lastTrack.recenttracks.track[0].artist["#text"]; | |
let lastTrackName = lastTrack.recenttracks.track[0].name; | |
var options = { | |
uri: "http://ws.audioscrobbler.com/2.0/", | |
json: true, | |
qs: { | |
method: "track.getInfo", | |
user: user, | |
track: lastTrackName, | |
artist: lastArtist, | |
api_key: apiKey, | |
format: "json", | |
}, | |
}; | |
const rData = await fetch(options); | |
const data = { | |
artist: lastTrack.recenttracks.track[0].artist["#text"], | |
album: lastTrack.recenttracks.track[0].album["#text"], | |
trackName: lastTrack.recenttracks.track[0].name, | |
playcount: rData.track.userplaycount ? rData.track.userplaycount : "0", | |
scrobbles: lastTrack.recenttracks["@attr"].total, | |
whenScrobbled: lastTrack.recenttracks.track[0]["@attr"], | |
scrobbleStatus: !lastTrack.recenttracks.track[0]["@attr"] | |
? `Last scrobbled ${prettyMilliseconds( | |
Date.now() - lastTrack.recenttracks.track[0].date.uts * 1000, { compact: true } | |
)} ago. | |
` | |
// : "Now scrobbling. ", | |
: "", | |
cover: | |
lastTrack.recenttracks.track[0].image[ | |
lastTrack.recenttracks.track[0].image.length - 1 | |
]["#text"], | |
}; | |
return data; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment