bangumi new game subject helper

assist to create new game subject

// ==UserScript==
// @name        bangumi new game subject helper
// @name:zh-CN  bangumi创建黄油条目助手
// @namespace   https://github.com/22earth
// @description assist to create new game subject
// @description:zh-cn 辅助创建Bangumi黄油条目
// @include     http://www.getchu.com/soft.phtml?id=*
// @include     /^https?:\/\/(bangumi|bgm|chii)\.(tv|in)\/.*$/
// @include     /^https?:\/\/erogamescape\.(?:ddo\.jp|dyndns\.org)\/~ap2\/ero\/toukei_kaiseki\/(.*)/
// @include     http://122.219.133.135/~ap2/ero/toukei_kaiseki/*
// @include     http://www.dmm.co.jp/dc/pcgame/*
// @version     0.3.12
// @note        0.3.0 增加上传人物肖像功能,需要和bangumi_blur_image.user.js一起使用
// @note        0.3.1 增加在Getchu上点击检测条目是否功能存在,若条目存在,自动打开条目页面。
// @note        0.3.3 增加添加Getchu游戏封面的功能,需要和bangumi_blur_image.user.js一起使用
// @run-at      document-end
// @grant       GM_setValue
// @grant       GM_getValue
// @grant       GM_addStyle
// @grant       GM_openInTab
// @grant       GM_registerMenuCommand
// @grant       GM_xmlhttpRequest
// @require     https://cdn.staticfile.org/jquery/2.1.4/jquery.min.js
// @require     https://cdn.staticfile.org/fuse.js/2.6.2/fuse.min.js
// ==/UserScript==


/******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId]) {
/******/ 			return installedModules[moduleId].exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			i: moduleId,
/******/ 			l: false,
/******/ 			exports: {}
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.l = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// define getter function for harmony exports
/******/ 	__webpack_require__.d = function(exports, name, getter) {
/******/ 		if(!__webpack_require__.o(exports, name)) {
/******/ 			Object.defineProperty(exports, name, {
/******/ 				configurable: false,
/******/ 				enumerable: true,
/******/ 				get: getter
/******/ 			});
/******/ 		}
/******/ 	};
/******/
/******/ 	// getDefaultExport function for compatibility with non-harmony modules
/******/ 	__webpack_require__.n = function(module) {
/******/ 		var getter = module && module.__esModule ?
/******/ 			function getDefault() { return module['default']; } :
/******/ 			function getModuleExports() { return module; };
/******/ 		__webpack_require__.d(getter, 'a', getter);
/******/ 		return getter;
/******/ 	};
/******/
/******/ 	// Object.prototype.hasOwnProperty.call
/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(__webpack_require__.s = 1);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


function gmFetchBinary(url, TIMEOUT) {
  return new Promise(function (resolve, reject) {
    GM_xmlhttpRequest({
      method: "GET",
      timeout: TIMEOUT || 10 * 1000,
      url: url,
      overrideMimeType: "text\/plain; charset=x-user-defined",
      onreadystatechange: function onreadystatechange(response) {
        if (response.readyState === 4 && response.status === 200) {
          resolve(response.responseText);
        }
      },
      onerror: function onerror(err) {
        reject(err);
      },
      ontimeout: function ontimeout(err) {
        reject(err);
      }
    });
  });
}

function gmFetch(url, TIMEOUT) {
  return new Promise(function (resolve, reject) {
    GM_xmlhttpRequest({
      method: "GET",
      timeout: TIMEOUT || 10 * 1000,
      url: url,
      onreadystatechange: function onreadystatechange(response) {
        if (response.readyState === 4 && response.status === 200) {
          resolve(response.responseText);
        }
      },
      onerror: function onerror(err) {
        reject(err);
      },
      ontimeout: function ontimeout(err) {
        reject(err);
      }
    });
  });
}

module.exports = {
  gmFetch: gmFetch,
  gmFetchBinary: gmFetchBinary
};

/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

var searchBangumiSubject = __webpack_require__(2);
var getImageBase64 = __webpack_require__(5);

