Greasy Fork

Greasy Fork is available in English.

bt_search_for_bgm

add search icons in bangumi.tv for search anime

当前为 2016-12-18 提交的版本,查看 最新版本

// ==UserScript==
// @name        bt_search_for_bgm
// @namespace   http://bangumi.tv/user/a_little
// @description add search icons in bangumi.tv for search anime 
// @include     /^https?://(bangumi|bgm|chii)\.(tv|in)/(subject|index|anime|game|book|subject_search)/.*$/
// @include     /^https?://(bangumi|bgm|chii).(tv|in)/$/
// @resource    apis  https://gist.githubusercontent.com/22earth/11859ea67a97b4df940350ce0f8052d5/raw/2609aeab9e42ad81d66fdb0b9721b76d4e12eacb/searchapis.json
// @version     0.13.3
// @grant       GM_addStyle
// @grant       GM_getResourceText
// ==/UserScript==

(function() {
  if (!localStorage.getItem('searchEngines') || typeof JSON.parse(localStorage.getItem('searchEngines')) !== 'object') {
    localStorage.setItem('searchEngines', JSON.stringify(['dmhy', 'google', 'torrentproject']));
  }
  var ENABLE_EXTERNAL_TEXT = true;
  var deprecatedEngines = ["btdigg", "camoe", "btcherry"];
  var allSearchEngineLists = [
    ["dmhy"],  // CN
    ["google", "sukebei", "tokyotosho", "torrentproject"],  // JP
  ];

  // Data format and order like this: name : ["title", "icon", "searchapi"].
  // In "searchapi", query string should indead by {searchTerms}.
  var searchAPIsUser = {
    google : [
      "Download Search",
      "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVQ4jaXTPUvDQBgH8HyzkiCVdlBcFD+CDgUn0bU5rUMRS6mD4BuCVgfFKmitCl0s+FKhvoEgVvsyWKuRS9JLcvm7tcplSHW44e6e5/c8x91JAaKFZJXWFELRzZBVWgsQLST9JfknInlt9ExRJLMMqSOG67ID7gLb5xbG100h1hNIFyzM51gbu61wnN7Znl14Al+GC7LTas9nMi20bPgHPnUXmatOxbE1E89v3D8wd8DAbGBiw0R/XMfupY3RJcM/oBCKkUUDiUMGF/h1HN+AQiiC0xSa4aL04mBgVvcPTKZNbBYspHIMy3mGJnXx+s4xmBARAVg4Ybh4ctAb66wNJXSUGxx7RfEqBaDa5EgdMSEwmWXIlnwA+Qcb5QbHcLLTbjBGcfboILLq4yX2xXVsFSzUP1zcVzmOb2zsF21EVsRkhVD89zPVJTmqhWWV1rsGVFqRo1r4G6iM33AbQTj+AAAAAElFTkSuQmCC",
      "https://www.google.com/cse?q=&newwindow=1&cx=006100883259189159113%3Atwgohm0sz8q#gsc.tab=0&gsc.sort=&gsc.ref=more%3Ap2p&gsc.q={searchTerms}"
    ]
  };

  var searchAPIsResource = null;
  try {
    if (ENABLE_EXTERNAL_TEXT)
      searchAPIsResource = JSON.parse(GM_getResourceText("apis").replace(/\'/ig,'"'));
  } catch (e) {
    console.log("Pare JSON:", e);
  }
  var searchAPIs = Object.assign({}, searchAPIsResource, searchAPIsUser);

  for (var i = 0, len = deprecatedEngines.length; i < len; i++) {
    delete searchAPIs[deprecatedEngines[i]];
  }
  var searchEngineLists = Object.keys(searchAPIs);
  var searchEngines = JSON.parse(localStorage.getItem('searchEngines'));
  searchEngines = searchEngines.filter(function(e) {
    if (searchEngineLists.indexOf(e) !== -1)
      return true;
  });

  var addSearchIcon = {
    init: function() {
      if (window.location.href.match("/subject/") && document.getElementById("navMenuNeue").children[2].children[0].className !== "focus chl")
        this.addIcon1();
      else if (window.location.href.match("/anime|index|game|book|subject_search/"))
        this.addIcon2();

    },
    createLink: function(link) {
      var searchIcon = document.createElement("a");
      searchIcon.href = link;
      searchIcon.target = "_blank";
      searchIcon.className = "searchicon";
      var searchIconImg = document.createElement("img");
      searchIconImg.style.cssText = "display:inline-block;border:none;height:12px;width:14px;margin-left:2px";
      searchIcon.appendChild(searchIconImg);
      // add title and icon
      var re = new RegExp(searchEngineLists.join("|"));
      if (link.match(re)) {
        var domain = link.match(re)[0];
        searchIcon.title = searchAPIs[domain][0];
        searchIconImg.src = searchAPIs[domain][1];
      }
      return searchIcon;
    },

    getChineseName: function(title) {
      if (window.location.href.match(/subject_search|index/))
        return title.getElementsByClassName("l")[0].textContent;
      if (title.getElementsByTagName("a")[0].title)
        return title.children[0].title;
      return title.children[0].textContent;
    },

    getJanpaneseName: function(title) {
      if (window.location.href.match(/subject_search/)) {
        if (title.getElementsByClassName("grey").length)
          return title.getElementsByClassName("grey")[0].textContent;
        else
          return title.getElementsByClassName("l")[0].textContent;
      }
      if (title.tagName === "H3" && title.children[1] !== undefined) {
        return title.children[1].textContent;
      }
      else if (title.tagName === "H1")
        return title.children[0].textContent;
      return "";
    },
    getLink: function(engineName, animeName) {
      return searchAPIs[engineName][2].replace(/\{searchTerms\}/, encodeURIComponent(animeName));
    },
    addIcon1: function() {
      // add search icon in subject page
      var h1 = document.getElementsByTagName("h1")[0];
      if (h1) {
        for (var i = 0, len = searchEngines.length; i < len; i++) {
          var animeName = this.getJanpaneseName(h1);
          var engineName = searchEngines[i];
          if (allSearchEngineLists[0].indexOf(engineName) > -1 || !animeName.length)
            animeName = this.getChineseName(h1);

          h1.appendChild(this.createLink(this.getLink(engineName, animeName)));
        }
      }
    },

    addIcon2: function addSearchIcon2() {
      // add search icon in anime or index page
      //    if (window.location.href.match(/subject_search/))
      for (var i = 0, len = document.getElementsByTagName("h3").length; i < len; i++) {
        var h3 = document.getElementsByTagName("h3")[i];
        for (var j = 0; j < searchEngines.length; j++) {
          var animeName = this.getJanpaneseName(h3);
          var engineName = searchEngines[j];
          if (allSearchEngineLists[0].indexOf(engineName) > -1 || !animeName.length)
            animeName = this.getChineseName(h3);
          h3.appendChild(this.createLink(this.getLink(engineName, animeName)));
        }
      }
    },
  };

  var searchSwitch = {
    init: function() {
      if (this.isHomepge()) {
        this.addStyle();
        this.insertStatus();
        this.insertSearchEngineSwitch();
      }
    },
    isHomepge: function() {
      return window.location.pathname === '/' ? true : false;
    },
    addStyle: function(css) {

      if (css) {
        GM_addStyle(css);
      } else {
        GM_addStyle([
          '.search-switches {display:none;}',
          '*:hover > .search-switches {display:block;}',
          '.search-status {padding: 5px 15px 0;}',
          '.search-switches a {display:inline-block;float:left;margin:5px 5px;padding:5px 5px;border-radius:4px;box-shadow:1px 1px 2px #333;}',
          '.search-switches a.engine-off {background:#ccffcc none repeat scroll 0 0;color:#333;}',
          '.search-switches a.engine-on {background:#f09199 none repeat scroll 0 0;color:#fff;}'
        ].join(''));
      }
    },
    insertStatus: function() {
      // move to sidepanel because of confliction of default function
      //var b = document.querySelector('#columnHomeB');
      var b = document.querySelector('.SidePanelMini');
      if (b) {
        // try to create a wrapper
        //var statusContainer = document.createElement('div');
        //b.appendChild(statusContainer);

        var status = document.createElement('div');
        status.className = 'search-status';
        status.textContent = '已开启'+ searchEngines.length + '个搜索引擎';
        b.appendChild(status);
        var div = document.createElement('div');
        div.className = 'search-switches';
        b.appendChild(div);
      }
      b.innerHTML += '<br />';
    },
    insertSearchEngineSwitch: function() {
      var div = document.querySelector('.search-switches');
      for (var i = 0; i < searchEngineLists.length; i += 1) {
        if (searchEngines.indexOf(searchEngineLists[i]) > -1) {
          div.appendChild(this.createSwitch(searchEngineLists[i], 'engine-on'));
        } else {
          div.appendChild(this.createSwitch(searchEngineLists[i], 'engine-off'));
        }
      }
    },
    createSwitch: function(name, aclass) {
      var a = document.createElement('a');
      a.className = aclass;
      a.textContent = name;
      a.href = '#';
      a.addEventListener('click', function(e) {
        var engines = searchEngines;
        if (e.target.className === 'engine-on') {
          e.target.className = 'engine-off';
          var index = engines.indexOf(e.target.textContent);
          if (index > -1) engines.splice(index, 1);
        } else {
          e.target.className = 'engine-on';
          engines.push(e.target.textContent);
        }
        var status = document.querySelector('.search-status');
        status.textContent = '已开启'+ document.querySelectorAll('.engine-on').length + '个搜索引擎';
        localStorage.setItem('searchEngines', JSON.stringify(engines));
        e.preventDefault();
      });
      return a;
    },
    registerEvent: function () {

    }
  };

  try {
    searchSwitch.init();
    addSearchIcon.init();
  } catch (e) {
    console.log(e);
  }
}());