📻 Yabancı 1 (BASILI TUT SÜRÜKLE)
↻
❌
📻 Yabancı 2 (BASILI TUT SÜRÜKLE)
↻
❌
📻 Yabancı 3 (BASILI TUT SÜRÜKLE)
↻
❌
📻 Yabancı 4 (BASILI TUT SÜRÜKLE)
↻
❌
📻 Yabancı 5 (BASILI TUT SÜRÜKLE)
↻
❌
📻 Yabancı 6 (BASILI TUT SÜRÜKLE)
↻
❌
📻 Yabancı 7 (BASILI TUT SÜRÜKLE)
↻
❌
📻 Yabancı 8 (BASILI TUT SÜRÜKLE)
↻
❌
📻 Yabancı 9 (BASILI TUT SÜRÜKLE)
↻
❌
📻 Yabancı 10 (BASILI TUT SÜRÜKLE)
↻
❌
📻 Yabancı 11 (BASILI TUT SÜRÜKLE)
↻
❌
📻 Yabancı 12 (BASILI TUT
SÜRÜKLE)
↻
❌
📻 Yabancı 13 (BASILI TUT SÜRÜKLE)
↻
❌
📻 Yabancı 14 (BASILI TUT SÜRÜKLE)
↻
❌
📻 Yabancı 15 (BASILI TUT SÜRÜKLE)
↻
❌
📻 Yabancı 16 (BASILI TUT SÜRÜKLE)
↻
❌
📻 Yabancı 17 (BASILI TUT SÜRÜKLE)
↻
❌
📻 Yabancı 18 (BASILI TUT SÜRÜKLE)
↻
❌
📻 Yabancı 19 (BASILI TUT SÜRÜKLE)
↻
❌
📻 Yabancı 20 (ÖZEL SEÇİM SABİT)
↻
❌
📻 Yabancı 21 (BASILI TUT SÜRÜKLE)
↻
❌
📻 Yabancı 22 (BASILI TUT SÜRÜKLE)
↻
❌
// === Debug helpers (safe) ===
const log = (...a)=>console.log('[SV]', ...a);
const warn = (...a)=>console.warn('[SV]', ...a);
import AudioMotionAnalyzer from 'https://cdn.skypack.dev/-/audiomotion-analyzer@v4.5.4-UnISvush0sMQ1COoSTMA/dist=es2019,mode=imports,min/optimized/audiomotion-analyzer.js';
const audioEl = document.getElementById('audio');
const container = document.getElementById('container');
const playlist = document.getElementById('playlist');
// Üst ince bar kontrolleri
const settingsBar = document.getElementById('settingsBar');
const openBtn = document.getElementById('openSettings');
const closeBtn = document.getElementById('closeSettings');
const fsBtn = document.getElementById('fullscreen');
const gradientSelect = document.getElementById('gradientSelect');
const modeSelect = document.getElementById('modeSelect');
const scaleSelect = document.getElementById('scaleSelect');
// YENİ kontrol referansları
const fftSizeSelect = document.getElementById('fftSizeSelect');
const minFreqSelect = document.getElementById('minFreqSelect');
const maxFreqSelect = document.getElementById('maxFreqSelect');
const barSpaceSelect = document.getElementById('barSpaceSelect');
const mirrorSelect = document.getElementById('mirrorSelect');
const smoothingRange = document.getElementById('smoothingRange');
const smoothValSpan = document.getElementById('smoothVal');
let currentIndex = -1;
const loopStates = new WeakMap();
let hls = null;
let shakaPlayer = null;
// Auto-resume AudioContext on user interaction
try {
const resume = ()=>{ if (audioCtx && audioCtx.state !== 'running') audioCtx.resume().then(()=>log('AudioContext resumed')); };
['click','touchstart','keydown'].forEach(ev => document.addEventListener(ev, resume, { passive:true }));
audioEl.addEventListener('play', resume);
} catch(e){}
// Aç/Kapat (TOGGLE)
function openSettingsBar() { settingsBar.classList.add('open'); settingsBar.setAttribute('aria-hidden','false'); }
function closeSettingsBar() { settingsBar.classList.remove('open'); settingsBar.setAttribute('aria-hidden','true'); }
function toggleSettingsBar(){ settingsBar.classList.contains('open') ? closeSettingsBar() : openSettingsBar(); }
openBtn.addEventListener('click', toggleSettingsBar);
closeBtn.addEventListener('click', closeSettingsBar);
document.addEventListener('keydown', (e)=>{ if(e.key==='Escape') closeSettingsBar(); });
// Fullscreen
fsBtn.addEventListener('click', () => {
if (!document.fullscreenElement) container.requestFullscreen().catch(()=>{});
else document.exitFullscreen().catch(()=>{});
});
// Kaynak türleri
const isM3U8 = s => /\.m3u8(\?|$)/i.test(s);
const isAAC = s => /\.aac(\?|$)/i.test(s);
const isM4A = s => /\.m4a(\?|$)/i.test(s);
const isMP3 = s => /\.mp3(\?|$)/i.test(s);
const isOGG = s => /\.ogg(\?|$)/i.test(s);
const isWAV = s => /\.wav(\?|$)/i.test(s);
const isFLAC = s => /\.flac(\?|$)/i.test(s);
const isWEBM = s => /\.webm(\?|$)/i.test(s);
function guessMime(src){
if (isAAC(src)) return 'audio/aac';
if (isM4A(src)) return 'audio/mp4';
if (isMP3(src)) return 'audio/mpeg';
if (isOGG(src)) return 'audio/ogg';
if (isWAV(src)) return 'audio/wav';
if (isFLAC(src)) return 'audio/flac';
if (isWEBM(src)) return 'audio/webm';
return '';
}
function cleanupPlayers(){
if (hls) { try { hls.destroy(); } catch {} hls = null; }
if (shakaPlayer) { try { shakaPlayer.destroy(); } catch {} shakaPlayer = null; }
}
function setTypedSource(src, mime){
audioEl.pause();
cleanupPlayers();
audioEl.removeAttribute('src');
while (audioEl.firstChild) audioEl.removeChild(audioEl.firstChild);
const source = document.createElement('source');
source.src = src;
if (mime) source.type = mime;
audioEl.appendChild(source);
audioEl.load();
audioEl.play().catch(()=>{});
}
// Analyzer (başlangıç varsayılanları - sonra UI / kayıt ile override edilecek)
// Web Audio pipeline (single instance)
const audioCtx = new (window.AudioContext||window.webkitAudioContext)();
const srcNode = audioCtx.createMediaElementSource(audioEl);
srcNode.connect(audioCtx.destination);
const audioMotion = new AudioMotionAnalyzer(container, { source: srcNode,
mode: 6,
barSpace: .1,
showLeds: false,
mirror: 0,
reflexRatio: 0,
height: container.clientHeight,
fftSize: 8192,
minFreq: 20,
maxFreq: 16000,
smoothing: 0.5
});
/* ---------- 19 Gradient kaydı ---------- */
const gradients = {
'Apple ][': ['#001100','#005500','#00AA00','#55FF55','#AAFFAA'],
'Aurora': ['#00284d','#005f73','#0a9396','#94d2bd','#e9d8a6','#ee9b00','#ca6702'],
'Borealis': ['#0b0e2e','#1b3a4b','#1f7a8c','#88d498','#c3f0ca'],
'Candy': ['#ff006e','#fb5607','#ffbe0b','#ff006e'],
'Classic': ['#0f0','#ff0','#f80','#f00'],
'Cool': ['#001f3f','#0074D9','#7FDBFF','#39CCCC'],
'Dusk': ['#2e026d','#6a00f4','#b5179e','#ff006e','#ffbe0b'],
'Miami': ['#00d2d3','#54a0ff','#5f27cd','#ff6b6b','#feca57'],
'Orient': ['#2C3E50','#FD746C','#FF9068'],
'Outrun': ['#200122','#6f0000','#C33764','#1D2671','#12c2e9'],
'Pacific Dream':['#34e89e','#0f3443','#2c5364','#0b8793'],
'Prism': ['#ff0000','#ffa500','#ffff00','#00ff00','#00ffff','#0000ff','#8b00ff'],
'Prism (legacy)':['#ff0000','#ffff00','#00ff00','#00ffff','#0000ff'],
'Rainbow': ['#ffffff','#ffffff','#ffffff','#ffffff','#ffffff','#ffffff','#ffffff'],
'Rainbow (legacy)':['#ff0000','#ffff00','#00ff00','#0000ff','#ff00ff'],
'Shahabi': ['#e96443','#904e95','#1f1c2c'],
'Summer': ['#f6d365','#fda085','#fbc2eb','#a6c0fe'],
'Sunset': ['#0b486b','#f56217','#f7485e','#ff8c00'],
'Tie Dye': ['#ff595e','#ffca3a','#8ac926','#1982c4','#6a4c93']
};
for (const [name, stops] of Object.entries(gradients)) {
audioMotion.registerGradient(name, { colorStops: stops });
}
// ====== Ayarları uygula & persist ======
const LS_KEY = 'amSettingsV1';
const switchesWrap = settingsBar; // tüm switch inputları bar içinde
function applyOptions(opts) {
try { audioMotion.setOptions(opts); }
catch(e){ console.warn('setOptions error:', e); }
}
function readSwitches() {
const switches = {};
switchesWrap.querySelectorAll('input[type="checkbox"][data-key]').forEach(cb=>{
switches[cb.dataset.key] = cb.checked;
});
return switches;
}
function saveSettings() {
const data = {
gradient: gradientSelect.value,
mode: parseInt(modeSelect.value,10),
scale: scaleSelect.value,
// yeni numeric/select değerleri
fftSize: parseInt(fftSizeSelect.value,10),
minFreq: parseFloat(minFreqSelect.value),
maxFreq: parseFloat(maxFreqSelect.value),
barSpace: parseFloat(barSpaceSelect.value),
mirror: parseInt(mirrorSelect.value,10),
smoothing: parseFloat(smoothingRange.value),
switches: readSwitches()
};
localStorage.setItem(LS_KEY, JSON.stringify(data));
}
function loadSettings() {
try {
const raw = localStorage.getItem(LS_KEY);
if (!raw) return null;
return JSON.parse(raw);
} catch { return null; }
}
// İlk yükleme
(function initUI(){
const saved = loadSettings();
// Gradient
const defaultGradient = (saved && saved.gradient) || 'Rainbow';
if ([...gradientSelect.options].some(o=>o.value===defaultGradient)) {
gradientSelect.value = defaultGradient;
}
audioMotion.gradient = gradientSelect.value;
// Mode
if (saved && Number.isFinite(saved.mode)) {
modeSelect.value = String(saved.mode);
applyOptions({ mode: saved.mode });
} else {
applyOptions({ mode: parseInt(modeSelect.value,10) });
}
// Scale
scaleSelect.value = (saved && saved.scale) || 'log';
applyOptions({ frequencyScale: scaleSelect.value });
// ==== Yeni numeric/select alanları ====
// fftSize
if (saved && saved.fftSize) fftSizeSelect.value = String(saved.fftSize);
applyOptions({ fftSize: parseInt(fftSizeSelect.value,10) });
// min/max freq (geçersiz birleşim seçildiyse kibarca düzelt)
if (saved && saved.minFreq) minFreqSelect.value = String(saved.minFreq);
if (saved && saved.maxFreq) maxFreqSelect.value = String(saved.maxFreq);
let minF = parseFloat(minFreqSelect.value), maxF = parseFloat(maxFreqSelect.value);
if (minF >= maxF) { minF = 20; maxF = 16000; minFreqSelect.value = '20'; maxFreqSelect.value = '16000'; }
applyOptions({ minFreq: minF, maxFreq: maxF });
// barSpace
if (saved && typeof saved.barSpace==='number') barSpaceSelect.value = String(saved.barSpace);
applyOptions({ barSpace: parseFloat(barSpaceSelect.value) });
// mirror (0/1)
if (saved && typeof saved.mirror!=='undefined') mirrorSelect.value = String(saved.mirror);
applyOptions({ mirror: parseInt(mirrorSelect.value,10) });
// smoothing
const sm = (saved && typeof saved.smoothing==='number') ? saved.smoothing : 0.5;
smoothingRange.value = String(sm);
smoothValSpan.textContent = Number(sm).toFixed(2);
applyOptions({ smoothing: parseFloat(smoothingRange.value) });
// Switches (kaldırılanlar DOM’da yok; varsa kayıtları yine okunur)
const defaults = {
// eski anahtarlar
showPeaks:true, showScaleX:false, showScaleY:false,
linearAmplitude:false, lumiBars:false, showLeds:false,
outlineBars:false, radial:false, roundBars:false,
ansiBands:false, showFPS:false, alphaBars:false,
// yeni anahtarlar
overlay:false, splitGradient:false, trueLeds:false,
fadePeaks:true, peakLine:false, ledBars:true
};
const sw = Object.assign({}, defaults, (saved && saved.switches) || {});
switchesWrap.querySelectorAll('input[type="checkbox"][data-key]').forEach(cb=>{
cb.checked = !!sw[cb.dataset.key];
});
applyOptions(sw);
// Events
gradientSelect.addEventListener('change', ()=>{ audioMotion.gradient = gradientSelect.value; saveSettings(); });
modeSelect.addEventListener('change', ()=>{ applyOptions({ mode: parseInt(modeSelect.value,10) }); saveSettings(); });
scaleSelect.addEventListener('change', ()=>{ applyOptions({ frequencyScale: scaleSelect.value }); saveSettings(); });
fftSizeSelect.addEventListener('change', ()=>{ applyOptions({ fftSize: parseInt(fftSizeSelect.value,10) }); saveSettings(); });
minFreqSelect.addEventListener('change', ()=>{
const minFreq = parseFloat(minFreqSelect.value);
let maxFreq = parseFloat(maxFreqSelect.value);
if (minFreq >= maxFreq) {
// min >= max ise, mantıklı bir üst değer seç
const options = [...maxFreqSelect.options].map(o=>parseFloat(o.value)).filter(v=>v>minFreq);
if (options.length) { maxFreq = options[0]; maxFreqSelect.value = String(maxFreq); }
}
applyOptions({ minFreq, maxFreq });
saveSettings();
});
maxFreqSelect.addEventListener('change', ()=>{
let minFreq = parseFloat(minFreqSelect.value);
const maxFreq = parseFloat(maxFreqSelect.value);
if (minFreq >= maxFreq) {
// max <= min ise, mantıklı bir alt değer seç
const options = [...minFreqSelect.options].map(o=>parseFloat(o.value)).filter(v=>v
{ applyOptions({ barSpace: parseFloat(barSpaceSelect.value) }); saveSettings(); });
mirrorSelect.addEventListener('change', ()=>{ applyOptions({ mirror: parseInt(mirrorSelect.value,10) }); saveSettings(); });
smoothingRange.addEventListener('input', ()=>{
smoothValSpan.textContent = Number(smoothingRange.value).toFixed(2);
applyOptions({ smoothing: parseFloat(smoothingRange.value) });
saveSettings();
});
switchesWrap.addEventListener('change', (e)=>{
if (e.target.matches('input[type="checkbox"][data-key]')) {
const key = e.target.dataset.key;
const val = e.target.checked;
applyOptions({ [key]: val });
saveSettings();
}
});
})();
// ------- player kaynak yükleme -------
async function loadSource(src) {
log('loadSource', src);
try { if (audioCtx && audioCtx.state !== 'running') audioCtx.resume(); } catch(e) {}
// .m3u8 ise: HLS.js -> (gerekirse) native HLS -> (gerekirse) Shaka
if (isM3U8(src)) {
cleanupPlayers();
audioEl.pause();
audioEl.removeAttribute('src');
while (audioEl.firstChild) audioEl.removeChild(audioEl.firstChild);
audioEl.load();
// 1) HLS.js
if (window.Hls && Hls.isSupported()) {
log('HLS.js supported, initializing');
try {
hls = new Hls({
enableWorker: true,
lowLatencyMode: true
});
hls.loadSource(src);
hls.attachMedia(audioEl);
hls.on(Hls.Events.MANIFEST_PARSED, () => audioEl.play().catch(() => {}));
// Fatal error olursa Shaka'ya düş
hls.on(Hls.Events.ERROR, (_e, data) => {
if (data && data.fatal) {
try { hls.destroy(); } catch {}
hls = null;
tryShaka(src);
}
});
return;
} catch(e){
try { hls && hls.destroy(); } catch {}
hls = null;
// HLS.js başarısız oldu → Shaka dene
await tryShaka(src);
return;
}
}
// 2) Safari/native HLS
if (audioEl.canPlayType('application/vnd.apple.mpegurl')) {
log('Using native HLS playback');
const source = document.createElement('source');
source.src = src;
source.type = 'application/vnd.apple.mpegurl';
audioEl.appendChild(source);
audioEl.load();
audioEl.play().catch(() => {});
return;
}
// 3) Shaka
await tryShaka(src);
return;
}
// Diğer bilinen ses tipleri
const mime = guessMime(src);
log('Direct type', mime||''); setTypedSource(src, mime);
}
async function tryShaka(src) {
log('Trying Shaka', src);
try {
if (!(window.shaka && shaka.Player && shaka.Player.isBrowserSupported())) {
console.warn('Shaka desteklenmiyor ya da yüklenemedi.');
return;
}
cleanupPlayers();
shakaPlayer = new shaka.Player(audioEl);
await shakaPlayer.load(src);
await audioEl.play().catch(()=>{});
console.log('Shaka Player ile oynatılıyor:', src);
} catch (err) {
console.warn('Shaka yüklenemedi:', err);
}
}
function playFromPlaylist(trackEl) {
if (!trackEl) return;
const btn = trackEl.querySelector('.play');
if (!btn) return;
const src = btn.dataset.src;
const isUserUpload = btn.dataset.user === '1' || btn.hasAttribute('data-user');
if (isUserUpload) {
audioEl.classList.add('no-ui');
audioEl.addEventListener('contextmenu', preventContext, { passive: false });
audioEl.addEventListener('ratechange', fixRate, { passive: true });
} else {
audioEl.classList.remove('no-ui');
audioEl.removeEventListener('contextmenu', preventContext);
audioEl.removeEventListener('ratechange', fixRate);
}
loadSource(src);
highlightActive(btn);
currentIndex = [...playlist.querySelectorAll('.track')].indexOf(trackEl);
}
function preventContext(e){
e.preventDefault();
return false;
}
function fixRate(){
if (audioEl && audioEl.playbackRate !== 1) {
try { audioEl.playbackRate = 1; } catch(e){}
}
}
function highlightActive(activeBtn) {
playlist.querySelectorAll('.play').forEach(b => {
b.classList.toggle('active', b === activeBtn);
});
}
playlist.addEventListener('click', e => {
if (e.target.closest('.play')) {
playFromPlaylist(e.target.closest('.track'));
}
if (e.target.closest('.remove')) {
const trackEl = e.target.closest('.track');
if (trackEl) {
if (trackEl.querySelector('.play').classList.contains('active')) {
audioEl.pause();
currentIndex = -1;
}
trackEl.remove();
}
}
if (e.target.closest('.loop')) {
const btn = e.target.closest('.loop');
const trackEl = e.target.closest('.track');
const state = !loopStates.get(trackEl);
loopStates.set(trackEl, state);
btn.classList.toggle('active', state);
}
});
document.getElementById('upload').addEventListener('change', e => {
const files = e.target.files;
if (!files.length) return;
let firstTrackEl = null;
for (const fileBlob of files) {
const url = URL.createObjectURL(fileBlob);
const name = fileBlob.name;
const trackEl = document.createElement('div');
trackEl.className = 'track';
trackEl.draggable = true;
trackEl.innerHTML = `
🎵 ${name}
↻
❌
`;
playlist.insertBefore(trackEl, playlist.firstChild);
if (!firstTrackEl) firstTrackEl = trackEl;
}
if (firstTrackEl) playFromPlaylist(firstTrackEl);
});
audioEl.addEventListener('ended', () => {
const tracks = playlist.querySelectorAll('.track');
if (currentIndex >= 0) {
const currentTrack = tracks[currentIndex];
if (loopStates.get(currentTrack)) {
playFromPlaylist(currentTrack);
return;
}
if (currentIndex + 1 < tracks.length) {
playFromPlaylist(tracks[currentIndex + 1]);
} else if (tracks.length) {
playFromPlaylist(tracks[0]);
}
}
});
// Başlangıç şarkısını playlist içinden güvenli şekilde seç (IIFE)
(function(){
try {
const startIndex = (typeof window.startSongIndex === 'number') ? window.startSongIndex : 16; // 17. şarkı
const tracks = playlist.querySelectorAll('.track');
if (tracks && tracks[startIndex]) {
playFromPlaylist(tracks[startIndex]);
}
} catch(e) {
console.warn('startFromPlaylist error', e);
}
})();
let draggedEl = null;
playlist.addEventListener('dragstart', e => {
const tr = e.target.closest('.track');
if (!tr) return;
draggedEl = tr;
tr.classList.add('dragging');
e.dataTransfer.effectAllowed = 'move';
});
playlist.addEventListener('dragover', e => {
e.preventDefault();
const target = e.target.closest('.track');
if (target && target !== draggedEl) {
const rect = target.getBoundingClientRect();
const next = (e.clientY - rect.top) / rect.height > 0.5;
playlist.insertBefore(draggedEl, next ? target.nextSibling : target);
}
});
playlist.addEventListener('dragend', () => {
if (draggedEl) draggedEl.classList.remove('dragging');
draggedEl = null;
});
// Canvas çift tık ile tam ekran
container.addEventListener('dblclick', () => {
if (document.fullscreenElement) document.exitFullscreen();
else container.requestFullscreen();
});
audioEl.addEventListener('error', () => {
const e = audioEl.error;
console.warn('Audio error', e && e.code);
});
// --- test stream input ---
document.getElementById('testStream').addEventListener('click', () => {
const url = document.getElementById('customStream').value.trim();
if (!url) return;
let label = url;
try {
const u = new URL(url);
label = u.hostname;
const pathName = u.pathname.split('/').pop();
if (pathName) label = pathName;
} catch {
const parts = url.split('/');
if (parts.length) label = parts.pop();
}
const trackEl = document.createElement('div');
trackEl.className = 'track';
trackEl.draggable = true;
trackEl.innerHTML = `
🌐 ${label}
↻
❌
`;
playlist.insertBefore(trackEl, playlist.firstChild);
playFromPlaylist(trackEl);
document.getElementById('customStream').value = '';
});
// Reset Defaults button handler (affects ALL controls)
const resetBtn = document.getElementById('resetDefaults');
if (resetBtn) {
resetBtn.addEventListener('click', ()=>{
const defaultsMain = {
gradient: 'Rainbow',
mode: 6,
frequencyScale: 'log',
fftSize: 8192,
minFreq: 20,
maxFreq: 16000,
barSpace: 0.10,
mirror: 0,
smoothing: 0.40
};
const desiredSwitches = {
showPeaks: true,
fadePeaks: true,
ledBars: true
// others default to false
};
try {
// Build options object including all switches present in DOM
const switchesObj = {};
document.querySelectorAll('#settingsBar input[type="checkbox"][data-key]').forEach(cb=>{
const k = cb.dataset.key;
const val = !!desiredSwitches[k];
cb.checked = val;
switchesObj[k] = val;
});
const opts = Object.assign({}, defaultsMain, switchesObj);
// Apply options at once
try { audioMotion.setOptions(opts); } catch(e){ console.warn('setOptions error on reset:', e); }
// Sync selects/ranges UI
if (typeof gradientSelect !== 'undefined' && gradientSelect) gradientSelect.value = defaultsMain.gradient;
if (typeof modeSelect !== 'undefined' && modeSelect) modeSelect.value = String(defaultsMain.mode);
if (typeof scaleSelect !== 'undefined' && scaleSelect) scaleSelect.value = defaultsMain.frequencyScale;
if (typeof fftSizeSelect !== 'undefined' && fftSizeSelect) fftSizeSelect.value = String(defaultsMain.fftSize);
if (typeof minFreqSelect !== 'undefined' && minFreqSelect) minFreqSelect.value = String(defaultsMain.minFreq);
if (typeof maxFreqSelect !== 'undefined' && maxFreqSelect) maxFreqSelect.value = String(defaultsMain.maxFreq);
if (typeof barSpaceSelect !== 'undefined' && barSpaceSelect) barSpaceSelect.value = String(defaultsMain.barSpace);
if (typeof mirrorSelect !== 'undefined' && mirrorSelect) mirrorSelect.value = String(defaultsMain.mirror);
if (typeof smoothingRange !== 'undefined' && smoothingRange) smoothingRange.value = defaultsMain.smoothing;
if (typeof smoothValSpan !== 'undefined' && smoothValSpan) smoothValSpan.textContent = defaultsMain.smoothing.toFixed(2);
// Persist
try { if (typeof saveSettings === 'function') saveSettings(); } catch(e){}
if (window.__svDebug && window.__svDebug.log) __svDebug.log('Defaults restored');
} catch(e){ console.warn('Reset defaults error', e); }
});
}
Yabancı Müzik Radyoları – En Hareketli ve Son Çıkan Yabancı Şarkıları 7/24 Dinle
Dünyanın en popüler hitlerini tek bir platformda buluşturan Yabancı Müzik Radyoları , en yeni ve en hareketli yabancı şarkıları kesintisiz dinlemek isteyenler için vazgeçilmez bir adrestir. Pop, Dance, EDM, House, Hip Hop, R/B, Rock, Latin, Electronic ve Remix müzik türlerinden oluşan zengin yayın akışıyla günün her saatinde enerjinizi yükseltebilirsiniz. Sürekli güncellenen playlist sayesinde dünya müzik listelerinde zirvede yer alan en yeni yabancı şarkılar ilk yayınlandığı andan itibaren sizlerle buluşur.
Son Çıkan Yabancı Şarkılar ve Dünya Hitleri
Müzik dünyasında öne çıkan son çıkan yabancı şarkılar , viral TikTok hitleri, Spotify ve Billboard listelerinde yükselen parçalar, kulüplerde en çok çalınan remixler ve yazın en hareketli yabancı müzikleri tek bir radyoda sizleri bekliyor. Her gün yenilenen yayın akışımız sayesinde en güncel uluslararası müzik trendlerini kaçırmadan dinleyebilir, dünyanın dört bir yanında milyonlarca kişinin dinlediği hit parçaları yüksek ses kalitesiyle keşfedebilirsiniz.
Remix, Dance ve Hareketli Yabancı Müzik Keyfi
Eğlenceyi seven müzik tutkunları için hazırlanan özel yayın akışında remix şarkılar , dance müzik , EDM , club mix , house müzik , DJ performansları , elektronik müzik, hızlı yabancı şarkılar ve en popüler parti parçaları aralıksız çalıyor. Spor yaparken, araba kullanırken, çalışırken veya arkadaşlarınızla eğlenirken enerjinizi yükseltecek en iyi yabancı hitleri tek tıkla dinleyebilirsiniz. Gelişmiş ekolayzerli oynatıcı sayesinde müziğin ritmini hem işitebilir hem de görsel olarak hissedebilirsiniz.
Online Yabancı Müzik Radyosu ile Kesintisiz Canlı Yayın
Online yabancı müzik radyosu , bilgisayar, tablet ve akıllı telefonlardan kolayca erişilebilen modern altyapısıyla dünyanın her yerinden kesintisiz müzik keyfi sunar. Yüksek ses kalitesi, hızlı yüklenen oynatıcı ve reklamsız dinleme deneyimine odaklanan yayın sistemi sayesinde favori yabancı şarkılarınızı günün 24 saati dinleyebilirsiniz. Popüler yabancı sanatçılar, yeni albümler, remix versiyonlar ve uluslararası müzik listelerinin en sevilen parçaları sürekli güncellenen arşivimizde yer almaktadır.
En Yeni Yabancı Müzikleri Dinle, Müziğin Ritmini Yakala
Yabancı müzik dinle , yabancı radyo dinle , en hareketli yabancı müzikler , son çıkan yabancı şarkılar , dünya hitleri , remix müzik , dance , EDM , house , hip hop , pop müzik , rock müzik , canlı radyo , kesintisiz müzik ve 24 saat online radyo arıyorsanız doğru yerdesiniz. En yeni yabancı müzikleri, en popüler uluslararası hitleri ve durmaksızın güncellenen müzik arşivini keşfederek günün her anını müzikle dolu yaşayabilirsiniz.
EN SON YABANCI MÜZİKLERİ DİNLEYEBİLECEĞİM SİTELER: en çok tercih edilen ve dinlenen müzik siteleri, siteme eklemek istiyorum, Ekolayzırlı yeni hitler ve yeni albümler en önce gösterilen siteler tarzını kanala yansıt maksimum hit müzik yeni çıkan, beğenisi ve like oranı yüksek yabancı hit müzikler, sizin için seçmece ve yepyeni şarkılar en çok hareketli ve listelerde 1 numara olan şarkılar, harkulade müzikler, kafa şişirmeyen tizli baslı çok hareketli, Tüm dünya genelindeki yabancı sanatçıların çıkarttığı son albümleri dinleyebileceğim, en güzel canlı radyo yayını yapan yerler, internetten yabancı müzik dinle, reklam yok, kesinti yok, takılmadan, popüler sorunsuz hemen şimdi yabancı müzikleri dinlemeye başlayabilirsiniz. Yabancı Müzik Dinleyebileceğim siteler - yeni hitler. kulağa hoş gelen avrupa ve dünya sıralamasında en ilk 12 20 30 40 ve 50 şarkı sanatçı ve şarkı isimleri dinle, podcast fenomen fm yabancı müzik dinlemek istiyorum. ekolayzırı olan site bilgileri.dans ettiren hareketli oynak yabancı müziker. usb ye yuklemek istiyorum.
en etkili ve hareketli yabancı müzikler