Get_all_img_Library

添加了downloader和Add_css;

À partir de 2024-10-28. Voir la dernière version.

Ce script ne devrait pas être installé directement. C'est une librairie créée pour d'autres scripts. Elle doit être inclus avec la commande // @require https://update.sleazyfork.org/scripts/480132/1473184/Get_all_img_Library.js

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==UserScript==
// @name         Get_all_img_Library
// @namespace    http://tampermonkey.net/
// @version      2024.10.28
// @description  添加了downloader和Add_css;
// @author       You
// @grant        none
// ==/UserScript==
function get_img_obo_sessionStorage(key,nums,geturl,getimg,putimg){
	if(window.location.href.indexOf(key)<0){return}
	var i = 2
	if(sessionStorage.num){i = Number(sessionStorage.num)}
	var oldimg = $(sessionStorage.img)
	before_reflash(i,oldimg,putimg)
	
	var state = sessionStorage.state
	if(state!='start'){putimg($(sessionStorage.img),0);sessionStorage.clear();return}
	
	if(i<=nums){
		var href = geturl(i)
		if(!href){putimg($(sessionStorage.img),0);sessionStorage.clear();return}
		$.ajax({
			url:href,
			success:function(){
				var img = getimg('')
				if(sessionStorage.img==undefined){sessionStorage.img=""}
				sessionStorage.img += $('<div></div>').append(img.clone()).html()
				window.location.href = href
				i+=1
				sessionStorage.num = i
			},
			error:function(){
				alert(href+' error')
				putimg($(sessionStorage.img),0)
				sessionStorage.clear()
			},
		})
		
	}else{
		putimg($(sessionStorage.img),0)
		sessionStorage.clear()
	}
}
function before_reflash(i,oldimg,putimg){
	if(sessionStorage.reflash){putimg($(sessionStorage.img),0)}

	console.log('before_reflash')
	window.onbeforeunload = function(){
		if(!oldimg){return}
		if(sessionStorage.state){return}
		sessionStorage.img = $('<div></div>').append(oldimg).html()
		sessionStorage.reflash = 'reflash'
		sessionStorage.num = i
	}
}
function get_img_obo_ajax_href(key,nums,geturl,getimg,putimg){
	var obo = function(i){
		var href = geturl(i)
		console.log(href)
		if(!href){return}
		$.ajax({
			url:href,
			success:function(data){
				var img = getimg(data)
				putimg(img,i)
				showmass(i+'/'+nums)
				
				i+=1
				if(i>=nums){return}
				obo(i)
			},
			error:function(){
				console.log('error: '+href)
				i+=1
				if(i>=nums){return}
				obo(i)
			}
		})
	};obo(0)
}
function new_bottom_bu(text){
	var bu = $('<button></button>').text(text).css({
		position:'fixed',
		bottom:0,
		width:'100vw',
		height:'10vh',
		'font-size':'5vh'
	})
	return bu
}
function obo_sessionStorage_start_bu(){
	var bu = new_bottom_bu("start")
	bu.click(function(){
		if(sessionStorage.state!='start'){
			sessionStorage.clear()
			sessionStorage.setItem('state','start')
			location.reload()
		}else{
			sessionStorage.clear()
		}
	})
	return bu
}
function showmass(ms) {
	if($('.mass_top').attr('class')){$('.mass_top').text(ms);return}
	$('body').append($('<div class="mass_top"></div>').css({
		'font-size':'2vw',
		'color':'rgba(0, 102, 0, 0.5)',
		'position':'fixed',
		'top':'10px',
		'left':'10px',
		'font-weight':'bold',
		'z-index':99999999,
	}).click(function(){$(this).hide()}))
	$('.mass_top').text(ms)
}
function add_css(tag,object){
	var style = $('<style></style>').text(tag+JSON.stringify(object).replace(/\"/g,'').replace(/,/g,";"))
	$('body').append(style)
}
function remove_sameimg(){
	var hs = new Array()
	$('img').each(function(){
		if(hs.indexOf(this.src)<0){
			hs.push(this.src)
		}else{
			$(this).remove()
		}
	})
}
function reflash_unloadimg(){
	var check = setInterval(function(){
		if(sessionStorage.reflashlock == 'yes'){return}
		var img = $('img:visible').filter(function(){return this.naturalWidth==0})
		img.each(function(){
			if(this.naturalWidth==0){
				//console.log(this.src)
				var clone = $(this).clone(true)
				var parent = $(this).parent()
				var pre = $(this).prev()
				var next = $(this).next()
				$(this).remove()
		
				setTimeout(function(){
					if(pre[0]){pre.after(clone);return}
					if(next[0]){next.before(clone);return}
					if(parent[0]){parent.append(clone);return}
				},500)
			}
		})
	},1000)
}

let addedKeyControl = false;
function AddKeyControl(downItem,upItem,leftItem,rightItem,closew){
	if(addedKeyControl){return;}else{addedKeyControl = true;}
	
	if(!downItem){
		downItem = $('<a></a>').click(function(){
			// 获取当前窗口的滚动位置
			var currentScroll = document.documentElement.scrollTop;
			
			// 设置每次 PageDown 后滚动的距离,可以根据需要调整
			var scrollDistance = $(window).height()/2;
			
			console.log(currentScroll);
			// 使用 scrollTo 方法将窗口滚动到当前位置加上设定的滚动距离
			window.scrollTo(0,currentScroll + scrollDistance);
		})
	}
	if(!upItem){
		upItem = $('<a></a>').click(function(){
			// 获取当前窗口的滚动位置
			var currentScroll = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
			
			// 设置每次 PageDown 后滚动的距离,可以根据需要调整
			var scrollDistance = window.innerHeight/2;
			
			// 使用 scrollTo 方法将窗口滚动到当前位置加上设定的滚动距离
			window.scrollTo(0,currentScroll - scrollDistance);
		})
	}
	document.addEventListener('keydown', function(event) {
	    if (event.key === 'ArrowLeft' && leftItem && leftItem.length>0) {
	        // 用户按下了左箭头键
			leftItem[0].click();
	        console.log('Left arrow key pressed');
	        // 执行左方向键对应的操作
	    } else if (event.key === 'ArrowRight' && rightItem && rightItem.length>0 ) {
	        // 用户按下了右箭头键
			rightItem[0].click();
	        console.log('Right arrow key pressed');
	        // 执行右方向键对应的操作
	    } else if (event.key === 'ArrowUp' && upItem && upItem.length>0) {
	        // 用户按下了上箭头键
			upItem[0].click();
	        console.log('Up arrow key pressed');
	        // 执行上方向键对应的操作
	    } else if (event.key === 'ArrowDown' && downItem && downItem.length>0) {
	        // 用户按下了下箭头键
			downItem[0].click();
	        console.log('Down arrow key pressed');
	        // 执行下方向键对应的操作
	    } else if (event.key === '0' && closew) {
	        // 用户按下了下箭头键
			window.close();
	        // 执行下方向键对应的操作
	    }
	});
}
async function hold_and_zoom(img,name,GetBigImg){
	if(!$('.holdbox:first')[0]){
		$('body').append($('<div class="holdbox"></div>').css({
			'z-index':'9999999',
			width:'100vw',
			height:'100vh',
			position:'fixed',
			top:0,
			left:0,
			display:'flex',
			'justify-content':'center',
		}))
		$('.holdbox').hide()
		$('.holdbox').on('mousedown',function(e){
			if(e.button!=0){return}
			if(showimg){clearTimeout(showimg)}
			if(showimg){showimg = null}
			$('.holdbox:first').hide()
		}).on('mousewheel',function(){
			if(showimg){clearTimeout(showimg)}
			if(showimg){showimg = null}
			$('.holdbox:first').hide()
		})
	}
	
	var showimg = null
	var state = 'mouseout'
	img.on('mouseout',function(){
		state = 'mouseout'
	})
	let getting = false;
	img.on('mouseover',async function(event){
		state = 'mousemove'
		if(showimg){clearTimeout(showimg)}
		if(showimg){showimg = null}
		
		let _img = $(this);
		let iimg = $(this).clone();

		showimg = setTimeout(function(){
			if(state=='mouseout'){return}
			if(GetBigImg && img.attr('big-src')==null && !getting){
				new Promise((resolve,reject)=>{
					getting = true;
					GetBigImg(function(src){
						if(!src || src==""){console.log('src error');resolve()}else{
							getting = false;
							_img.attr('big-src',src).attr('src',src);
							let mass = $('<p>loading...</p>');
							_img.after(mass);
							let ioo = new Image();
							ioo.onload = function(){
								iimg.attr('src',src);
								console.log('src success');
								mass.remove();
								resolve();
							}
							ioo.src = src;
						}
					})
				})
			}
			$('.holdbox img').remove()
			$('.holdbox:first').append(iimg.css({
				width:'auto',
				height:'100vh',
			}).attr('name',name(_img)).on('mousedown',function(){
				var src = this.src
				var n = $(this).attr('name')
				if($(this).attr('big-src')){
					src = $(this).attr('big-src')
				}
				GM_download({
					url:src,
					name:n,
				})
			}))
			console.log('show');
			$('.holdbox').fadeIn(200)
		},500)
		
	})
}
function Add_css(cssString){
	var style = document.createElement('style');
	style.type = 'text/css';
	style.innerHTML = cssString;
	document.body.appendChild(style);
}

class Downloader{
	constructor(){
		this.downloadType = "";
		this.downloaded = [];
		this.downloading = 0;
		this.downloadError = [];
		this.imgs = "";
		this.maxDownloadingCounts = 10;
		this.timeout = null;
		this.AllComplete = null;
		this.OneSuccess = null;
		this.OneError = null;
	}
	
	async Download_img(imgs){
		let self = this;
		if(this.downloadType==""){
			await this.Test_downloadType(imgs.eq(0));
		}
		
		this.Set_download(imgs)
		if(this.downloadType=="GM_download"){
			this.Donwload_img_by_GM();
		}else if(this.downloadType=="atag"){
			this.Donwload_img_by_atag();
		}else if(this.downloadType=="blob"){
			this.Donwload_img_by_blob();
		}
	}
	
	async Test_downloadType(img){
		return new Promise((resolve)=>{
			let timeout = 3000;
			let isOk = false;
			GM_download({
				url:img[0].src,
				name:"test.png",
				onload:()=>{isOk = true;this.downloadType = "GM_download";resolve()},
			})
			setTimeout(()=>{
				if(!isOk){this.downloadType = "atag";}
				resolve()
			},timeout)
		})
	}
	Set_download(imgs){
		this.downloaded = [];
		this.downloading = 0;
		this.downloadError = [];
		this.imgs = imgs;
	}
	
	Donwload_img_by_GM(){
		let self = this;
		async function Download_one(i){
			if(i>=self.imgs.length){if(self.AllComplete){self.AllComplete()};return;}
			if(self.downloading>=self.maxDownloadingCounts){setTimeout(()=>{Download_one(i)},1000);return;}
			
			let name = '';
			let src = '';
			self.downloading++;
			try{
				await self.Check_and_get_nameAndsrc({img:self.imgs.eq(i),checkSrc:true})
						.then((m)=>{
							name = m.name;
							src = m.src;
						});
			}catch(error){
				console.log(error)
				console.log('imgsrc is error:');
				self.downloadError.push(i);
				self.downloading--;
				Download_one(i+1);
				return;
			}
			console.log(name)
			console.log(document.title)
			let timeout = false;
			setTimeout(() => {timeout = true;},10000);
			const donwimg = self.imgs.eq(i);
			GM_download({
				url:src,
				name:name,
				onload:function(){
					self.downloaded.push(downimg);
					self.downloading--;
					if(window.GAIL.showmass){
						window.GAIL.showmass((self.downloaded.length+self.downloadError.length)+"/"+self.imgs.length);
					}
					self.imgs.eq(i).remove();
					
					if(self.OneSuccess){self.OneSuccess(downimg);}
				},
				onerror:function(){
					self.downloading--;
					self.downloadError.push(downimg);
					if(self.OnError){self.OnError(downimg);}
				},
				onprogress:function(){
					if(timeout){return false;}
				}
			});
			setTimeout(function() {Download_one(i+1);}, 10);
		}
		Download_one(0);
	}
	Check_and_get_nameAndsrc(args){
		let self = this;
		console.log(args);
		return new Promise(async (resolve,reject)=>{
			if(!args || !args.img){return reject();}
			let src = args.img.attr('big_src');
			if(!src){src = args.img.attr('src');}
			if(!src){reject();}
			console.log("check:"+src)
			if(args.checkSrc){
				try{
					await self.check_src_is_right(src);
				}catch(error){
					reject();
				}
			}
			let ext = src.match(/\.jpg|\.png|\.webp|\.gif|\.bmp/g);
			if(!ext){ext = '.png';}else{ext = ext[0];}
			let name = args.img.attr('name');
			if(!name){name = document.title + new Date().getTime() + ext;}
			resolve({name:name,src:src});
		});
	}
	Donwload_img_by_atag(){
		let self = this;
		let myWindow = window.open('_blank');
		async function Download_one(i){
			if(i>=imgs.length){myWindow.alert('end');myWindow.history.go(0-myWindow.history.length+1);myWindow.close();return;}
			
			let name = '';
			let src = '';
			self.downloading++;
			try{
				await self.Check_and_get_nameAndsrc({img:self.imgs.eq(i),checkSrc:true})
						.then((m)=>{
							name = m.name;
							src = m.src;
						});
			}catch(error){
				console.log('imgsrc is error:');
				self.downloadError.push(i);
				self.downloading--;
				Download_one(i+1);
				return;
			}
			
			if(!myWindow){alert('windows is closed');return;}
			myWindow.location.href = src;
			let a = $('<a></a>').attr({
				'href':$(myWindow.document.body).find('img:first').attr('src'),
				'download':name,
			})
			a[0].click();
			setTimeout(function() {Download_one(i+1);self.imgs.eq(i).remove()}, 1000);
			self.downloaded.push(i);
			self.downloading--;
		}
		Download_one(0);
	}
	check_src_is_right(src){
		let self = this;
		return new Promise((resolve,reject)=>{
			let iimg = new Image();
			iimg.onload = function(){
				if(this.width*this.height*this.naturalWidth*this.naturalHeight==0){reject();}else{resolve();}
			}
			iimg.onerror = function(){reject();}
			iimg.src = src;
			setTimeout(function() {iimg.abort();reject();}, 2000);
		})
	}
	Donwload_img_by_blob(){
		if(!this.imgs || this.imgs.length==0){return;}
		
		const _this = this;
		const imgs = this.imgs;
		const obo = (i)=>{
			if(i>=imgs.length){return;}
			if(_this.maxDownloadingCounts>1 && _this.downloading >= _this.maxDownloadingCounts){
				setTimeout(function() {obo(i)}, 1000);
			}
			let src = imgs.eq(i).attr('big_src');
			if(!src){src = imgs.eq(i).attr('src');}
			const checkimg = imgs.eq(i);
			_this.downloading++;
			_this.UrlToBlob({url:src,timeout:_this.timeout})
				.then(blob=>{
					_this.Check_and_get_nameAndsrc({img:checkimg}).then(args=>{
						const name = args.name;
						let a = $('<a></a>').attr({
							download:name,
							href:blob
						})
						a[0].click();
						_this.downloaded.push(checkimg);
						_this.downloading--;
						checkimg.attr('src',blob);
						OneSuccess?.(checkimg);
					})
					
					if(_this.maxDownloadingCounts==1){
						obo(++i);
					}else{
						window.GAIL.showmass((_this.downloaded.length+_this.downloadError.length)+"/"+_this.imgs.length);
					}
				})
				.catch(er=>{
					console.log(er);
					_this.downloadError.push(imgs.eq(i));
					_this.downloading--;
					if(_this.maxDownloadingCounts==1){
						obo(++i);
					}else{
						window.GAIL.showmass((_this.downloaded.length+_this.downloadError.length)+"/"+_this.imgs.length);
					}
				});
			if(_this.maxDownloadingCounts>1){
				setTimeout(function() {obo(++i);}, 10);
			}
		}
		obo(0);
	}
	/*
	args = {url:url,timeout:timeout}
	*/
	async UrlToBlob(args) {
		let _this = this;
		return new Promise((resolve,reject)=>{
			if(!args.url){reject("no url");}
			if(args.timeout){
				const timeout = setTimeout(function() {reject("fetch timeout")}, args.timeout);
			}
			fetch(args.url)
					.then(response => {
						const contentLength = response.headers.get('Content-Length');
						const total = parseInt(contentLength, 10);
						let loaded = 0;
			
						// 克隆响应以便分别读取流和获得 Blob
						const clonedResponse = response.clone();
						const reader = clonedResponse.body.getReader();
			
						// 更新进度的函数
						function updateProgress({ done, value }) {
							if (done) {
								return; // 如果读取完毕,直接返回
							}
							loaded += value.byteLength; // 累加已加载字节
							const progress = (loaded / total) * 100; // 计算进度百分比
							console.log(`Loading: ${progress.toFixed(2)}%`);
							_this.FetchShowProgress?.(progress);
							// 继续读取下一块数据
							return reader.read().then(updateProgress);
						}
			
						// 开始读取流以更新进度
						return reader.read().then(updateProgress).then(() => {
							// 完成后返回原始响应的 Blob
							return response.blob();
						});
					})
					.then(blob => {
						const blobUrl = URL.createObjectURL(blob);
						resolve(blobUrl);
					})
					.catch(error => {
						console.error('Error caching video:', error);
						reject(error);
					});
		});
	}
	FetchShowProgress(pro){
		if(this.maxDownloadingCounts==1 && this.imgs.length==1){
			window.GAIL.showmass(pro);
			$(".mass_top").css('font-size',"10vw");
		}
	}
}

window.GAIL = {
	get_img_obo_sessionStorage : get_img_obo_sessionStorage,
	get_img_obo_ajax_href : get_img_obo_ajax_href,
	new_bottom_bu : new_bottom_bu,
	obo_sessionStorage_start_bu : obo_sessionStorage_start_bu,
	showmass : showmass,
	add_css : add_css,
	remove_sameimg : remove_sameimg,
	reflash_unloadimg : reflash_unloadimg,
	AddKeyControl : AddKeyControl,
	hold_and_zoom : hold_and_zoom,
	Add_css:Add_css,
	Downloader:Downloader,
}