// ==UserScript==
// @name nicolive_autoclose
// @namespace nicolive_autoclose
// @description 放送が終わって30分以内のニコ生視聴ページを自動で閉じる
// @include http://live.nicovideo.jp/watch/*
// @version 2013.03.16
// @grant none
// ==/UserScript==
// checkElapsedTime() 戻り値
var ELAPSED_BEFOREENDING = -1;
var ELAPSED_LESSTHAN30MINUTES = 0;
var ELAPSED_MORETHAN30MINUTES = 1;
var MILISECONDS_FOR_1MINUTE = ( 1000 * 60 );
var MILISECONDS_FOR_1DAY = ( MILISECONDS_FOR_1MINUTE * 60 * 24 );
window.onload = main;
//
// onloadイベントハンドラ
//
function main() {
// おまけの自動スクロール処理
window.scrollTo( 0, 200 );
var html = document.documentElement.innerHTML;
closeWindowIfLessThan30MinutesElapsedAfterEnding( html );
}
//
// 放送終了から30分以内ならウィンドウを閉じる
//
function closeWindowIfLessThan30MinutesElapsedAfterEnding( html ) {
// 開いている放送の関連日時を取得
var ssDateStart = html.match( // )[0].substr( 34, 10 );
var ssDateEnd = ssDateStart
var ssTimeStart = html.match( // )[0].substr( 35, 5 );
var ssTimeEnd = html.match( // )[0].substr( 33, 5 );
// 時刻の表記が24:00以降なら修正。必要なら日付も修正
var timeStart = validateTimeStr( ssTimeStart );
var timeEnd = validateTimeStr( ssTimeEnd );
var msStart = ( new Date( ssDateStart + " " + timeStart ) ).getTime();
var msEnd = ( new Date( ssDateEnd + " " + timeEnd ) ).getTime();
if ( timeStart !== ssTimeStart ) { // 開始が24時以降
// 日付も修正
msStart += MILISECONDS_FOR_1DAY;
msEnd += MILISECONDS_FOR_1DAY;
} else { // 開始が24時より前
if ( timeEnd !== ssTimeEnd ) { // 終了が24時以降
msEnd += MILISECONDS_FOR_1DAY;
} else { // 終了が24時より前
if ( msStart > msEnd ) { // 終了が開始より早い=ありえない
msEnd += MILISECONDS_FOR_1DAY;
}
}
}
// 現在時刻と放送の終了時刻を比較
var msNow = Date.now();
var status = checkElapsedTime( msEnd, msNow );
if ( status === ELAPSED_BEFOREENDING ) { // 放送終了前
// alert( "放送終了前です:" );
// 放送の終了予定時刻(頃)にページをリロード
setTimeout(
function(){ window.location.reload(true); },
( msEnd - msNow + ( MILISECONDS_FOR_1MINUTE * 2 ) )
);
} else if ( status === ELAPSED_LESSTHAN30MINUTES ) { // 放送終了から30分以内
// alert( "放送終了から30分以内なので閉じます" );
window.close();
} else {
// alert( "放送終了から30分以上経過しています" );
}
}
//
// 放送終了日時からの経過時間をチェック
//
function checkElapsedTime( msEnd, msNow ) {
if ( msNow < msEnd ) { // 放送終了前
return ELAPSED_BEFOREENDING;
} else if ( ( msNow - msEnd ) < ( MILISECONDS_FOR_1MINUTE * 30 ) ) { // 放送終了から30分以内
return ELAPSED_LESSTHAN30MINUTES;
} else { // 放送終了から30分以降
return ELAPSED_MORETHAN30MINUTES;
}
}
//
// 時刻文字列が24:00以降なら正しい表記(00:00~23:59)に修正
//
function validateTimeStr( timeStr ) {
var newTime = timeStr;
var hour = Number( timeStr.substr( 0, 2 ) );
if ( hour > 23 ) {
hour = hour - 24;
hour = hour.toString();
if ( hour.length < 2 ) {
hour = "0" + hour;
}
newTime = hour + timeStr.substr( 2 );
}
return newTime;
}