soiz1 commited on
Commit
0581458
·
1 Parent(s): 3681794

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +96 -64
index.html CHANGED
@@ -1409,45 +1409,67 @@ let isInBackgroundTab = false;
1409
 
1410
  // visibilitychange イベントリスナーの修正
1411
  document.addEventListener('visibilitychange', async () => {
1412
- if (document.hidden) {
1413
- // 他タブに移動した場合
1414
- isInBackgroundTab = true;
1415
- stopSyncCheck(); // 同期チェックを停止
1416
-
1417
- try {
1418
- // PiP表示を試みる(再生中のときのみ)
1419
- if (!video.paused) {
1420
- await enterPiP();
1421
- // PiPに成功したら同期チェックを再開
1422
- if (document.pictureInPictureElement) {
1423
- isInBackgroundTab = false;
1424
- startSyncCheck();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- function playMedia() {
1686
- try {
1687
- const duration = video.duration || videoDuration;
1688
- const startTime = parseFloat(startTimeInput.value) || 0;
1689
- const endTime = parseFloat(endTimeInput.value) || duration;
1690
-
1691
- if (video.currentTime >= endTime) {
1692
- video.currentTime = startTime;
1693
- }
1694
-
1695
- const playPromise = video.play();
1696
-
1697
- if (playPromise !== undefined) {
1698
- playPromise.then(() => {
1699
- isPlaying = true;
1700
- playPauseBtn.textContent = '⏸';
1701
-
 
 
1702
  syncAudioWithVideo();
1703
- startSyncCheck();
1704
-
1705
- video.playbackRate = currentPlaybackRate;
1706
- }).catch(error => {
1707
- console.error('動画再生エラー:', error);
1708
- });
1709
- }
1710
- } catch (error) {
1711
- console.error('メディア再生エラー:', error);
 
 
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() {