bangumi new game subject helper

assist to create new game subject

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

Bạn sẽ cần cài đặt một tiện ích mở rộng như Tampermonkey hoặc Violentmonkey để cài đặt kịch bản này.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(Tôi đã có Trình quản lý tập lệnh người dùng, hãy cài đặt nó!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==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;

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