From 18e8114016fad2617f3a1c1abd6c5e108899ff8b Mon Sep 17 00:00:00 2001 From: Krateng Date: Sun, 7 Apr 2019 13:13:12 +0200 Subject: [PATCH] Added generic extendible Chromium scrobbler --- scrobblers/chromium-generic/background.js | 237 ++++++++++++++++++ scrobblers/chromium-generic/icon128.png | Bin 0 -> 6401 bytes scrobblers/chromium-generic/icon256.png | Bin 0 -> 11735 bytes scrobblers/chromium-generic/icon48.png | Bin 0 -> 2754 bytes scrobblers/chromium-generic/manifest.json | 38 +++ scrobblers/chromium-generic/settings.html | 31 +++ scrobblers/chromium-generic/settings.js | 77 ++++++ .../chromium-generic/sitescripts/plex.js | 38 +++ .../chromium-generic/sitescripts/ytmusic.js | 40 +++ 9 files changed, 461 insertions(+) create mode 100644 scrobblers/chromium-generic/background.js create mode 100644 scrobblers/chromium-generic/icon128.png create mode 100644 scrobblers/chromium-generic/icon256.png create mode 100644 scrobblers/chromium-generic/icon48.png create mode 100644 scrobblers/chromium-generic/manifest.json create mode 100644 scrobblers/chromium-generic/settings.html create mode 100644 scrobblers/chromium-generic/settings.js create mode 100644 scrobblers/chromium-generic/sitescripts/plex.js create mode 100644 scrobblers/chromium-generic/sitescripts/ytmusic.js diff --git a/scrobblers/chromium-generic/background.js b/scrobblers/chromium-generic/background.js new file mode 100644 index 0000000..441b941 --- /dev/null +++ b/scrobblers/chromium-generic/background.js @@ -0,0 +1,237 @@ + + +chrome.tabs.onUpdated.addListener(onTabUpdated); +chrome.tabs.onRemoved.addListener(onTabRemoved); +//chrome.tabs.onActivated.addListener(onTabChanged); +chrome.runtime.onMessage.addListener(onPlaybackUpdate); + +tabManagers = {} + +pages = { + "plex":{ + "patterns":[ + "https://app.plex.tv", + "http://app.plex.tv", + "https://plex.", + "http://plex." + ], + "script":"plex.js" + }, + "youtube_music":{ + "patterns":[ + "https://music.youtube.com", + "http://music.youtube.com" + ], + "script":"ytmusic.js" + } + +} + + +function onTabUpdated(tabId, changeInfo, tab) { + + + // still same page? + //console.log("Update to tab " + tabId + "!") + if (tabManagers.hasOwnProperty(tabId)) { + //console.log("Yes!") + page = tabManagers[tabId].page + patterns = pages[page]["patterns"] + //console.log("Page was managed by a " + page + " manager") + for (var i=0;i this.currentLength) { + this.alreadyPlayed = this.alreadyPlayed - this.currentLength + scrobble(this.currentArtist,this.currentTitle,this.currentLength) + } + + this.setUpdate() + this.currentlyPlaying = true + + } + + // CASE 2: New track is being played + else if (artist != this.currentArtist || title != this.currentTitle) { + + //first inform ourselves that the previous track has now been stopped for good + this.stopPlayback(artist,title) + //then initialize new playback + console.log("New track") + this.setUpdate() + this.alreadyPlayed = 0 + this.currentTitle = title + this.currentArtist = artist + this.currentLength = seconds + console.log(artist + " - " + title + " is playing!") + this.currentlyPlaying = true + } + } + + // the artist and title arguments are not attributes of the track being stopped, but of the track active now + // they are here to recognize whether the playback has been paused or completely ended / replaced + stopPlayback(artist,title) { + + //CASE 1: Playback just paused OR CASE 2: Playback ended + if (this.currentlyPlaying) { + var d = this.setUpdate() + this.alreadyPlayed = this.alreadyPlayed + d + console.log(d + " seconds played since last update, " + this.alreadyPlayed + " seconds played overall") + } + + + // Already played full song + while (this.alreadyPlayed > this.currentLength) { + this.alreadyPlayed = this.alreadyPlayed - this.currentLength + scrobble(this.currentArtist,this.currentTitle,this.currentLength) + } + + this.currentlyPlaying = false + + + + //ONLY CASE 2: Playback ended + if (artist != this.currentArtist || title != this.currentTitle) { + if (this.alreadyPlayed > this.currentLength / 2) { + scrobble(this.currentArtist,this.currentTitle,this.alreadyPlayed) + this.alreadyPlayed = 0 + } + } + } + + + + + // sets last updated to now and returns how long since then + setUpdate() { + var d = new Date() + var t = Math.floor(d.getTime()/1000) + var delta = t - this.lastUpdate + this.lastUpdate = t + return delta + } + + +} + + + + +function scrobble(artist,title,seconds) { + console.log("Scrobbling " + artist + " - " + title + "; " + seconds + " seconds playtime") + artiststring = encodeURIComponent(artist) + titlestring = encodeURIComponent(title) + chrome.storage.local.get("apikey",function(result) { + APIKEY = result["apikey"] + chrome.storage.local.get("serverurl",function(result) { + URL = result["serverurl"] + var xhttp = new XMLHttpRequest(); + xhttp.open("POST",URL + "/db/newscrobble",true); + xhttp.send("artist=" + artiststring + "&title=" + titlestring + "&duration=" + seconds + "&key=" + APIKEY) + }); + }); + + +} diff --git a/scrobblers/chromium-generic/icon128.png b/scrobblers/chromium-generic/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..e2293c27740de96c1c708531ab49705f11721bd9 GIT binary patch literal 6401 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 P00000NkvXXu0mjf!~Ip? literal 0 HcmV?d00001 diff --git a/scrobblers/chromium-generic/icon256.png b/scrobblers/chromium-generic/icon256.png new file mode 100644 index 0000000000000000000000000000000000000000..2cd97f9140ed48dabf3d01e88ddcb3148431922c GIT binary patch literal 11735 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 Of!@ig%2Y_1e*S+f*nQ^! literal 0 HcmV?d00001 diff --git a/scrobblers/chromium-generic/icon48.png b/scrobblers/chromium-generic/icon48.png new file mode 100644 index 0000000000000000000000000000000000000000..863a541d75f28eeeaef136766b2a19f65a46e0be GIT binary patch literal 2754 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 IM6N<$f*2AW8~^|S literal 0 HcmV?d00001 diff --git a/scrobblers/chromium-generic/manifest.json b/scrobblers/chromium-generic/manifest.json new file mode 100644 index 0000000..90c333a --- /dev/null +++ b/scrobblers/chromium-generic/manifest.json @@ -0,0 +1,38 @@ +{ + "name": "Maloja Scrobbler", + "version": "0.1", + "description": "Scrobbles tracks from various sites to your Maloja server", + "manifest_version": 2, + "permissions": ["activeTab", + "declarativeContent", + "tabs", + "storage", + "http://*/", + "https://*/", + "" + ], + "background": + { + "scripts": + [ + "background.js" + ] + }, + + + "browser_action": + { + "default_icon": + { + "128":"icon128.png", + "48":"icon48.png" + }, + "default_popup": "settings.html", + "default_title": "Settings" + }, + "icons": + { + "128":"icon128.png", + "48":"icon48.png" + } +} diff --git a/scrobblers/chromium-generic/settings.html b/scrobblers/chromium-generic/settings.html new file mode 100644 index 0000000..07a8659 --- /dev/null +++ b/scrobblers/chromium-generic/settings.html @@ -0,0 +1,31 @@ + + + + + Wat + + + + + +
+ Server:
+ +

