// ==UserScript==
// @name MyAnimeList详情页 自动获取详情页动漫日文/英文名 发售时间复制 2020年8月23日
// @version 0.0.1
// @description MyAnimeList详情页 自动获取详情页动漫日文/英文名 发售时间复制
// @author waecy
// @require https://cdn.staticfile.org/jquery/2.1.4/jquery.min.js
// @include *://myanimelist.net/anime/*
// @include *://myanimelist.net/manga/*
// @grant GM_xmlhttpRequest
// @grant GM_setValue
// @run-at document-start
// @license MIT License
// @namespace https://greasyfork.org/users/28972
// ==/UserScript==
/*
2020年8月23日开始写脚本
2020年8月23日21:46:04写完
2020年8月25日13:41:45 如果标题只有一个英文名,那么赋值
2022年09月11日 20:50:05加判断如果是Top跳过
2023年11月20日 19:30:16更改获取漫画日文主标题名和副标题名
*/
$(function() {
// $(document).ready(function() {
console.time('测试');
// 一键复制
$('.h1-title').append('<button class="toCopy">全部复制</botton>');
// 创建input,来复制
$('.h1-title').append('<input type="text" id="searchInput">');
// 设置为0隐藏
$('#searchInput').css({
'opacity' : 0
})
// 设置样式
$('.toCopy').css({
"margin-left": "10px",
"color": "#fff",
"line-height": "1.499",
"position": "relative",
"display": "inline-block",
"font-weight": "400",
"white-space": "nowrap",
"text-align": "center",
"background-image": "none",
"border": "1px solid transparent",
"-webkit-box-shadow": "0 2px 0 rgba(0, 0, 0, 0.015)",
"box-shadow": "0 2px 0 rgba(0, 0, 0, 0.015)",
"cursor": "pointer",
"-webkit-transition": "all .3s cubic-bezier(.645, .045, .355, 1)",
"transition": "all .3s cubic-bezier(.645, .045, .355, 1)",
"-webkit-user-select": "none",
"-moz-user-select": "none",
"-ms-user-select": "none",
"user-select": "none",
"-ms-touch-action": "manipulation",
"touch-action": "manipulation",
"height": "32px",
"padding": "0 15px",
"font-size": "14px",
"border-radius": "4px",
// "border-color": "#d9d9d9",
"border-color": "transparent",
// "background-color": "#FF5A44",
"background-color": "#4f74c8",
"text-shadow": "0 -1px 0 rgba(0, 0, 0, 0.12)",
"-webkit-box-shadow": "0 2px 0 rgba(0, 0, 0, 0.045)",
"box-shadow": "0 2px 0 rgba(0, 0, 0, 0.045)"
});
// 设置按钮hover事件
$('.toCopy').hover(function() {
// hover时效果
$(this).css({
'background': '#2e51a2',
"border": "1px solid transparent"
});
}, function() {
//非 hover时效果
$(this).css({
"background-color": "#4f74c8"
});
});
// 创建对象,存放数组
var listObj = {
English: [],
Synonyms: [],
Japanese: [],
sum: [],
data: [],
EnglishFlag: false,
SynonymsFlag: false,
JapaneseFlag: false
};
// 循环遍历词条
$('.spaceit_pad').each(function(index, ele) {debugger
if (index > 3) {
console.log(
listObj
);
return false;
}
// 获取当前元素名
var names = $(this).find('span').html();
// 英文名
var EnglishName = '';
// 别名
var SynonymsName = '';
// 日文名
var JapaneseNmae = '';
// 如果不只一个别名的话
var newArr = [];
// 判断是否英文名
var EnglishFlag = false;
// 判断是否英文别名
var SynonymsFlag = false;
// 判断是否日文别名
var JapaneseFlag = false;
// 判断是否有英文名/别名/日文名
if (names == "English:") {
listObj['EnglishFlag'] = true;
// 赋值
EnglishName = $(this).text().replace(/(^\s*)|(\s*$)/g, "").substr(9);
// 判断是否不只一个名称
if (EnglishName.indexOf(',') != -1) {
EnglishFlag = true;
newArr = EnglishName.split(',');
} else {
listObj['English'][0] = EnglishName;
}
} else if (names == "Synonyms:") {
listObj['SynonymsFlag'] = true;
// 赋值
SynonymsName = $(this).text().replace(/(^\s*)|(\s*$)/g, "").substr(10);
// 判断是否不只一个名称
if (SynonymsName.indexOf(',') != -1) {
SynonymsFlag = true;
newArr = SynonymsName.split(',');
} else {
listObj['Synonyms'][0] = SynonymsName;
}
} else if (names == "Japanese:") {
JapaneseFlag = true;
listObj['JapaneseFlag'] = true;
// 赋值
JapaneseNmae = $(this).text().replace(/(^\s*)|(\s*$)/g, "").substr(10);
// 判断是否不只一个名称
if (SynonymsName.indexOf(',') != -1) {
JapaneseFlag = true;
newArr = JapaneseNmae.split(',');
} else {
listObj['Japanese'][0] = JapaneseNmae;
}
}
// 如果别名不只一个
if (newArr.length > 0) {
// 循环遍历
for (var i = 0; i < newArr.length; i++) {
// 如果符合条件进入判断
if (EnglishFlag) {
listObj['English'][i] = trim(newArr[i]);
} else if (SynonymsFlag) {
listObj['Synonyms'][i] = trim(newArr[i]);
} else if (JapaneseFlag) {
listObj['Japanese'][i] = trim(newArr[i]);
}
}
} else {
if (listObj['Japanese'][0] == listObj['English'][0]) {
listObj['JapaneseFlag'] = false;
}
}
})
console.timeEnd('测试');
// 点击【全部复制】按钮
$('.toCopy').on('click', function() {debugger
// 标题英文名
var titleName = '';
var text = '';
// 获取漫画标题名
var comicName = trim($('span[itemprop="name"]').contents().eq(0).text());
// 获取头部主标题名
var topUpTitle = $('.h1-title strong:eq(0)').text();
// 获取头部副标题
var topSubTitle = $('.h1-title p:eq(0)').text() || $('span[itemprop="name"]')[0].lastChild.innerText;
// 获取头部主标题名文本
var topUpTitleTxt = trim(topUpTitle);
// 获取头部副标题文本
var topSubTitleTxt = topSubTitle != null ? trim(topSubTitle) : "";
// 如果只有一个标题名,更改主标题名
if (topUpTitleTxt.length >= 1 && topSubTitleTxt.length == 0) {
// 赋值副标题英文名
titleName = topUpTitleTxt;
} else {
// 如果标题名是空,说明是漫画标题名
if (!titleName && comicName != "Top") {
// 赋值主标题英文名
titleName = comicName;
} else {
// 赋值副标题英文名
titleName = topSubTitleTxt;
}
}
// 判断如果标题名称有两个进入判断
/* if ($('.h1-title span:eq(0)').length == 1) {
$('.h1-title span:eq(0)').contents().each(function(){
if(this.nodeType === 3){
titleName += this.wholeText;
}
});
}*/
// 如果标题只有一个英文名,那么赋值
/*if ($('.h1-title').find('h1').length == 1 && $('.h1-title strong:eq(0)').length == 0){
if ($('.h1-title').find('h1').text() != titleName) {
titleName = trim($('.h1-title').find('h1').text());
}
}*/
// 英文名
var EnglishName = '';
// 别名
var SynonymsName = '';
// 日文名
var JapaneseNmae = '';
// 判断是否和标题英文名相同
var EnglishFlag = false;
// 判断是否和标题英文名相同
var SynonymsFlag = false;
// 判断是否和标题英文名相同
var JapaneseFlag = false;
// 最终返回结果
var ret = '';
// 判断是否有相关名
if (listObj['EnglishFlag'] && listObj['SynonymsFlag'] && listObj['JapaneseFlag']) {
// 英文名/别名/日文名全有
if (listObj['English'].length == 1
&& listObj['Synonyms'] == 1
&& listObj['Japanese'] == 1 ) {
// 判断是否和标题名一致
if (listObj['Synonyms'][0] == titleName || listObj['English'][0] == titleName) {
ret = '[' + listObj['Japanese'][0] + '][' + titleName + ']';
} else {
ret = '[' + listObj['Japanese'][0] + ']' +
'[' + listObj['Synonyms'][0] + ']' +
'[' + listObj['English'][0] + '][' + titleName + ']';
}
} else {
for (var i = 0; i < listObj['Japanese'].length; i++) {
ret += '[' + listObj['Japanese'][i] + ']';
}
for (var i = 0; i < listObj['Synonyms'].length; i++) {
ret += '[' + listObj['Synonyms'][i] + ']';
}
for (var i = 0; i < listObj['English'].length; i++) {
ret += '[' + listObj['English'][i] + ']';
}
}
} else if (!listObj['EnglishFlag'] && listObj['SynonymsFlag'] && listObj['JapaneseFlag']) {
// 只有别名/日文名
if (listObj['Japanese'].length == 1 && listObj['Synonyms'].length == 1) {
// 判断别名和日文名是否相同
if (listObj['Japanese'][0] == listObj['Synonyms'][0]) {
ret = '[' + listObj['Japanese'][0] + ']';
} else {
// 判断别名是否和标题英文名相同
if (listObj['Synonyms'][0] != titleName) {
ret = '[' + listObj['Japanese'][0] + ']' + '[' + listObj['Synonyms'][0] + '][' + titleName + ']';
} else {
ret = '[' + listObj['Japanese'][0] + ']' + '[' + listObj['Synonyms'][0] + ']';
}
}
} else {
for (var i = 0; i < listObj['Japanese'].length; i++) {
ret += '[' + listObj['Japanese'][i] + ']';
}
for (var i = 0; i < listObj['Synonyms'].length; i++) {
// 如果别名不等于标题名
if (listObj['Synonyms'][i] != titleName) {
ret += '[' + listObj['Synonyms'][i] + ']';
} else {
SynonymsFlag = true;
}
}
// 如果别名不等于标题名
if (!SynonymsFlag) {
ret += '[' + titleName + ']';
}
}
} else if (listObj['EnglishFlag'] && !listObj['SynonymsFlag'] && listObj['JapaneseFlag']) {
// 只有英文名/日文名
if (listObj['English'].length == 1 && listObj['Japanese'].length == 1) {
// 判断英文名和日文名是否相同
if (listObj['English'][0] == listObj['Japanese'][0]) {
ret = '[' + listObj['Japanese'][0] + ']';
} else {
// 判断英文名是否和标题英文名相同
if (listObj['English'][0] != titleName) {
ret = '[' + listObj['Japanese'][0] + ']' + '[' + listObj['English'][0] + '][' + titleName + ']';
} else {
ret = '[' + listObj['Japanese'][0] + ']' + '[' + listObj['English'][0] + ']';
}
}
} else {
for (var i = 0; i < listObj['Japanese'].length; i++) {
ret += '[' + listObj['Japanese'][i] + ']';
}
for (var i = 0; i < listObj['English'].length; i++) {
ret += '[' + listObj['English'][i] + ']';
}
}
} else if (listObj['EnglishFlag'] && listObj['SynonymsFlag'] && !listObj['JapaneseFlag']) {
// 只有英文名/别名
if (listObj['English'].length == 1 && listObj['Synonyms'].length == 1) {
// 判断英文名和别名是否相同
if (listObj['English'][0] == listObj['Synonyms'][0]) {
ret = '[' + listObj['English'][0] + ']';
} else {
// 判断英文名是否和标题英文名相同
if (listObj['English'][0] != titleName) {
ret = '[' + listObj['Synonyms'][0] + ']' + '[' + listObj['English'][0] + '][' + titleName + ']';
} else {
ret = '[' + listObj['Synonyms'][0] + ']' + '[' + listObj['English'][0] + ']';
}
}
} else {
for (var i = 0; i < listObj['Synonyms'].length; i++) {
ret += '[' + listObj['Synonyms'][i] + ']';
}
for (var i = 0; i < listObj['English'].length; i++) {
ret += '[' + listObj['English'][i] + ']';
}
}
} else if (listObj['EnglishFlag'] && !listObj['SynonymsFlag'] && !listObj['JapaneseFlag']) {
// 只有英文名
if (listObj['English'].length == 1) {
// 判断英文名是否和标题名一致
if (listObj['English'][0] != titleName) {
ret = '[' + listObj['English'][0] + '][' + titleName + ']';
} else {
ret = '[' + listObj['English'][0] + ']';
}
} else {
for (var i = 0; i < listObj['English'].length; i++) {
ret += '[' + listObj['English'][i] + ']';
}
}
ret = listObj['English'];
} else if (!listObj['EnglishFlag'] && listObj['SynonymsFlag'] && !listObj['JapaneseFlag']) {
// 只有别名
if (listObj['Synonyms'].length == 1) {
// 判断别名是否和标题名一致
if (listObj['Synonyms'][0] != titleName) {
ret = '[' + listObj['Synonyms'][0] + '][' + titleName + ']';
} else {
ret = '[' + listObj['Synonyms'][0] + ']';
}
} else {
for (var i = 0; i < listObj['Synonyms'].length; i++) {
ret += '[' + listObj['Synonyms'][i] + ']';
}
}
ret = listObj['Synonyms'];
} else if (!listObj['EnglishFlag'] && !listObj['SynonymsFlag'] && listObj['JapaneseFlag']) {
// 只有日文名
if (listObj['Japanese'].length == 1) {
// 判断日文名是否和标题名一致
if (listObj['Japanese'][0] != titleName) {
ret = '[' + listObj['Japanese'][0] + '][' + titleName + ']';
} else {
ret = '[' + listObj['Japanese'][0] + ']';
}
ret = '[' + listObj['Japanese'][0] + '][' + titleName + ']';
} else {
for (var i = 0; i < listObj['Japanese'].length; i++) {
ret += '[' + listObj['Japanese'][i] + ']';
}
}
}
// 最后[判断头标题
if (topUpTitleTxt.length >= 1 && topSubTitleTxt.length >= 1) {
ret += '[' + topUpTitleTxt + ']';
}
// 更改input内容
$('#searchInput').val(ret);
// 全选输入框内容
$('#searchInput').select();
// 执行浏览器自带的复制
document.execCommand("Copy");
// 清空输入框内容
$('#searchInput').val('');
})
/* ================== 监听键盘按下快捷键,来跳转或触发点击事件Start =================== */
// 获取键盘码
function getKeyCode(str) {
// 获取当前字符串
var getKey = str.toLocaleLowerCase();
// 返回结果
var ret = '';
// 键码表
var keyCode = {
key: {
/* 字母和数字键的键码值 */
'a': 65,
'b': 66,
'c': 67,
'd': 68,
'e': 69,
'f': 70,
'g': 71,
'h': 72,
'i': 73,
'j': 74,
'k': 75,
'l': 76,
'm': 77,
'n': 78,
'o': 79,
'p': 80,
'q': 81,
'r': 82,
's': 83,
't': 84,
'u': 85,
'v': 86,
'w': 87,
'x': 88,
'y': 89,
'z': 90,
'0': 48,
'1': 49,
'2': 50,
'3': 51,
'4': 52,
'5': 53,
'6': 54,
'7': 55,
'8': 56,
'9': 57,
/* 数字键盘上的键的键码值 后面加_和主键盘数字键 区分开 */
'0_': 96,
'1_': 97,
'2_': 98,
'3_': 99,
'4_': 100,
'5_': 101,
'6_': 102,
'7_': 103,
'8_': 104,
'9_': 105,
'*': 106,
'+_': 107,
'enter1': 108,
'-': 109,
'.': 110,
'/': 111,
/* 功能键键码值 */
'f1': 112,
'f2': 113,
'f3': 114,
'f4': 115,
'f5': 116,
'f6': 117,
'f7': 118,
'f8': 119,
'f9': 120,
'f10': 121,
'f11': 122,
'f12': 123,
/* 控制键键码值 */
'backspace': 8,
'tab': 9,
'clear': 12,
'enter': 13,
'shift': 16,
'ctrl': 17,
'control': 17,
'alt': 19,
'cape lock': 20,
'esc': 27,
'spacebar': 32,
'page up': 33,
'page down': 34,
'end': 35,
'home': 36,
'left arrow': 37,
'up arrow': 38,
'right arrow': 39,
'down arrow': 40,
'insert': 45,
'delete': 46,
'num lock': 144,
';': 186,
':': 186,
'=': 187,
'+': 187,
'-': 189,
'_': 189,
'.': 190,
'>': 190,
'/': 191,
'?': 191,
'`': 192,
'~': 192,
'[': 219,
'{': 219,
'/': 220,
'|': 220,
']': 221,
'}': 221
}
}
// 循环遍历
for (var i in keyCode['key']) {
// 判断是否有当前key值
if (i == getKey) {
// 返回结果
ret = keyCode['key'][i];
}
}
return ret;
}
// 监听鼠标按下事件
$(document).keydown(function(e){
/* console.log(
e
);*/
// 获取键盘控制键
var keyCode = e.keyCode || e.which || e.charCode;
// 获取Ctrl键,返回true和false
var ctrlKey = e.ctrlKey || e.metaKey;
// 获取Shift键,返回true和false
var shiftKey = e.shiftKey || e.metaKey;
// 获取Alt键,返回true和false
var altKey = e.altKey || e.metaKey;
/* ========= 判断按下Ctrl + Shift + Alt + 英文字母/数字快捷键 ============*/
if (ctrlKey && shiftKey && altKey && keyCode == getKeyCode('X')) {
toUrl(['动漫花园', 'Nyaa表站'], 1);
console.log('Ctrl + Shift + Alt + X');
} else if (ctrlKey && shiftKey && keyCode == getKeyCode('X')) {
/* ========= 判断按下Ctrl + Shift + 英文字母/数字快捷键 ============*/
toUrl('动漫花园', 0);
console.log('Ctrl + Shift + X');
} else if (ctrlKey && altKey && keyCode == getKeyCode('X')) {
/* ========= 判断按下Ctrl + Alt + 英文字母/数字快捷键 ============*/
console.log('Ctrl + Alt + X');
} else if (shiftKey && altKey && keyCode == getKeyCode('X')) {
/* ========= 判断按下Shift + Alt + 英文字母/数字快捷键 ============*/
console.log('Shift + Alt + X');
} else if (ctrlKey && keyCode == getKeyCode('x')) {
/* ========= 判断按下Ctrl + 英文字母/数字快捷键 ============*/
console.log('Ctrl + x');
} else if (shiftKey && keyCode == getKeyCode('C')) {
/* ========= 判断按下Shift + 英文字母/数字快捷键 ============*/
// 点击一键复制按钮
$('.toCopy').click();
console.log('Shift + C');
} else if (altKey && keyCode == getKeyCode('X')) {
/* ========= 判断按下Alt + 英文字母/数字快捷键 ============*/
console.log('Alt + X');
} /*else if (keyCode) {
// 如果是单个键的话
// 判断选择哪个快捷键,动态获取哪个页面
switch (keyCode) {
case getKeyCode('F1'):
console.log('F1');
break;
case getKeyCode('F2'):
console.log('F2');
break;
}
}*/
// 阻止默认事件
// e.preventDefault();
// return false;
return;
})
//跳转url
// 第一个参数可用字符串,也可以用数组,如果是字符串,单独跳转,如果是数组格式,同时跳转
// 第二个参数是用中文名跳转,还是用日文名跳转,0是中文,1是日文
function toUrl(toUrlNames, nameType) {
// 跳转url
var toUrls = {
'动漫花园': 'https://share.dmhy.org/topics/list?keyword=',
'Nyaa表站': 'https://nyaa.si/?f=0&c=1_4&q=',
'Nyaa里站': 'https://sukebei.nyaa.si/?f=0&c=1_1&q='
}
// 获取url
var getToUrl = toUrlNames;
// 判断拼接名称类型
var nameType = nameType;
// 获取标题日文名
var titleName = $('.nameSingle a').html();
// 0的话用中文名跳转
/* if (nameType == 0) {
// 赋值
nameType = listObj['zhName'];
} else if (nameType == 1) {
// 赋值
nameType = titleName;
}*/
// 判断是否是字符串格式,否则就是数组格式
if (toString.call(toUrlNames) == "[object String]") {
// 跳转页面
window.open(toUrls[getToUrl] + nameType, "_blank");
} else if (toString.call(toUrlNames) == "[object Array]") {
// 创建新数组
var ret = [];
// 循环变量
for (var i = 0; i < getToUrl.length; i++) {
window.open(toUrls[getToUrl[i]] + nameType, "_blank");
}
}
}
/* ================== 监听键盘按下快捷键,来跳转或触发点击事件End =================== */
function trim(str) { //删除左右两端的空格
return str.replace(/(^\s*)|(\s*$)/g, "");
}
/* function ltrim(str) { //删除左边的空格
return str.replace(/(^\s*)/g, "");
}
function rtrim(str) { //删除右边的空格
return str.replace(/(\s*$)/g, "");
}*/
// 将相同的值相邻,然后遍历去除重复值
function unique4(array) {
array.sort();
var re = [array[0]];
for (var i = 1; i < array.length; i++) {
if (array[i] !== re[re.length - 1]) {
re.push(array[i]);
}
}
return re;
}
});