export function md5(input) { function safeAdd(x,y){var l=(x&0xffff)+(y&0xffff);return((x>>16)+(y>>16)+(l>>16)<<16)|(l&0xffff)} function rol(n,c){return(n<>>32-c)} function cmn(q,a,b,x,s,t){return safeAdd(rol(safeAdd(safeAdd(a,q),safeAdd(x,t)),s),b)} function ff(a,b,c,d,x,s,t){return cmn((b&c)|(~b&d),a,b,x,s,t)} function gg(a,b,c,d,x,s,t){return cmn((b&d)|(c&~d),a,b,x,s,t)} function hh(a,b,c,d,x,s,t){return cmn(b^c^d,a,b,x,s,t)} function ii(a,b,c,d,x,s,t){return cmn(c^(b|~d),a,b,x,s,t)} var l=input.length,m=[]; for(var i=0;i>2]|=(input.charCodeAt(i)&0xff)<<((i%4)*8); m[l>>2]|=0x80<<((l%4)*8); m[((l+8>>6)+1)*16-2]=l*8; var a=1732584193,b=-271733879,c=-1732584194,d=271733878; for(var i=0;i>>(j*8))&0xff).toString(16)).slice(-2);return s} return hex(a)+hex(b)+hex(c)+hex(d); } export function esc(s) { // Coerce to string first — callers sometimes pass numbers (e.g. a Deezer artist id), which // would throw on .replace. null/undefined → ''. return String(s ?? '').replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"'); } export function formatDur(s) { if(!s) return '0:00'; const m = Math.floor(s/60), sec = Math.floor(s%60); return `${m}:${sec.toString().padStart(2,'0')}`; } // Gesamtdauer einer Playlist oder eines Albums. Ab einer Stunde werden Stunden ausgewiesen — // "134 Min." muss man sonst selbst umrechnen, und bei einer Playlist mit 2000 Titeln steht dort // sonst eine vierstellige Minutenzahl. export function formatGesamtdauer(sekunden) { const min = Math.round((sekunden || 0) / 60); if (min < 60) return `${min} Min.`; const std = Math.floor(min / 60); const rest = min % 60; return rest ? `${std} Std. ${rest} Min.` : `${std} Std.`; } // Fan/count formatting in German: full grouped number up to a million (559534 → "559.542"), // then compact millions (1200000 → "1,2 Mio."). export function fmtCount(n) { if (n == null || isNaN(n)) return ''; if (n >= 1e6) return (n / 1e6).toFixed(1).replace(/\.0$/, '').replace('.', ',') + ' Mio.'; return Math.round(n).toLocaleString('de-DE'); } export function toast(msg) { const t = document.createElement('div'); t.className = 'toast'; t.textContent = msg; document.getElementById('toast-container').appendChild(t); setTimeout(() => t.remove(), 3000); }