AbemaTV番組→Googleカレンダー

    @@ -15,7 +15,7 @@ zerofill(date.getUTCMinutes()) + zerofill(date.getUTCSeconds()) + 'Z'; -}; +}; var zerofill = function(num){ return ('0'+num).slice(-2); }; @@ -41,7 +41,19 @@ return now; })(); var date_pair = (function(){ - var digits = document.querySelectorAll(".com-tv-SlotHeader__air-time span")[0].innerText.match(/(\d+)/g); + var digits; + var node = document.querySelectorAll(".com-tv-SlotHeader__air-time span")[0]; + /* node が見つからない場合、body 全体から探す */ + if ( !node ) { + console.log("bookmarklet: air-time selector is not found. whole search mode."); + digits = document.body.innerText.match(/(\d+)月(\d+)日\(\S+\) +(\d+):(\d+) *〜 *(\d+)月(\d+)日\(\S+\) (\d+):(\d+)/); + if ( !digits ) { + digits = document.body.innerText.match(/(\d+)月(\d+)日\(\S+\) +(\d+):(\d+) *〜 *(\d+):(\d+)/); + } + if ( digits ) digits.shift(); + } else { + digits = node.innerText.match(/(\d+)/g); + } if ( digits.length == 6 ) { var base_date = now.year.toString() + '-' +
  • /*
     * @title AbemaTV番組→Googleカレンダー
     * @description AbemaTVの番組ページで実行すると番組放送予定をGoogleカレンダーに登録します
     * @include https://abema.tv/channels/abema-anime/slots/*
     * @license MIT License
     * @require 
     */
    var getUTC = function(date_str){
        var date = new Date(date_str);
        return date.getUTCFullYear() +
            zerofill(date.getUTCMonth()+1) +
            zerofill(date.getUTCDate()) +
            'T' +
            zerofill(date.getUTCHours()) +
            zerofill(date.getUTCMinutes()) +
            zerofill(date.getUTCSeconds()) +
            'Z';
    };
    var zerofill = function(num){
        return ('0'+num).slice(-2);
    };
    var get_url = function(param){
        var base = 'http://www.google.com/calendar/event?';
        return base + 
            'action=TEMPLATE' + 
            '&text='     + encodeURIComponent(param.title) +
            '&details='  + encodeURIComponent(param.details||'') +
            '&location=' + encodeURIComponent(param.location||'') +
            '&dates='    + getUTC(param.sdate) + '/' + getUTC(param.edate) +
            '&sprop='    + encodeURIComponent(param.sprop||'');
    };
    var now = (function(){
        var dnow = new Date;
        var now = {};
        var keys = ["getFullYear", "getMonth", "getDate", "getHours", "getMinutes"];
        for (var i = 0; i < keys.length; i++ ) {
            var method = keys[i];
            var key    = method.match(/[A-Z][a-z]+$/)[0].toLocaleLowerCase();
            now[key] = dnow[method]();
        }
        return now;
    })();
    var date_pair = (function(){
        var digits;
        var node = document.querySelectorAll(".com-tv-SlotHeader__air-time span")[0];
        /* node が見つからない場合、body 全体から探す */
        if ( !node ) {
            console.log("bookmarklet: air-time selector is not found. whole search mode.");
            digits = document.body.innerText.match(/(\d+)月(\d+)日\(\S+\) +(\d+):(\d+) *〜 *(\d+)月(\d+)日\(\S+\) (\d+):(\d+)/);
            if ( !digits ) {
                digits = document.body.innerText.match(/(\d+)月(\d+)日\(\S+\) +(\d+):(\d+) *〜 *(\d+):(\d+)/);
            }
            if ( digits ) digits.shift();
        } else {
            digits = node.innerText.match(/(\d+)/g);
        }
        if ( digits.length == 6 ) {
            var base_date = 
                now.year.toString() + '-' +
                zerofill(digits[0]) + '-' +
                zerofill(digits[1]) + 'T';
            var sdate = base_date +
                zerofill(digits[2]) + ':' +
                zerofill(digits[3]) + ':00+09:00';
            var edate = base_date +
                zerofill(digits[4]) + ':' +
                zerofill(digits[5]) + ':00+09:00';
            return [sdate, edate];
        }
        if ( digits.length == 8 ) {
            var sdate =
                now.year.toString() + '-' +
                zerofill(digits[0]) + '-' +
                zerofill(digits[1]) + 'T' +
                zerofill(digits[2]) + ':' +
                zerofill(digits[3]) + ':00+09:00';
            var edate =
                now.year.toString() + '-' +
                zerofill(digits[4]) + '-' +
                zerofill(digits[5]) + 'T' +
                zerofill(digits[6]) + ':' +
                zerofill(digits[7]) + ':00+09:00';
            return [sdate, edate];
        }
        throw "date_pair error";
    })();
    var title = document.querySelectorAll(".com-tv-SlotHeader__title span")[0].innerText;
    var channel = document.querySelectorAll(".com-tv-SlotHeader__channel-name span")[0].innerText
    ;
    var details = location.href;
    var url = get_url({
        title: title,
        details: details,
        location: "AbemaTV " + channel,
        sdate: date_pair[0],
        edate: date_pair[1],
        sprop: location.href
    });
    open(url);
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。

History

  1. 2019/04/06 14:19:34 - 2019-04-06
  2. 2019/02/22 00:04:59 - 2019-02-22
  3. 2019/02/21 23:43:54 - 2019-02-21