/*
* @title ニコ生→Googleカレンダー
* @description SmartySmileページ情報を利用してニコ生の予定をGoogleカレンダーに登録します
* @include http://smartysmile.jp/entry/*
* @license MIT License
* @require
*/
// see: https://developers.google.com/google-apps/calendar/?hl=ja
// samples: http://ch.nicovideo.jp/2013spring-anime
/*
使い方:
1.ニコニコ生放送のページを開く (http://live.nicovideo.jp/watch/lv*)
2.ここからだと終了時間が拾えないので、時計アイコンからSmartySmileページを開く
3.予定を作る画面が出たらそこでこのブックマークレットを起動
4.Googleカレンダーに予定を追加する画面が開くので追加
NOTE: SmartySmileに会員登録しているかどうかは関係有りません。
たんにそのページから終了時間を拾いたいだけです。
*/
(function(){
var title = document.querySelector("#basefrm .event_description").innerText.replace(/\n.*/g,""),
url = document.querySelector("#basefrm .event_description a[href^='http://live.nicovideo.jp/watch/lv']").href,
bigs = document.querySelectorAll("#basefrm .big"),
yyyymmdd = bigs[0].innerText, // 2013/04/11
from_HHMM = bigs[1].innerText, // 23:20
to_HHMM = bigs[2].innerText, // 24:00
gcalep_link, // 以降で決定する
m,
pad = function(digit) {
if(digit.toString().length==1) digit="0"+digit.toString();
return digit;
},
to_utcdigit = function(jst) { // String jst
var date, incl_date=false;
// TODO: 月初や末日バグ等が無いかチェック
if(m=jst.match(/ (2[4-9]):([0-9][0-9])/)) {
incl_date = true;
//jst = jst.replace(/ 2[4-9]:[0-9][0-9]/, " "+pad(parseInt(m[1])%24)+":"+m[2]); // NOTE: Chromeだと"%"と数字の連結でURLエスケープとみなされる場合がある(全体をURLエスケープせずpackされると危ない)
jst = jst.replace(/ 2[4-9]:[0-9][0-9]/, " "+pad(parseInt(m[1])-24)+":"+m[2]);
}
//console.log("jst="+jst);
date = new Date(jst); // valid JST Date string
if(incl_date){
date.setDate(date.getDate()+1);
}
//console.log("dated_jst="+date.toString());
//console.log("incl_date is " + (incl_date?"true":"false"));
return(date.getUTCFullYear().toString()+pad(date.getUTCMonth()+1)+pad(date.getUTCDate())+"T"+pad(date.getUTCHours())+pad(date.getUTCMinutes())+pad(date.getUTCSeconds())+"Z");
},
gen_gcalep_link = function(arg) {
// args: text, url, desc, location,
// from, to (valid Date object)
var gparam = {};
var gparam_array = [];
var gparam_keys = ["action", "text", "dates", "sprop", "details", "location"];
var gev_url_base = "http://www.google.com/calendar/event?";
var from = arg["from"];
var to = arg["to"];
//console.log("from="+from+" to="+to);
var dates = to_utcdigit(from)+"/"+to_utcdigit(to);
//console.log("dates="+dates);
gparam["action"] = arg["action"] || "TEMPLATE";
gparam["text"] = arg["text"];
gparam["dates"] = dates;
gparam["sprop"] = arg["url"].replace(/^http:/,"website:");
gparam["details"] = arg["url"]+"\n"+(arg["desc"]||"");
gparam["location"] = arg["location"];
gparam_keys.forEach(
function(key){
gparam_array.push(key+"="+encodeURIComponent(gparam[key]));
}
);
return(gev_url_base+gparam_array.join("&"));
};
//console.log("generate gcalep_link");
gcalep_link = gen_gcalep_link({
"text": title,
"url": url,
"desc": "", //url,
"location": "ニコニコ生放送",
"from": yyyymmdd+" "+from_HHMM,
"to": yyyymmdd+" "+to_HHMM
});
//console.log("gcalep_link is "+gcalep_link);
window.open(gcalep_link);
})();
/** $Debug-Rev$ */