eBird Acornizer

Custom tags and improved rating display for eBird media.

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==UserScript==
// @name         eBird Acornizer
// @namespace    https://github.com/balagansky/
// @version      2025-11-15
// @description  Custom tags and improved rating display for eBird media.
// @author       Ruslan Balagansky
// @license	     MIT
// @match        https://media.ebird.org/catalog*
// @match        https://macaulaylibrary.org/asset/*
// @icon         data:image/png;base64,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
// @grant        GM.getValue
// @grant        GM.setValue
// @grant        GM.listValues
// @grant        GM.registerMenuCommand
// @grant		 GM.setClipboard
// @run-at	   	 document-end
// ==/UserScript==

var settings;
var favorites;
var goods;
var alternates;
var funnies;
var stares;

const cMaxAutoLoad = 500;

// import/export functions
function importFavorites() {
	var dataStr = prompt("Enter data (exported with Export function): ");
	try {
		var data = JSON.parse(dataStr);
		for (const key in data) {
			GM.setValue(key, data[key]);
			console.log("Saved data for key: " + key);
		}
		
		alert("Data imported! Refresh the page to see changes.");
	} catch (e) {
		alert("Failed to import data. Please check the format and try again.");
	}
}

function exportFavorites() {
	GM.listValues().then(async function(keys) {
		var data = {};
		for (const key of keys) {
			data[key] = await GM.getValue(key);
			console.log("Loaded data for key: " + key);
		}

		GM.setClipboard(JSON.stringify(data), "text").then(function() {
			alert("Exported data to clipboard.");
		});
	});
}

GM.registerMenuCommand("Import Tags", importFavorites);
GM.registerMenuCommand("Export Tags", exportFavorites);


async function readFromStorage(key)
{
	try {
		// GM.getValue returns the stored value directly; don't JSON.parse it
		var readResult = await GM.getValue(key);
		var valueStr = JSON.stringify(readResult);
		if (valueStr)
			valueStr = valueStr.slice(0, 100) + "...";
		console.log("read " + key + ": " + valueStr);
		return readResult;
	} catch (e) {
		console.log("error reading " + key + ". Maybe not written yet?");
		return null;
	}
}

async function saveToStorage(key, value)
{
	// stringify once for logging only
	var valueStr = JSON.stringify(value);
	if (valueStr)
		valueStr = valueStr.slice(0, 100) + "...";
	console.log("saving " + key + ": " + valueStr);
	await GM.setValue(key, value);
	console.log(key + " saved");
}

async function readSettings()
{
	var readSettings = await readFromStorage("settings");
	settings = readSettings || {
		maxResults: 100
	};
}

async function saveSettings()
{
	await saveToStorage("settings", settings);
}

async function readFavorites()
{
	var readFavorites = await readFromStorage("favorites");
	favorites = new Set();
	if (readFavorites) {
		try {
			favorites = new Set(readFavorites);
		} catch {}
	}
	
	var readGoods = await readFromStorage("goods");
	goods = new Set();
	if (readGoods) {
		try {
			goods = new Set(readGoods);
		} catch {}
	}
	
	var readAlternates = await readFromStorage("alternates");
	alternates = new Set();
	if (readAlternates) {
		try {
			alternates = new Set(readAlternates);
		} catch {}
	}
	
	var readFunnies = await readFromStorage("funnies");
	funnies = new Set();
	if (readFunnies) {
		try {
			funnies = new Set(readFunnies);
		} catch {}
	}
	
	var readStares = await readFromStorage("stares");
	stares = new Set();
	if (readStares) {
		try {
			stares = new Set(readStares);
		} catch {}
	}
}

async function saveFavorites()
{
	await saveToStorage("favorites", Array.from(favorites));
	await saveToStorage("goods", Array.from(goods));
	await saveToStorage("alternates", Array.from(alternates));
	await saveToStorage("funnies", Array.from(funnies));
	await saveToStorage("stares", Array.from(stares));
}

async function readStorage()
{
	await readSettings();
	await readFavorites();
}

function isViewSupported() {
	var resultsGrid = document.getElementsByClassName("ResultsGrid");
	if (resultsGrid.length == 0) {
		console.log("Only grid views are supported.");
		return false;
	}
	return true;
}

var results = [];
var resultIds = new Set();
var resultOrigOrder = {};
var resultRatings = {};

