ニコ生→Googleカレンダー

    
      
  • /*
     * @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$ */
    
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。

History

  1. 2014/08/27 00:57:56 - 2014-08-27
  2. 2013/04/14 13:18:13 - 2013-04-14