追っかけ配信ではない、かつ再生中、かつニコ生ゲーム中の場合に、シークバー移動をブロックすることで、意図せず追っかけ配信へ切り替わってしまう問題に対処します。
// ==UserScript==
// @name ニコ生ゲーム中のシークバー移動を防止
// @description 追っかけ配信ではない、かつ再生中、かつニコ生ゲーム中の場合に、シークバー移動をブロックすることで、意図せず追っかけ配信へ切り替わってしまう問題に対処します。
// @namespace https://greasyfork.org/users/137
// @version 1.2.0
// @match https://live.nicovideo.jp/watch/lv*
// @license MPL-2.0
// @contributionURL https://www.amazon.co.jp/registry/wishlist/E7PJ5C3K7AM2
// @compatible Edge
// @compatible Firefox 推奨
// @compatible Opera
// @compatible Chrome
// @grant dummy
// @noframes
// @icon https://nicolive.cdn.nimg.jp/relive/party1-static/images/common/favicon.3cf1c.ico
// @author 100の人
// @homepageURL https://greasyfork.org/users/137
// ==/UserScript==
'use strict';
const SEEK_CONTROLLERS_SELECTOR = '[class*="seek-controller"], [class*="head-button"], [class*="back-button"]';
document.head.insertAdjacentHTML('beforeend', `<style>
:is(${SEEK_CONTROLLERS_SELECTOR})[aria-disabled="true"]::after {
content: "";
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
cursor: not-allowed;
}
</style>`);
const seekControllers = document.querySelectorAll(SEEK_CONTROLLERS_SELECTOR);
const playButton = document.querySelector('[class*="play-button"]');
let liveStatus = document.querySelector('[data-live-status]');
const lockItemArea = document.querySelector('[class*="lock-item-area"]');
function switchEnabled()
{
const ariaDisabled = /* 追っかけ再生中ではない */ liveStatus.dataset.liveStatus === 'live'
&& /* 再生中 */ playButton.dataset.toggleState === 'true'
&& /* ゲーム中 */ lockItemArea.querySelector('[data-content-type="game"], [data-content-type="akasha"]')
? 'true'
: 'false';
for (const controller of seekControllers) {
controller.setAttribute('aria-disabled', ariaDisabled);
}
}
new Promise(function (resolve) {
if (liveStatus) {
resolve();
return;
}
new MutationObserver(function (mutations, observer) {
liveStatus = document.querySelector('[data-live-status]');
if (liveStatus) {
observer.disconnect();
resolve();
}
}).observe(document.querySelector('[class*="time-status-area"]'), { childList: true });
}).then(function () {
switchEnabled();
new MutationObserver(switchEnabled).observe(liveStatus, { attributeFilter: [ 'data-live-status' ] });
new MutationObserver(switchEnabled).observe(playButton, { attributeFilter: [ 'data-toggle-state' ] });
new MutationObserver(switchEnabled).observe(lockItemArea, { childList: true });
});