function clearResults() {
	results = [];
	resultIds = new Set();
	resultOrigOrder = {};
}

var additionalLoadCount = 0;
const cImagesPerLoad = 30;

function loadMoreResults() {
	if (results.length == 0)
		return;
	
	var pagination = document.getElementsByClassName("pagination")[0];
	for (var pagChild of pagination.childNodes) {
		if (pagChild.type == "button") {
			if (results.length >= settings.maxResults) {
				console.log("Result limit reached.");
			} else if (additionalLoadCount > settings.maxResults / cImagesPerLoad) {
				console.log("Safety additional load limit reached");
			} else if (isViewSupported()) {
				console.log("loading more results");
				pagChild.click();
				additionalLoadCount += 1;
			}
			break;
		}
	}
}

function getResultId(result) {
	return result.querySelector("[data-asset-id]").getAttribute("data-asset-id");
}

function getNumRatings(result) {
	var ratings = result.querySelector(".RatingStars-count");
	if (!ratings)
		return 0;
	return Number(result.querySelector(".RatingStars-count").textContent.match(/\d+/));
}

function getStarRating(result) {
	var stars = result.querySelector(".RatingStars");
	if (!stars)
		return 0;
	return Number(stars.querySelector("[class=is-visuallyHidden]").textContent.match(/\d+/));
}

function getCheckboxState(result, checkboxClassName) {
	var checkBox = result.getElementsByClassName(checkboxClassName)[0];
	return checkBox && checkBox.checked;
}

function getAcornRating(result) {
	if (getCheckboxState(result, "favCheck"))
		return 3;
	if (getCheckboxState(result, "goodCheck"))
		return 2;
	return 0;
}

function getAlternateRating(result) { return getCheckboxState(result, "altCheck");} 
function getFunnyRating(result) { return getCheckboxState(result, "funnyCheck");} 
function getStareRating(result) { return getCheckboxState(result, "stareCheck");} 

function getOriginalOrder(result) {
	return resultOrigOrder[getResultId(result)];
}

const cEncodedIcon = 'data:image/png;base64,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'
var iconStyles = new Set();

function createAcornizerIconElement(size)
{
	if (!iconStyles[size]) {
		iconStyles.add(size);
		const iconStyle = document.createElement('style')
		iconStyle.textContent = `
		span.acornizer-icon-${size}::before {
			background-image: url("${cEncodedIcon}");
			content: "";
			background-repeat: no-repeat;
			background-size: ${size}px ${size}px;
			width: ${size}px;
			height: ${size}px;
			margin-right: 2px;
			display: inline-block;
		}`;
		document.head.appendChild(iconStyle);
	}

	var span = document.createElement("span");
	span.classList.add(`acornizer-icon-${size}`);
	return span;
}

