Bandcamp Album Length

Sums up the lengths of Bandcamp album tracks and gives you a total album runtime up top.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @namespace   raina
// @name        Bandcamp Album Length
// @author      raina
// @description Sums up the lengths of Bandcamp album tracks and gives you a total album runtime up top.
// @version     2.3
// @include     *
// @grant       none
// ==/UserScript==
window.self === window.top && window.siteroot && "https://bandcamp.com" == window.siteroot && (function() {

	let tracks = document.querySelectorAll('#track_table .title .time');
	if (tracks.length) {
		let runtime = document.createElement("span");
		let mul = [1, 60, 60 * 60];
		let total = 0;
		let duration = "";
		let time;
		let section;
		let digits;
		let hours;
		let minutes;

		for (let i = 0; i < tracks.length; i++)	{
			time = tracks[i].textContent.trim();
			section = 0;
			while (time) {
				digits = Number(time.slice(time.lastIndexOf(":") + 1));
				total += digits * mul[section];
				if (0 > time.lastIndexOf(":")) break;
				time = time.slice(0, time.lastIndexOf(":"));
				section++;
			}
		}

		hours = Math.floor(total / mul[2]);
		if (1 <= hours) {
			duration = hours + ":";
			total -= hours * mul[2];
		}

		minutes = Math.floor(total / mul[1]);
		if (duration) {
			duration += ("0" + minutes).slice(-2) + ":";
		} else {
			duration = minutes + ":";
		}
		if (1 <= minutes) {
			total -= minutes * mul[1];
		}

		duration += ("0" + total).slice(-2);
		runtime.textContent = "Total runtime: " + duration;
		runtime.style = "display: inline-block; float: right;";
		document.querySelector('#name-section h3').insertBefore(runtime, document.querySelector('#name-section h3 [itemprop="byArtist"]'));
	}

}());