Mirakurun
Mirakurun copied to clipboard
番組がリスケジュールされた際に、必要な番組まで削除される不具合を修正
バグの内容
番組スケジュールが変更になった際に放送時間の重なりをチェックして番組を削除しているが、必要な番組まで削除されてしまう
バグの原因
例えば、スポーツ番組などで放送時間が延長された場合、後続番組との重なりは避けられないので、"Forrowing"の番組も含めて削除される場合がある 以降受信するEIT[p/f]やEIT[schedle]で番組情報が復活されることが望まれるが、重なりが生じて削除された番組はProgramクラスが保持している情報にすでに存在しないため、以下に示すコードの229行目の"set"が失敗する(例外としてはEIT[schedule]からEIT[p/f]へテープルが移行した番組はこの限りではない) https://github.com/Chinachu/Mirakurun/blob/31b22cc83cb2166c117a2fba8f2499d467750dc8/src/Mirakurun/EPG.ts#L217-L236 また、Following番組の開始が早まった場合、EIT[p]よりもEIT[f]を先に受信してしまうと、Following番組でPresent番組が削除されてしまう https://github.com/Chinachu/Mirakurun/blob/31b22cc83cb2166c117a2fba8f2499d467750dc8/src/Mirakurun/Program.ts#L187-L193
改善内容
- Programオブジェクトに"Present","Following"を識別できるプロパティを追加し、"Following"と"Present"を識別することで"Present"が削除されない様にする
- 番組の延長などにより一旦削除されても直後に受信するEITにより完全なプログラム情報を提供できるよう、削除した番組情報を一時保管するバッファを用意し、削除済みの番組に対して"add"が呼ばれないで再び"set"メソッドが呼ばれたら一時保管バッファに保管していた情報を戻して処理する
- 放送番組の変更(例えばスポーツ番組が中止になり、他の番組に差し替えなど)が発生じた際の削除では、一時保管バッファに溜まったままになるので、gcを実行するタイミングで一時保管バッファから削除する