Help
RSS
API
Feed
Maltego
Contact
Domain > listenmachine.com
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2015-07-22
54.231.162.67
(
ClassC
)
2026-01-10
185.199.111.153
(
ClassC
)
Port 80
HTTP/1.1 301 Moved PermanentlyConnection: keep-aliveContent-Length: 162Server: GitHub.comContent-Type: text/htmlLocation: https://listenmachine.com/X-GitHub-Request-Id: BFE6:C50AE:10A56A3:111CE53:696239EFAccept-Ranges: bytesAge: 0Date: Sat, 10 Jan 2026 11:37:19 GMTVia: 1.1 varnishX-Served-By: cache-bfi-krnt7300023-BFIX-Cache: MISSX-Cache-Hits: 0X-Timer: S1768045040.831537,VS0,VE59Vary: Accept-EncodingX-Fastly-Request-ID: 78d352e89d64c6252993ff0a68629cfa9cfc8dee html>head>title>301 Moved Permanently/title>/head>body>center>h1>301 Moved Permanently/h1>/center>hr>center>nginx/center>/body>/html>
Port 443
HTTP/1.1 200 OKConnection: keep-aliveContent-Length: 25767Server: GitHub.comContent-Type: text/html; charsetutf-8Last-Modified: Thu, 04 Dec 2025 01:05:54 GMTAccess-Control-Allow-Origin: *ETag: 6930de72-64a7expires: Sat, 10 Jan 2026 11:47:19 GMTCache-Control: max-age600x-proxy-cache: MISSX-GitHub-Request-Id: 257C:14AB7F:107A48E:10F1B65:696239EFAccept-Ranges: bytesAge: 0Date: Sat, 10 Jan 2026 11:37:20 GMTVia: 1.1 varnishX-Served-By: cache-bfi-kbfi7400067-BFIX-Cache: MISSX-Cache-Hits: 0X-Timer: S1768045040.935201,VS0,VE73Vary: Accept-EncodingX-Fastly-Request-ID: a49bc680e47b09c0a59c05d22a3b047b32e6e6d9 !doctype html>html langen>head>meta charsetutf-8 />meta nameviewport contentwidthdevice-width, initial-scale1, viewport-fitcover />title>ListenMachine/title>meta namecolor-scheme contentdark light />!-- Preconnects -->link relpreconnect hrefhttps://api.github.com crossorigin>link relpreconnect hrefhttps://raw.githubusercontent.com crossorigin>!-- Preload ONLY the first background so time-to-first-frame is instant -->link relpreload asvideo hrefmedia/Clouds4.mp4?v22 typevideo/mp4 />style> :root{ --ui-alpha: 0.26; --ui-color-live: rgba(255,255,255,var(--ui-alpha)); --ui-color-boot: rgba(255,255,255,0.92); --title-blur: 0px; --title-opacity: 1; --title-fade-ms: 20000ms; --bg-filter: saturate(0.95) contrast(0.96) brightness(1.06) blur(0px); --bg-fade-ms: 20000ms; /* JS will override */ } html, body { height: 100%; } body { margin: 0; background: #000; color: #fff; overflow: hidden; font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif; } .bgvideo{ position: fixed; inset: 0; width: 100%; height: 100%; object-fit: cover; z-index: 0; pointer-events: none; background:#000; filter: var(--bg-filter); opacity: 0; transition: opacity var(--bg-fade-ms) linear; will-change: opacity; contain: paint; backface-visibility: hidden; } .bgvideo.show{ opacity: 1; } .fadeLayer{ position: fixed; inset: 0; width: 100vw; height: 100vh; z-index: 1; pointer-events: none; opacity: 0; /* fade OUT to reveal next video */ transition: opacity var(--bg-fade-ms) linear; will-change: opacity; contain: paint; } .title-wrap{ position: fixed; top: clamp(12px, 8vh, 96px); left: 50%; transform: translateX(-50%); width: min(92vw, 1200px); z-index: 2; text-align: center; pointer-events: none; padding-inline: 2vw; isolation: isolate; } #title{ margin: 0; text-transform: uppercase; white-space: nowrap; letter-spacing: 0.18em; font-weight: 700; line-height: 1.06; color: var(--ui-color-boot); user-select: none; font-size: 8vw; will-change: font-size, filter, opacity; mix-blend-mode: normal; filter: blur(var(--title-blur)); opacity: var(--title-opacity); transition: filter var(--title-fade-ms) linear, opacity var(--title-fade-ms) linear, color 200ms ease; } body.bg-live #title{ color: var(--ui-color-live); mix-blend-mode: soft-light; } .uibtn{ position: fixed; left: 50%; top: 50%; transform: translate(-50%,-50%); z-index: 3; display: inline-flex; align-items: center; justify-content: center; padding: 14px 32px; border: none; outline: none; background: transparent; color: var(--ui-color-boot); text-transform: uppercase; font-weight: 800; letter-spacing: 0.22em; font-size: clamp(12px, 2.6vw, 18px); line-height: 1; cursor: pointer; mix-blend-mode: normal; isolation: isolate; -webkit-tap-highlight-color: transparent; touch-action: manipulation; filter: blur(0px); opacity: 1; transition: filter var(--title-fade-ms) linear, opacity var(--title-fade-ms) linear, color 200ms ease; } body.bg-live .uibtn{ color: var(--ui-color-live); mix-blend-mode: overlay; } .uibtn:focus{ outline: none; } .hidden{ display:none !important; } .fade-out{ filter: blur(30px); opacity: 0; } @media (prefers-reduced-motion: reduce){ .bgvideo{ transition: none; } .uibtn{ transition: none; } #title{ transition: none; } .fadeLayer{ transition: none; } } @media (pointer: coarse), (max-width: 820px){ :root{ --bg-filter: none; } }/style>/head>body>!-- Background videos -->video idbgA classbgvideo show muted loop playsinline autoplay preloadauto srcmedia/Clouds4.mp4?v22>/video>video idbgB classbgvideo muted loop playsinline preloadmetadata srcmedia/Nightsky.mp4?v22>/video>video idbgC classbgvideo muted loop playsinline preloadmetadata srcmedia/Road2.mp4?v22>/video>video idbgD classbgvideo muted loop playsinline preloadmetadata srcmedia/Forest.mp4?v22>/video>video idbgE classbgvideo muted loop playsinline preloadmetadata srcmedia/Snow3.mp4?v22>/video>!-- Snapshot fade layer -->canvas idfadeLayer classfadeLayer aria-hiddentrue>/canvas>!-- Title -->div classtitle-wrap> h1 idtitle>LISTENMACHINE/h1>/div>!-- Play -->button idplay classuibtn typebutton aria-labelPlay>PLAY/button>!-- Audio sinks -->audio idsink preloadauto playsinline>/audio>audio idambEl preloadauto playsinline>/audio>!-- Hard fallback element (only used if WebAudio fails) -->audio idfallbackAudio preloadauto playsinline classhidden>/audio>script> // Base platform flags (incl. Brave) window.LM window.LM || {}; window.LM.IS_MOBILE /Mobi|Android|iPhone|iPad/i.test(navigator.userAgent); window.LM.IS_IOS /iPad|iPhone|iPod/.test(navigator.userAgent); window.LM.IS_ANDROID /Android/i.test(navigator.userAgent); window.LM.IS_SAFARI /^((?!chrome|android).)*safari/i.test(navigator.userAgent); window.LM.IS_BRAVE !!navigator.brave;/script>script>/* Dynamic BG configuration (long mobile fade; no lag) */(() > { const IS_MOBILE window.LM.IS_MOBILE; const conn navigator.connection || {}; const saveData (conn && conn.saveData) || false; const veryLowNet /^(2g|3g)$/i.test(conn.effectiveType || ); const mobileLite IS_MOBILE && (saveData || veryLowNet); const BG { displayMs: IS_MOBILE ? 9000 : 5000, fadeMs: 0, firstHoldAfterClickMs: 15000 }; const root document.documentElement; if (mobileLite) { BG.fadeMs 0; BG.displayMs 12000; root.style.setProperty(--bg-fade-ms, 0ms); } else { const MOBILE_SLOW_FADE_MS 12000; // bump to 20000 if you want even slower const DESKTOP_FADE_MS 55000; const ms IS_MOBILE ? MOBILE_SLOW_FADE_MS : DESKTOP_FADE_MS; BG.fadeMs ms; root.style.setProperty(--bg-fade-ms, ms + ms); } window.__LM_CONF { BG, mobileLite, connType: conn.effectiveType || };})();/script>script>/* -------- Auto-fit title to ONE line -------- */(() > { const title document.getElementById(title); function fit(){ const container title.parentElement; const maxWidth container.clientWidth; let size Math.min(window.innerWidth * 0.08, window.innerHeight * 0.18, 110); title.style.fontSize size + px; let safety 80; while (title.scrollWidth > (maxWidth - 1.5) && safety-- > 0){ size * 0.965; title.style.fontSize size + px; } } addEventListener(resize, fit, {passive:true}); addEventListener(orientationchange, fit, {passive:true}); addEventListener(load, fit); setTimeout(fit, 0);})();/script>script>/* BACKGROUND LOOP */(() > { const CONF window.__LM_CONF || {}; const BG CONF.BG || { displayMs: window.LM.IS_MOBILE ? 9000 : 5000, fadeMs: window.LM.IS_MOBILE ? 12000 : 55000, firstHoldAfterClickMs: 15000 }; const mobileLite !!CONF.mobileLite; const conn navigator.connection || {}; const cores navigator.hardwareConcurrency || 4; const isLowishDesktop (!window.LM.IS_MOBILE) && (cores 4 || /^(2g|3g)$/i.test(conn.effectiveType||)); if (isLowishDesktop) { document.documentElement.style.setProperty(--bg-filter, none); } const vids bgA,bgB,bgC,bgD,bgE.map(id > document.getElementById(id)); let i 0; let loopStarted false; const USE_SNAPSHOT_FADE window.LM.IS_MOBILE && BG.fadeMs > 0 && !mobileLite; const fadeCanvas document.getElementById(fadeLayer); const fctx fadeCanvas.getContext(2d, {alpha: false, desynchronized: true}); function drawVideoCover(canvas, ctx, video){ const dpr Math.min(window.devicePixelRatio || 1, window.LM.IS_MOBILE ? 1.5 : 2); const w Math.floor(window.innerWidth * dpr); const h Math.floor(window.innerHeight * dpr); if (canvas.width ! w || canvas.height ! h){ canvas.width w; canvas.height h; canvas.style.width 100vw; canvas.style.height 100vh; } const vw video.videoWidth || 1920; const vh video.videoHeight || 1080; if (!vw || !vh) { ctx.fillStyle#000; ctx.fillRect(0,0,w,h); return; } const scale Math.max(w / vw, h / vh); const dw vw * scale, dh vh * scale; const dx (w - dw) / 2, dy (h - dh) / 2; ctx.drawImage(video, dx, dy, dw, dh); } function playOnly(idx){ vids.forEach((v,k)>{ try{ kidx ? v.play() : v.pause(); }catch(e){} }); } function playOnlyCurrentAndNext(idx){ const nextIdx (idx + 1) % vids.length; vids.forEach((v, k) > { try { (k idx || (BG.fadeMs>0 && !USE_SNAPSHOT_FADE && k nextIdx)) ? v.play() : v.pause(); } catch(e){} }); } function warmNext(next){ try { if (next.preload ! auto) next.preload auto; next.load(); } catch(e){} } function microSeek(v){ try{ v.currentTime Math.max(0, (v.currentTime||0) + 0.033); v.play().catch(()>{});}catch{} } function pausePlay(v){ try{ v.pause(); v.play().catch(()>{});}catch{} } function hardRefreshVideo(v){ try{ const wasShowing v.classList.contains(show); v.classList.remove(show); v.load(); if (wasShowing){ setTimeout(()>{ v.classList.add(show); v.play().catch(()>{}); }, 50); } }catch{} } function wakeVideos(){ const cur vidsi, nxt vids(i + 1) % vids.length; cur, nxt.forEach(v > { microSeek(v); }); setTimeout(() > { cur, nxt.forEach(v > { try{ const t0 v._lm_t0 ?? 0, t1 v.currentTime; if (t1 t0){ pausePlay(v); } v._lm_t0 t1; setTimeout(() > { if (v.currentTime v._lm_t0){ hardRefreshVideo(v); } }, 800); }catch{} }); }, 400); } function waitPresented(video, timeoutMs 140){ return new Promise(res > { const hasRVFC typeof video.requestVideoFrameCallback function; let settled false, to null, cancel null; const done () > { if (settled) return; settled true; if (to) clearTimeout(to); if (cancel) try{ cancel(); }catch{} res(); }; if (hasRVFC){ const id video.requestVideoFrameCallback(() > done()); cancel () > { try{ video.cancelVideoFrameCallback(id); }catch{} }; } else if (video.readyState > 2){ done(); } else { const onCan () > { video.removeEventListener(canplay, onCan); done(); }; video.addEventListener(canplay, onCan, { once:true }); cancel () > { try{ video.removeEventListener(canplay, onCan); }catch{} }; } to setTimeout(done, timeoutMs); }); } function crossfade(){ const cur vidsi; const nextIdx (i + 1) % vids.length; const next vidsnextIdx; warmNext(next); if (USE_SNAPSHOT_FADE){ vids.forEach((v,k)>v.classList.toggle(show, knextIdx)); try { next.play(); } catch(_e){} microSeek(next); waitPresented(next).then(() > { try { drawVideoCover(fadeCanvas, fctx, cur); } catch(_e){} fadeCanvas.style.transition `opacity ${BG.fadeMs}ms linear`; fadeCanvas.style.opacity 1; void fadeCanvas.offsetHeight; getComputedStyle(fadeCanvas).opacity; requestAnimationFrame(() > { requestAnimationFrame(() > { fadeCanvas.style.opacity 0; try { cur.pause(); } catch(_e){} }); }); setTimeout(() > { try { fctx.clearRect(0,0,fadeCanvas.width, fadeCanvas.height); } catch(_e){} }, BG.fadeMs + 120); }); } else if (BG.fadeMs > 0){ try { next.play(); } catch(_e){} next.classList.add(show); cur.classList.remove(show); } else { vids.forEach((v,k)>v.classList.toggle(show, knextIdx)); try { next.play(); } catch(_e){} try { cur.pause(); } catch(_e){} } const prevIdx i; i nextIdx; setTimeout(() > { try{ vidsprevIdx.pause(); }catch(_e){} playOnlyCurrentAndNext(i); }, BG.fadeMs + 40); setTimeout(crossfade, BG.displayMs + BG.fadeMs); } function startLoop(initialDelay){ if (loopStarted) return; loopStarted true; playOnlyCurrentAndNext(i); setTimeout(crossfade, initialDelay); } const playBtn document.getElementById(play); playOnly(0); vids.forEach(v > v.addEventListener(playing, () > document.body.classList.add(bg-live), { once: true })); if (playBtn) playBtn.addEventListener(click, () > startLoop(BG.firstHoldAfterClickMs), { once: true }); document.addEventListener(visibilitychange, () > { if (!document.hidden) { if (loopStarted){ vids.forEach((v, k) > v.classList.toggle(show, k i)); playOnlyCurrentAndNext(i); wakeVideos(); } else { vids.forEach((v, k) > v.classList.toggle(show, k 0)); playOnly(0); wakeVideos(); } } }, {passive:true});})();/script>!-- AUDIO -->script>(() > {/* Platform-aware audio routing */const IS_IOS window.LM.IS_IOS;const AUDIO_LATENCY_HINT IS_IOS ? playback : interactive;const AUDIO_SAMPLE_RATE IS_IOS ? undefined : 48000;const conn navigator.connection || {};const HW Math.max(navigator.hardwareConcurrency || 4, 4);const IS_LOW window.LM.IS_MOBILE && (conn.saveData || /^(2g|3g)$/i.test(conn.effectiveType || ) || HW 4);/* Tunables */const AUDIO_V 55;const MAX_MSG 154;/* Make the first sound quickly so its obvious its working */const MSG_DELAY_MS 0;/* Messages */const messages Array.from({length: MAX_MSG}, (_, i) > `audio/messages/${i+1}.mp3`);const withV url > url + (url.includes(?) ? & : ?) + v + AUDIO_V;/* Elements */const playBtn document.getElementById(play);const sinkEl document.getElementById(sink);const ambEl document.getElementById(ambEl);const fbEl document.getElementById(fallbackAudio);sinkEl.playsInline true;sinkEl.muted false;fbEl.playsInline true;/* Web Audio graph */let ctx null, masterGain null, ambGain null, msgGain null;let mediaDest null, directOut null;/* Decks & caches */let msgDeck , ambDeck , ambient ;const AB_LIMIT IS_LOW ? 4 : 12;const msgABCache new Map();const msgBufCache new Map();const abPending new Map();const bufPending new Map();const NET_SLOW /^(2g|3g)$/i.test((conn && conn.effectiveType) || );const FETCH_TIMEOUT_MS NET_SLOW ? 70000 : 45000;const DECODE_TIMEOUT_MS 20000;/* Helpers */function shuffle(a){ const ra.slice(); for(let ir.length-1;i>0;i--){const jMath.floor(Math.random()*(i+1)); ri,rjrj,ri;} return r; }async function fetchAB(url, timeoutMs FETCH_TIMEOUT_MS){ const u withV(url); const ctrl new AbortController(); const t setTimeout(() > ctrl.abort(), timeoutMs); try{ const res await fetch(u, {mode:cors, cache:default, signal: ctrl.signal}); if (!res.ok) throw new Error(HTTP +res.status); return await res.arrayBuffer(); } finally { clearTimeout(t); }}function getAB(url, timeoutMs FETCH_TIMEOUT_MS){ if (msgABCache.has(url)) return Promise.resolve(msgABCache.get(url)); if (abPending.has(url)) return abPending.get(url); const p fetchAB(url, timeoutMs).then(ab > { if (msgABCache.size > AB_LIMIT){ const first msgABCache.keys().next().value; msgABCache.delete(first); } msgABCache.set(url, ab); abPending.delete(url); return ab; }).catch(e > { abPending.delete(url); throw e; }); abPending.set(url, p); return p;}function decodeAB(ab, timeoutMs DECODE_TIMEOUT_MS){ return new Promise((resolve, reject) > { let donefalse; const tosetTimeout(()>{ if(!done) reject(new Error(decode timeout)); }, timeoutMs); const copy ab.slice(0); ctx.decodeAudioData(copy, b>{ donetrue; clearTimeout(to); resolve(b); }, e>{ donetrue; clearTimeout(to); reject(e); }); });}async function getDecoded(url, timeoutMs DECODE_TIMEOUT_MS){ if (msgBufCache.has(url)) return msgBufCache.get(url); if (bufPending.has(url)) return bufPending.get(url); const p (async () > { const ab await getAB(url, timeoutMs); return decodeAB(ab, timeoutMs); })().then(buf > { msgBufCache.set(url, buf); return buf; }) .catch(e > { throw e; }) .finally(()> bufPending.delete(url)); bufPending.set(url, p); return p;}/* Scheduler */let msgScheduleTime 0;let scheduledUrls ;let schedulingPaused false;function scheduleMessages(){ if (!ctx) return; const now ctx.currentTime; let picksThisPass 6; while (msgDeck.length && picksThisPass-- > 0){ const readyIdx msgDeck.findIndex(u > msgBufCache.has(u)); if (readyIdx -1) break; const nextUrl msgDeck.splice(readyIdx, 1)0; const buf msgBufCache.get(nextUrl); if (!buf) continue; const earliest now + (IS_LOW ? 0.6 : 0.2); const startAt Math.max(msgScheduleTime, earliest); const endAt startAt + buf.duration; scheduledUrls.push(nextUrl); const src ctx.createBufferSource(); src.buffer buf; const g ctx.createGain(); src.connect(g); g.connect(msgGain); const XFADE_SEC IS_LOW ? 0.00 : 0.02; if (XFADE_SEC > 0){ g.gain.setValueAtTime(0, startAt); g.gain.linearRampToValueAtTime(1, startAt + XFADE_SEC); g.gain.setValueAtTime(1, endAt - XFADE_SEC); g.gain.linearRampToValueAtTime(0, endAt); } else { g.gain.setValueAtTime(1, startAt); } try { src.start(startAt); } catch {} msgScheduleTime endAt + 0.01; msgBufCache.delete(nextUrl); }}/* Maintain horizon */const PREFETCH_AHEAD IS_LOW ? 2 : 3;const DECODE_AHEAD IS_LOW ? 1 : 4;function maintainAhead(){ for (let i0; iMath.min(PREFETCH_AHEAD, msgDeck.length); i++){ const url msgDecki; getAB(url).catch(()>{}); } let need DECODE_AHEAD; for (let i0; imsgDeck.length && need>0; i++){ const url msgDecki; if (!scheduledUrls.includes(url) && !msgBufCache.has(url) && !bufPending.has(url)){ getDecoded(url).catch(()>{}); need--; } }}/* Ambient (optional) */let ambNode null;async function playNextAmbientWebAudio(){ if (!ctx || !ambDeck.length) return; const url ambDeck.shift(); try{ const ab await fetchAB(url); const buf await decodeAB(ab); const src ctx.createBufferSource(); src.buffer buf; src.connect(ambGain); src.onended () > { ambNode null; playNextAmbientWebAudio(); }; const startAt Math.max(ctx.currentTime + 0.2, 0); src.start(startAt); ambNode src; }catch(_e){ playNextAmbientWebAudio(); }}function startAmbientWebAudio(){ if (ambient.length){ ambDeck shuffle(ambient); playNextAmbientWebAudio(); } loadAmbientList().then(() > { if (!ambNode && !IS_IOS){ ambDeck shuffle(ambient); playNextAmbientWebAudio(); } }).catch(()>{});}function playNextAmbientHTML(){ if (!ambient.length){ return; } if (!ambDeck.length){ ambDeck shuffle(ambient); } const url withV(ambDeck.shift()); ambEl.src url; ambEl.load(); ambEl.volume 1.0; ambEl.play().catch(()>{});}function startAmbientHTML(){ if (ambient.length){ ambDeck shuffle(ambient); playNextAmbientHTML(); } loadAmbientList().then(() > { if (IS_IOS && ambEl.paused){ ambDeck shuffle(ambient); playNextAmbientHTML(); } }).catch(()>{}); ambEl.onended playNextAmbientHTML; document.addEventListener(visibilitychange, () > { if (document.hidden) { ambEl.play().catch(()>{}); } }, {passive:true});}const GH { owner: listenmachine, repo: listenmachine, path: audio/ambient };const API_URL `https://api.github.com/repos/${GH.owner}/${GH.repo}/contents/${GH.path}`;async function loadAmbientList(){ try{ const r await fetch(API_URL, { headers: { Accept: application/vnd.github+json } }); if (!r.ok) throw new Error(Ambient list HTTP +r.status); const items await r.json(); ambient (Array.isArray(items) ? items : ) .filter(it > it.type file && /\.mp3$/i.test(it.name)) .map(it > it.download_url); }catch(e){ console.warn(Ambient list unavailable:, e); ambient ; }}/* iOS unlock tick */function unlockAudio(ctx, node){ try{ const b ctx.createBuffer(1, 1, 22050); const s ctx.createBufferSource(); s.buffer b; s.connect(node); s.start(0); s.stop(0); s.disconnect(); }catch{}}/* Kickstart: play first track ASAP so user hears sound immediately, but choose it from the shuffled deck so it is random each time. */async function kickstartFirstTrack(){ try{ if (!ctx){ return; } // Ensure we have a shuffled deck if (!msgDeck || !msgDeck.length){ msgDeck shuffle(messages).map(u > u); } // Take the first URL from the shuffled deck const first msgDeck.shift(); if (!first) return; const buf await getDecoded(first, 15000); const now ctx.currentTime + 0.05; const src ctx.createBufferSource(); src.buffer buf; const g ctx.createGain(); src.connect(g); g.connect(msgGain); g.gain.setValueAtTime(0, now); g.gain.linearRampToValueAtTime(1, now + 0.02); src.start(now); msgScheduleTime now + buf.duration + 0.01; }catch(e){ console.warn(Kickstart via WebAudio failed, trying HTMLAudio fallback, e); try{ let fallbackUrl null; if (msgDeck && msgDeck.length){ fallbackUrl msgDeck.shift(); } else { fallbackUrl messagesMath.floor(Math.random() * messages.length); } fbEl.src withV(fallbackUrl); await fbEl.play(); }catch(_e){} }}/* Lifecycle */async function tryResumeAndSchedule(){ if (!ctx) return; if (ctx.state ! running){ try { await ctx.resume(); } catch { return; } } maintainAhead(); scheduleMessages();}document.addEventListener(visibilitychange, tryResumeAndSchedule, {passive:true});window.addEventListener(pageshow, tryResumeAndSchedule, {passive:true});window.addEventListener(focus, tryResumeAndSchedule, {passive:true});/* Start on tap */playBtn.addEventListener(click, async () > { playBtn.disabled true; if (!ctx){ ctx new (window.AudioContext || window.webkitAudioContext)({ latencyHint: AUDIO_LATENCY_HINT, sampleRate: AUDIO_SAMPLE_RATE }); masterGain ctx.createGain(); masterGain.gain.value 1.0; ambGain ctx.createGain(); ambGain.gain.value 1.0; msgGain ctx.createGain(); msgGain.gain.value 0.85; /* Always wire a direct output path first (works everywhere) */ directOut ctx.createGain(); directOut.gain.value 1.0; ambGain.connect(masterGain); msgGain.connect(masterGain); masterGain.connect(directOut); directOut.connect(ctx.destination); try { await ctx.resume(); } catch(e){ console.warn(ctx.resume failed, e); } unlockAudio(ctx, masterGain); // gentle nudge for iOS /* iOS optional MediaStream → audio> path */ if (IS_IOS){ try{ mediaDest ctx.createMediaStreamDestination(); masterGain.connect(mediaDest); sinkEl.srcObject mediaDest.stream; await sinkEl.play(); // pulls the stream; no-op on Android/desktop // Keep direct path too for robustness; if you prefer stream-only, uncomment: // try { masterGain.disconnect(directOut); directOut.disconnect(); } catch {} }catch(e){ console.warn(iOS stream sink failed; staying on direct path, e); } } if (mediaSession in navigator){ try { navigator.mediaSession.metadata new MediaMetadata({ title: ListenMachine }); navigator.mediaSession.playbackState playing; } catch {} } } // Visuals const root document.documentElement; root.style.setProperty(--title-blur, 30px); root.style.setProperty(--title-opacity, 0); if (!document.body.classList.contains(bg-live)){ // Ensure class if a browser delays video> playback document.body.classList.add(bg-live); } // animate out button if (!playBtn.classList.contains(hidden)){ playBtn.classList.add(fade-out); playBtn.addEventListener(transitionend, () > playBtn.classList.add(hidden), { once:true }); } // Build deck and start fetching/decoding msgDeck shuffle(messages).map(u > u); // The first item we play is taken from this deck in kickstartFirstTrack, // so it will not be reused immediately by the scheduler. const maint () > { maintainAhead(); scheduleMessages(); }; maint(); setInterval(maint, 2000); // Start audio immediately with a random first track await kickstartFirstTrack(); // Ambient: HTMLAudio on iOS; WebAudio elsewhere if (IS_IOS){ startAmbientHTML(); } else { startAmbientWebAudio(); } // Keep-alive document.addEventListener(pointerup, () > { ctx?.resume().catch(()>{}); }, {passive:true}); document.addEventListener(visibilitychange, () > { if (document.visibilityState visible) { ctx?.resume().catch(()>{}); } }, {passive:true});}, { once:true });})();/script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]