Greasy Fork

Greasy Fork is available in English.

sukebei preview

sukebei preview script

当前为 2017-08-09 提交的版本,查看 最新版本

// ==UserScript==
// @name       sukebei preview
// @namespace  https://sukebei.nyaa.si/
// @author      darkyop
// @version    0.2
// @description  sukebei preview script
// @include     http*://sukebei.nyaa.si/*
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @require     http://cdnjs.cloudflare.com/ajax/libs/markdown-it/8.3.1/markdown-it.min.js
// @grant       GM_xmlhttpRequest
// @copyright  2012+, You
// ==/UserScript==

var markdownOptions = {
    html: false,
    breaks: true,
    linkify: true,
    typographer: true
};
var markdown = window.markdownit(markdownOptions);
markdown.renderer.rules.table_open = function(tokens, idx) {
    return '<table class="table table-striped table-bordered" style="width: auto;">';
};

$(function() {
	$("body").append("<label class='nyaa_check' style='position:absolute;right:5px;top:60px;font-size:12px'><input type='checkbox' id='nyaa_check' checked='checked' style='display:inline-block;margin:-1px 2px 0 0;vertical-align:middle'>사용</label>");
	$("#nyaa_check").on("change", function() {
		localStorage.setItem("nyaa_check", this.checked ? "use" : "no");
		if(this.checked) {
			location.reload();
		}
	});
	
	var getNyaaUse = localStorage.getItem("nyaa_check");
	if(getNyaaUse != undefined && getNyaaUse != null && getNyaaUse == "no") {
		$("#nyaa_check").prop("checked",false).trigger("change");
		return false;
	}
	
	page.load();
	page.convertload();

	var checkPoint = true;
	var convertIdx = 0;
	$(".torrent-list tbody tr").each(function(key) {        
		var getTarget = $(this);
		var getUrl = getTarget.find("td:eq(1) a").attr("target","_blank").attr("href");
		var getTime = getTarget.find("td:eq(4)").text();
		if(getUrl != undefined && getUrl != "" && getUrl.indexOf("view") > -1) {
			if(checkPoint == true) {
				page.checkpoint(true, getUrl);
			}
			checkPoint = false;
			if(page.data[getUrl] == undefined) {
				page.list.push([getTarget, getUrl, getTime]);
			}
			else {
				convertIdx += 1;
				setTimeout(function() {
					page.convert(getTarget, page.data[getUrl][0], page.data[getUrl][1]);
				}, convertIdx * page.delay);
			}
		}
	});
	
	//임시 클릭시 실행하기
	if(page.autoload == false) {
		$("body").on("click", ".torrent-list .preview_box", function() {
			var getTarget = $(this);
			if(!getTarget.hasClass(".preview_box")) getTarget = $(this).closest(".preview_box");
			var target = getTarget.data("target");
			var data = getTarget.data("data");
			var time = getTarget.data("time");
			page.converthtml(getTarget, target, data, time);
			return false;
		});
	}

	page.detail(0);
	
	if(page.debug == true) {
		$("body").append("<textarea id='input_debug' style='position:fixed;left:0;top:0;width:80px;height:60px;z-index:10000'></textarea>");
		$("#input_debug").on("focusin", function() {
			$(this).css({ width:500, height:200 });
		}).on("focusout", function() {
			$(this).css({ width:80, height:60 });
		});
	}
});

