Greasy Fork

来自缓存

Greasy Fork is available in English.

115网盘显示文件SHA1

显示网盘文件SHA1哈希值、批量复制文件SHA1值

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         115网盘显示文件SHA1
// @namespace    com.115wangpan.showsha1
// @version      0.8
// @description  显示网盘文件SHA1哈希值、批量复制文件SHA1值
// @author       YIU
// @icon         http://115.com/favicon.ico
// @match        http*://115.com/*ct=file*
// @grant        unsafeWindow
// @run-at       document-end
// ==/UserScript==

let $ = unsafeWindow.$;

//* 显示SHA1(要显示的元素,列表类型[0列表型,1图标型])
function displaySha1(dom, listType){
	//由事件传入的dom元素可能是任何标签,只对含有sha1的文件元素显示sha1
	if(!dom.hasAttribute('sha1')){ return; }

	var sha1 = $(dom).attr('sha1');
	if(listType){
		//图标型、无法直接显示、只能在提示中显示
		if($(dom).find('em[gmflagsha1]').length > 0){
			$(dom).find('em[gmflagsha1]').remove();
			$(dom).find('em').css('padding-top','');
			$(dom).find('.file-name').css({'position':'', 'height':''});
		}
		if(dom.title.indexOf('\r')<1){
			var title = `\r\n${sha1}`;
			dom.title += title;
			$(dom).find('.file-name .name')[0].title += title;
		}
	}
	else if(listType < 1 && $(dom).find('em[gmflagsha1]').length < 1){
		//列表型
		$(dom).find('em').css('padding-top','6px');
		$(dom).find('.file-name').css({'position':'initial', 'height':'50px'});
		$(dom).find('.file-name').append(`<em gmflagsha1 style="position:absolute;padding-top:25px;color:#1a273466;font-size: x-small">${sha1}</em>`);
	}
}

//复制SHA1界面方法
let UI_CopySHA1 = {
	'ui': null,
	'hasBind': false,
	'createCopy': function(type){
		let content = '';
		let contentTitle = '';
		let checkedItems = $('#js_data_list input[checked="checked"]').parent();
		let checkedItemsLast = checkedItems.length - 1;
		checkedItems.each(function(i){
			if(!this.hasAttribute('sha1')){return;}
			contentTitle = $(this).parents('.list-thumb').length > 0 ? $(this).attr('title').split('\n')[0] : $(this).attr('title');
			switch(type){
				case 1:
					content += `${contentTitle}\n${$(this).attr('sha1')}${(i != checkedItemsLast ? '\n' : '')}`;break;
				case 2:
					content += `${$(this).attr('sha1')}#${contentTitle}`;break;
				default:
					content += `${$(this).attr('sha1')}`;
			}
			content += i < checkedItemsLast ? '\n' : '';
		});
		return content;
	},
	'copySHA1': function(e, type){
		unsafeWindow.oofUtil.plug.copy.initNewCopy({
			btn_parent: e,
			txt: function(){
				return UI_CopySHA1.createCopy(type);
			},
			suc: function(){
				return unsafeWindow.TOP.Core.MinMessage.Show({
					text: "复制成功",
					type: "suc",
					timeout: 2e3
				});
			}
		});
	},
	'show': function(show){
		if(!this.ui){ this.createUI(); }
		if(show){ this.ui.show(); }
		else{ this.ui.hide(); }
	},
	'createUI': function(){
		if($('.header-name [gmflagcopysha1ui]').length > 0){return;}

		let hookmenu = false;
		let addmenu = $(`<div class="context-menu" style="top:50px;z-index:9999999;display:none;margin-left:-13px">
<em class="arrow-position" style="left:18px;" rel="js_float_arrow"><i class="arrow"></i><s class="arrow"></s></em>
<div class="cell-icon"><ul></ul></div></div>`).hover(
			function(){ hookmenu = !0; },
			function(){
				hookmenu = !1;
				setTimeout(function(){
					if(!hookmenu){addmenu.css('display','none');}
				},200);
			});

		let addmenuitem = $(`<li menu="copy_sha1_filename_u" style="display:list-item"><a href="javascript:;" style="">
<i class="icon-operate ifo-copy"></i><span>文件名在上</span></a></li>`);
		this.copySHA1(addmenuitem, 1);
		addmenu.find('ul').append(addmenuitem);

		addmenuitem = $(`<li menu="copy_sha1_filename_r" style="display:list-item"><a href="javascript:;">
<i class="icon-operate ifo-copy"></i><span>文件名在右</span></a></li>`);
		this.copySHA1(addmenuitem, 2);
		addmenu.find('ul').append(addmenuitem);

		addmenuitem = $(`<li menu="copy_sha1_only" style="display:list-item"><a href="javascript:;">
<i class="icon-operate ifo-copy"></i><span>只有SHA1</span></a></li>`);
		this.copySHA1(addmenuitem);
		addmenu.find('ul').append(addmenuitem);

		//绑定所有菜单事件
		addmenu.find('ul li').click(function(){hookmenu=false; addmenu.css('display','none');});
		addmenu.find('a').hover(
			function(){$(this).css('color','#fff');},
			function(){$(this).css('color','');}
		);

		let addbtn = $(`<a href="javascript:;" class="button btn-stroke" style="padding:0 10px;color:#2777F8;top:-2px">
<i class="icon-operate ifo-copy" style="background-position-y:-40px;margin:0 -3px 0 -2px"></i>
<span>复制SHA1</span></a>`).hover(
			function(){addmenu.css('display','block');},
			function(){
				setTimeout(function(){
					if(!hookmenu){addmenu.css('display','none');}
				},200);
			});

		//组合UI
		let copyui = $('<div gmflagcopysha1ui></div>');
		copyui.append(addbtn, addmenu);
		$('.header-name').append(copyui);
		this.ui = copyui;
	}
};

//绑定的事件
let Events = {
	'listChange': function(){
		//-- 文件列表变化
		//先解除先前绑定
		this.listChangeOff();
		$('#js_data_list').on("DOMSubtreeModified",function(e){
			//防止修改元素造成死循环
			Events.listChangeOff();
			displaySha1(e.target, $('#js_data_list').find('.list-thumb').length);

			//有文件列表时绑定文件勾选事件
			if($('#js_data_list ul li').length > 0 && !UI_CopySHA1.hasBind){
				Events.fileChecked();
			}else if($('#js_data_list ul li').length < 1 && UI_CopySHA1.hasBind){
				UI_CopySHA1.show(!1);
				UI_CopySHA1.ui = null;
				UI_CopySHA1.hasBind = !1;
			}
			//重新绑定本事件
			Events.listChange();
		});
	},
	'listChangeOff': function(){
		//-- 解除文件列表变化绑定事件
		$('#js_data_list').off("DOMSubtreeModified");
	},
	'fileChecked': function(){
		//-- 文件列表勾选
		let bindlist = $('#js_data_list ul')[0];
		let config = { attributes: true, attributeFilter:['checked'], subtree: true };
		if(!bindlist){return;}

		new MutationObserver(function(mutations){
			let isChecked = false;
			let forCount = 0;
			for(let mutation of mutations){
				if(forCount > 1){ break; }
				if(mutation.type === 'attributes' && mutation.target.parentNode && mutation.target.parentNode.hasAttribute('sha1')){
					isChecked = isChecked || mutation.target.checked;
					forCount += isChecked ? 1 : 0;
				}
			}
			UI_CopySHA1.show(isChecked);
		}).observe(bindlist, config);
		UI_CopySHA1.hasBind = !0;
	}
};

//* 执行开始
(function(){
	//绑定事件
	Events.listChange();
})();