// ==UserScript==/
// @name Bangumi 番组计划 详情页 自动获取详情页动漫中文/日文名/播放时间/新番完结日期复制 2020年06月16日编写代码
// @version 0.0.3
// @description Bangumi 番组计划 详情页 自动获取详情页动漫中文/日文名/发售播放复制
// @author waecy
// @namespac Bangumi 番组计划 详情页 自动获取详情页动漫中文/日文名/播放时间复制
// @require https://cdn.staticfile.org/jquery/2.1.4/jquery.min.js
// @include *://bangumi.tv/subject/*
// @include *://bgm.tv/subject/*
// @include *://chii.in/subject/*
// @icon https://lain.bgm.tv/pic/icon/s/000/00/13/1391.jpg?r=1357822756
// @icon64 https://lain.bgm.tv/pic/icon/s/000/00/13/1391.jpg?r=1357822756
// @grant GM_xmlhttpRequest
// @grant GM_setValue
// @run-at document-start
// @license MIT License
// @namespace https://greasyfork.org/users/28972
// ==/UserScript==
/*
2020年6月16日2:27:41
2020年6月16日4:19:26
2020年7月4日0:35:53更改去除两边空格
2020年8月20日19:05:21添加去重函数,判断别名是否有和中文名同名,有的话不拼接字符,防止复制重复
2020年8月20日19:52:13添加复制新番更新时间
*/
$(function() {
// 创建对象,存放数组
var listObj = {
zhName: [],
jpZhName: [],
sum: [],
data: []
};
// 封装复制函数
var copyFn = function (ele, copyText) {
// 更改input内容
$(ele).val(copyText);
// 全选输入框内容
$(ele).select();
// 执行浏览器自带的复制
document.execCommand("Copy");
// 清空输入框内容
$(ele).val('');
}
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, "");
}
// 循环遍历词条
$("#infobox li span").each(function(index, ele) {
// 循环遍历标题
var selfText = $(this).html();
// 添加名称
var addName = '';
// 主要标题中文
if (selfText == "中文名: ") {
// 获取番名
addName = $(this).parent().text();
// 截取名称
addName = addName.substr(4).replace(/(^\s*)|(\s*$)/g, "").replace(/\)/g,"]").replace(/\(/g,"[");
// 添加数组
listObj['zhName'].push(addName);
} else if (selfText == '话数: ' || selfText == '集数: ') {
// 获取话数
addName = $(this).parent().text();
// 截取话数
addName = addName.substr(3).replace(/(^\s*)|(\s*$)/g, "").replace(/\)/g,"]").replace(/\(/g,"[");
// 添加数组
listObj['sum'].push(addName);
} else if (selfText == '别名: ') {
// 获取别名
addName = $(this).parent().text();
// 截取别名
addName = addName.substr(3).replace(/(^\s*)|(\s*$)/g, "").replace(/\)/g,"]").replace(/\(/g,"[");
// 添加数组
listObj['jpZhName'].push(addName);
} else if (selfText == '发售日期: ' ||
selfText == '放送开始: ' ||
selfText == '其他: ' ||
selfText == '上映年度: ' ||
selfText == '发售日: ' ||
selfText == '开始: ' ||
selfText == '放送星期: ' ||
selfText == '发行日期: ' ) {
// 获取发售日期
addName = $(this).parent().text();
// 判断是否包含()和号
if (addName.indexOf('(') != -1 &&
addName.indexOf(')') != -1 &&
addName.indexOf('号') != -1) {
// 截取发售日期,并截取日期
addName = addName.substr(4).replace(/\s+/g, "");
} else if (addName.indexOf('年') != -1 && addName.indexOf('号') != -1) {
addName = addName.substr(4).replace(/\s+/g, "");
} else {
// 新增数组,判断"发售日: 2018-09-14"格式
var newAry = $(this).parent().text().split('-');
// 如果是2018-09-14格式的话
if (newAry.length - 1 == 2) {
// 自定义格式
// addName = newAry[0].substr(newAry[0].length - 4) + '年' + newAry[1] + '月' + newAry[2] + '日';
addName = $(this).parent().text().substr("发售日: ".length);
} else {
// 截取发售日期,并截取日期
addName = $(this).parent().html().split('</span>')[1]
}
// 自定义格式
addName = getListDate(addName);
}
// 判断是否不为空
if (addName) {
// 添加发售日期
listObj['data'].push(addName);
}
}
console.log(
listObj
);
})
// 一键复制
$('.subjectNav ul').append('<button class="toCopy">全部复制</botton>');
// $('.nameSingle').after('<div style="width: 80%;position:relative;margin: 0 auto;"><button class="toCopy">全部复制</botton></div>');
// 设置样式
$('.toCopy').css({
/* "position":"absolute",
"top":"0",
"left":"0",
"bottom":"0",
"right":"0",
"margin":"2px 2.4rem auto",*/
"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": "#F09199",
"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' : '#02A3FB',
"border": "1px solid transparent"
});
}, function() {
//非 hover时效果
$(this).css({
// 'background' : 'rgb(255, 90, 68)'
"background-color": "#F09199"
});
});
// 点击【全部复制】按钮
$('.toCopy').on('click', function() {
// 最终复制的名称
var ret = '';
// 获取标题日文名
var titleName = $('.nameSingle a').text();
// 获取中文名
var zhNames = listObj['zhName'];
// 获取别名
var jpZhName = listObj['jpZhName'];
// 获取集数
var animeSum = listObj['sum'];
// 获取时间
var data = listObj['data'];
// 判断是否填写
var zhNamesFlasg = false;
var jpFlag = false;
// 如果中文名不为空
if (!zhNamesFlasg && zhNames && zhNames.length > 0) {
ret += zhNames[0];
zhNamesFlasg = true;
console.log(
ret
);
}
// 判断日文名
if (!jpFlag && titleName != zhNames[0]) {
// 如果只有标题名,不添加[]
if (zhNames.length == 0 && jpZhName.length == 0) {
ret += titleName;
} else {
ret += '[' + titleName + ']';
}
jpFlag = true;
}
// 判断别名
if(jpZhName && jpZhName.length > 0) {
// 循环遍历跳转链接
for (var i = 0; i < jpZhName.length; i++) {
ret += '[' + jpZhName[i] + ']';
}
}
// 判断时间日期是否为空
if(data && data.length > 0) {
// 判断个是否为"1917年4月"格式
if (data[0].indexOf('日') === -1) {
ret += ' ' + getListDate(data[0]);
} else {
ret += ' ' + data[0];
}
}
if(animeSum && animeSum.length > 0) {
ret += ' 共' + animeSum[0].replace(/话+/g, "") + '集';
}
// 获取第一个集数的颜色
var firstLiColor = $('.subject_prg li:first a').css('color');
// 获取最后一个集数的颜色
var lastLiColor = $('.subject_prg li:last a').css('color');
// 每集鼠标悬停后详细信息DOM元素
var animeEpDetailedEle = $('.prg_popup .tip');
// 获取最后更新完最后一集信息
var animeEpEndDetailed = "";
// 开始索引
var startIndex = "";
// 结束索引
var endIndex = "";
// 更新完日期
var animeEndDate = '';
// 临时赋值
var tempStr = '';
// animeEpEndDetailed = $('.prg_popup .tip').eq($('.prg_popup .tip').length - 1).html()
// 如果颜色不同,说明目前是新番,正在更新中
if (firstLiColor != lastLiColor) {
// 保存信息
animeEpEndDetailed = animeEpDetailedEle.eq(animeEpDetailedEle.length - 1)[0].innerHTML;
// 保存字符串
tempStr = animeEpEndDetailed;
// 赋值
startIndex = tempStr.indexOf(":");
// 赋值
endIndex = tempStr.indexOf("<");
// 赋值日期
animeEndDate = animeEpEndDetailed.slice(startIndex + 1, endIndex);
// 更改年月日格式
// animeEndDate = getListDate(animeEndDate);
animeEndDate = animeEndDate;
// 拼接字符
ret = ret + ' ' + animeEndDate + '更新完';
}
console.log(
ret,
listObj
);
// 复制文件名
copyFn('#search_text', ret);
})
/* ================== 监听键盘按下快捷键,来跳转或触发点击事件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.onkeydown = function(e) {
$(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('M')) {
/* ========= shiftKey + M跳转MAL ============*/
setTimeout(function () {
// 获取url参数
var urlKey = getQueryVariable('keyword');
// 判断参数是否有值
if (urlKey && urlKey == "MAL") {
// 解码赋值
urlKey = decodeURIComponent(urlKey);
//循环遍历
$('.frdScore.e-userjs-score-compare').each(function (index,ele) {
// 获取参数
var title = $(ele).find('a').attr('title');
// 如果是MAL进入
if (title == 'myanimelist') {
// 跳转url
var toMalUrl = $(ele).find('a:eq(1)').attr("href")
window.open(toMalUrl,"_blank")
}
})
}
//获取url参数[得到url参数]为对象
function getQueryVariable(variable) {
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split("=");
if (pair[0] == variable) {
return pair[1];
}
}
return (false);
}
}, 1500)
console.log('shiftKey + M');
} 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 noRepeat(arr) {
var arr1 = [];
for (var i = 0; i < arr.length; i++) {
var item = arr[i];
if (arr1.indexOf(item) === -1) arr1.push(item);
}
return arr1;
}
/*
封装函数获取年/月/日 格式日期,并更改年月日格式
2020年6月21日21:51:15完美封装
2020年7月4日13:28:38 更改2015格式并添加年
2020年8月13日20:55:43 新增"2020-10"和"2020-3"格式判断
2020年8月17日22:58:51 新增1986.10.15 / 1986.10.5 / 1986.1.15 / 1986.1.3 格式判断
2022年2月16日20:48:37 新增"1917年4月"格式判断
*/
function getListDate(value) {
// 获取传的值
var str = value;
// 创建新字符串保存
var ret = "";
// 创建最终返回字符串
var retStr = "";
// 循环去除空格
for (i = 0; i < str.length; i++) {
if (str.charAt(i) != " ") {
ret += str[i];
}
}
// 分类
var str1 = "";
var str2 = "";
var str3 = "";
var index = 0;
var dateType = 0;
// 如果有年月日格式
if (ret.indexOf('年') != -1 && ret.indexOf('月') == -1 & ret.indexOf('日') == -1) {
dateType = 1;
index = ret.indexOf('年');
} else if (ret.indexOf('月') != -1 && ret.indexOf('日') == -1) {
dateType = 2;
index = ret.indexOf('月');
} else if (ret.indexOf('年') != -1 && ret.indexOf('月') != -1 && ret.indexOf('日') != -1) {
dateType = 3;
index = ret.indexOf('日');
} else if ((/^\+?[0-9][0-9]*$/).test(ret)) { // 判断是否为2015这样的格式
dateType = 6;
index = ret + '年';
}
// 判断是否有春/夏/秋/冬
if (ret.indexOf('春') != -1) {
dateType = 4;
index = ret.indexOf('春');
} else if (ret.indexOf('夏') != -1) {
dateType = 4;
index = ret.indexOf('夏');
} else if (ret.indexOf('秋') != -1) {
dateType = 4;
index = ret.indexOf('秋');
} else if (ret.indexOf('冬') != -1) {
dateType = 4;
index = ret.indexOf('冬');
}
// 判断是否为年/月/日格式
// 判断年月日格式
if (ret.substring(4, 5) == '-' && ret.substring(7, 8) == '-'
|| ret.substring(4, 5) == '/' && ret.substring(7, 8) == '/'
|| ret.substring(4, 5) == '-') {
// 赋值类型是/或-
dateType = 5;
// 判断2020-02-28和2020/02/28/*
// 判断2020-02-2和2020/02/2/*
if (ret.substring(8, 10).indexOf('/') == -1 && ret.substring(8, 10).length == 2) {
str3 = ret.substring(0, 4) + "年" + ret.substring(5, 7) + "月" + ret.substring(8, 10) + "日";
} else if (ret.substring(8, 10).indexOf('/') == -1 && ret.substring(8, 10).length == 1) {
str3 = ret.substring(0, 4) + "年" + ret.substring(5, 7) + "月0" + ret.substring(8, 9) + "日";
} else if (ret.substring(8, 10).indexOf('/') == 1 && ret.substring(8, 10).length == 2) {
str3 = ret.substring(0, 4) + "年" + ret.substring(5, 7) + "月0" + ret.substring(8, 9) + "日";
} else if (ret.substring(8, 10).indexOf('/') == 1 && ret.substring(8, 10).length == 3) {
str3 = ret.substring(0, 4) + "年" + ret.substring(5, 7) + "月" + ret.substring(8, 9) + "日";
} else if (ret.substring(8, 10).indexOf('/') == -1 && ret.length == 7) {
str3 = ret.substring(0, 4) + "年" + ret.substring(5, 7) + "月";
} else if (ret.substring(8, 10).indexOf('/') == -1 && ret.length == 6) {
str3 = ret.substring(0, 4) + "年0" + ret.substring(5, 7) + "月";
}
} else if (ret.substring(4, 5) == '-' && ret.substring(6, 7) == '-' || ret.substring(4, 5) == '/' && ret.substring(6, 7) == '/') {
// 赋值类型是/或-
dateType = 5;
// 判断2020-2-28和2020/2/28/*
// 判断2020-2-2和2020/2/2/*
if (ret.substring(7, 9).indexOf('/') == -1 && ret.substring(7, 9).length == 2) {
str3 = ret.substring(0, 4) + "年0" + ret.substring(5, 6) + "月" + ret.substring(7, 9) + "日";
} else if (ret.substring(7, 9).indexOf('/') == -1 && ret.substring(7, 9).length == 1) {
str3 = ret.substring(0, 4) + "年0" + ret.substring(5, 6) + "月0" + ret.substring(7, 9) + "日";
} else if (ret.substring(7, 9).indexOf('/') == 1 && ret.substring(7, 9).length == 2) {
str3 = ret.substring(0, 4) + "年0" + ret.substring(5, 6) + "月0" + ret.substring(7, 8) + "日";
} else if (ret.substring(7, 9).indexOf('/') == 1 && ret.substring(7, 9).length == 3) {
str3 = ret.substring(0, 4) + "年0" + ret.substring(5, 6) + "月" + ret.substring(7, 9) + "日";
}
}
// 最后判断,并赋值
if (dateType == 1) {
if (ret.indexOf('年') == ret.length - 1 || ret.substring(index + 1, index + 2) == '/' || ret.substring(ret.length, ret.length + 1) == '') {
retStr = ret.substring(0, index + 1);
}
} else if (dateType == 2) {
if (ret.indexOf('月') == ret.length - 1 || ret.substring(index + 1, index + 2) == '/' || ret.substring(ret.length, ret.length + 1) == '') {
// 判断是否1917年4月格式
if (ret.indexOf('日') === -1) {
// 如果月数大于0,进入判断
if (ret.slice(3, 4) > 0) {
retStr = ret.slice(0, 5) + '0' + ret.slice(3, 4) + '月';
}
} else {
retStr = ret.substring(0, index + 1);
}
}
} else if (dateType == 3) {
// 判断格式
if (ret.substr(4, 1) == '年' && ret.substr(7, 1) == '月' && ret.substr(10, 1) == '日') {
// 如果日后面没多余的字符的话
if (ret.substr(11, 1).length == 0) {
retStr = ret.substr(0, 11);
} else if (ret.substr(11, 1).length == 1 && ret.substr(11, 1) == '/') {
retStr = ret.substr(0, 11);
}
} else if (ret.substr(4, 1) == '年' && ret.substr(7, 1) == '月' && ret.substr(9, 1) == '日') {
retStr = ret.substr(0, 8) + '0' + ret.substr(8, 2);
} else if (ret.substr(4, 1) == '年' && ret.substr(6, 1) == '月' && ret.substr(9, 1) == '日') {
retStr = ret.substr(0, 5) + '0' + ret.substr(5, 2) + ret.substr(7, 3);
} else if (ret.substr(4, 1) == '年' && ret.substr(6, 1) == '月' && ret.substr(8, 1) == '日') {
retStr = ret.substr(0, 5) + '0' + ret.substr(5, 2) + '0' + ret.substr(7, 2);
}
} else if (dateType == 4) {
// 赋值
retStr = ret.substring(0, index + 1);
} else if (dateType == 5) {
// 赋值
retStr = str3;
} else if (dateType == 6) {
// 赋值
retStr = index;
}
// 返回xxxx年xx月xx日格式
return retStr;
}