var page = {
	autoload: true,
	debug: false,
	delay: 600,
	list: [],
	data: {},
	link: {},
	detail: function(idx) {
		if(page.list[idx] == undefined) return;
		$.ajax({
			url:page.list[idx][1],
			dataType:"html",
			success:function(data) {
				//console.log(data);
				if(data && data.indexOf("torrent-description") > -1) {
					var getHtml = $(data).find("#torrent-description").html();
					page.data[page.list[idx][1]] = [getHtml, page.list[idx][2]];
					page.convert(page.list[idx][0], getHtml, page.list[idx][2]);

					page.save();
				}
				setTimeout(function() {
					page.detail(idx + 1);
				}, page.delay);
			},
			error:function() {
				setTimeout(function() {
					page.detail(idx + 1);
				}, page.delay);
			}
		});
	},
	convert: function(target, data, time) {
		//console.log(data);
		var getDescHtml = markdown.render(data);
		var getPreviewBox = $("<tr class='preview_box'><td colspan='9' style='padding:5px;white-space:normal' class='viewdescription'>" + getDescHtml + "</td></tr>").insertAfter(target);
		getPreviewBox.data({ target:target, data:data, time:time });
		
		//클릭시 실행하게 막기
		if(page.autoload == true) {
			page.converthtml(getPreviewBox, target, data, time);
		}
	},
	converthtml: function(getPreviewBox, target, data, time) {
		getPreviewBox.find("a").each(function() {
			var getText = $(this).text();
			if(getText.indexOf("[/img") > -1) {
				getText = getText.replace("[/img]", "").replace("[/img", "");
				$(this).attr("href",getText).empty().append("<img src='" + getText + "' alt='' style='max-width:500px'>");
			}
		});

		getPreviewBox.find("img").css({ "maxWidth": 500 }).eq(0).each(function() {
			//if($(this).parent()[0].tagName == "A" && $(this).parent().attr("href") != "") {
			//	return true;
			//}
			var getImg = $(this);
			var getLinkSrc = getImg.attr("src");
			if(page.link[getLinkSrc] != undefined && page.link[getLinkSrc] != "") {
				console.log("link data", getLinkSrc, page.link[getLinkSrc]);
				getImg.attr("src",page.link[getLinkSrc]);
			}
			else {
				var getSrc = page.image("img", getImg, getLinkSrc, time);
			}
		});

		//getPreviewBox.find("a").each(function() {
		//	var getText = $(this).text();
		//	if(getText.indexOf("http") > -1 && (getText.indexOf(".jpg") > -1 || getText.indexOf(".jpeg") > -1 || getText.indexOf(".png") > -1)) {
		//		$(this).empty().append("<img src='" + getText + "' alt='' style='max-width:500px'>");
		//	}
		//});
		getPreviewBox.find("a").attr("target","_blank").eq(0).each(function() {			
			var getLink = $(this);
			var getLinkSrc = getLink.attr("href");
			if(getLinkSrc.indexOf("imgur.com") > -1) {
				if(getLinkSrc.indexOf(".jpg") == -1 && getLinkSrc.indexOf(".jpeg") == -1 && getLinkSrc.indexOf(".png") == -1) {
					var getImg = $("<img>").attr("src", getLinkSrc + ".jpg").css("maxWidth", 500);
					var getImg2 = $("<img>").attr("src", getLinkSrc + ".png").css("maxWidth", 500);
					getLink.empty().append(getImg).append(getImg2);					
				}
				else {					
					var getImg = $("<img>").attr("src", getLinkSrc).css("maxWidth", 500);
					getLink.empty().append(getImg);
				}
			}
			else if((getLinkSrc.indexOf("img169.com") > -1 || getLinkSrc.indexOf("imgtuku.com") > -1) && getLinkSrc.indexOf(".jp") > -1) {
				var getImg = $("<img>").attr("src", getLinkSrc).css("maxWidth", 500);
				getLink.empty().append(getImg);
			}			
			else {
				if(page.link[getLinkSrc] != undefined && page.link[getLinkSrc] != "") {
					console.log("link data", getLinkSrc, page.link[getLinkSrc]);
					var getImg = $("<img>").attr("src", page.link[getLinkSrc]).css("maxWidth", 500);
					getLink.empty().append(getImg);
				}
				else {
					var getSrc = page.image("html", getLink, getLinkSrc, time);
				}
			}
		});
	},
	onload: function(type, target, src, img) {
		if(src != "") {
			console.log("onload",type,src,img);
			if(type == "img") {
				var imgObj = new Image();
				imgObj.onload = function() {
					page.link[img] = src;
					page.convertsave();
					console.log("onload success",type,src,img);

					target.addClass("active").attr("src",src).on("click", function() {
						window.open(src,"_blank");
						return false;
					});
				};
				imgObj.src = src;
			}
			else {
				if(target.find("img.active").length > 0) return;
				var imgObj = new Image();
				imgObj.onload = function() {
					page.link[img] = src;
					page.convertsave();
					console.log("onload success",type,src,img);

					var getImg = $("<img>").attr("src", src).css("maxWidth", 500);
					target.attr("src",src).empty().append(getImg);
				};
				imgObj.src = src;
			}
		}
	},
	image: function(type, target, img, time) {
		var getSrc = "";
		
		//핫링크 차단
		 //imgadult.com imgtaxi.com imgdrive.net 

		if(type == "img") {
			if(img.indexOf("pixsense.net") > -1) {
				getSrc = img.replace("small/","big/").replace("/small-","/");	
			}	
			//else if(img.indexOf("imgwallet.com") > -1 || img.indexOf("img.yt") > -1 || img.indexOf("imgstudio.org") > -1 || img.indexOf("hentai-jav.top") > -1 || img.indexOf("hentai-sun.top") > -1 || img.indexOf("imageteam.org") > -1 || img.indexOf("imgdrive.net") > -1 || img.indexOf("imgadult.com") > -1 || img.indexOf("imgtaxi.com") > -1) {		
			else if(img.indexOf("imgwallet.com") > -1 || img.indexOf("img.yt") > -1 || img.indexOf("imgstudio.org") > -1 || img.indexOf("hentai-jav.top") > -1 || img.indexOf("hentai-sun.top") > -1 || img.indexOf("star-hentai.com") > -1 || img.indexOf("hentai-baka.com") > -1 || img.indexOf("imageteam.org") > -1) {		
				getSrc = img.replace("small/","big/");	
			}
			else {
				console.log("image", type,target,img,time);
			}	
			if(getSrc != "") {
				page.onload(type, target, getSrc, img);
			}
		}
		else {
			if(img.indexOf("imgazel.info") > -1 || img.indexOf("55888.eu") > -1 || img.indexOf("imgadult.com") > -1 || img.indexOf("dimtus.com") > -1 || img.indexOf("damimage.com") > -1 || img.indexOf("imagedecode.com") > -1 || img.indexOf("pixsense.net") > -1 || img.indexOf("imgtaxi.com") > -1 || img.indexOf("imgseed.com") > -1 || img.indexOf("imgchili.net") > -1 || img.indexOf("h-hentai.com") > -1) {				
				console.log("html ajax", img);
				page.ajax(type, target, img);
			}			
			else {
				console.log("html", type,target,img,time);
			}
		}

		page.onload(type, target, getSrc, img);
	},
	ajax: function(type, target, img) {
		GM_xmlhttpRequest({
			method: "POST",
			url: img,
			overrideMimeType:"text/html; charset=utf-8",
			headers:{
				"Content-Type": "text/html; charset=utf-8",
				"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",    // If not specified, navigator.userAgent will be used.
				"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"            // If not specified, browser defaults will be used.
			},
			onload: function(response) {
				if(response && response.status && response.status == 200 && response.responseText) {
					var getHtml = $(response.responseText);
					console.log("html ajax onload", img);
					if(page.debug == true) {
						$("#input_debug").val(response.responseText);
					}
					var getSrc = "";
					if(img.indexOf("pixsense.net") > -1) {
						if(getHtml.find("#myUniqueImg").length > 0) {
							getSrc = getHtml.find("#myUniqueImg").attr("src");
							if(getSrc.indexOf("pixsense.net") == -1) {								
								getSrc = getHtml.find("#myUniqueImg").parent().attr("href");
							}
						}
					}
					else if(img.indexOf("imgadult.com") > -1 || img.indexOf("imgtaxi.com") > -1) {
						if(response.responseText.indexOf("og:image") > -1) {
							var getSrcArray = response.responseText.split("og:image")[1].split("\"");
							console.log(getSrcArray[2]);
							if(getSrcArray.length > 2 && getSrcArray[2] != "") {
								getSrc = getSrcArray[2];
							}
						}
						
						//if(getHtml.find("meta[property='og:image']").length > 0) {
							//getSrc = getHtml.find("meta[property='og:image']").attr("content");
							//if(getSrc != undefined && getSrc != null && getSrc != "") {
							//	getSrc = getSrc.replace("/small","/big");
							//}
							//else getSrc = "";
						//}
					}
					else if(img.indexOf("imgazel.info") > -1 || img.indexOf("55888.eu") > -1 || img.indexOf("dimtus.com") > -1 || img.indexOf("damimage.com") > -1 || img.indexOf("imgseed.com") > -1 || img.indexOf("imagedecode.com") > -1) {
						if(getHtml.find("img.centred").length > 0) {
							getSrc = getHtml.find("img.centred").attr("src");
						}
						else if(getHtml.find("img.centred_resized").length > 0) {
							getSrc = getHtml.find("img.centred_resized").attr("src");
						}
					}
					else if(img.indexOf("imgchili.net") > -1) {
						if(getHtml.find("#show_image").length > 0) {
							getSrc = getHtml.find("#show_image").attr("src");
						}
					}
					else if(img.indexOf("h-hentai.com") > -1) {
						if(getHtml.find(".dishImage").length > 0) {
							getSrc = getHtml.find(".dishImage > .attachment-full").attr("src");
						}
					}
					if(getSrc != "") {
						page.onload(type, target, getSrc, img);
					}
				}
			}
		});
	},
	load: function() {
		var getLastTime = localStorage.getItem("sukebie_time");
		var getNowTime = new Date().getTime();
		var timeCheck = false;
		console.log("page load", parseInt(getLastTime, 10), getNowTime, getNowTime - parseInt(getLastTime, 10), getNowTime - parseInt(getLastTime, 10) < 1000 * 60 * 60);
		if(getLastTime == null || getLastTime == undefined || getLastTime == "" || getNowTime - parseInt(getLastTime, 10) < 1000 * 60 * 60) {
			timeCheck = true;
		}

		var getData = localStorage.getItem("sukebie_data");
		if(timeCheck == true && getData != null && getData !=="") {
			getData = $.parseJSON(getData);
			if(getData != null && getData != undefined && getData.data != undefined) {				
				page.data = getData.data;
				console.log("page load", page.data);
			}
		}
		else {
			console.log("데이터 초기화");
			localStorage.removeItem("sukebie_data");
			localStorage.removeItem("sukebie_list");
		}

		page.checkpoint(false, "");
	},
	saveinterval: null,
	save: function() {
		clearTimeout(page.saveinterval);        
		page.saveinterval = setTimeout(function() {
			console.log("page save", page.data);
			localStorage.setItem("sukebie_data",JSON.stringify({ time:new Date().getTime(), data:page.data }));
			localStorage.setItem("sukebie_time", new Date().getTime());
		}, 3000);
	},
	convertload: function() {        
		var getData = localStorage.getItem("sukebie_list");
		if(getData != null && getData !=="") {
			getData = $.parseJSON(getData);
			if(getData != null && getData != undefined && getData.data != undefined) {
				page.link = getData.data;
				console.log("page convertload", page.link);
			}
		}
	},
	convertsaveinterval: null,
	convertsave: function() {
		clearTimeout(page.convertsaveinterval);
		page.convertsaveinterval = setTimeout(function() {
			console.log("page convertsave", page.link);
			localStorage.setItem("sukebie_list",JSON.stringify({ time:new Date().getTime(), data:page.link }));
			localStorage.setItem("sukebie_time", new Date().getTime());
		}, 3000);
	},
	checkpoint: function(type,url) {
		if(type == true) {
			var getPrev = localStorage.getItem("sukebie_checkpoint");
			var prevCheck = 0;
			var currCheck = parseInt(url.replace("/view/",""), 10);
			if(getPrev != null && getPrev != undefined && getPrev != "") {
				prevCheck = parseInt(getPrev.replace("/view/",""), 10);
			}
			if(currCheck > prevCheck) {
				localStorage.setItem("sukebie_checkpoint", url);
			}
		}
		else {
			var getPrev = localStorage.getItem("sukebie_checkpoint");
			if(getPrev != null && getPrev != undefined && getPrev != "") {
				var getLast = $(".torrent-list tbody tr a[href='" + getPrev + "']");
				if(getLast.length > 0) {
					$("<tr><td colspan='9' style='padding:5px;text-align:center;color:#fff;font-size:14px;background:#a90101'><p style='margin:0'>☞ 이전에 여기까지 읽음</p></td></tr>").insertBefore(getLast.closest("tr"));
				}
			}
		}
	}
};