From e4809216cb7bda269f609b446cc6012d85d2a348 Mon Sep 17 00:00:00 2001 From: tsukumi Date: Wed, 25 Oct 2023 20:05:13 +0000 Subject: [PATCH] =?UTF-8?q?Fix:=20[Client/Player]=20=E4=B8=80=E9=83=A8?= =?UTF-8?q?=E3=81=AE=20assert=20=E3=82=92=E5=89=8A=E9=99=A4=20=E7=B5=B6?= =?UTF-8?q?=E5=AF=BE=E3=81=AB=E7=99=BA=E7=94=9F=E3=81=97=E3=81=AA=E3=81=84?= =?UTF-8?q?=E3=81=A8=E6=80=9D=E3=81=A3=E3=81=A6=E3=81=84=E3=81=9F=E3=81=8C?= =?UTF-8?q?=E3=80=81=E3=82=88=E3=81=8F=E8=80=83=E3=81=88=E3=82=8B=E3=81=A8?= =?UTF-8?q?=20init()=20=E5=AE=8C=E4=BA=86=E5=89=8D=E3=81=AB=20destroy()=20?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=82=8B=E5=8F=AF=E8=83=BD=E6=80=A7=E3=82=82?= =?UTF-8?q?=E3=81=AA=E3=81=8F=E3=82=82=E3=81=AA=E3=81=84=E3=81=9F=E3=82=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/services/player/PlayerWrapper.ts | 34 +++++++++++-------- .../player/managers/LiveEventManager.ts | 8 ++--- client/src/views/TV/Watch2.vue | 10 ------ 3 files changed, 23 insertions(+), 29 deletions(-) diff --git a/client/src/services/player/PlayerWrapper.ts b/client/src/services/player/PlayerWrapper.ts index 551c5dbc..3501059c 100644 --- a/client/src/services/player/PlayerWrapper.ts +++ b/client/src/services/player/PlayerWrapper.ts @@ -923,8 +923,6 @@ class PlayerWrapper { * player_store.event_emitter.emit('PlayerRestartRequired', 'プレイヤーロジックを再起動しています…') のようにイベントを発火させるべき */ public async destroy(): Promise { - assert(this.player !== null); - assert(this.player_container_resize_observer !== null); const player_store = usePlayerStore(); // すでに破棄されているのに再度実行してはならない @@ -947,12 +945,14 @@ class PlayerWrapper { // ローディング状態への移行に伴い、映像がフェードアウトするアニメーション (0.2秒) 分待ってから実行 // この 0.2 秒の間に音量をフェードアウトさせる // なお、ザッピングでチャンネルを連続で切り替えている場合は実行しない (実行しても意味がないため) - const current_volume = this.player.user.get('volume'); - // 20回 (0.01秒おき) に分けて音量を下げる - for (let i = 0; i < 20; i++) { - await Utils.sleep(0.01); - if (this.player?.video) { - this.player.video.volume = current_volume * (1 - (i + 1) / 20); + if (this.player !== null) { + const current_volume = this.player.user.get('volume'); + // 20回 (0.01秒おき) に分けて音量を下げる + for (let i = 0; i < 20; i++) { + await Utils.sleep(0.01); + if (this.player && this.player.video) { // この行がないとタイミングによってはエラーになる + this.player.video.volume = current_volume * (1 - (i + 1) / 20); + } } } @@ -961,17 +961,21 @@ class PlayerWrapper { window.clearTimeout(this.player_control_ui_hide_timer_id); // プレイヤー全体のコンテナ要素の監視を停止 - this.player_container_resize_observer.disconnect(); - this.player_container_resize_observer = null; + if (this.player_container_resize_observer !== null) { + this.player_container_resize_observer.disconnect(); + this.player_container_resize_observer = null; + } // DPlayer 本体を破棄 // なぜか例外が出ることがあるので try-catch で囲む - try { - this.player.destroy(); - } catch (e) { - // 何もしない + if (this.player !== null) { + try { + this.player.destroy(); + } catch (e) { + // 何もしない + } + this.player = null; } - this.player = null; // 破棄済みかどうかのフラグを立てる this.destroyed = true; diff --git a/client/src/services/player/managers/LiveEventManager.ts b/client/src/services/player/managers/LiveEventManager.ts index 6f28c5ac..0e96cf9d 100644 --- a/client/src/services/player/managers/LiveEventManager.ts +++ b/client/src/services/player/managers/LiveEventManager.ts @@ -1,5 +1,4 @@ -import assert from 'assert'; import DPlayer from 'dplayer'; @@ -263,11 +262,12 @@ class LiveEventManager implements PlayerManager { * サーバー側のライブストリームステータス API (Server-Sent Events) への接続を切断し、ライブストリームのステータス監視を停止する */ public async destroy(): Promise { - assert(this.eventsource !== null); // EventSource を破棄し、Server-Sent Events のストリーミングを終了する - this.eventsource.close(); - this.eventsource = null; + if (this.eventsource !== null) { + this.eventsource.close(); + this.eventsource = null; + } } } diff --git a/client/src/views/TV/Watch2.vue b/client/src/views/TV/Watch2.vue index 9e0c6abf..ce0c8212 100644 --- a/client/src/views/TV/Watch2.vue +++ b/client/src/views/TV/Watch2.vue @@ -263,10 +263,6 @@ export default Vue.extend({ // ザッピング(「前/次のチャンネル」ボタン or 上下キーショートカット)によるチャンネル移動かどうか is_zapping: false, - // ザッピングで連続してチャンネルを切り替えている最中かどうか - // 「連続して」とは、切り替える間隔が 0.5 秒以下で、再生セッションが初期化される前に次のチャンネルに切り替えたときのこと - is_zapping_continuously: false, - // ***** プレイヤー ***** // PlayerWrapper のインスタンス @@ -407,10 +403,6 @@ export default Vue.extend({ // 前の再生セッションを破棄して終了する const destroy_promise = this.destroy(); - // 連続してチャンネルを切り替えていることを示すフラグを立てる - // このフラグは再生セッションが初期化されるタイミングで必ず降ろされる - this.is_zapping_continuously = true; - // チャンネル ID を次のチャンネルのものに切り替える this.channelsStore.display_channel_id = to.params.display_channel_id; @@ -422,13 +414,11 @@ export default Vue.extend({ if (this.is_zapping === true) { this.is_zapping = false; this.interval_ids.push(window.setTimeout(() => { - this.is_zapping_continuously = false; // 新しいセッションを初期化するので、フラグを下ろす destroy_promise.then(() => this.init()); // destroy() の実行完了を待ってから初期化する }, 0.5 * 1000)); // 通常のチャンネル移動時は、すぐに再生セッションを初期化する } else { - this.is_zapping_continuously = false; // 新しいセッションを初期化するので、フラグを下ろす destroy_promise.then(() => this.init()); // destroy() の実行完了を待ってから初期化する } })();