function readNewCards() {
	var resultItems = document.getElementsByClassName("ResultsGrid-card");
	var gotNewResult = false;
	var cardOrder = 1;
	for (var result of resultItems) {
		const resultId = getResultId(result);
		if (!resultIds.has(resultId))
		{
			resultOrigOrder[resultId] = cardOrder;
			
			gotNewResult = true;
			//console.log("num ratings " + getNumRatings(result));
			//console.log("rating " + getStarRating(result));
			resultIds.add(resultId);
			// NOTE: cloning breaks site code. Have to manipulate in place.
			results.push(result);
			
			// add acornizer controls
			var capDiv = result.getElementsByClassName("ResultsGrid-caption")[0];
			if (capDiv.getElementsByClassName("favDiv").length == 0) {
				// add fav div
				var userDiv = capDiv.getElementsByClassName("userDateLoc")[0];
				var favDiv = document.createElement("div");
				favDiv.classList.add("favDiv");
				capDiv.insertBefore(favDiv, userDiv);
				
				favDiv.appendChild(createAcornizerIconElement(20));
				
				var favCheck = document.createElement("input");
				favCheck.classList.add("favCheck");
				favCheck.setAttribute("type", "checkbox");
				favCheck.checked = favorites.has(resultId);
				favCheck.addEventListener("change", (e) => {
					if (e.target.checked) {
						favorites.add(resultId);
						goods.delete(resultId);
						alternates.delete(resultId);
						e.target.parentElement.getElementsByClassName("goodCheck")[0].checked = false;
						e.target.parentElement.getElementsByClassName("altCheck")[0].checked = false;
					} else {
						favorites.delete(resultId);
					}
					saveFavorites();
					updateOrdering();
					});
				favDiv.appendChild(favCheck);
				favDiv.appendChild(document.createTextNode("Favorite "));
				
				var goodCheck = document.createElement("input");
				goodCheck.classList.add("goodCheck");
				goodCheck.setAttribute("type", "checkbox");
				goodCheck.checked = goods.has(resultId);
				goodCheck.addEventListener("change", (e) => {
					if (e.target.checked) {
						goods.add(resultId);
						favorites.delete(resultId);
						alternates.delete(resultId);
						e.target.parentElement.getElementsByClassName("favCheck")[0].checked = false;
						e.target.parentElement.getElementsByClassName("altCheck")[0].checked = false;
					} else {
						goods.delete(resultId);
					}
					saveFavorites();
					updateOrdering();
					});
				favDiv.appendChild(goodCheck);
				favDiv.appendChild(document.createTextNode("Good "));
				
				var altCheck = document.createElement("input");
				altCheck.classList.add("altCheck");
				altCheck.setAttribute("type", "checkbox");
				altCheck.checked = alternates.has(resultId);
				altCheck.addEventListener("change", (e) => {
					if (e.target.checked) {
						alternates.add(resultId);
						goods.delete(resultId);
						favorites.delete(resultId);
						e.target.parentElement.getElementsByClassName("goodCheck")[0].checked = false;
						e.target.parentElement.getElementsByClassName("favCheck")[0].checked = false;
					} else {
						alternates.delete(resultId);
					}
					saveFavorites();
					updateOrdering();
					});
				favDiv.appendChild(altCheck);
				favDiv.appendChild(document.createTextNode("Alternate "));
				
				var funnyCheck = document.createElement("input");
				funnyCheck.classList.add("funnyCheck");
				funnyCheck.setAttribute("type", "checkbox");
				funnyCheck.checked = funnies.has(resultId);
				funnyCheck.addEventListener("change", (e) => {
					if (e.target.checked) {
						funnies.add(resultId);
					} else {
						funnies.delete(resultId);
					}
					saveFavorites();
					updateOrdering();
					});
				favDiv.appendChild(document.createTextNode(" | "));
				favDiv.appendChild(funnyCheck);
				favDiv.appendChild(document.createTextNode("Funny "));
				
				var stareCheck = document.createElement("input");
				stareCheck.classList.add("stareCheck");
				stareCheck.setAttribute("type", "checkbox");
				stareCheck.checked = stares.has(resultId);
				stareCheck.addEventListener("change", (e) => {
					if (e.target.checked) {
						stares.add(resultId);
					} else {
						stares.delete(resultId);
					}
					saveFavorites();
					updateOrdering();
					});
				favDiv.appendChild(stareCheck);
				favDiv.appendChild(document.createTextNode("Staring"));
				
				// add image url
				var modifiedLibraryDiv = document.createElement("div");
				modifiedLibraryDiv.style = "display: flex; justify-content: space-between";
				var libraryAnchor = capDiv.lastChild;
				capDiv.appendChild(modifiedLibraryDiv);
				modifiedLibraryDiv.appendChild(libraryAnchor);
				var customLibraryDiv = document.createElement("div");
				customLibraryDiv.appendChild(createAcornizerIconElement(18));
				var libraryImageUrl = document.createElement("a");
				libraryImageUrl.href = `https://cdn.download.ams.birds.cornell.edu/api/v2/asset/${resultId}/2400`;
				libraryImageUrl.target = "_blank";
				libraryImageUrl.innerText = "Image Link";
				customLibraryDiv.appendChild(libraryImageUrl);
				modifiedLibraryDiv.appendChild(customLibraryDiv);
				
				// add average rating (query api)
				try {
					// for result item
					var modifiedRatingDiv = document.createElement("div");
					modifiedRatingDiv.style = "display: flex; justify-content: space-between";
					capDiv.insertBefore(modifiedRatingDiv, userDiv);
					var ratingAnchor = capDiv.getElementsByClassName("RatingStars")[0];
					modifiedRatingDiv.appendChild(ratingAnchor);
					var customRatingDiv = document.createElement("div");
					customRatingDiv.style = "display: flex";
					customRatingDiv.appendChild(createAcornizerIconElement(18));
					var avgRatingDiv = document.createElement("div");
					avgRatingDiv.id = `avg${resultId}`;
					avgRatingDiv.innerHTML = 'Avg: (loading...)';
					customRatingDiv.appendChild(avgRatingDiv);
					modifiedRatingDiv.appendChild(customRatingDiv);
					
					fetch(`https://media.ebird.org/internal/v1/get-rating/${resultId}`)
						.then(r => {
							if (r.ok) {
								return r.json();
							}
							throw new Error('rating query failed');
						})
						.then(data => {
							var ratingDivToUpdate = document.getElementById(`avg${resultId}`);
							var resultRatings = data[resultId];
							avgRatingTxt = 'Avg: ' + parseFloat(resultRatings.ratingAverage.toFixed(3)).toString();
							myRatingTxt = '';
							if ("myRating" in resultRatings && resultRatings.myRating > 0) {
								myRatingTxt = "My: " + resultRatings.myRating.toString();
							}
							ratingDivToUpdate.innerHTML = myRatingTxt + " | " + avgRatingTxt;
						})
						.catch(err => {
							console.error('rating query failed');
						});
				} catch (e) {
					// ignoring missing ratings, etc
				}
			}
		}
		cardOrder += 1;
	}
	return gotNewResult;
}

