// ==UserScript== // @name Plex now playing badge // @namespace V@no // @description Display a badge on favicon with a number of users streaming from the server // @author V@no // @include http://localhost:32400/web/* // @include http://127.0.0.1:32400/web/* // @include https://app.plex.tv/desktop // @include https://app.plex.tv/desktop/* // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADi0lEQVRYhc2XXYgbVRTH/8bFdrex2+5Xdppmbyg+2OJaLL5IG1DEh74p4ka0gj4UpEh8rLDtth1dadQurYMW+6DSIH6sInlRhAgiSqDdtZt2W5dZlJZYEYlgLSMqyM8HJ9nJmEiTNOiFCwMzc8/vnHvO/54rYwz/5dT/HuDk7g3M7bMaztOTFndsHusuQGrrGKcmGwPM7bN4b8+G7gIYYzjw4MamAPNTo0ykEt0FuPUWw+lQFOb3W5w5FKP03AjFqRjJZJeTcHoiXuf1gh3j3PMjnM8O8/VLQ2R3Wd0FSCYNn++1mNtvsXDob+MXXhhiaWYQ99gA7tEBtm1pPSFbKsOHdiQ4c3CUs9MjnPeNL788wLevruPia/18NDncXQBjDO9nLBYPD7N0ZMX4pRP9lF9fy+U3b+aRe+PdBdi2eYzF7BDu0QG+eWU9F33j35+M8sNba1g6vralhGxLCbO7LJad9Vya6efqfTfxx1gEpGua5Z4eZqNRtsfj7QMkk4azBwf5s++GusWvSkxL3C+xUWKVxJ0ST0iUQiBXIhG2x+PtnwWfja6pW7AkcbtEJpOhVCpRHZVKhXw+jzGGmRDEbDTaPkC5p6e20JcSUQnHcWg2yuUyxhiOh6LQNkDQk90Sxhg8z2sKAJDP5+mVuBz4t2OAXyV6JXK5XJ23qVQKY0zddniehyTevZ4Ab0jID7/rulQqFRzHYZXEoJ8TwSGJvdcT4CkfIDwTfhXYtl0XGUm83SlAMrkC8JvEVxI5iWck7g5ApFIpyuVyDcC2bSTxS6cA2cespkLzoW/cdd26vXccB0k8EPq+LSm+8OJQU4AjPkDQcwDXdUmn02yScDsB+OBp618B9gTCr1ASep6HMYbH2wWY2JGg9GyMxcPDDY3/KHGXDxCRiPnPhUKhBlEoFJDET60CVBuSaj9QNbpTYouvhMEqeEfiO/85n8/XbYV89WwJoNaS+R1RFSAdSLrqvtu2zZMSC/67YrH4D4AvWgEIN6XzU6M1gGMNkq6qhNGQQgLkcjnkK+g1AzRqy6sASz5AUHCajWoSjreShM0uJr+vu7G2yMMNQt3IeDqdRhKfqoXTsNnVrLK1twbgSdwWiES4HygWi7WynAp4/0lfX/tnwXgiUVeCyxKPqvG5IAnLl+tgL7DTsjq7HY8nEsxGo1yJrPSEH0sckJiQuEciI3FC4ueA4eLq1bWe8C/6ASv5oJETowAAAABJRU5ErkJggg== // @version 1.1 // @grant none // @downloadURL none // ==/UserScript== var links = document.getElementsByTagName("link"), link = null, head = document.getElementsByTagName('head')[0], prev = null; for(let i = 0; i < links.length; i++) { if (links[i].getAttribute("rel") == "shortcut icon") { link = links[i]; break; } } if (!link) { link = document.createElement('link'); link.type = 'image/x-icon'; link.rel = 'shortcut icon'; link.href = "/web/favicon.ico"; head.appendChild(link); /* link = document.createElement('img'); document.body.appendChild(link); let span = document.createElement("span"); span.className = "activity-badge badge badge-transparent"; span.innerText = "0"; document.body.appendChild(span); */ } var src = link.href, _coords = [ {// badge < 10 roundRect: [14, 11, 18, 21, 4], lineWidth: 3, text: [17, 30], size: 23, color: ["#F00", "#FFF", "#000"] }, {// badge > 9 roundRect: [4, 11, 28, 21, 4], lineWidth: 3, text: [5, 30], size: 23, color: ["#F00", "#FFF", "#000"] } ]; (function loop() { let badge = document.getElementsByClassName("activity-badge badge badge-transparent"); badge = badge.length ? badge[0].innerText : ""; let text = parseInt(badge); if (isNaN(text)) text = 0; if (badge && prev != text) { let canvas = document.createElement('canvas'), ctx = canvas.getContext('2d'), img = new Image(); canvas.width = 32; canvas.height = 32; img.setAttribute('crossOrigin','anonymous'); img.src = src; img.onload = function() { ctx.drawImage(img, 0, 0); if (text) { let coords = _coords[text < 10 ? 0 : 1]; ctx.fillStyle = coords.color[0]; ctx.roundRect.apply(ctx, coords.roundRect).fill(); ctx.font = 'bold ' + coords.size + 'px sans-serif'; ctx.strokeStyle = coords.color[2]; ctx.lineWidth = coords.lineWidth; ctx.strokeText(text, coords.text[0], coords.text[1]); ctx.fillStyle = coords.color[1]; ctx.fillText(text, coords.text[0], coords.text[1]); } link.href = canvas.toDataURL("image/x-icon"); prev = text; /* link.src = canvas.toDataURL("image/x-icon"); badge[0].innerText++; */ }; } setTimeout(loop, 3000); })(); //https://stackoverflow.com/a/7838871/2930038 CanvasRenderingContext2D.prototype.roundRect = function (x, y, w, h, r) { if (w < 2 * r) r = w / 2; if (h < 2 * r) r = h / 2; this.beginPath(); this.moveTo(x+r, y); this.arcTo(x+w, y, x+w, y+h, r); this.arcTo(x+w, y+h, x, y+h, r); this.arcTo(x, y+h, x, y, r); this.arcTo(x, y, x+w, y, r); this.closePath(); return this; };