Update index.html
Browse files- index.html +68 -96
index.html
CHANGED
@@ -1002,104 +1002,80 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
|
|
1002 |
<b>これはテスト的な機能で、ページの更新などができなくなるバグが発生する可能性があります。<br>(更新機能は実装していますが安定して動作するとは限りません。)<br>
|
1003 |
ページが更新されない場合、動画の更新ができなかったり既存のバグが残り続けたりする可能性があります。</b></a>
|
1004 |
<br>
|
1005 |
-
<button class="combine-button" id="sw-register-btn">登録を開始</button>
|
1006 |
<div class="combine-status" id="sw-status">
|
1007 |
</div>
|
1008 |
-
|
1009 |
-
|
1010 |
-
|
1011 |
-
|
1012 |
-
|
1013 |
-
console.log('registerBtn:', registerBtn);
|
1014 |
-
|
1015 |
-
function updateStatus(message) {
|
1016 |
-
console.log(message);
|
1017 |
-
statusElem.textContent = message;
|
1018 |
-
}
|
1019 |
-
|
1020 |
-
function updateError(message, error) {
|
1021 |
-
const errorMsg = `${message}\nエラー詳細: ${error?.message || error}`;
|
1022 |
-
console.error(errorMsg, error);
|
1023 |
-
statusElem.textContent = errorMsg;
|
1024 |
-
}
|
1025 |
-
|
1026 |
-
if (!navigator.onLine) {
|
1027 |
-
updateStatus('オフラインのため操作できません。');
|
1028 |
-
return;
|
1029 |
-
}
|
1030 |
-
|
1031 |
-
if (!('serviceWorker' in navigator)) {
|
1032 |
-
updateError('このブラウザはService Workerに対応していません。');
|
1033 |
-
return;
|
1034 |
-
}
|
1035 |
-
|
1036 |
-
try {
|
1037 |
-
// 登録済みかチェック
|
1038 |
-
const reg = await navigator.serviceWorker.ready;
|
1039 |
|
1040 |
-
|
1041 |
-
|
1042 |
-
|
1043 |
-
|
1044 |
-
registerBtn.disabled = false;
|
1045 |
|
1046 |
-
|
|
|
|
|
|
|
|
|
1047 |
|
1048 |
-
|
1049 |
-
|
1050 |
-
|
1051 |
-
|
1052 |
-
if (newSW.state === 'installed') {
|
1053 |
-
if (navigator.serviceWorker.controller) {
|
1054 |
-
updateStatus('ページの更新があるため、更新ボタンを押してサービスワーカーのキャッシュを再登録してください。');
|
1055 |
-
registerBtn.textContent = '更新を開始';
|
1056 |
-
registerBtn.disabled = false;
|
1057 |
-
} else {
|
1058 |
-
updateStatus('初回インストール完了。');
|
1059 |
-
}
|
1060 |
-
}
|
1061 |
-
};
|
1062 |
-
}
|
1063 |
-
};
|
1064 |
|
1065 |
-
|
1066 |
-
|
1067 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1068 |
updateStatus('Service Workerは未登録です。');
|
1069 |
-
registerBtn.style.display = 'inline-block';
|
1070 |
registerBtn.textContent = '登録とキャッシュ';
|
1071 |
registerBtn.disabled = false;
|
1072 |
}
|
|
|
|
|
|
|
1073 |
|
1074 |
-
|
1075 |
-
|
1076 |
-
|
1077 |
-
|
1078 |
-
|
1079 |
-
|
1080 |
-
|
1081 |
-
|
1082 |
-
}
|
1083 |
-
|
1084 |
-
updateStatus('新しいService Workerを登録中...');
|
1085 |
-
await navigator.serviceWorker.register('/sw.js');
|
1086 |
|
1087 |
-
|
1088 |
-
|
1089 |
-
registerBtn.textContent = 'ページをリロード';
|
1090 |
-
registerBtn.disabled = false;
|
1091 |
|
1092 |
-
|
1093 |
-
|
|
|
1094 |
|
1095 |
-
|
1096 |
-
|
1097 |
-
|
1098 |
-
|
1099 |
-
};
|
1100 |
});
|
1101 |
-
|
1102 |
-
|
|
|
1103 |
</div>
|
1104 |
<div class="container">
|
1105 |
<div class="audio-controls">
|
@@ -1834,8 +1810,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
|
|
1834 |
combinedAudioElement.playbackRate = speed;
|
1835 |
}
|
1836 |
|
1837 |
-
speedValue.textContent = speed.toFixed(
|
1838 |
-
playbackSpeedValue.textContent = speed.toFixed(
|
1839 |
speedSlider.value = speed;
|
1840 |
}
|
1841 |
|
@@ -2138,14 +2114,10 @@ video.addEventListener('timeupdate', function() {
|
|
2138 |
if (!isAudioCombined) return;
|
2139 |
|
2140 |
const speed = parseFloat(this.value);
|
2141 |
-
speedValue.textContent = speed.toFixed(
|
2142 |
playbackSpeedSlider.value = speed;
|
2143 |
-
playbackSpeedValue.textContent = speed.toFixed(
|
2144 |
updatePlaybackRate(speed);
|
2145 |
-
const baseTempo = isTMode ? 66 : 92;
|
2146 |
-
const newTempo = baseTempo * speed;
|
2147 |
-
tempoInput.value = newTempo.toFixed(1);
|
2148 |
-
tempoSpeedValue.textContent = speed.toFixed(3) + 'x';
|
2149 |
});
|
2150 |
|
2151 |
// 再生速度スライダー (設定メニュー)
|
@@ -2153,9 +2125,9 @@ video.addEventListener('timeupdate', function() {
|
|
2153 |
if (!isAudioCombined) return;
|
2154 |
|
2155 |
const speed = parseFloat(this.value);
|
2156 |
-
playbackSpeedValue.textContent = speed.toFixed(
|
2157 |
speedSlider.value = speed;
|
2158 |
-
speedValue.textContent = speed.toFixed(
|
2159 |
updatePlaybackRate(speed);
|
2160 |
});
|
2161 |
|
@@ -2168,10 +2140,10 @@ video.addEventListener('timeupdate', function() {
|
|
2168 |
const clampedSpeed = Math.max(0.001, Math.min(5.0, speed));
|
2169 |
|
2170 |
playbackSpeedSlider.value = clampedSpeed;
|
2171 |
-
playbackSpeedValue.textContent = clampedSpeed.toFixed(
|
2172 |
speedSlider.value = clampedSpeed;
|
2173 |
-
speedValue.textContent = clampedSpeed.toFixed(
|
2174 |
-
tempoSpeedValue.textContent = clampedSpeed.toFixed(
|
2175 |
|
2176 |
updatePlaybackRate(clampedSpeed);
|
2177 |
});
|
|
|
1002 |
<b>これはテスト的な機能で、ページの更新などができなくなるバグが発生する可能性があります。<br>(更新機能は実装していますが安定して動作するとは限りません。)<br>
|
1003 |
ページが更新されない場合、動画の更新ができなかったり既存のバグが残り続けたりする可能性があります。</b></a>
|
1004 |
<br>
|
1005 |
+
<button class="combine-button" id="sw-register-btn" disabled>登録を開始</button>
|
1006 |
<div class="combine-status" id="sw-status">
|
1007 |
</div>
|
1008 |
+
<script>
|
1009 |
+
window.addEventListener('load', async () => {
|
1010 |
+
const statusElem = document.getElementById('sw-status');
|
1011 |
+
const registerBtn = document.getElementById('sw-register-btn');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1012 |
|
1013 |
+
function updateStatus(message) {
|
1014 |
+
console.log(message);
|
1015 |
+
statusElem.textContent = message;
|
1016 |
+
}
|
|
|
1017 |
|
1018 |
+
function updateError(message, error) {
|
1019 |
+
const errorMsg = `${message}\nエラー詳細: ${error?.message || error}`;
|
1020 |
+
console.error(errorMsg, error);
|
1021 |
+
statusElem.textContent = errorMsg;
|
1022 |
+
}
|
1023 |
|
1024 |
+
if (!('serviceWorker' in navigator)) {
|
1025 |
+
updateError('このブラウザはService Workerに対応していません。');
|
1026 |
+
return;
|
1027 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1028 |
|
1029 |
+
try {
|
1030 |
+
const reg = await navigator.serviceWorker.getRegistration();
|
1031 |
+
if (reg) {
|
1032 |
+
updateStatus('Service Workerは既に登録されています。更新を確認中...');
|
1033 |
+
await reg.update();
|
1034 |
+
reg.onupdatefound = () => {
|
1035 |
+
const newSW = reg.installing;
|
1036 |
+
if (newSW) {
|
1037 |
+
newSW.onstatechange = () => {
|
1038 |
+
if (newSW.state === 'installed' && navigator.serviceWorker.controller) {
|
1039 |
+
updateStatus('新しいService Workerがインストールされました。');
|
1040 |
+
registerBtn.textContent = '更新を開始';
|
1041 |
+
registerBtn.disabled = false;
|
1042 |
+
}
|
1043 |
+
};
|
1044 |
+
}
|
1045 |
+
};
|
1046 |
+
} else {
|
1047 |
updateStatus('Service Workerは未登録です。');
|
|
|
1048 |
registerBtn.textContent = '登録とキャッシュ';
|
1049 |
registerBtn.disabled = false;
|
1050 |
}
|
1051 |
+
} catch (err) {
|
1052 |
+
updateError('Service Workerの確認中にエラーが発生しました。', err);
|
1053 |
+
}
|
1054 |
|
1055 |
+
registerBtn.addEventListener('click', async () => {
|
1056 |
+
registerBtn.disabled = true;
|
1057 |
+
try {
|
1058 |
+
updateStatus('既存のService Workerをアンレジスター中...');
|
1059 |
+
const regs = await navigator.serviceWorker.getRegistrations();
|
1060 |
+
for (const reg of regs) {
|
1061 |
+
await reg.unregister();
|
1062 |
+
}
|
|
|
|
|
|
|
|
|
1063 |
|
1064 |
+
updateStatus('新しいService Workerを登録中...');
|
1065 |
+
await navigator.serviceWorker.register('/sw.js');
|
|
|
|
|
1066 |
|
1067 |
+
updateStatus('登録完了。ページをリロードしてキャッシュを有効化します。');
|
1068 |
+
registerBtn.textContent = 'ページをリロード';
|
1069 |
+
registerBtn.disabled = false;
|
1070 |
|
1071 |
+
registerBtn.onclick = () => location.reload();
|
1072 |
+
} catch (err) {
|
1073 |
+
updateError('Service Workerの登録に失敗しました。', err);
|
1074 |
+
}
|
|
|
1075 |
});
|
1076 |
+
});
|
1077 |
+
</script>
|
1078 |
+
|
1079 |
</div>
|
1080 |
<div class="container">
|
1081 |
<div class="audio-controls">
|
|
|
1810 |
combinedAudioElement.playbackRate = speed;
|
1811 |
}
|
1812 |
|
1813 |
+
speedValue.textContent = speed.toFixed(2) + 'x';
|
1814 |
+
playbackSpeedValue.textContent = speed.toFixed(2) + 'x';
|
1815 |
speedSlider.value = speed;
|
1816 |
}
|
1817 |
|
|
|
2114 |
if (!isAudioCombined) return;
|
2115 |
|
2116 |
const speed = parseFloat(this.value);
|
2117 |
+
speedValue.textContent = speed.toFixed(2) + 'x';
|
2118 |
playbackSpeedSlider.value = speed;
|
2119 |
+
playbackSpeedValue.textContent = speed.toFixed(2) + 'x';
|
2120 |
updatePlaybackRate(speed);
|
|
|
|
|
|
|
|
|
2121 |
});
|
2122 |
|
2123 |
// 再生速度スライダー (設定メニュー)
|
|
|
2125 |
if (!isAudioCombined) return;
|
2126 |
|
2127 |
const speed = parseFloat(this.value);
|
2128 |
+
playbackSpeedValue.textContent = speed.toFixed(2) + 'x';
|
2129 |
speedSlider.value = speed;
|
2130 |
+
speedValue.textContent = speed.toFixed(2) + 'x';
|
2131 |
updatePlaybackRate(speed);
|
2132 |
});
|
2133 |
|
|
|
2140 |
const clampedSpeed = Math.max(0.001, Math.min(5.0, speed));
|
2141 |
|
2142 |
playbackSpeedSlider.value = clampedSpeed;
|
2143 |
+
playbackSpeedValue.textContent = clampedSpeed.toFixed(2) + 'x';
|
2144 |
speedSlider.value = clampedSpeed;
|
2145 |
+
speedValue.textContent = clampedSpeed.toFixed(2) + 'x';
|
2146 |
+
tempoSpeedValue.textContent = clampedSpeed.toFixed(2) + 'x';
|
2147 |
|
2148 |
updatePlaybackRate(clampedSpeed);
|
2149 |
});
|