function acornSorted() {
	return results.sort(function(a, b) {
		if (settings.sortByFunny)
		{
			let aa = getFunnyRating(a);
			let ba = getFunnyRating(b);
			if (aa > ba)
				return -1;
			if (aa < ba)
				return 1;
		}
		if (settings.sortByStare)
		{
			let aa = getStareRating(a);
			let ba = getStareRating(b);
			if (aa > ba)
				return -1;
			if (aa < ba)
				return 1;
		}
		if (settings.sortByFavorites)
		{
			let aa = getAcornRating(a);
			let ba = getAcornRating(b);
			if (aa > ba)
				return -1;
			if (aa < ba)
				return 1;
		}
		if (settings.sortByAlternates)
		{
			let aa = getAlternateRating(a);
			let ba = getAlternateRating(b);
			if (aa > ba)
				return -1;
			if (aa < ba)
				return 1;
		}
		if (settings.sortByNumRatings)
		{
			let ar = getNumRatings(a);
			let br = getNumRatings(b);
			if (ar > br)
				return -1;
			if (ar < br)
				return 1;
		}
		let as = getOriginalOrder(a);
		let bs = getOriginalOrder(b);
		if (as < bs)
			return -1;
		if (as > bs)
			return 1;
		console.log("oops?");
		return 0;
	});
}

function applyOrdering(containerElem, orderedElems) {
	for (var elem of orderedElems.toReversed()) {
		containerElem.insertBefore(elem, containerElem.firstChild);
	}
}

function updateOrdering() {
	console.log("reordering");
	// rebuild results grid from saved results
	var resultsGrid = document.getElementsByClassName("ResultsGrid")[0];
	applyOrdering(resultsGrid, acornSorted());
}

function applyAcorns() {
	if (!readNewCards())
		return;
	
	console.log("# results: " + results.length);
	
	updateOrdering();
}

var resultsObserver = null;

function observeResults() {
	if (!resultsObserver) {
		resultsObserver = new MutationObserver(function(mutations) {
			mutations.forEach(function(mutation) {
				for (var addedNode of mutation.addedNodes) {
					applyAcorns();
					if (addedNode.type == "li") {
						applyAcorns();
					}
				}
			})
		});
		var resultsGrid = document.getElementsByClassName("ResultsGrid")[0];
		resultsObserver.observe(resultsGrid, { childList: true });
	}
}

function processSearchResults() {
	if (!isViewSupported())
		return;
	observeResults();
	applyAcorns();
	loadMoreResults();
}

function refreshView() {
	if (!isViewSupported())
		return;
	clearResults();
	processSearchResults();
	updateOrdering();
}

