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">
|
||||
<link rel="stylesheet" type="text/css" href="anthrstlsht.css">
|
||||
<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>
|
||||
<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>
|
||||
<body style="background-color:#222;">
|
||||
<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>
|
||||
</td></tr>
|
||||
</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
|
||||
,d 88 88 88
|
||||
|
||||
Reference in New Issue
Block a user