dafiulh / Strava Activity Speed

// ==UserScript==
// @name         Strava Activity Speed
// @version      0.1
// @license      MIT
// @description  Show speed for every activity on "My Activities" page in Strava website
// @author       Dafiul Haq
// @match        https://www.strava.com/athlete/training
// @grant        none
// ==/UserScript==

let table = document.getElementById("search-results");
let thead = table.firstElementChild;
let tbody = table.lastElementChild;

let speedTh = document.createElement("th");
speedTh.style.textAlign = "center";
speedTh.style.padding = "0";
speedTh.textContent = "Avg. Speed";

thead.firstElementChild.insertBefore(speedTh, thead.firstElementChild.querySelector(".col-elev"));

let observer = new MutationObserver((mutations, observer) => {
    for (let mutation of mutations) {
        if (mutation.type === 'childList' && mutation.removedNodes.length > 0) {
			[...tbody.children].forEach((tr) => {
				let meter = parseFloat(tr.querySelector(".col-dist").textContent) * 1000;
				let second = Number((() => {
					let raw = tr.querySelector(".col-time").textContent;
					let splitted = raw.split(":").map(v => Number(v));
					if (splitted.length === 3) {
						return splitted[0] * 3600 + splitted[1] * 60 + splitted[2];
					} else if (splitted.length === 2) {
						return splitted[0] * 60 + splitted[1];
					} else {
						return raw.slice(0, -1);
					}
				})());
				let kmh = ((meter / second) * 3600 / 1000).toFixed(1);

				let speedTd = document.createElement("td");
				speedTd.classList.add("view-col");
				speedTd.style.display = "table-cell";
				speedTd.style.textAlign = "right";
				speedTd.textContent = kmh + " km/h";

				tr.insertBefore(speedTd, tr.querySelector(".col-elev"));
			});
        }
    }
});

observer.observe(tbody, {childList: true, subtree: true});