var wasViewSupported = isViewSupported();
function observePageChanges() {
	var pagination = document.getElementsByClassName("pagination")[0];
	var paginationObserver = new MutationObserver(function(mutations) {
			mutations.forEach(function(mutation) {
				for (var addedNode of mutation.addedNodes) {
					if (addedNode.type == "button") {
						if (!isViewSupported())
							return;
						loadMoreResults();
					}
				}
			})
		});
	paginationObserver.observe(pagination, { childList: true });
	
	var viewObserver = new MutationObserver(function(mutations) {
			if (wasViewSupported != isViewSupported())
			{
				console.log("view change");
				if (isViewSupported()) {
					refreshView();
				}
				addSettings();
			}
			wasViewSupported = isViewSupported();
		});
	viewObserver.observe(document, { childList: true, subtree: true });

	function observeFilterElement(element, observeAttributes = false) {
		//console.log("observing " + element.textContent);
		var filterSpanObserver = new MutationObserver(function (mutations) {
			console.log("filter change");
			clearResults();
			loadMoreResults();
		});
		filterSpanObserver.observe(element, { 
			characterData: true, attributes: observeAttributes, childList: false, subtree: true
		});
		filterSpanObservers.push(filterSpanObserver);
	}

	var activeFiltersDiv = document.getElementsByClassName("ActiveFilters")[0];
	var filterSpanObservers = [];
	var filterObserver = new MutationObserver(function(mutations) {
			console.log("resetting results");
			
			for (var mutation of mutations) {
				for (var addedNode of mutation.addedNodes) {
					for (var span of addedNode.getElementsByTagName("span")) {
						observeFilterElement(span);
					}
				}
			}
			
			clearResults();
			loadMoreResults();
		});
	filterObserver.observe(activeFiltersDiv, { childList: true, subtree: true });
	for (let span of activeFiltersDiv.getElementsByTagName("span")) {
		observeFilterElement(span);
	}

	var filtersDiv = document.getElementsByClassName("filters")[0];
	var currentSortDiv = filtersDiv.getElementsByClassName("filterSection--last")[0];
	for (let span of currentSortDiv.getElementsByTagName("span")) {
		observeFilterElement(span);
	}

	// update when switching media type (birds vs habitats etc)
	var tabsDiv = document.getElementsByClassName("tabs")[0];
	for (let button of tabsDiv.getElementsByTagName("button")) {
		observeFilterElement(button, true);
	}
}

function addSettings()
{
	var existingSettingsDiv = document.getElementById("settingsDiv");
	if (existingSettingsDiv)
		existingSettingsDiv.parentElement.removeChild(existingSettingsDiv);
	
	var resultsGrid = document.getElementsByClassName("ResultsGrid");
	if (resultsGrid.length == 0)
		return;
	resultsGrid = resultsGrid[0];
	
	var settingsDiv = document.createElement("div");
	settingsDiv.id = "settingsDiv";
	resultsGrid.parentElement.insertBefore(settingsDiv, resultsGrid);
	
	var maxResultsInput = document.createElement("input");
	maxResultsInput.setAttribute("type", "number");
	maxResultsInput.id = "maxResultsInput";
	maxResultsInput.min = 1;
	maxResultsInput.max = cMaxAutoLoad;
	maxResultsInput.value = settings.maxResults;
	maxResultsInput.addEventListener("change", (e) => {
		var input = document.getElementById("maxResultsInput");
		input.value = Math.min(input.max, Math.max(input.min, input.value));
		updateSettings().then(loadMoreResults);
	});
	
	settingsDiv.appendChild(createAcornizerIconElement(25));
	settingsDiv.appendChild(document.createTextNode("Auto-Load Results: "));
	settingsDiv.appendChild(maxResultsInput);
	
	settingsDiv.appendChild(document.createTextNode(" "));
	
	var favSortCheck = document.createElement("input");
	favSortCheck.id = "favSortCheck";
	favSortCheck.setAttribute("type", "checkbox");
	favSortCheck.checked = settings.sortByFavorites;
	favSortCheck.addEventListener("change", () => {
		updateSettings().then(updateOrdering);
		});
	settingsDiv.appendChild(document.createTextNode("Sort by "));
	settingsDiv.appendChild(favSortCheck);
	settingsDiv.appendChild(document.createTextNode(" Favorites"));
	
	var altSortCheck = document.createElement("input");
	altSortCheck.id = "altSortCheck";
	altSortCheck.setAttribute("type", "checkbox");
	altSortCheck.checked = settings.sortByAlternates;
	altSortCheck.addEventListener("change", () => {
		updateSettings().then(updateOrdering);
		});
	settingsDiv.appendChild(document.createTextNode(", then by "));
	settingsDiv.appendChild(altSortCheck);
	settingsDiv.appendChild(document.createTextNode(" Alternates"));
	
	var ratingCountSortCheck = document.createElement("input");
	ratingCountSortCheck.id = "numRatingsSortCheck";
	ratingCountSortCheck.setAttribute("type", "checkbox");
	ratingCountSortCheck.checked = settings.sortByNumRatings;
	ratingCountSortCheck.addEventListener("change", () => {
		updateSettings().then(updateOrdering);
		});
	settingsDiv.appendChild(document.createTextNode(", then by "));
	settingsDiv.appendChild(ratingCountSortCheck);
	settingsDiv.appendChild(document.createTextNode(" # of ratings"));
	
	settingsDiv.appendChild(document.createTextNode(". Show on top: "));
	
	var funnySortcheck = document.createElement("input");
	funnySortcheck.id = "funnySortCheck";
	funnySortcheck.setAttribute("type", "checkbox");
	funnySortcheck.checked = settings.sortByFunny;
	funnySortcheck.addEventListener("change", (e) => {
		if (e.target.checked) {
			document.getElementById("stareSortCheck").checked = false;
		}
		updateSettings().then(updateOrdering);
		});
	settingsDiv.appendChild(funnySortcheck);
	settingsDiv.appendChild(document.createTextNode(" Funny"));
	
	var stareSortCheck = document.createElement("input");
	stareSortCheck.id = "stareSortCheck";
	stareSortCheck.setAttribute("type", "checkbox");
	stareSortCheck.checked = settings.sortByStare;
	stareSortCheck.addEventListener("change", (e) => {
		if (e.target.checked) {
			document.getElementById("funnySortCheck").checked = false;
		}
		updateSettings().then(updateOrdering);
		});
	settingsDiv.appendChild(document.createTextNode(", or "));
	settingsDiv.appendChild(stareSortCheck);
	settingsDiv.appendChild(document.createTextNode(" Staring."));
}