;(function () {
  if (window.top != window.self) return;
  function setDomain() {
    bgm_domain = prompt('预设bangumi的域名是 "' + 'bangumi.tv' + '". 根据需要输入chii.in或者bgm.tv', 'bgm.tv');
    GM_setValue('bgm', bgm_domain);
    return bgm_domain;
  }
  var bgm_domain = GM_getValue('bgm') || '';
  if (!bgm_domain.length || !bgm_domain.match(/bangumi\.tv|chii\.in|bgm\.tv/)) {
    bgm_domain = setDomain();
    bgm_domain = GM_getValue('bgm');
  }
  if (GM_registerMenuCommand) {
    GM_registerMenuCommand('\u8BBE\u7F6E\u57DF\u540D', setDomain, 'b');
  }
  var addStyle = function addStyle(css) {
    if (css) {
      GM_addStyle(css);
    } else {
      GM_addStyle(['.new-character,.new-subject,.search-subject,.fill-form{color: rgb(0, 180, 30) !important;margin-left: 4px !important;}', '.new-character:hover,.new-subject:hover,.search-subject:hover,.fill-form:hover{color:red !important;cursor:pointer;}'].join(''));
    }
  };
  var getchu = {
    init: function init() {
      if (getchu.isGamepage()) {
        addStyle();
        this.addNode();
        registerEvent(this);
        //GM_setValue('subjectData', JSON.stringify(this.getSubjectInfo()));
      }
    },
    isGamepage: function isGamepage() {
      if ($('.genretab.current').length && $('.genretab.current')) return true;
    },
    getSubjectInfo: function getSubjectInfo() {
      var info = {};
      var adict = [{
        "定価": "售价",
        "発売日": "发行日期",
        "ジャンル": "游戏类型"
      }, {
        "ブランド": "开发",
        "原画": "原画",
        "音楽": "音乐",
        "シナリオ": "剧本",
        "アーティスト": "主题歌演出",
        "作詞": "主题歌作词",
        "作曲": "主题歌作曲"
      }];
      info.subjectName = $('#soft-title').text().split('\n')[1].replace(/<?初回.*$|廉価.*$/g, '').trim();
      var $infoTable = $('#soft_table table').eq(0).find('tr');
      $infoTable.each(function (index, element) {
        var alist = [];
        var elem = $(element);
        if (index === 0) {
          alist[0] = 'ブランド';
          alist[1] = elem.text().split('\n')[0].replace('ブランド:', '');
        }
        if (index === 2) {
          alist = elem.text().replace(/\s*/g, '').split(':');
        }
        if (!alist.length) {
          alist = elem.text().split(':');
        }
        if (index > 8 && alist[0].match(/作詞\/作曲/)) {
          var templist1 = alist[0].split('/');
          var templist2 = alist[1].split('/');
          info[templist1[0]] = templist2[0];
          info[templist1[1]] = templist2[1] ? templist2[1] : templist2[0];
        }
        if (!adict[0].hasOwnProperty(alist[0]) && !adict[1].hasOwnProperty(alist[0])) {
          return;
        }
        if (alist.length) {
          info[alist[0]] = alist[1];
        }
      });
      $('div.tabletitle:lt(4)').each(function (index, element) {
        var elem = $(element);
        if (index === 0 && elem.text().match(/商品紹介/)) {
          info.subjectStory = $(this).next().text().replace(/^\s*[\r\n]/gm, '');
        }
        if (elem.text().match(/ストーリー/)) {
          info.subjectStory = $(this).next().text().replace(/^\s*[\r\n]/gm, '');
        }
      });
      var cvlist = [];
      $('.chara-name').each(function (index, element) {
        var elem = $(element);
        if (elem.text().match("CV")) {
          cvlist.push(elem.text().replace(/.*CV:|新建角色/g, ''));
        }
      });
      info.cv = cvlist.join(',');
      //console.log(info);
      // store img data
      var $a = $('#soft_table .highslide').eq(0);
      if ($a.length) {
        info.subjectCoverURL = $a[0].href;
      }
      return info;
    },
    addNode: function addNode() {
      // new subject
      var $th = $('#soft-title').parent();
      $th.append($('<a>').attr({
        class: 'new-subject',
        target: '_blank',
        href: '//' + bgm_domain + '/new_subject/4'
      }).text('\u65B0\u5EFA\u6761\u76EE'));
      // search subject
      $th.append($('<a>').attr({
        class: 'search-subject e-userjs-search-cse',
        target: '_blank',
        href: 'https://cse.google.com/cse/home?cx=008561732579436191137:pumvqkbpt6w'
      }).text('Google CSE\u641C\u7D22\u6761\u76EE'));
      // new search method
      $th.append($('<a>').attr({
        class: 'search-subject e-userjs-search-subject',
        title: '检测条目是否存在',
        href: '#'
      }).text('检测条目是否存在'));
      // add new character
      $('h2.chara-name').append($('<a>').attr({
        class: 'new-character',
        target: '_blank',
        href: '//' + bgm_domain + '/character/new'
      }).text('\u65B0\u5EFA\u89D2\u8272'));
    },
    getCharacterInfo: function getCharacterInfo(target) {
      var charaData = {};
      var $target = $(target);

      var $charaName = $(target).parent();
      if ($charaName.find('charalist').length) {
        var name = $charaName.find('charalist').text();
        charaData.characterName = name.replace(/\s/, '');
        charaData['日文名'] = name;
      } else {
        var _name = target.previousSibling.textContent;
        charaData['日文名'] = _name.split(/(|\(|\sCV|新建角色/)[0];
        charaData.characterName = charaData['日文名'].replace(/\s/, '');
      }
      var $p = $target.closest('dt');
      var $intro = $p.next('dd');
      var $clonedIntro = $intro.clone();
      $clonedIntro.children('span[style^="font-weight"]').remove();
      charaData.characterIntro = $clonedIntro.text().trim();

      $intro.children('span[style^="font-weight"]').each(function (idx, elem) {
        var t = $(elem).text();
        var alist = t.trim().split(/:|:/);
        if (alist.length === 2) charaData[alist[0]] = alist[1];
        if (alist.length > 2) {
          t.split(/\s/).forEach(function (element) {
            var alist = element.trim().split(/:|:/);
            if (alist.length === 2) charaData[alist[0]] = alist[1];
          });
        }
        var c = t.match(/(?:スリーサイズ.)(B.*W.*H\d\d)/);
        if (c && c.length > 1) {
          charaData['スリーサイズ'] = c[1];
        }
      });
      // get hiragana name, cv
      var charatext = $p.text();
      if (charatext.match(/((.*))/)) charaData.hiraganaName = charatext.match(/((.*))/)[1];
      if (charatext.match("CV")) {
        charaData.CV = charatext.replace(/.*CV[::]|新建角色/g, '');
      }
      // store img data
      var $img = $target.closest('tr').find('td>img');
      var getBase64Image = function getBase64Image(img) {
        var canvas = document.createElement("canvas");
        canvas.width = img.width;
        canvas.height = img.height;
        var ctx = canvas.getContext("2d");
        ctx.drawImage(img, 0, 0, img.width, img.height);
        var dataURL = canvas.toDataURL("image/png");
        return dataURL;
      };
      if ($img.length) {
        charaData.characterImg = getBase64Image($img[0]);
      }
      return charaData;
    }
  };

  function registerEvent(self) {
    $('.e-userjs-search-cse').click(function (e) {
      e.preventDefault();
      var s = self.getSubjectInfo();
      var name = encodeURIComponent(s.subjectName);
      GM_openInTab('https://cse.google.com/cse/publicurl?cx=008561732579436191137:pumvqkbpt6w&query=' + name);
    });
    $('.e-userjs-search-subject').click(function (e) {
      e.preventDefault();
      var subject = self.getSubjectInfo();
      var subjectInfo = {
        subjectName: subject.subjectName,
        startDate: subject['発売日']
      };
      searchBangumiSubject.fetchBangumiDataBySearch(subjectInfo).then(function (i) {
        if (i) return i;
        return searchBangumiSubject.fetchBangumiDataByDate(subjectInfo);
      }).then(function (i) {
        console.log('搜索结果: ', i);
        var $search = $('.e-userjs-search-subject');
        $search.text('条目存在');
        $search.attr('href', i.subjectURL);
        $search.attr('target', '_blank');
        $search.unbind('click');
        GM_openInTab(i.subjectURL);
      }).catch(function (r) {
        console.log(r);
      });
      //fetchBangumiData(subjectInfo);
    });
    function saveSubjectInfo(e) {
      e.preventDefault();
      var s = self.getSubjectInfo();
      console.log('条目信息: ', s);
      GM_setValue('subjectData', JSON.stringify(s));
      GM_openInTab($(this).attr('href'));
    }
    function saveCharacterInfo(e) {
      e.preventDefault();
      var s = self.getSubjectInfo();
      GM_setValue('subjectData', JSON.stringify(s));
      console.info('条目信息: ', s);
      GM_setValue('charaData', JSON.stringify(self.getCharacterInfo(this)));
      GM_openInTab($(this).attr('href'));
    }
    $('.new-subject').click(saveSubjectInfo);
    $('.new-character').click(saveCharacterInfo);
  }

  var bangumi = {
    init: function init() {
      addStyle();
      this.subjectSearch.init();
      var re = new RegExp(['new_subject', 'add_related', 'character\/new', 'upload_img'].join('|'));
      var page = document.location.href.match(re);
      if (page) {
        switch (page[0]) {
          case 'new_subject':
            // 非添加新书页面返回
            if (!/new_subject\/4/.test(document.location.pathname)) return;
            this.newSubject();
            break;
          case 'add_related':
            this.addRelated();
            break;
          case 'character\/new':
            this.newCharacter();
            break;
          case 'upload_img':
            this.addSubjectCover();
            break;
        }
      }
    },
    fillForm: function fillForm(data) {
      var pNode = $('.settings .inputtext').eq(0);
      if (data.subjectName && pNode) {
        pNode.val(data.subjectName);
      }
      if (data.subjectStory) {
        $('#subject_summary').val(data.subjectStory);
      }
      setTimeout(function () {
        $('#showrobot').click();
      }, 300);
      var handleClick = function handleClick() {
        window.NormaltoWCODE();
        setTimeout(function () {
          if ($('#subject_infobox')) {
            var infobox = ["{{Infobox Game", "|中文名=", "|平台={", "[PC]", "}", "|游玩人数=1"];
            var infodict = {
              "ブランド": "开发",
              "原画": "原画",
              "音楽": "音乐",
              "シナリオ": "剧本",
              "アーティスト": "主题歌演出",
              "作詞": "主题歌作词",
              "作曲": "主题歌作曲",
              "発売日": "发行日期",
              "ジャンル": "游戏类型",
              "定価": "售价"
            };
            for (var prop in infodict) {
              if (data[prop]) {
                infobox.push("|item=".replace("item", infodict[prop]) + data[prop]);
              }
            }
            infobox.push("}}");
            $('#subject_infobox').val(infobox.join('\n'));
            window.WCODEtoNormal();
            $('[name=subject_nsfw]').attr('checked', true);
          }
        }, 1000);
      };
      $('.fill-form').click(handleClick);
      var autoFillForm = function autoFillForm(handler) {
        var config = { attributes: true, childList: true, subtree: true };
        var callback = function callback() {
          handler();
          window.E_USERJS_OBSERVER.disconnect();
        };
        var targetNode = document.querySelector('#infobox_normal');
        window.E_USERJS_OBSERVER = new MutationObserver(callback);
        E_USERJS_OBSERVER.observe(targetNode, config);
      };
      autoFillForm(handleClick);
    },
    fillFormCharacter: function fillFormCharacter(data) {
      var pNode = $('.settings .inputtext').eq(0);
      if (data.characterName && pNode) {
        pNode.val(data.characterName);
      }
      if (data.characterIntro) {
        $('#crt_summary').val(data.characterIntro);
      }
      setTimeout(function () {
        $('#showrobot').click();
      }, 300);
      var handleClick = function handleClick() {
        window.NormaltoWCODE();
        if ($('#preview').length) {
          var canvas = document.getElementById('preview');
          var ctx = canvas.getContext('2d');
          var image = new Image();
          image.onload = function () {
            canvas.width = image.width;
            canvas.height = image.height;
            ctx.drawImage(image, 0, 0);
          };
          image.src = data.characterImg;
        }
        setTimeout(function () {
          if ($('#subject_infobox')) {
            var infobox = ["{{Infobox Crt", "|简体中文名= ", "|别名={", "[第二中文名|]", "[英文名|]"];
            var crt_infodict = {
              '年齢': '年龄',
              '誕生日': '生日',
              '血液型': '血型',
              '身長': '身高',
              'スリーサイズ': 'BWH'
            };
            infobox.push("[日文名|" + data['日文名'] + "]");
            if (data.hiraganaName) {
              infobox.push("[纯假名|" + data.hiraganaName + "]");
            }
            infobox = infobox.concat(["[罗马字|]", "[昵称|]", "}", "|性别= "]);
            // basic information
            for (var prop in crt_infodict) {
              if (data[prop]) {
                infobox.push("|item=".replace("item", crt_infodict[prop]) + data[prop]);
              }
            }
            infobox.push("|体重= ");
            // deal additional information and remove that has pushed in array
            for (prop in data) {
              if (!crt_infodict[prop] && ['characterName', 'hiraganaName', 'characterIntro', '日文名', 'characterImg'].indexOf(prop) === -1) infobox.push("|item=".replace("item", prop) + data[prop]);
            }
            infobox.push("|引用来源= ");
            infobox.push("}}");
            $('#subject_infobox').val(infobox.join('\n'));
            window.WCODEtoNormal();
          }
        }, 1000);
      };
      $('.fill-form').click(handleClick);
      var autoFillForm = function autoFillForm(handler) {
        var config = { attributes: true, childList: true, subtree: true };
        var callback = function callback() {
          handler();
          window.E_USERJS_OBSERVER.disconnect();
        };
        var targetNode = document.querySelector('#infobox_normal');
        window.E_USERJS_OBSERVER = new MutationObserver(callback);
        E_USERJS_OBSERVER.observe(targetNode, config);
      };
      autoFillForm(handleClick);
    },
    addNode: function addNode() {
      $('<span>').attr({ class: 'fill-form' }).text('填表').insertAfter($('.settings .alarm').eq(0));
    },
    newSubject: function newSubject() {
      this.addNode();
      //$('body').append($('<script>').html("(" + bangumi.fillForm.toString() + ")(" + GM_getValue('subjectData') + ");"));
      var selfInvokeScript = document.createElement("script");
      var prop = 'fillForm';
      if (GM_getValue('fillFormAnother') === 'wikipedia') {
        prop = 'fillFormAnother';
        GM_setValue('fillFormAnother', '');
      }
      selfInvokeScript.innerHTML = "(" + this[prop].toString() + ")(" + GM_getValue('subjectData') + ");";
      document.body.appendChild(selfInvokeScript);
    },
    createTable: function createTable(data) {
      var html = '';
      // first td
      var html1 = '<td style="width:100px;" align="right" valign="top">';
      // second td
      var html2 = '<td style="width:auto;" align="top">';
      var filterDict = {
        "subjectName": "游戏",
        "ブランド": "开发",
        "原画": "原画",
        "音楽": "音乐",
        "シナリオ": "剧本",
        "アーティスト": "主题歌演出",
        "作詞": "主题歌作词",
        "作曲": "主题歌作曲",
        "cv": "声优"
      };
      for (var prop in data) {
        if (filterDict[prop]) {
          html += '<tr>' + html1 + filterDict[prop] + ':</td>';
          var td2;
          if (data[prop].match('、')) {
            td2 = data[prop].split('、').map(function (item) {
              return '<span>' + item + '</span>';
            }).join(',');
          } else if (data[prop].match(',')) {
            td2 = data[prop].split(',').map(function (item) {
              return '<span>' + item + '</span>';
            }).join(',');
          } else {
            td2 = '<span>' + data[prop] + '</span>';
          }
          html += html2 + td2 + '</td></tr>';
        }
      }
      return html;
    },
    addRelated: function addRelated() {
      addStyle(['.a-table{float:right;margin-top:20px;width:320px;}', '.a-table span:hover{color:red;cursor:pointer;}', '.a-table span{color:rgb(0,180,30);}'].join(''));
      $('#columnCrtRelatedA').append($('<table>').addClass('a-table').html(this.createTable(JSON.parse(GM_getValue('subjectData')))));
      $('.a-table span').each(function (index, element) {
        $(this).click(function () {
          var searchtext = $(this).text().replace(/\(.*\)/, '');
          console.log(searchtext);
          $('#subjectName').val(searchtext);
          window.setTimeout(function () {
            $('#findSubject').click();
          }, 300);
        });
      });
    },
    newCharacter: function newCharacter() {
      this.addNode();
      var selfInvokeScript = document.createElement("script");
      selfInvokeScript.innerHTML = "(" + this.fillFormCharacter.toString() + ")(" + GM_getValue('charaData') + ");";
      document.body.appendChild(selfInvokeScript);
      //$('body').append($('<script>').html("(" + this.fillFormCharacter.toString() + ")(" + GM_getValue('charaData') + ");"));
    },
    subjectSearch: {
      init: function init() {
        this.addIcon();
        this.registerEvent();
      },
      creadIcon: function creadIcon(prop, imgsrc) {
        var icon = $('<a>');
        var img = $('<img>');
        img.attr({ src: imgsrc, style: 'display:inline-block;border:none;height:16px;width:16px;' });
        if ((typeof prop === 'undefined' ? 'undefined' : _typeof(prop)) === "object") {
          icon.attr(prop);
        }
        return icon.append(img);
      },
      addIcon: function addIcon() {
        this.creadIcon({ href: "", target: "_blank", class: 'search-baidu' }, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACoklEQVQ4jZ2T6UuUURSHzz9QRhCpJJVZERUFmVmp7bZYZiUttpiEVliEtCctJtGHPgQGEm1EUbQHUlCBWSI1NbagJfheX3XG1LSmhWL0NTtPH6ZmEulLF86XcznPPb/7O0eksAYprEEK3iKHqpED1Uj+a2TvK2TXC2SHG8lzIVufILkVyKZyJLsMySpF1t1HpLCG/z2ScQ+Rgre9LqzaTj1S0K7VVR0KYKxOtY2jvQAr7iBysLpH0nGUPTvaGBVTp5kZzWobh2mTGzVljldt4/QEpJcgsr8qmPj8qRuAXXltTB7fQE5mC26Xn7hx9cyd4cHt8vcEpN1GZN9rADyNXWxY26y5Oa1668ZXcjJbKC7yAVBc5KO4yIfb5cfr6QoBFt1EZPdLAK5d+sKQgZYmxjUogG0cOjtCsm3jsGrZO1YuadLWlh8BwPxriOysBOC5y09CbANLFzZxt+QbtnHYvKGFvC2t2Mbh2NGPTBpfT0ykwe3yK4DMvYLI9mcAdHfDjatftbjIp7ZxSE326ogoo2NibNYsf6e2cViW6iVtvlcb6gOOyKxLiGx7Gmyzo+MntnFIm+dlZJTR6HDDn1ixuElt4/D44XfltzKZfhGR3Iog4E1VJymzvYwYVMffxdHhhnHDbbIymrHrQlZK4nlENpUDoAqH89t18ACjQweaXoDBA4yOHWbzqPR78Gdl6jlEssuCgKMFHzS8r6WR/SwiwywN71OrEWEWUf0tHdTf0mERhssXvoQA8WcRySoNtuRp7GJLdivJSR7SU5o4cdzHieM+Zk1tJHZ0PRvXN9P2/kdIQtxpRNY9+Hu4FKgEnvwjKntM4sRTiKy+F1iK9BJkyW0k9Say4HrA49mXkZkXkaQLSMJ5ZMo5JP5M4OXYU8iEk/wC6ZkDX3ssK20AAAAASUVORK5CYII=").insertBefore($('#headerSearch .search'));
        this.creadIcon({ href: "https://cse.google.com/cse/home?cx=008561732579436191137:pumvqkbpt6w", target: "_blank", class: 'search-google' }, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB5klEQVQ4jYWTzWsTYRCH9yLYePL/EAlisEQvtlC13irUVagHBUX0omAv3oQqHiooTeiiudTvtaiIVZGqlHoRtB+StrE9yYK0mw8ipLG7mcnjIdmYL8nA7/bOM/Obd8YwmsL3/T0iYqnqmqr6Va2KyDgQbn5fCyAkIgk6hIhYjuN0tUueBSh7HsXJh+TOD5HuP4B7KEru7Ek2n05Q9rwAMtMACSqru07ujInbG2mr/PDF+k7Ga56DytnTg7i9EdJH9lO4F8P/Po+fXKSQiJM9NYA4P5sdhQ0RsQBK83fIDOzD7evGTy60mldtN4+4oaprAPIlgvcqRPHBhU5zrGNqylBVH6D0cQel6W2UM28aHvWMFFp01f4TALx/gA+hCiA91RFw5VEjYBXg9+ddZKd38nJx9L8tX3u+Rc9IgdGprQCwYlQ3jG/LNzlsH6XbHmTOXWpJTv1S+m5UOphNSTDEMQMIA3jic/ztJfY+OUbUNrm9MMHXjSRz7jJ3kzb99y0OXs9zLlGkXK5APc/bHSySBbCxmcGsQtrJfHGL9Xw5qB6rbaLjOF0iMgPgqc/jH68Zej9M9JlJ1DY58e4yiaVJiqWtIPkTsL3hHqoQq8PXIyKxluSmwwqLSFxVU6rqVbUiImM1z3XxF/9k+3A9su/8AAAAAElFTkSuQmCC").insertBefore($('#headerSearch .search'));
      },
      registerEvent: function registerEvent() {
        $('.search-baidu').click(function (e) {
          var v = $('#search_text').val();
          if (v) {
            e.preventDefault();
            GM_openInTab('http://www.baidu.com/s?&ie=UTF-8&oe=UTF-8&cl=3&rn=100&wd=%20%20' + (encodeURIComponent(v) + " site:bangumi.tv"));
          }
        });
        $('.search-google').click(function (e) {
          var v = $('#search_text').val();
          if (v) {
            e.preventDefault();
            GM_openInTab('https://cse.google.com/cse/publicurl?cx=008561732579436191137:pumvqkbpt6w&query=' + encodeURIComponent(v));
          }
        });
      }
    },
    redirect: function redirect() {
      window.location.href.replace(/((?:bgm|bangumi)\.tv|chii\.in)/, bgm_domain);
    },
    addSubjectCover: function addSubjectCover() {
      var $form = $('form[name=img_upload]');
      var $btn = $('<input class="inputBtn" style="margin-top: 10px;" value="获取游戏封面" name="fetchImage" type="button">');
      $form.after($btn);
      $btn.click(function () {
        var $blur = $('.blur-info');
        if (!$blur.length) {
          alert('该功能需要配合bangumi_blur_image.user.js才能使用');
          return;
        }
        var subjectData = JSON.parse(GM_getValue('subjectData'));
        getImageBase64(subjectData.subjectCoverURL).then(function (data) {
          console.log('cover: ', subjectData);
          var $canvas = document.querySelector('#preview');
          var ctx = $canvas.getContext('2d');
          var $img = new Image();
          $img.addEventListener('load', function () {
            $canvas.width = $img.width;
            $canvas.height = $img.height;
            ctx.drawImage($img, 0, 0);
            window.dispatchEvent(new Event('resize')); // let img cut tool at right position
          }, false);
          $img.src = data;
        });
      });
    }
  };
  var erogamescape = {
    init: function init() {
      if (erogamescape.isGamepage()) {
        addStyle();
        this.addNode(erogamescape.softtitle());
        registerEvent(this);
        //GM_setValue('subjectData', JSON.stringify(this.getSubjectInfo()));
      }
    },
    isGamepage: function isGamepage() {
      if (window.location.search.match('game')) {
        return true;
      }
    },
    addNode: function addNode() {
      // new subject
      $('#soft-title').append($('<a>').attr({
        class: 'new-subject',
        target: '_blank',
        href: 'http://' + bgm_domain + '/new_subject/4'
      }).text('\u65B0\u5EFA\u6761\u76EE'));
      // search subject
      $('#soft-title').append($('<a>').attr({
        class: 'search-subject e-userjs-search-cse',
        target: '_blank',
        href: 'https://cse.google.com/cse/home?cx=008561732579436191137:pumvqkbpt6w'
      }).text('\u641C\u7D22\u6761\u76EE'));
      $('#soft-title').append($('<a>').attr({
        class: 'search-subject e-userjs-search-subject',
        title: '检测条目是否存在',
        href: '#'
      }).text('检测条目是否存在'));
    },
    softtitle: function softtitle() {
      return document.getElementById("soft-title");
    },
    getSubjectInfo: function getSubjectInfo() {
      var info = {};
      var title = $('#soft-title');
      info.subjectName = title.find('span').eq(0).text().trim();
      info['ブランド'] = title.find('a').eq(0).text();
      if (title.text().match(/\d{4}-\d\d-\d\d/)) {
        info['発売日'] = title.text().match(/\d{4}-\d\d-\d\d/)[0];
      }
      if (document.getElementById('genga')) {
        info['原画'] = $('#genga td').text();
      }
      if (document.getElementById('shinario')) {
        info['シナリオ'] = $('#shinario td').text();
      }
      if (document.getElementById('ongaku')) {
        info['音楽'] = $('#ongaku td').text();
      }
      if (document.getElementById('kasyu')) {
        info['アーティスト'] = $('#kasyu td').text();
      }
      //console.log(info);
      return info;
    }
  };
  var dmm = {
    init: function init() {
      if (dmm.isGamepage()) {
        dmm.getSubjectInfo();
        addStyle();
        dmm.addNode();
      }
    },
    isGamepage: function isGamepage() {
      if (window.location.pathname.match('pcgame')) {
        return true;
      }
    },
    getSubjectInfo: function getSubjectInfo() {
      var info = {};
      var adict = {
        "原画": "原画",
        "シナリオ": "剧本",
        "ブランド": "开发"
      };
      if ($('#title').length) info.subjectName = $('h1#title').text().replace(/新建.*$/, '').trim();
      if ($('.mg-b20.lh4').length) info.subjectStory = $('.mg-b20.lh4').text();
      if ($('table.mg-b20').length) {
        var infoTable = $('table.mg-b20 tr');
        infoTable.each(function (index, element) {
          var alist = $(element).text().split(':').map(String.trim);
          if (alist[0] === "配信開始日") info['発売日'] = alist[1];
          if (alist[0] === "ゲームジャンル") info['ジャンル'] = alist[1];
          if (alist.length === 2 && adict.hasOwnProperty(alist[0])) {
            info[alist[0]] = alist[1];
          }
        });
      }
      var astr = JSON.stringify(info);
      GM_setValue('subjectData', astr);
      console.log(astr);
      return info;
    },
    addNode: function addNode() {
      $('h1#title').append($('<a>').attr({
        class: 'new-subject',
        target: '_blank',
        href: 'http://' + bgm_domain + '/new_subject/4'
      }).text('新建条目'));
      $('h1#title').append($('<a>').attr({
        class: 'search-subject',
        target: '_blank',
        href: 'https://cse.google.com/cse/home?cx=008561732579436191137:pumvqkbpt6w'
      }).text('搜索条目'));
    }
  };
  var wikipedia = {
    init: function init() {
      // wikipedia use different way to fill form
      GM_setValue('fillFormAnother', 'wikipedia');
      addStyle();
      this.addNode();
      GM_setValue('subjectData', JSON.stringify(this.getSubjectInfo()));
    },
    getSubjectInfo: function getSubjectInfo() {
      var info = {};
      var adict = {
        '開発元': 'ブランド',
        'Developer(s)': 'ブランド',
        'ジャンル': 'ジャンル',
        'Genre(s)': 'ジャンル',
        'Release date(s)': '発売日',
        '発売日': '発売日'
      };
      info.subjectName = $('#firstHeading').text().replace(/新建.*$/, '');
      var $infotable = $('.infobox tbody').eq(0).find('tr');
      $infotable.each(function (index, element) {
        var alist = [],
            elem = $(element);
        alist = elem.text().trim().split('\n');
        if (alist.length === 2 && adict.hasOwnProperty(alist[0])) {
          info[adict[alist[0]]] = alist[1];
        }
      });
      return info;
    },
    addNode: function addNode() {
      // new subject
      $('#firstHeading').append($('<a>').attr({
        class: 'new-subject',
        target: '_blank',
        href: 'http://' + bgm_domain + '/new_subject/4'
      }).text('\u65B0\u5EFA\u6761\u76EE'));
      // search subject
      $('#firstHeading').append($('<a>').attr({
        class: 'search-subject',
        target: '_blank',
        href: 'https://cse.google.com/cse/home?cx=008561732579436191137:pumvqkbpt6w'
      }).text('\u641C\u7D22\u6761\u76EE'));
    }
  };

  var init = function init() {
    var re = new RegExp(['getchu', 'bangumi', 'bgm', 'chii', 'erogamescape', 'dmm', '219\.66', 'wikipedia'].join('|'));
    var page = document.location.href.match(re);
    if (page) {
      switch (page[0]) {
        case 'getchu':
          getchu.init();
          break;
        case 'erogamescape':
          erogamescape.init();
          break;
        case '219\.66':
          erogamescape.init();
          break;
        case 'dmm':
          dmm.init();
          break;
        case 'wikipedia':
          wikipedia.init();
          break;
        default:
          bangumi.init();
      }
    }
  };
  init();
})();

/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();

function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }

var gmFetch = __webpack_require__(0).gmFetch;
var delayPromise = __webpack_require__(3);
var filterResults = __webpack_require__(4);

function dealDate(dateStr) {
  return dateStr.replace(/年|月|日/g, '/').replace(/\/$/, '');
}

function htmlToElement(html) {
  var template = document.createElement('template');
  template.innerHTML = html;
  return template.content.firstChild;
}
/**
 * @return {array}
 */
function dealRawHTML(info) {
  var rawInfoList = [];
  var $doc = new DOMParser().parseFromString(info, "text/html");

  var items = $doc.querySelectorAll('#browserItemList>li>div.inner');
  // get number of page
  var numOfPage = 1;
  var pList = $doc.querySelectorAll('.page_inner>.p');
  if (pList && pList.length) {
    var tempNum = parseInt(pList[pList.length - 2].getAttribute('href').match(/page=(\d*)/)[1]);
    numOfPage = parseInt(pList[pList.length - 1].getAttribute('href').match(/page=(\d*)/)[1]);
    numOfPage = numOfPage > tempNum ? numOfPage : tempNum;
  }
  if (items && items.length) {
    var _iteratorNormalCompletion = true;
    var _didIteratorError = false;
    var _iteratorError = undefined;

    try {
      for (var _iterator = items[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
        var item = _step.value;

        var $subjectTitle = item.querySelector('h3>a.l');
        var itemSubject = {
          subjectTitle: $subjectTitle.textContent.trim(),
          subjectURL: 'https://bgm.tv' + $subjectTitle.getAttribute('href'),
          subjectGreyTitle: item.querySelector('h3>.grey') ? item.querySelector('h3>.grey').textContent.trim() : ''
        };
        var matchDate = item.querySelector('.info').textContent.match(/\d{4}[\-\/\年]\d{1,2}[\-\/\月]\d{1,2}/);
        if (matchDate) {
          itemSubject.startDate = dealDate(matchDate[0]);
        }
        var $rateInfo = item.querySelector('.rateInfo');
        if ($rateInfo) {
          if ($rateInfo.querySelector('.fade')) {
            itemSubject.averageScore = $rateInfo.querySelector('.fade').textContent;
            itemSubject.ratingsCount = $rateInfo.querySelector('.tip_j').textContent.replace(/[^0-9]/g, '');
          } else {
            itemSubject.averageScore = '0';
            itemSubject.ratingsCount = '少于10';
          }
        } else {
          itemSubject.averageScore = '0';
          itemSubject.ratingsCount = '0';
        }
        rawInfoList.push(itemSubject);
      }
    } catch (err) {
      _didIteratorError = true;
      _iteratorError = err;
    } finally {
      try {
        if (!_iteratorNormalCompletion && _iterator.return) {
          _iterator.return();
        }
      } finally {
        if (_didIteratorError) {
          throw _iteratorError;
        }
      }
    }
  } else {
    return [];
  }
  return [rawInfoList, numOfPage];
}

/**
 * 搜索bgm条目
 * @param {Object} subjectInfo
 * @param {number} typeNumber
 */
function fetchBangumiDataBySearch(subjectInfo, typeNumber) {
  var startDate;
  if (subjectInfo && subjectInfo.startDate) {
    startDate = subjectInfo.startDate;
  }
  typeNumber = typeNumber || 'all';
  var query = subjectInfo.subjectName;
  console.log(subjectInfo);
  // if (subjectInfo.isbn13) {
  //   query = subjectInfo.isbn13;
  // }
  if (subjectInfo.isbn) {
    query = subjectInfo.isbn;
  }
  if (!query) {
    console.info('Query string is empty');
    return Promise.resolve();
  }
  var url = 'https://bgm.tv/subject_search/' + encodeURIComponent(query) + '?cat=' + typeNumber;
  console.info('seach bangumi subject URL: ', url);
  return gmFetch(url).then(function (info) {
    var rawInfoList = dealRawHTML(info)[0] || [];
    // 使用ISBN 搜索时,不再使用名称过滤
    if (subjectInfo.isbn) {
      return rawInfoList[0];
    }
    return filterResults(rawInfoList, subjectInfo.subjectName, {
      keys: ['subjectTitle', 'subjectGreyTitle'],
      startDate: startDate
    });
  });
}

function fetchBangumiDataByDate(subjectInfo, pageNumber, type, allInfoList) {
  if (!subjectInfo || !subjectInfo.startDate) throw 'no date info';
  var startDate = new Date(subjectInfo.startDate);
  var SUBJECT_TYPE = type || 'game';
  var sort = startDate.getDate() > 15 ? 'sort=date' : '';
  var page = pageNumber ? 'page=' + pageNumber : '';
  var query = '';
  if (sort && page) {
    query = '?' + sort + '&' + page;
  } else if (sort) {
    query = '?' + sort;
  } else if (page) {
    query = '?' + page;
  }
  var url = 'https://bgm.tv/' + SUBJECT_TYPE + '/browser/airtime/' + startDate.getFullYear() + '-' + (startDate.getMonth() + 1) + query;

  console.log('uuuuuuuu', url);
  return gmFetch(url).then(function (info) {
    var _dealRawHTML = dealRawHTML(info),
        _dealRawHTML2 = _slicedToArray(_dealRawHTML, 2),
        rawInfoList = _dealRawHTML2[0],
        numOfPage = _dealRawHTML2[1];

    pageNumber = pageNumber || 1;

    if (allInfoList) {
      numOfPage = 3;
      allInfoList = [].concat(_toConsumableArray(allInfoList), _toConsumableArray(rawInfoList));
      if (pageNumber < numOfPage) {
        return delayPromise(1000).then(function () {
          return fetchBangumiDataByDate(subjectInfo, pageNumber + 1, SUBJECT_TYPE, allInfoList);
        });
      }
      return allInfoList;
    }

    var result = filterResults(rawInfoList, subjectInfo.subjectName, {
      keys: ['subjectTitle', 'subjectGreyTitle'],
      startDate: subjectInfo.startDate
    });
    pageNumber = pageNumber || 1;
    if (!result) {
      if (pageNumber < numOfPage) {
        return delayPromise(300).then(function () {
          return fetchBangumiDataByDate(subjectInfo, pageNumber + 1, SUBJECT_TYPE);
        });
      } else {
        throw 'notmatched';
      }
    }
    return result;
  });
}

module.exports = {
  fetchBangumiDataByDate: fetchBangumiDataByDate,
  fetchBangumiDataBySearch: fetchBangumiDataBySearch
};

/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


function delayPromise(t) {
  var max = 400;
  var min = 200;
  t = t || Math.floor(Math.random() * (max - min + 1)) + min;
  return new Promise(function (resolve) {
    setTimeout(resolve, t);
  });
}

module.exports = delayPromise;

/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


function filterResults(items, searchstring, opts) {
  if (!items) return;
  var results = new Fuse(items, opts).search(searchstring);
  if (!results.length) return;
  if (opts.startdate) {
    var _iteratorNormalCompletion = true;
    var _didIteratorError = false;
    var _iteratorError = undefined;

    try {
      for (var _iterator = results[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
        var result = _step.value;

        if (result.startdate && new date(result.startdate) - new date(opts.startdate) === 0) {
          return result;
        }
      }
    } catch (err) {
      _didIteratorError = true;
      _iteratorError = err;
    } finally {
      try {
        if (!_iteratorNormalCompletion && _iterator.return) {
          _iterator.return();
        }
      } finally {
        if (_didIteratorError) {
          throw _iteratorError;
        }
      }
    }
  } else {
    return results[0];
  }
}

module.exports = filterResults;

/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var gmFetchBinary = __webpack_require__(0).gmFetchBinary;

function getImageSuffix(url) {
  var m = url.match(/png|jpg|jpeg|gif|bmp/);
  if (m) {
    switch (m[0]) {
      case 'png':
        return 'png';
      case 'jpg':
      case 'jpeg':
        return 'jpeg';
      case 'gif':
        return 'gif';
      case 'bmp':
        return 'bmp';
    }
  }
  return '';
}

function getImageBase64(url) {
  return gmFetchBinary(url).then(function (info) {
    var binary = '';
    for (var i = 0; i < info.length; i++) {
      binary += String.fromCharCode(info.charCodeAt(i) & 0xff);
    }
    return 'data:image/' + getImageSuffix(url) + ';base64,' + btoa(binary);
  });
}

module.exports = getImageBase64;

/***/ })
/******/ ]);