+ API key:
+ +
+ + diff --git a/scrobblers/chromium-generic/settings.js b/scrobblers/chromium-generic/settings.js new file mode 100644 index 0000000..ac403e2 --- /dev/null +++ b/scrobblers/chromium-generic/settings.js @@ -0,0 +1,77 @@ + +document.addEventListener("DOMContentLoaded",function() { + document.getElementById("serverurl").addEventListener("input",updateServer); + document.getElementById("apikey").addEventListener("input",updateAPIKey); + + document.getElementById("serverurl").addEventListener("change",checkServer); + document.getElementById("apikey").addEventListener("change",checkServer); + + + chrome.storage.local.get({"serverurl":"http://localhost:42010"},function(result) { + document.getElementById("serverurl").value = result["serverurl"] + checkServer() + }); + chrome.storage.local.get({"apikey":"BlackPinkInYourArea"},function(result) { + document.getElementById("apikey").value = result["apikey"] + checkServer() + }); + + + +}); + + + +function updateServer() { + + text = document.getElementById("serverurl").value + + + chrome.storage.local.set({"serverurl":text}) +} + +function updateAPIKey() { + text = document.getElementById("apikey").value + chrome.storage.local.set({"apikey":text}) +} + +function checkServer() { + url = document.getElementById("serverurl").value + "/db/test?key=" + document.getElementById("apikey").value + + var xhttp = new XMLHttpRequest(); + xhttp.onreadystatechange = createCheckmarks; + try { + xhttp.open("GET",url,true); + xhttp.send(); + } + catch (e) { + //document.getElementById("checkmark_url").innerHTML = "❌" + //document.getElementById("checkmark_key").innerHTML = "❌" + document.getElementById("serverurl").style.backgroundColor = "red" + document.getElementById("apikey").style.backgroundColor = "red" + } + +} + +function createCheckmarks() { + if (this.readyState == 4) { + if ((this.status == 204) || (this.status == 205)) { + //document.getElementById("checkmark_url").innerHTML = "✔️" + //document.getElementById("checkmark_key").innerHTML = "✔️" + document.getElementById("serverurl").style.backgroundColor = "lawngreen" + document.getElementById("apikey").style.backgroundColor = "lawngreen" + } + else if (this.status == 403) { + //document.getElementById("checkmark_url").innerHTML = "✔️" + //document.getElementById("checkmark_key").innerHTML = "❌" + document.getElementById("serverurl").style.backgroundColor = "lawngreen" + document.getElementById("apikey").style.backgroundColor = "red" + } + else { + //document.getElementById("checkmark_url").innerHTML = "❌" + //document.getElementById("checkmark_key").innerHTML = "❌" + document.getElementById("serverurl").style.backgroundColor = "red" + document.getElementById("apikey").style.backgroundColor = "red" + } + } +} diff --git a/scrobblers/chromium-generic/sitescripts/plex.js b/scrobblers/chromium-generic/sitescripts/plex.js new file mode 100644 index 0000000..d4fcfd1 --- /dev/null +++ b/scrobblers/chromium-generic/sitescripts/plex.js @@ -0,0 +1,38 @@ +bar = document.querySelector("div[class*=PlayerControls]") +if (bar == null) { + console.log("Nothing playing right now!") + chrome.runtime.sendMessage({type:"stopPlayback",artist:"",title:""}) + exit() +} + +metadata = bar.querySelector("div[class*=PlayerControlsMetadata-container]") + +title = metadata.querySelector("a[class*=MetadataPosterTitle-singleLineTitle]").getAttribute("title") +artist = metadata.querySelector("span[class*=MetadataPosterTitle-title] > a:nth-child(1)").getAttribute("title") +duration = metadata.querySelector("[data-qa-id=mediaDuration]").innerHTML.split("/")[1] +if (duration.split(":").length == 2) { + durationSeconds = parseInt(duration.split(":")[0]) * 60 + parseInt(duration.split(":")[1]) +} +else { + durationSeconds = parseInt(duration.split(":")[0]) * 60 * 60 + parseInt(duration.split(":")[1]) * 60 + parseInt(duration.split(":")[2]) +} + + +control = bar.querySelector("div[class*=PlayerControls-buttonGroupCenter] > button:nth-child(2)").getAttribute("title") +if (control == "Play") { + console.log("Not playing right now") + chrome.runtime.sendMessage({type:"stopPlayback",artist:artist,title:title}) + //stopPlayback() +} +else if (control == "Pause") { + console.log("Playing " + artist + " - " + title) + chrome.runtime.sendMessage({type:"startPlayback",artist:artist,title:title,duration:durationSeconds}) + //startPlayback(artist,title,durationSeconds) +} + + + + + + + diff --git a/scrobblers/chromium-generic/sitescripts/ytmusic.js b/scrobblers/chromium-generic/sitescripts/ytmusic.js new file mode 100644 index 0000000..b4e9a68 --- /dev/null +++ b/scrobblers/chromium-generic/sitescripts/ytmusic.js @@ -0,0 +1,40 @@ +bar = document.querySelector("ytmusic-player-bar") +if (bar == null) { + console.log("Nothing playing right now!") + chrome.runtime.sendMessage({type:"stopPlayback",artist:"",title:""}) + exit() +} + +metadata = bar.querySelector("div[class*=middle-controls] > div[class*=content-info-wrapper]") + +ctrl = bar.querySelector("div[class*=left-controls]") + +title = metadata.querySelector("yt-formatted-string[class*=title]").getAttribute("title") +artist = metadata.querySelector("span > span[class*=subtitle] > yt-formatted-string > a:nth-child(1)").innerHTML +duration = ctrl.querySelector("[class*=time-info]").innerHTML.split("/")[1] +if (duration.split(":").length == 2) { + durationSeconds = parseInt(duration.split(":")[0]) * 60 + parseInt(duration.split(":")[1]) +} +else { + durationSeconds = parseInt(duration.split(":")[0]) * 60 * 60 + parseInt(duration.split(":")[1]) * 60 + parseInt(duration.split(":")[2]) +} + + +control = ctrl.querySelector("div > paper-icon-button[class*=play-pause-button]").getAttribute("title") +if (control == "Play") { + console.log("Not playing right now") + chrome.runtime.sendMessage({type:"stopPlayback",artist:artist,title:title}) + //stopPlayback() +} +else if (control == "Pause") { + console.log("Playing " + artist + " - " + title) + chrome.runtime.sendMessage({type:"startPlayback",artist:artist,title:title,duration:durationSeconds}) + //startPlayback(artist,title,durationSeconds) +} + + + + + + +