async function updateSettings()
{
	await readSettings();
	settings.maxResults = document.getElementById("maxResultsInput").value;
	settings.sortByFavorites = document.getElementById("favSortCheck").checked;
	settings.sortByAlternates = document.getElementById("altSortCheck").checked;
	settings.sortByNumRatings = document.getElementById("numRatingsSortCheck").checked;
	settings.sortByFunny = document.getElementById("funnySortCheck").checked;
	settings.sortByStare = document.getElementById("stareSortCheck").checked;
	await saveSettings();
}

function acornize() {
	processSearchResults();
	observePageChanges();
	addSettings();
}

function displayRatingsOnAssetPage() {
	var assetId = window.location.href.split("/asset/")[1].split("/")[0];
	var ratingDiv = document.getElementsByClassName("Rating")[0];
	var customRatingDiv = document.createElement("div");
	customRatingDiv.appendChild(createAcornizerIconElement(20));
	customRatingDiv.style = "display: flex; justify-content: space-between; margin-right: 4rem;";
	var avgRatingDiv = document.createElement("div");
	avgRatingDiv.id = "avgRating";
	avgRatingDiv.innerHTML = 'Avg: (loading...)';
	customRatingDiv.appendChild(avgRatingDiv);
	ratingDiv.insertBefore(customRatingDiv, ratingDiv.firstChild);

	fetch(`https://macaulaylibrary.org/internal/v1/get-rating/${assetId}`)
		.then(r => {
			if (r.ok) {
				return r.json();
			}
			throw new Error('rating query failed');
		})
		.then(data => {
			var ratingDivToUpdate = document.getElementById("avgRating");
			var resultRatings = data[assetId];
			var avgText = 'None';
			if (resultRatings.ratingAverage > 0) {
				avgText = parseFloat(resultRatings.ratingAverage.toFixed(3)).toString();
			}
			ratingDivToUpdate.innerHTML = 'Avg: ' + avgText;
		})
		.catch(err => {
			console.error('rating query failed');
		});
}

window.onload = function() {
	if (window.location.href.includes("media.ebird.org/catalog")) {
    	readStorage().then(() => acornize());
	} else if (window.location.href.includes("macaulaylibrary.org/asset/")) {
		displayRatingsOnAssetPage();
	}
};