2016-12-12 10:30:34 +03:00
|
|
|
<!DOCTYPE html>
|
2019-08-02 16:31:09 +03:00
|
|
|
<!-- https://gitlab.com/zlax/dubtechradiopage -->
|
2016-12-12 10:30:34 +03:00
|
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
|
|
|
<head>
|
|
|
|
|
<!--
|
|
|
|
|
88 88 88
|
|
|
|
|
88 88 ,d 88
|
|
|
|
|
88 88 88 88
|
|
|
|
|
,adPPYb,88 88 88 88,dPPYba, MM88MMM ,adPPYba, ,adPPYba, 88,dPPYba,
|
|
|
|
|
a8" `Y88 88 88 88P' "8a 88 a8P_____88 a8" "" 88P' "8a
|
|
|
|
|
8b 88 88 88 88 d8 88 8PP""""""" 8b 88 88
|
|
|
|
|
"8a, ,d88 "8a, ,a88 88b, ,a8" 88, "8b, ,aa "8a, ,aa 88 88
|
|
|
|
|
`"8bbdP"Y8 `"YbbdP'Y8 8Y"Ybbd8"' "Y888 `"Ybbd8"' `"Ybbd8"' 88 88
|
|
|
|
|
-->
|
2018-05-17 12:30:49 +03:00
|
|
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
|
|
|
|
<meta name="description" content="dub techno radio">
|
2026-02-02 11:49:14 +03:00
|
|
|
<meta name="keywords" content="dub techno radio,dub techno stream,dub techno radio stream,dubtechno radio,dub techno,dub,techno,tech,
|
|
|
|
|
deep,deep techno,dubtechno,radio,web radio,webradio,stream,dubtech">
|
2016-12-12 10:30:34 +03:00
|
|
|
<link rel="stylesheet" type="text/css" href="anthrstlsht.css">
|
|
|
|
|
<title>dub tech</title>
|
2026-07-25 11:26:27 +03:00
|
|
|
<style type="text/css">
|
|
|
|
|
.container { display: table; height: 100vh; }
|
|
|
|
|
.tabb { display: table-cell; vertical-align: middle; }
|
|
|
|
|
body { background: url("bclp.gif") repeat;}
|
2016-12-12 10:30:34 +03:00
|
|
|
</style>
|
|
|
|
|
</head>
|
2021-12-21 12:56:34 +03:00
|
|
|
<body style="background-color:#222;">
|
2016-12-12 10:30:34 +03:00
|
|
|
<div class="container">
|
|
|
|
|
<table class="tabb">
|
|
|
|
|
<tr><td>
|
2017-11-10 22:44:03 +03:00
|
|
|
<h5 align="right"><b><a href="http://anima.sknt.ru">Anima Amoris [Dub Techno]</a></b></h5>
|
2026-02-02 11:49:14 +03:00
|
|
|
<h5 align="right"><b><a href="http://amoris.sknt.ru/dubtechno">http://amoris.sknt.ru</a></b></h5>
|
|
|
|
|
</td><td><audio controls preload="none"><source src="http://amoris.sknt.ru/dubtechno" type="audio/mpeg"></audio></td><td>
|
2017-11-10 22:44:03 +03:00
|
|
|
<h6 id="first"></h6>
|
2016-12-12 10:30:34 +03:00
|
|
|
</td></tr><tr><td>
|
2017-11-10 22:44:03 +03:00
|
|
|
<h5 align="right"><b><a href="http://anima.sknt.ru">Anima Amoris [DubTech Mix]</a></b></h5>
|
2026-02-02 11:49:14 +03:00
|
|
|
<h5 align="right"><b><a href="http://amoris.sknt.ru/dubtechnomix">http://amoris.sknt.ru</a></b></h5>
|
|
|
|
|
</td><td><audio controls preload="none"><source src="http://amoris.sknt.ru/dubtechnomix" type="audio/mpeg"></audio></td><td>
|
2018-05-17 12:30:49 +03:00
|
|
|
<h6 id="second"></h6>
|
2016-12-12 10:30:34 +03:00
|
|
|
</td></tr><tr><td>
|
2017-11-10 22:44:03 +03:00
|
|
|
<h5 align="right"><b><a href="http://radcap.ru">Radio Caprice - Dub Techno</a></b></h5>
|
2019-08-02 16:31:09 +03:00
|
|
|
<h5 align="right"><b><a href="http://79.120.39.202:8002/dubtechno">http://79.120.39.202:8002/dubtechno</a></b></h5>
|
|
|
|
|
</td><td><audio controls preload="none"><source src="http://79.120.39.202:8002/dubtechno" type="audio/mpeg"></audio></td><td>
|
2021-01-16 19:17:34 +03:00
|
|
|
<h6 id="third"></h6>
|
2018-05-17 12:30:49 +03:00
|
|
|
</td></tr><tr><td>
|
2026-02-02 11:49:14 +03:00
|
|
|
<h5 align="right"><b><a href="https://myradio24.com/ddtradio">Deep Dub Tech radio </a></b></h5>
|
|
|
|
|
<h5 align="right"><b><a href="https://listen5.myradio24.com/ddtradio">https://listen5.myradio24.com/ddtradio</a></b></h5>
|
|
|
|
|
</td><td><audio controls src="https://listen5.myradio24.com/ddtradio" preload="none"></audio></td><td>
|
2021-01-16 19:17:34 +03:00
|
|
|
<h6 id="fourth"></h6>
|
2018-05-17 12:30:49 +03:00
|
|
|
</td></tr><tr><td>
|
2019-08-02 16:31:09 +03:00
|
|
|
<h5 align="right"><b><a href="http://schizoid.in/">Schizoid Dub Techno</a></b></h5>
|
|
|
|
|
<h5 align="right"><b><a href="http://94.130.113.214:8000/dubtechno">http://schizoid.in:8000/dubtechno</a></b></h5>
|
|
|
|
|
</td><td><audio controls preload="none"><source src="http://94.130.113.214:8000/dubtechno" type="audio/mpeg"></audio></td><td>
|
2021-12-21 12:56:34 +03:00
|
|
|
<h6 id="fifth"></h6>
|
2018-05-17 12:30:49 +03:00
|
|
|
</td></tr><tr><td>
|
2020-05-02 13:21:18 +03:00
|
|
|
<h5 align="right"><b><a href="https://mabu-beatz-radio.com/home/dub-techno/">MABU Beatz Dub Techno</a></b></h5>
|
|
|
|
|
<h5 align="right"><b><a href="http://78.47.31.164:8002/dub">http://78.47.31.164:8002/dub</a></b></h5>
|
|
|
|
|
</td><td><audio controls preload="none"><source src="http://78.47.31.164:8002/dub" type="audio/mpeg"></audio></td><td>
|
2021-12-21 12:56:34 +03:00
|
|
|
<h6 id="sixth"></h6>
|
2021-01-16 19:17:34 +03:00
|
|
|
</td></tr><tr><td>
|
|
|
|
|
<h5 align="right"><b><a href="http://http://mixcult.net">MixCult Deep Techno Radio</a></b></h5>
|
|
|
|
|
<h5 align="right"><b><a href="http://radio.mixcult.net:8000">http://radio.mixcult.net:8000</a></b></h5>
|
|
|
|
|
</td><td><audio controls preload="none"><source src="http://radio.mixcult.net:8000/MixCult_256kbps" type="audio/mpeg"></audio></td><td>
|
2021-12-21 12:56:34 +03:00
|
|
|
<h6 id="seventh"></h6>
|
|
|
|
|
</td></tr><tr><td>
|
2026-02-02 11:49:14 +03:00
|
|
|
<h5 align="right"><b><a href="http://anima.sknt.ru">Anima Amoris [Deep Techno]</a></b></h5>
|
|
|
|
|
<h5 align="right"><b><a href="http://amoris.sknt.ru/minimal">http://amoris.sknt.ru</a></b></h5>
|
|
|
|
|
</td><td><audio controls preload="none"><source src="http://amoris.sknt.ru/minimal" type="audio/mpeg"></audio></td><td>
|
2020-05-02 13:21:18 +03:00
|
|
|
<h6 id="eighth"></h6>
|
|
|
|
|
</td></tr><tr><td>
|
2026-02-02 11:49:14 +03:00
|
|
|
<h5 align="right"><b><a href="http://anima.sknt.ru">Anima Amoris [Deep Tech House]</a></b></h5>
|
|
|
|
|
<h5 align="right"><b><a href="http://amoris.sknt.ru/deeptech">http://amoris.sknt.ru</a></b></h5>
|
|
|
|
|
</td><td><audio controls preload="none"><source src="http://amoris.sknt.ru/deeptech" type="audio/mpeg"></audio></td><td>
|
2021-01-16 19:17:34 +03:00
|
|
|
<h6 id="ninth"></h6>
|
|
|
|
|
</td></tr><tr><td>
|
2026-02-02 11:49:14 +03:00
|
|
|
<h5 align="right"><b><a href="https://laut.fm/best-of-techno">Best of techno</a></b></h5>
|
|
|
|
|
<h5 align="right"><b><a href="https://best-of-techno.stream.laut.fm/best-of-techno">https://laut.fm/best-of-techno</a></b></h5>
|
|
|
|
|
</td><td><audio controls preload="none"><source src="https://best-of-techno.stream.laut.fm/best-of-techno" type="audio/mpeg"></audio></td><td>
|
2021-01-16 19:17:34 +03:00
|
|
|
<h6 id="tenth"></h6>
|
2026-02-02 11:49:14 +03:00
|
|
|
</td></tr><tr><td>
|
|
|
|
|
<h5 align="right"><b><a href="https://minimalmix.com/">Minimal Mix Radio</a></b></h5>
|
|
|
|
|
<h5 align="right"><b><a href="http://orion.shoutca.st:8750">http://orion.shoutca.st:8750</a></b></h5>
|
|
|
|
|
</td><td><audio controls preload="none"><source src="http://orion.shoutca.st:8750/stream" type="audio/mpeg"></audio></td><td>
|
|
|
|
|
<h6 id="eleventh"></h6>
|
|
|
|
|
</td></tr><tr><td>
|
|
|
|
|
<h5 align="right"><b><a href="http://www.di.fm/dubtechno">Digitally Imported Dub Techno</a></b></h5>
|
|
|
|
|
<h5 align="right"><b><a href="http://www.di.fm/dubtechno">http://prem2.di.fm/dubtechno_hi</a></b></h5>
|
|
|
|
|
</td><td><audio controls src="http://prem2.di.fm:80/dubtechno_hi?266a3dc03aaa30a0807d9062" preload="none"></audio></td><td>
|
|
|
|
|
<h6 id="twelfth"></h6>
|
2018-05-17 12:30:49 +03:00
|
|
|
</td><td>
|
|
|
|
|
</td></tr><tr><td colspan="3">
|
2026-02-02 11:49:14 +03:00
|
|
|
<br><h4 align="center"><a href="https://is3.ussr.win/dubtech/reverberations_of_the_delayed_chords">reverberations of the delayed chords</a></h4>
|
2016-12-12 10:30:34 +03:00
|
|
|
</td></tr>
|
|
|
|
|
</table></div>
|
2026-07-25 11:26:27 +03:00
|
|
|
<script type="text/javascript">
|
|
|
|
|
(function() {
|
|
|
|
|
console.log("--- [SYSTEM] Audio Recovery v9 (Strict Mode) ---");
|
|
|
|
|
|
|
|
|
|
var audios = document.getElementsByTagName("audio");
|
|
|
|
|
var active = null;
|
|
|
|
|
|
|
|
|
|
// НАСТРОЙКИ
|
|
|
|
|
var STALL_THRESHOLD = 5; // Секунд замирания перед восстановлением
|
|
|
|
|
var RECOVERY_COOLDOWN = 5000; // Пауза между попытками восстановления
|
|
|
|
|
//var MAX_RETRIES = 10; // Сколько раз пытаться оживить трек, прежде чем сдаться
|
|
|
|
|
|
|
|
|
|
var monitorData = {};
|
|
|
|
|
|
|
|
|
|
function bind(el, type, fn) {
|
|
|
|
|
if (el.addEventListener) el.addEventListener(type, fn, false);
|
|
|
|
|
else if (el.attachEvent) el.attachEvent("on" + type, fn);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function switchAudio(el) {
|
|
|
|
|
if (active && active !== el) {
|
|
|
|
|
// Если переключаемся на другой трек, старый просто ставим на паузу
|
|
|
|
|
try { active.load(); } catch(e) {}
|
|
|
|
|
// try { active.pause(); } catch(e) {}
|
|
|
|
|
}
|
|
|
|
|
active = el;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < audios.length; i++) {
|
|
|
|
|
var audio = audios[i];
|
|
|
|
|
audio._index = i;
|
|
|
|
|
monitorData[i] = {
|
|
|
|
|
lastTime: 0,
|
|
|
|
|
stalledSince: 0,
|
|
|
|
|
isUserPaused: true,
|
|
|
|
|
lastRecoveryAttempt: 0,
|
|
|
|
|
retryCount: 0
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Событие: музыка реально начала играть
|
|
|
|
|
bind(audio, "playing", function() {
|
|
|
|
|
console.log(`[DEBUG] Поток пошел: №${this._index}`);
|
|
|
|
|
monitorData[this._index].isUserPaused = false;
|
|
|
|
|
monitorData[this._index].retryCount = 0; // Сбрасываем счетчик ошибок при успехе
|
|
|
|
|
switchAudio(this);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Событие: нажата кнопка Play
|
|
|
|
|
bind(audio, "play", function() {
|
|
|
|
|
console.log(`[DEBUG] Нажат Play: №${this._index}`);
|
|
|
|
|
monitorData[this._index].isUserPaused = false;
|
|
|
|
|
switchAudio(this);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Событие: пауза
|
|
|
|
|
bind(audio, "pause", function() {
|
|
|
|
|
// Если в момент паузы была ошибка сети — это системная пауза
|
|
|
|
|
if (this.error || (active === this && monitorData[this._index].stalledSince > 0)) {
|
|
|
|
|
console.log(`[DEBUG] Системная пауза (сбой): №${this._index}`);
|
|
|
|
|
monitorData[this._index].isUserPaused = false;
|
|
|
|
|
} else {
|
|
|
|
|
console.log(`[DEBUG] Пользователь поставил на паузу: №${this._index}`);
|
|
|
|
|
monitorData[this._index].isUserPaused = true;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
bind(audio, "error", function() {
|
|
|
|
|
console.warn(`[DEBUG] Ошибка сети: №${this._index}`);
|
|
|
|
|
monitorData[this._index].isUserPaused = false;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ГЛАВНЫЙ МОНИТОР (проверка раз в секунду)
|
|
|
|
|
setInterval(function() {
|
|
|
|
|
if (!active) return; // Если ничего не играет, не тратим ресурсы
|
|
|
|
|
|
|
|
|
|
var now = new Date().getTime();
|
|
|
|
|
var data = monitorData[active._index];
|
|
|
|
|
|
|
|
|
|
// Работаем ТОЛЬКО если пользователь НЕ ставил на паузу
|
|
|
|
|
if (!data.isUserPaused) {
|
|
|
|
|
|
|
|
|
|
// 1. Проверяем, движется ли время (currentTime)
|
|
|
|
|
if (Math.abs(data.lastTime - active.currentTime) < 0.1) {
|
|
|
|
|
data.stalledSince += 1;
|
|
|
|
|
} else {
|
|
|
|
|
data.lastTime = active.currentTime;
|
|
|
|
|
data.stalledSince = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 2. Условие восстановления: замерло на X секунд ИЛИ возникла ошибка
|
|
|
|
|
if (data.stalledSince >= STALL_THRESHOLD || active.error) {
|
|
|
|
|
|
|
|
|
|
// Защита от слишком частых перезагрузок и "мертвых" треков
|
|
|
|
|
//if (now - data.lastRecoveryAttempt > RECOVERY_COOLDOWN && data.retryCount < MAX_RETRIES) {
|
|
|
|
|
if (now - data.lastRecoveryAttempt > RECOVERY_COOLDOWN) {
|
|
|
|
|
|
|
|
|
|
//console.error(`[RECOVERY] Сбой трека №${active._index}. Попытка ${data.retryCount + 1}/${MAX_RETRIES}...`);
|
|
|
|
|
console.error(`[RECOVERY] Сбой трека №${active._index}. Попытка ${data.retryCount + 1}...`);
|
|
|
|
|
|
|
|
|
|
data.lastRecoveryAttempt = now;
|
|
|
|
|
data.stalledSince = 0;
|
|
|
|
|
data.retryCount++;
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// Важно: load() сбрасывает буфер и переподключается к серверу
|
|
|
|
|
active.load();
|
|
|
|
|
|
|
|
|
|
// Небольшая задержка перед play, чтобы load() успел сработать
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
active.play().catch(function(e) {
|
|
|
|
|
console.log("[RECOVERY] Браузер заблокировал автовоспроизведение (нужен клик)");
|
|
|
|
|
});
|
|
|
|
|
}, 300);
|
|
|
|
|
} catch(e) {
|
|
|
|
|
console.error("[RECOVERY] Ошибка при попытке перезапуска:", e);
|
|
|
|
|
}
|
|
|
|
|
//} else if (data.retryCount >= MAX_RETRIES) {
|
|
|
|
|
// // Если трек не ожил после n попыток, перестаем его мучить, чтобы не было "прыжков"
|
|
|
|
|
// if (active === active) {
|
|
|
|
|
// console.error(`[RECOVERY] Трек №${active._index} признан мертвым. Остановка восстановления.`);
|
|
|
|
|
// // Опционально: можно оставить как есть, чтобы пользователь сам переключил
|
|
|
|
|
// active = null;
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// Если пользователь на паузе, обнуляем счетчик замирания
|
|
|
|
|
data.stalledSince = 0;
|
|
|
|
|
}
|
|
|
|
|
}, 1000);
|
|
|
|
|
|
|
|
|
|
function allID() {
|
|
|
|
|
var xhr = new XMLHttpRequest();
|
|
|
|
|
xhr.open("GET", "id.php");
|
|
|
|
|
xhr.send(null);
|
|
|
|
|
xhr.onreadystatechange = function() {
|
|
|
|
|
if (xhr.readyState == 4 && xhr.status == 200) {
|
|
|
|
|
var kv = xhr.responseText.split(":;:");
|
|
|
|
|
var ids = ["first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth"];
|
|
|
|
|
for (var i = 0; i < ids.length; ++i) {
|
|
|
|
|
document.getElementById(ids[i]).textContent = kv[i + 1];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
allID();
|
|
|
|
|
setInterval(allID, 20000);
|
|
|
|
|
|
|
|
|
|
})();
|
|
|
|
|
</script>
|
|
|
|
|
|
2016-12-12 10:30:34 +03:00
|
|
|
<!--
|
|
|
|
|
88 88 88
|
|
|
|
|
,d 88 88 88
|
|
|
|
|
88 88 88 88
|
|
|
|
|
MM88MMM ,adPPYba, ,adPPYba, 88,dPPYba, ,adPPYb,88 88 88 88,dPPYba,
|
|
|
|
|
88 a8P_____88 a8" "" 88P' "8a a8" `Y88 88 88 88P' "8a
|
|
|
|
|
88 8PP""""""" 8b 88 88 8b 88 88 88 88 d8
|
|
|
|
|
88, "8b, ,aa "8a, ,aa 88 88 "8a, ,d88 "8a, ,a88 88b, ,a8"
|
|
|
|
|
"Y888 `"Ybbd8"' `"Ybbd8"' 88 88 `"8bbdP"Y8 `"YbbdP'Y8 8Y"Ybbd8"'
|
|
|
|
|
-->
|
|
|
|
|
</body>
|
2017-06-26 14:06:58 +03:00
|
|
|
</html>
|