fox's autoplay on interruptions
This commit is contained in:
+156
-28
@@ -18,35 +18,11 @@ a8" `Y88 88 88 88P' "8a 88 a8P_____88 a8" "" 88P' "8a
|
|||||||
deep,deep techno,dubtechno,radio,web radio,webradio,stream,dubtech">
|
deep,deep techno,dubtechno,radio,web radio,webradio,stream,dubtech">
|
||||||
<link rel="stylesheet" type="text/css" href="anthrstlsht.css">
|
<link rel="stylesheet" type="text/css" href="anthrstlsht.css">
|
||||||
<title>dub tech</title>
|
<title>dub tech</title>
|
||||||
|
<style type="text/css">
|
||||||
|
.container { display: table; height: 100vh; }
|
||||||
|
.tabb { display: table-cell; vertical-align: middle; }
|
||||||
|
body { background: url("bclp.gif") repeat;}
|
||||||
</style>
|
</style>
|
||||||
<script type="text/javascript">
|
|
||||||
function allID () {
|
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
xhr.open('GET', 'id.php');
|
|
||||||
xhr.send(null);
|
|
||||||
xhr.onreadystatechange = function() {
|
|
||||||
if (xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200) {
|
|
||||||
xhr.responseText.split('\n').forEach(function(line) {
|
|
||||||
var kvID = line.split(':;:');
|
|
||||||
document.getElementById("first").innerHTML = kvID[1];
|
|
||||||
document.getElementById("second").innerHTML = kvID[2];
|
|
||||||
document.getElementById("third").innerHTML = kvID[3];
|
|
||||||
document.getElementById("fourth").innerHTML = kvID[4];
|
|
||||||
document.getElementById("fifth").innerHTML = kvID[5];
|
|
||||||
document.getElementById("sixth").innerHTML = kvID[6];
|
|
||||||
document.getElementById("seventh").innerHTML = kvID[7];
|
|
||||||
document.getElementById("eighth").innerHTML = kvID[8];
|
|
||||||
document.getElementById("ninth").innerHTML = kvID[9];
|
|
||||||
document.getElementById("tenth").innerHTML = kvID[10];
|
|
||||||
document.getElementById("eleventh").innerHTML = kvID[11];
|
|
||||||
document.getElementById("twelfth").innerHTML = kvID[12];
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
allID();
|
|
||||||
setInterval(allID, 2e4);
|
|
||||||
</script>
|
|
||||||
</head>
|
</head>
|
||||||
<body style="background-color:#222;">
|
<body style="background-color:#222;">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
@@ -116,6 +92,158 @@ a8" `Y88 88 88 88P' "8a 88 a8P_____88 a8" "" 88P' "8a
|
|||||||
<br><h4 align="center"><a href="https://is3.ussr.win/dubtech/reverberations_of_the_delayed_chords">reverberations of the delayed chords</a></h4>
|
<br><h4 align="center"><a href="https://is3.ussr.win/dubtech/reverberations_of_the_delayed_chords">reverberations of the delayed chords</a></h4>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table></div>
|
</table></div>
|
||||||
|
<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>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
88 88 88
|
88 88 88
|
||||||
,d 88 88 88
|
,d 88 88 88
|
||||||
|
|||||||
Reference in New Issue
Block a user