More Links

(function () { var LB_USER = 'mjrider'; var API = 'https://api.listenbrainz.org/1/user/' + LB_USER; var PROFILE = 'https://listenbrainz.org/user/' + LB_USER + '/'; var REFRESH_MS = 30000; var PLACEHOLDER = "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Crect width='64' height='64' rx='10' fill='%233F7377'/%3E%3Ccircle cx='32' cy='32' r='18' fill='none' stroke='%23FDFDFE' stroke-width='2.5'/%3E%3Ccircle cx='32' cy='32' r='4' fill='%23FDFDFE'/%3E%3C/svg%3E"; var wrap = document.getElementById('lbnp'); var trackLink = document.getElementById('lbnpTrackLink'); var art = document.getElementById('lbnpArt'); art.src = PLACEHOLDER; function trackUrl(l) { var m = l.track_metadata && l.track_metadata.mbid_mapping; return (m && m.recording_mbid) ? ('https://listenbrainz.org/track/' + m.recording_mbid + '/') : PROFILE; } function loadArt(releaseId) { art.onerror = function () { art.onerror = null; art.src = PLACEHOLDER; }; art.src = 'https://coverartarchive.org/release/' + releaseId + '/front-250'; } function mbLookup(artist, release) { if (!artist || !release) return Promise.resolve(null); var esc = function (s) { return s.replace(/"/g, ''); }; var q = 'artist:"' + esc(artist) + '" AND release:"' + esc(release) + '"'; var url = 'https://musicbrainz.org/ws/2/release/?query=' + encodeURIComponent(q) + '&fmt=json&limit=1'; return fetch(url).then(function (r) { return r.ok ? r.json() : null; }).then(function (d) { var m = d && d.releases && d.releases[0]; return (m && m.score >= 90) ? m.id : null; }).catch(function () { return null; }); } function setArt(l) { var tm = l.track_metadata || {}; var m = tm.mbid_mapping; var rid = m && m.release_mbid; if (rid) { loadArt(rid); return; } art.src = PLACEHOLDER; mbLookup(tm.artist_name, tm.release_name).then(function (found) { if (found) loadArt(found); }); } function render(l, isLive) { var tm = l.track_metadata || {}; var track = tm.track_name || 'Unknown track'; var artist = tm.artist_name || 'Unknown artist'; trackLink.textContent = track + ' by ' + artist; trackLink.title = (isLive ? 'Now playing: ' : 'Last played: ') + track + ' by ' + artist; trackLink.href = trackUrl(l); wrap.classList.remove('is-hidden'); setArt(l); } function hide() { wrap.classList.add('is-hidden'); } function get(url) { return fetch(url).then(function (r) { if (!r.ok) throw 0; return r.json(); }); } function refresh() { get(API + '/playing-now').then(function (d) { var p = d.payload || {}; if (p.playing_now && p.listens && p.listens.length) { render(p.listens[0], true); return; } return get(API + '/listens?count=1').then(function (d2) { var ls = (d2.payload && d2.payload.listens) || []; if (!ls.length) { hide(); return; } render(ls[0], false); }); }).catch(hide); } refresh(); if (REFRESH_MS > 0) setInterval(refresh, REFRESH_MS); })();

Drag & drop files here, or browse

Tap to choose files