From 0b17fb1b4bdcb1b12c8090592b96ea20ae363aaa Mon Sep 17 00:00:00 2001 From: edideaur Date: Sat, 7 Mar 2026 10:12:59 +0000 Subject: [PATCH] higher image qualities for unreleased + fallbacks --- js/tracker.js | 52 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/js/tracker.js b/js/tracker.js index 950bd6e..e1e733f 100644 --- a/js/tracker.js +++ b/js/tracker.js @@ -47,7 +47,7 @@ async function loadArtistsPopularity() { async function loadArtistsData() { try { - const response = await fetch('https://sheets.artistgrid.cx/artists.ndjson'); + const response = await fetch('https://assets.artistgrid.cx/artists.ndjson'); if (!response.ok) throw new Error('Network response was not ok'); const text = await response.text(); artistsData = text @@ -89,15 +89,49 @@ function getSheetId(url) { return match ? match[1] : null; } -async function fetchTrackerData(sheetId) { - try { - const response = await fetch(`https://tracker.israeli.ovh/get/${sheetId}`); - if (!response.ok) return null; - return await response.json(); - } catch (e) { - console.error('Failed to fetch tracker data', e); - return null; +function transformImageUrl(url) { + if (!url) return url; + return url.replace('https://s3.sad.ovh/trackerapi/', 'https://r2.artistgrid.cx/'); +} + +function transformErasImages(eras) { + if (!eras) return eras; + for (const eraName in eras) { + const era = eras[eraName]; + if (era.image) { + era.image = transformImageUrl(era.image); + } } + return eras; +} + +async function fetchTrackerData(sheetId) { + const endpoints = [ + 'https://tracker.israeli.ovh/get/', + 'https://tracker.thug.surf/get/', + 'https://trackerapi-2.artistgrid.cx/get/', + ]; + + let lastError = null; + for (const baseUrl of endpoints) { + try { + const response = await fetch(`${baseUrl}${sheetId}`); + if (!response.ok) { + lastError = new Error(`HTTP ${response.status}`); + continue; + } + const data = await response.json(); + if (data.eras) { + transformErasImages(data.eras); + } + return data; + } catch (e) { + lastError = e; + console.warn(`Failed to fetch from ${baseUrl}, trying next...`); + } + } + console.error('Failed to fetch tracker data from all endpoints', lastError); + return null; } function parseDuration(durationStr) {