Update index.html
Browse files- index.html +96 -64
index.html
CHANGED
@@ -1409,45 +1409,67 @@ let isInBackgroundTab = false;
|
|
1409 |
|
1410 |
// visibilitychange イベントリスナーの修正
|
1411 |
document.addEventListener('visibilitychange', async () => {
|
1412 |
-
|
1413 |
-
|
1414 |
-
|
1415 |
-
|
1416 |
-
|
1417 |
-
|
1418 |
-
|
1419 |
-
|
1420 |
-
|
1421 |
-
//
|
1422 |
-
|
1423 |
-
|
1424 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1425 |
}
|
1426 |
-
}
|
1427 |
-
} catch (e) {
|
1428 |
-
console.warn('PiP開始失敗:', e);
|
1429 |
-
// PiP失敗時は何もしない(isInBackgroundTabがtrueのまま)
|
1430 |
-
}
|
1431 |
-
} else {
|
1432 |
-
// タブに戻った場合
|
1433 |
-
isInBackgroundTab = false;
|
1434 |
-
|
1435 |
-
// PiPを終了(再生中のときのみ)
|
1436 |
-
if (!video.paused) {
|
1437 |
-
try {
|
1438 |
-
await exitPiP();
|
1439 |
-
} catch (e) {
|
1440 |
-
console.warn('PiP終了失敗:', e);
|
1441 |
-
}
|
1442 |
-
}
|
1443 |
-
|
1444 |
-
// タブに戻った直後に一度だけ同期チェックを実行
|
1445 |
-
if (isPlaying) {
|
1446 |
-
checkSync();
|
1447 |
-
// その後、通常通り同期チェックを再開
|
1448 |
-
startSyncCheck();
|
1449 |
}
|
1450 |
-
}
|
1451 |
});
|
1452 |
|
1453 |
// 動画終了時に自動的にPiPを閉じる(次回再開のため)
|
@@ -1681,36 +1703,46 @@ document.addEventListener('visibilitychange', async () => {
|
|
1681 |
}
|
1682 |
}
|
1683 |
|
1684 |
-
|
1685 |
-
|
1686 |
-
|
1687 |
-
|
1688 |
-
|
1689 |
-
|
1690 |
-
|
1691 |
-
|
1692 |
-
|
1693 |
-
|
1694 |
-
|
1695 |
-
|
1696 |
-
|
1697 |
-
|
1698 |
-
|
1699 |
-
|
1700 |
-
|
1701 |
-
|
|
|
|
|
1702 |
syncAudioWithVideo();
|
1703 |
-
|
1704 |
-
|
1705 |
-
|
1706 |
-
|
1707 |
-
|
1708 |
-
|
1709 |
-
|
1710 |
-
|
1711 |
-
|
|
|
|
|
1712 |
}
|
|
|
|
|
|
|
|
|
|
|
1713 |
}
|
|
|
1714 |
|
1715 |
// 一時停止関数
|
1716 |
function pauseMedia() {
|
|
|
1409 |
|
1410 |
// visibilitychange イベントリスナーの修正
|
1411 |
document.addEventListener('visibilitychange', async () => {
|
1412 |
+
if (document.hidden) {
|
1413 |
+
// タブが非表示になった場合
|
1414 |
+
isInBackgroundTab = true;
|
1415 |
+
stopSyncCheck();
|
1416 |
+
|
1417 |
+
// 現在の再生状態と時間を保存
|
1418 |
+
const wasPlaying = isPlaying;
|
1419 |
+
const savedTime = video.currentTime;
|
1420 |
+
|
1421 |
+
// メディアを一時停止
|
1422 |
+
pauseMedia();
|
1423 |
+
|
1424 |
+
// タブが再表示されたときに復元するためのデータを保存
|
1425 |
+
video.dataset.wasPlaying = wasPlaying;
|
1426 |
+
video.dataset.savedTime = savedTime;
|
1427 |
+
|
1428 |
+
try {
|
1429 |
+
// PiP表示を試みる
|
1430 |
+
if (wasPlaying) {
|
1431 |
+
await enterPiP();
|
1432 |
+
if (document.pictureInPictureElement) {
|
1433 |
+
isInBackgroundTab = false;
|
1434 |
+
startSyncCheck();
|
1435 |
+
playMedia(); // PiPでは再生を続ける
|
1436 |
+
}
|
1437 |
+
}
|
1438 |
+
} catch (e) {
|
1439 |
+
console.warn('PiP開始失敗:', e);
|
1440 |
+
}
|
1441 |
+
} else {
|
1442 |
+
// タブが再表示された場合
|
1443 |
+
isInBackgroundTab = false;
|
1444 |
+
|
1445 |
+
// PiPを終了
|
1446 |
+
try {
|
1447 |
+
await exitPiP();
|
1448 |
+
} catch (e) {
|
1449 |
+
console.warn('PiP終了失敗:', e);
|
1450 |
+
}
|
1451 |
+
|
1452 |
+
// 保存された状態を復元
|
1453 |
+
const wasPlaying = video.dataset.wasPlaying === 'true';
|
1454 |
+
const savedTime = parseFloat(video.dataset.savedTime) || 0;
|
1455 |
+
|
1456 |
+
if (wasPlaying) {
|
1457 |
+
// 保存された時間にシーク
|
1458 |
+
video.currentTime = savedTime;
|
1459 |
+
if (combinedAudioElement) {
|
1460 |
+
combinedAudioElement.currentTime = savedTime;
|
1461 |
+
}
|
1462 |
+
|
1463 |
+
// 再生を再開
|
1464 |
+
playMedia();
|
1465 |
+
}
|
1466 |
+
|
1467 |
+
// タブに戻った直後に一度だけ同期チェックを実行
|
1468 |
+
if (isPlaying) {
|
1469 |
+
checkSync();
|
1470 |
+
startSyncCheck();
|
1471 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1472 |
}
|
|
|
1473 |
});
|
1474 |
|
1475 |
// 動画終了時に自動的にPiPを閉じる(次回再開のため)
|
|
|
1703 |
}
|
1704 |
}
|
1705 |
|
1706 |
+
function playMedia() {
|
1707 |
+
try {
|
1708 |
+
const duration = video.duration || videoDuration;
|
1709 |
+
const startTime = parseFloat(startTimeInput.value) || 0;
|
1710 |
+
const endTime = parseFloat(endTimeInput.value) || duration;
|
1711 |
+
|
1712 |
+
// 現在の時間が終了時間を超えている場合は開始時間に戻す
|
1713 |
+
if (video.currentTime >= endTime) {
|
1714 |
+
video.currentTime = startTime;
|
1715 |
+
}
|
1716 |
+
|
1717 |
+
const playPromise = video.play();
|
1718 |
+
|
1719 |
+
if (playPromise !== undefined) {
|
1720 |
+
playPromise.then(() => {
|
1721 |
+
isPlaying = true;
|
1722 |
+
playPauseBtn.textContent = '⏸';
|
1723 |
+
|
1724 |
+
// 音声が合成されている場合は同期
|
1725 |
+
if (isAudioCombined) {
|
1726 |
syncAudioWithVideo();
|
1727 |
+
}
|
1728 |
+
|
1729 |
+
startSyncCheck();
|
1730 |
+
|
1731 |
+
video.playbackRate = currentPlaybackRate;
|
1732 |
+
}).catch(error => {
|
1733 |
+
console.error('動画再生エラー:', error);
|
1734 |
+
// 再生に失敗した場合は一時停止状態に設定
|
1735 |
+
isPlaying = false;
|
1736 |
+
playPauseBtn.textContent = '▶';
|
1737 |
+
});
|
1738 |
}
|
1739 |
+
} catch (error) {
|
1740 |
+
console.error('メディア再生エラー:', error);
|
1741 |
+
// エラーが発生した場合は一時停止状態に設定
|
1742 |
+
isPlaying = false;
|
1743 |
+
playPauseBtn.textContent = '▶';
|
1744 |
}
|
1745 |
+
}
|
1746 |
|
1747 |
// 一時停止関数
|
1748 |
function pauseMedia() {
|