🏠 返回首頁 

Greasy Fork is available in English.

btnull设置已看

btnull设置已看,用来找电影

  1. // ==UserScript==
  2. // @name btnull设置已看
  3. // @namespace 设置已看
  4. // @version 1.0.0
  5. // @description btnull设置已看,用来找电影
  6. // @author 蓝白社野怪
  7. // @include *btnull*
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=greasyfork.org
  9. // @require https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js
  10. // @require https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.mini.min.js
  11. // @license GPLv3
  12. // @grant unsafeWindow
  13. // @grant GM_setValue
  14. // @grant GM_getValue
  15. // @grant GM_deleteValue
  16. // @grant GM_listValues
  17. // ==/UserScript==
  18. // 透明度设置修改下面三个变量:数值越小越透明,1不透明、0完全透明
  19. // ***********************************************************
  20. // 全局:视频封面(已看):透明度 设定(0.0-1.0)
  21. var opacityIsViewCover = 0.1;
  22. // 全局:未看按钮:透明度 设定(0.0-1.0)
  23. var opacitybtnView = 0.7;
  24. // 全局:已看按钮:透明度 设定(0.0-1.0)
  25. var opacitybtnIsView = 0.3;
  26. // ***********************************************************
  27. // 添加自定义样式
  28. var GM_addStyle = GM_addStyle || function(css) {
  29. var style = document.createElement("style");
  30. style.type = "text/css";
  31. style.appendChild(document.createTextNode(css));
  32. document.getElementsByTagName("head")[0].appendChild(style);
  33. };
  34. $(document).ready(function() {
  35. 'use strict';
  36. gateway();
  37. obServerPicture2();
  38. });
  39. // 方法入口
  40. var gateway = function(){
  41. setUploadList();
  42. setVideoIsViewed();
  43. setBtnView();
  44. }
  45. // 网站的列表,翻页只替换元素,不刷新,无法执行脚本,所以要监听元素变化
  46. var obServerPicture2 = function(){
  47. // 目标元素
  48. const targetElement = document.querySelector('.content-list');
  49. // 创建一个MutationObserver实例
  50. const observer = new MutationObserver((mutations) => {
  51. if(mutations){
  52. gateway();
  53. }
  54. });
  55. // 配置观察器
  56. const config = {
  57. childList: true,
  58. };
  59. // 启动观察器
  60. observer.observe(targetElement, config);
  61. }
  62. // 自定义样式
  63. var staticStyle = `
  64. .btnView{opacity:`+opacitybtnView+`;width:40px;height: 25px;line-height:16px;font-size:12px;text-align:center;cursor:pointer;display:inline-block;position:absolute;right:0;top:0;z-index:2;border:1px solid #999;border-radius:3px;padding:3px 5px;background:#fff;color:black;}
  65. .btnIsView{opacity:`+opacitybtnIsView+`;background:rgba(255,255,255,0.5);}
  66. .btnView:hover{opacity:1;background:#aaa;color:#fff;}
  67. .btnIsView:hover{background:rgba(255,255,255,1);opacity:1;color:#999;}
  68. .btnRefresh{display:inline-block;position:absolute;z-index:1;right:52px;top:18px;background:#fff;border:1px solid #999;border-radius:5px;color:#999;padding:1px 5px;}
  69. .btnRefresh:hover{background:#aaa;color:#fff;}
  70. .btnList{display:inline-block;position:absolute;z-index:1;right:97px;top:18px;background:#fff;border:1px solid #999;border-radius:5px;color:#999;padding:1px 5px;}
  71. .btnList:hover{background:#aaa;color:#fff;}
  72. .btnListSave{display:inline-block;position:absolute;z-index:1;right:170px;top:18px;background:#fff;border:1px solid #999;border-radius:5px;color:#999;padding:1px 5px;display:none;}
  73. .btnListSave:hover{background:#aaa;color:#fff;}
  74. .viewList{width:100%;height:120px;display:none;color:#999;padding:1px 5px;}
  75. /*通用属性*/
  76. .__scale-wrap .btnView{right:unset;width:40px;line-height:16px;}`;
  77. GM_addStyle(staticStyle);
  78. // bvid 影片id,bname 影片名称
  79. var bvid = null;
  80. var bname = null;
  81. // viewGroupArr存影片时间,viewNameGroupArr存影片名称
  82. var viewGroupArr = [];
  83. var viewNameGroupArr = [];
  84. viewGroupArr = GM_getValue("BtnullViewIdList",null);
  85. if(!viewGroupArr)
  86. viewGroupArr = [];
  87. viewNameGroupArr = GM_getValue("BtnullViewNameList",null);
  88. if(!viewNameGroupArr)
  89. viewNameGroupArr = [];
  90. // 设置上传按钮
  91. var setUploadList = function(){
  92. if($("#viewListUpload").length>0)
  93. return;
  94. else{
  95. $(".sort div:first").before("<input type='file' id='viewListUpload' >");
  96. $("#viewListUpload").bind("change", handleFile);
  97. }
  98. }
  99. // 读取上传的文件内容
  100. var handleFile = function(e) {
  101. var nameArray = [];
  102. var timeArray = [];
  103. var file = e.target.files[0];
  104. var reader = new FileReader();
  105. reader.readAsArrayBuffer(file);
  106. //reader.readAsText(file,'GB2312');
  107. reader.onload = function(e) {
  108. var data = e.target.r###lt;
  109. /* reader.readAsArrayBuffer(file) -> data will be an ArrayBuffer */
  110. //var workbook = XLSX.read(data,{ type: "binary", codepage: 936 });
  111. var workbook = XLSX.read(data);
  112. var mySheet = workbook.Sheets.Sheet1;
  113. let s = mySheet['!ref'];
  114. var sheetHeight = s.slice(s.indexOf(':')+2);
  115. //循环读取数据
  116. for(let i = 2;i<=sheetHeight;i++){
  117. var name = mySheet["A"+i].w;
  118. var time = null;
  119. var timecol = mySheet["E"+i];
  120. if(timecol == undefined){
  121. time = "0/";
  122. }else{
  123. time = timecol.w;
  124. }
  125. let a = name.indexOf('/');
  126. if(a!=-1){
  127. name = name.slice(0,name.indexOf('/')-1);
  128. }
  129. time = time.slice(0,time.indexOf('/'));
  130. nameArray.unshift(name);
  131. timeArray.unshift(time);
  132. }
  133. // 存储到GM
  134. GM_setValue("BtnullViewIdList",timeArray);
  135. GM_setValue("BtnullViewNameList",nameArray);
  136. alert("上传成功");
  137. };
  138. }
  139. // 设置封面样式
  140. var setVideoIsViewed = function(){
  141. // 获取内容列表
  142. var content_list = $(".content-list li");
  143. $.each(content_list,function(index,item){
  144. // 获取封面的 a标签
  145. var coverObj0 = $(item).find("a")[0];
  146. var coverObj = $(coverObj0);
  147. // bvid = coverObj.attr("href");
  148. // bvid = bvid.replace("/mv/","");
  149. var timeObj = coverObj.parent().next().find("div");
  150. var text = timeObj.text();
  151. bvid = text.slice(0,text.indexOf('/')-1);
  152. bname = coverObj.attr("title");
  153. // 添加已看/未看按钮、设置封面透明度
  154. if(getBvIsViewed(bvid,bname)){
  155. // 已看
  156. coverObj.before("<button class='btnView btnIsView' data-view='1' data-av='"+bvid+"' data-bname='"+bname+"'>已看</button>");
  157. coverObj.css("opacity",opacityIsViewCover);
  158. }else{
  159. // 未看
  160. coverObj.before("<button class='btnView btnNotView' data-view='0' data-av='"+bvid+"' data-bname='"+bname+"'>未看</button>");
  161. coverObj.css("opacity","1");
  162. }
  163. });
  164. }
  165. // 判断视频是否已看,判断同年且同名的
  166. var getBvIsViewed = function(bvid,bname){
  167. bvid = bvid + "";
  168. bname = bname + "";
  169. if(!viewNameGroupArr)
  170. return false;
  171. for(var i = 0 ; i < viewNameGroupArr.length;i++){
  172. if(bname == viewNameGroupArr[i] && bvid == viewGroupArr[i]){
  173. return true;
  174. }
  175. }
  176. return false;
  177. }
  178. // 更新和保存GM本地存储的列表
  179. var saveGMVideoList = function(bvid,bname,isViewed){
  180. bvid = bvid + "";
  181. bname = bname + "";
  182. if(isViewed){
  183. //列表非空
  184. if(viewNameGroupArr){
  185. // 防止没刷新重复插入
  186. for(let i = 0 ; i < viewNameGroupArr.length ;i++){
  187. if(viewNameGroupArr[i] == bname && viewGroupArr[i] == bvid){
  188. return;
  189. }
  190. }
  191. }
  192. viewGroupArr.unshift(bvid); // 添加新的ID到数组中
  193. viewNameGroupArr.unshift(bname);
  194. }else{
  195. if(!viewNameGroupArr)
  196. return;
  197. for(let i = 0 ; i < viewNameGroupArr.length;i++){
  198. if(viewNameGroupArr[i] == bname && viewGroupArr[i] == bvid){
  199. viewGroupArr.splice(i,1); // 删除数组上指定位置的数据
  200. viewNameGroupArr.splice(i,1);
  201. }
  202. }
  203. }
  204. // 存储到GM
  205. GM_setValue("BtnullViewIdList",viewGroupArr);
  206. GM_setValue("BtnullViewNameList",viewNameGroupArr);
  207. }
  208. // 设置已看/未看按钮响应
  209. //var coverItemClass = "img";
  210. var setBtnView = function(){
  211. $(".btnView").unbind("click").click(function(e){
  212. var avId = $(this).data("av");
  213. var view = $(this).data("view");
  214. var avName = $(this).data("bname");
  215. var coverObjs = $(this).next();
  216. // 先读再存(跨页操作)
  217. // not:类.block-list-item-info-player--img为课堂分区封面上面的播放小图标
  218. // not:类.cover为热门-全站排行榜的唱片封面
  219. // var coverObjs = $(this).parent().find(coverItemClass+":not(.block-list-item-info-player--img):not(.cover):first");
  220. // 已看标志
  221. var setIsViewed = false;
  222. if(view == 0){
  223. // 未看 -> 已看
  224. setIsViewed = true;
  225. $(this).text("已看");
  226. $(this).removeClass("btnNotView");
  227. $(this).addClass("btnIsView");
  228. $(this).data("view","1");
  229. coverObjs.css("opacity",opacityIsViewCover);
  230. }else{
  231. // 已看 -> 未看
  232. $(this).text("未看");
  233. $(this).removeClass("btnIsView");
  234. $(this).addClass("btnNotView");
  235. $(this).data("view","0");
  236. coverObjs.css("opacity","1");
  237. }
  238. // 删除所有按钮
  239. // $(".btnView").remove();
  240. // 即时存储
  241. saveGMVideoList(avId,avName,setIsViewed);
  242. // 重新读取
  243. // setMethod();
  244. return false;
  245. });
  246. }