您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
View Imgur media in a slideshow format
- // ==UserScript==
- // @name slideshow
- // @namespace https://gf.qytechs.cn/en/users/94062-oshaw
- // @version 3
- // @description View Imgur media in a slideshow format
- // @author Oscar Shaw
- // @grant none
- // @include https://*.reddit.*/r/*
- // @include http://imgur.com/*
- // @include https://imgur.com/*
- // @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
- // @run-at document-start
- // ==/UserScript==
- /* "name": "library.js",
- "program": "Slideshow",
- "description": ""
- */
- function say(str_input, tab_input = window) {
- tab_input.console.log(str_input);
- } say("Compiled");
- function list(arrkvp_input, tab_input = window) {
- var str_output = "";
- for (var i = 0; i < arrkvp_input.length; i++) {
- str_output += (
- arrkvp_input[i][0] + ": \t\t"
- + arrkvp_input[i][1] + "\n"
- );
- }
- say(str_output, tab_input);
- }
- function shout(str_input, tab_input = window) {
- tab_input.alert(str_input);
- }
- function tag(str_element, tab_input = window) {
- switch (str_element[0]) {
- case '.': return tab_input.document.getElementsByClassName(str_element.substring(1));
- case '#': return tab_input.document.getElementById(str_element.substring(1));
- default: return;
- }
- }
- function sayTab(str_body, str_title = "") {
- window.open().document.body.appendChild(document.createElement('pre')).innerHTML
- = (str_title != "" ? str_function + "\n\n" : "")
- + str_body;
- }
- function tryCatch(anon) {
- try { anon(); }
- catch(str_error) { say(str_error); }
- }
- function isDef(var_input) {
- return !(var_input == null || var_input == undefined || var_input == "");
- }
- function func_xhr(obj_input) {
- say("func_xhr requesting " + obj_input.url_destination);
- var xhr = new XMLHttpRequest();
- xhr.onload = function() {
- try { var json = JSON.parse(this.responseText); }
- catch(str_error) {
- say("func_error\n\n" + str_error + "\n\n" + this.responseText);
- obj_input.func_error(str_error);
- }
- if (!isDef(json.status)) obj_input.func_success(json);
- if (json.status == 200) {
- say("func_success");
- obj_input.func_success(json);
- }
- else {
- say("func_failure");
- obj_input.func_failure(json.status);
- }
- };
- xhr.open("GET", obj_input.url_destination, true);
- if (obj_input.str_headerKey != undefined && obj_input.str_headerValue != undefined) {
- xhr.setRequestHeader(
- obj_input.str_headerKey,
- obj_input.str_headerValue
- );
- }
- xhr.send();
- }
- function func_htmlUnescape(str_input) {
- return str_input
- .replace(/"/g, '"')
- .replace(/'/g, "'")
- .replace(/</g, '<')
- .replace(/>/g, '>')
- .replace(/&/g, '&');
- }
- /* "name": "parsers.js",
- "program": "Slideshow",
- "description": ""
- */
- function func_imgurUrlToJson(url_input, func_callback, arrstr_endpoints = ["append", "album", "image"]) {
- const constr_imgurApiId = "b5abfbf0e29baf1";
- var hash_source = url_input.substring(url_input.lastIndexOf("/") + 1);
- var anon_request = function(str_endpoint, func_next) {
- var obj_xhrInputs;
- switch(str_endpoint) {
- case "append": {
- obj_xhrInputs = { url_destination: url_input + ".json" }
- break;
- }
- case "album": {
- obj_xhrInputs = {
- url_destination: "https://api.imgur.com/3/album/" + hash_source
- , str_headerKey: "Authorization"
- , str_headerValue: "Client-ID " + constr_imgurApiId
- }
- break;
- }
- case "image": {
- obj_xhrInputs = {
- url_destination: "https://api.imgur.com/3/image/" + hash_source
- , str_headerKey: "Authorization"
- , str_headerValue: "Client-ID " + constr_imgurApiId
- }
- break;
- }
- default: break;
- }
- func_xhr({
- url_destination: obj_xhrInputs.url_destination
- , func_success: function(json_response) { func_callback(json_response); }
- , func_error: func_next
- , func_failure: func_next
- , str_headerKey: obj_xhrInputs.str_headerKey
- , str_headerValue: obj_xhrInputs.str_headerValue
- });
- };
- var i = 0;
- anon_request(arrstr_endpoints[i], function() {
- if (isDef(arrstr_endpoints[i + 1])) {
- i++;
- anon_request(arrstr_endpoints[i], function() {
- if (isDef(arrstr_endpoints[i + 1])) {
- i++;
- anon_request(arrstr_endpoints[i]);
- }
- });
- }
- }, function() {
- if (isDef(arrstr_endpoints[i + 1])) {
- i++;
- anon_request(arrstr_endpoints[i], function() {
- if (isDef(arrstr_endpoints[i + 1])) {
- i++;
- anon_request(arrstr_endpoints[i]);
- }
- });
- }
- });
- }
- function func_imgurJsonToSsdn(json_input) {
- say("func_imgur_jsonToSsdn");
- var bool_isAppend = json_input.data.hasOwnProperty("image");
- var node_inputHeader = bool_isAppend ? json_input.data.image : json_input.data;
- var node_imageArray = bool_isAppend ? json_input.data.image.album_images.images : json_input.data.images;
- var ssdn_output = {
- node_header:
- {
- str_title: (node_inputHeader.title === null) ? "" : node_inputHeader.title
- , str_description: (node_inputHeader.description === null) ? "" : node_inputHeader.description
- , str_poster: node_inputHeader.account_url
- , int_length: bool_isAppend ? node_inputHeader.num_images : node_inputHeader.images_count
- , int_views: node_inputHeader.views
- , int_points: node_inputHeader.points
- , int_ups: node_inputHeader.ups
- , int_downs: node_inputHeader.downs
- }
- , node_payload: []
- };
- var int_outputLength = ssdn_output.node_header.int_length;
- ssdn_output.node_header.int_length = (int_outputLength == null) ? 1 : int_outputLength;
- if (ssdn_output.node_header.int_length > 1) { // If album
- $.each(node_imageArray, function(i, node_image) {
- ssdn_output.node_payload.push({
- str_title: (node_image.title === null) ? "" : node_image.title
- , str_description: (node_image.description === null) ? "" : node_image.description
- , url_direct: bool_isAppend ? "http://i.imgur.com/" + node_image.hash + node_image.ext : node_image.link
- });
- });
- }
- else { // If image
- ssdn_output.node_payload.push({
- str_title: undefined
- , str_description: undefined
- , url_direct: node_inputHeader.link
- });
- }
- say("func_imgur_jsonToSsdn payload completed");
- return ssdn_output;
- }
- function class_redditParser(url_input, func_send) {
- function func_stringToUrlArray(str_input) {
- // say("func_stringToUrlArray");
- var array_urls = [];
- if (isDef(str_input.match(/http(.*?)(?=["?])/g))) {
- $.each(str_input.match(
- /http(.*?)(?=["?])/g
- ), function(i, url) { array_urls.push(url); });
- }
- // say("func_stringToUrlArray completed");
- return array_urls;
- }
- function func_isUrlImageDirect(url_input) {
- return (url_input.indexOf(".jpg") != -1
- || url_input.indexOf(".png") != -1
- || url_input.indexOf(".gif") != -1);
- }
- function func_redditThreadHeaderToSsdnHeader(json_redditHeader) {
- return {
- node_header: {
- str_title: json_redditHeader.title
- }
- };
- }
- function func_urlWithRedditContextToSsdnPayload(url, json_redditComment) {
- return {
- node_payload:
- [
- {
- str_title: json_redditComment.author
- , str_description: func_htmlUnescape(json_redditComment.body_html)
- , int_points: json_redditComment.score
- , url_direct: url
- }
- ]
- };
- }
- function func_main() {
- func_xhr({ url_destination: url_input + ".json", func_success: function(json_reddit) {
- { func_send( // Fabricate and send header
- func_redditThreadHeaderToSsdnHeader
- (json_reddit[0].data.children[0].data)
- ); }
- $.each(json_reddit[1].data.children, function(i, json_comment) { // Each comment
- if (!isDef(json_comment.data.body_html)) return;
- $.each(func_stringToUrlArray(json_comment.data.body_html), function(j, url) {
- if (func_isUrlImageDirect(url)) { // Direct
- { func_send(
- func_urlWithRedditContextToSsdnPayload
- (url, json_comment.data)
- ); }
- }
- else if (url.indexOf("imgur") != -1) { // Indirect
- func_imgurUrlToJson(url, function(json_indirectUrlResponse) {
- $.each(json_indirectUrlResponse.data.images,
- function(k, json_imgurImage) {
- ssdn_output = func_urlWithRedditContextToSsdnPayload(
- json_imgurImage.link,
- json_comment.data);
- var node_image = ssdn_output.node_payload[0];
- node_image.int_index = k + 1;
- node_image.int_length = json_indirectUrlResponse.data.images.length;
- node_image.url_album = url;
- func_send(ssdn_output);
- });
- }, ["album", "image"]);
- }
- }); // Next url in comment
- }); // Next comment
- }});
- } func_main();
- say("class_redditParser completed");
- }
- /* "name": "slideshow.js",
- "program": "Slideshow",
- "description": ""
- */
- function class_slideshow(tab) {
- const contab_home = tab;
- var css_head = ""; { // CSS
- { css_head +=
- "\
- <script type='text/javascript' src='http://ajax.googleapis.com/\
- ajax/libs/jquery/1.4.1/jquery.min.js'></script>\
- "; }
- { css_head += "<title></title><style>"; }
- { css_head += // #ctn_main, #ctn_image,
- "\
- #ctn_main\
- {\
- top: 0px;\
- right: 0px;\
- height: " + contab_home.innerHeight + "px;\
- width: " + contab_home.innerWidth + "px;\
- position: absolute;\
- }\
- #ctn_image\
- {\
- height: " + contab_home.innerHeight + "px;\
- width: 100%;\
- }\
- #act_image\
- {\
- display: block;\
- height: " + contab_home.innerHeight + "px;\
- width: 100%;\
- position: absolute;\
- background-position: center center;\
- background-repeat: no-repeat;\
- background-size: contain;\
- z-index: 1;\
- }\
- "; }
- { css_head += // .grp_details
- "\
- .grp_textBoxes\
- {\
- margin: 0px;\
- text-align: center;\
- }\
- .grp_details\
- {\
- display: none;\
- z-index: 1;\
- }\
- .grp_bold\
- {\
- font-weight: bold;\
- }\
- #ctn_header\
- {\
- width: 100%;\
- }\
- #act_header\
- {\
- box-sizing: border-box;\
- padding-top: 0px;\
- padding-bottom: 7px;\
- padding-left: 45px;\
- padding-right: 45px;\
- }\
- #ctn_footer\
- {\
- width: 100%;\
- }\
- #act_footer\
- {\
- box-sizing: border-box;\
- padding-top: 10px;\
- padding-bottom: 10px;\
- padding-left: 45px;\
- padding-right: 45px;\
- bottom: 0px;\
- width: 100%;\
- }\
- #p_imageNumbers\
- {\
- display: none;\
- }\
- ul\
- {\
- padding: 0px;\
- margin: 0px;\
- }\
- ol\
- {\
- padding: 0px;\
- margin: 0px;\
- }\
- p\
- {\
- padding: 0px;\
- margin: 0px;\
- }\
- "; }
- { css_head += // .grp_navButtons
- "\
- .grp_navButtons\
- {\
- top: 0px;\
- display: none;\
- line-height: " + contab_home.innerHeight + "px;\
- height: 100%;\
- margin: 0px;\
- cursor: pointer;\
- text-align: center;\
- vertical-align: middle;\
- position: absolute;\
- z-index: 10;\
- }\
- #btn_prev\
- {\
- left: 0px;\
- padding-left: 15px;\
- padding-right: 15px;\
- }\
- #btn_next\
- {\
- padding-left: 15px;\
- padding-right: 15px;\
- right: 0px;\
- }\
- "; }
- { css_head += // css_head suffix
- "\
- </style>\
- "; }
- }
- var html_body = ""; { // HTML
- { html_body += // #ctn_main prefix
- "\
- <div id = 'ctn_main'>\
- "; }
- { html_body += // #ctn_header
- "\
- <div class = 'grp_details' id = 'ctn_header'>\
- <div id = 'act_header'>\
- <h1 class = 'grp_textBoxes' id = 'h1_title'></h1>\
- <p class = 'grp_textBoxes' id = 'p_subtitle'></p>\
- </div>\
- </div>\
- "; }
- { html_body += // #ctn_image
- "\
- <div class = 'grp_image' id = 'ctn_image'>\
- <div class = 'grp_image' id = 'act_image'></div>\
- </div>\
- "; }
- { html_body += // #ctn_footer
- "\
- <div class = 'grp_details' id = 'ctn_footer'>\
- <div id = 'act_footer'>\
- <p class = 'grp_textBoxes' id = 'p_desc'></p>\
- <p class = 'grp_textBoxes grp_bold' id = 'p_imageNumbers'></p>\
- </div>\
- </div>\
- "; }
- { html_body += // #ctn_main suffix, .grp_navButtons,
- "\
- <div class = 'grp_navButtons' id = 'btn_prev'></div>\
- <div class = 'grp_navButtons' id = 'btn_next'></div>\
- </div>\
- "; }
- }
- var ssdn_source = { node_header: {}, node_payload: [] };
- var int_imageCurrent = 0;
- var bool_detailsDisplay = false;
- function func_detailsDisplay(bool_newDetailsDisplay = bool_detailsDisplay) {
- bool_detailsDisplay = bool_newDetailsDisplay;
- if (bool_detailsDisplay) { // Show
- var int_allocateHeightHeader = 0;
- var int_allocateHeightFooter = 0;
- { var bool_showHeader =
- isDef(tag("#h1_title", contab_home).textContent)
- || isDef(tag("#p_subtitle", contab_home).textContent)
- };
- { var bool_showFooter =
- isDef(tag("#p_desc", contab_home).textContent)
- || tag("#p_imageNumbers", contab_home).style.display == "block"
- };
- if (bool_showHeader) {
- tag("#ctn_header", contab_home).style.display = "block";
- int_allocateHeightHeader = tag("#ctn_header", contab_home).clientHeight;
- }
- if (bool_showFooter) {
- tag("#ctn_footer", contab_home).style.display = "block";
- int_allocateHeightFooter = tag("#act_footer", contab_home).clientHeight;
- }
- $.each(tag(".grp_image", contab_home), function(i, elmt) {
- elmt.style.height = (
- contab_home.innerHeight
- - int_allocateHeightHeader
- - int_allocateHeightFooter
- ).toString() + "px";
- });
- }
- else { // Hide
- $.each(tag(".grp_details", contab_home), function(i, elmt) {
- elmt.style.display = "none";
- });
- $.each(tag(".grp_image", contab_home), function(i, elmt) {
- elmt.style.height = contab_home.innerHeight.toString() + "px";
- });
- }
- say("func_detailsDisplay completed", contab_home);
- }
- function func_imageDisplay(int_newImageCurrent = int_imageCurrent) {
- // If reached end or beginning of album, stop
- if (!isDef(ssdn_source.node_payload[int_newImageCurrent])) {
- say("func_imageDisplay completed early with " + int_imageCurrent, contab_home);
- return;
- }
- int_imageCurrent = int_newImageCurrent;
- var node_image = ssdn_source.node_payload[int_imageCurrent];
- { tag("#act_image", contab_home).style.backgroundImage = (
- "url("
- + ((!isDef(node_image.url_direct)) ? "" : node_image.url_direct)
- + ")"
- ); }
- { tag("#p_desc", contab_home).innerHTML = (
- (
- (!isDef(node_image.str_title)) ? ""
- : ( "<span class = 'grp_bold'>"
- + node_image.str_title
- + "</span> " )
- ) + (
- (!isDef(node_image.str_description)) ? ""
- : node_image.str_description
- )
- ); }
- { tag("#p_imageNumbers", contab_home).innerHTML = (
- (int_imageCurrent + 1).toString()
- + " / "
- + (
- (!isDef(ssdn_source.node_header))
- ? ssdn_source.node_payload.length
- : (
- (!isDef(ssdn_source.node_header.int_length))
- ? ssdn_source.node_payload.length
- : ssdn_source.node_header.int_length
- )
- ).toString()
- ); }
- if (isDef(tag(".md", contab_home)[0])) {
- $.each(tag(".md", contab_home)[0].querySelectorAll('a'), function(i, elmt) {
- if (elmt.href.indexOf(node_image.url_direct) != -1
- || elmt.href.indexOf(node_image.url_album) != -1) {
- var str_indexAndLength = "";
- if (isDef(node_image.int_index)
- && isDef(node_image.int_length)
- && (node_image.int_length != 1)) {
- str_indexAndLength
- = " (" + node_image.int_index + " / "
- + node_image.int_length + ")";
- }
- elmt.innerHTML = (
- '<span class = "grp_bold">'
- + elmt.innerHTML
- + str_indexAndLength
- + '</span>'
- );
- }
- });
- }
- func_detailsDisplay();
- }
- function func_headerUpdate() {
- var node = (!isDef(ssdn_source.node_header))
- ? {}
- : ssdn_source.node_header;
- { (tag("#h1_title", contab_home)).textContent =
- (!isDef(node.str_title)) ? ""
- : node.str_title;
- }
- { (tag("#p_subtitle", contab_home)).innerHTML =
- ((!isDef(node.str_poster)) ? "" :
- "Posted by <span class = 'grp_bold'>\
- <a href = 'http://imgur.com/user/"
- + node.str_poster + "'>"
- + node.str_poster
- + "</a></span>"
- ) +
- ((isDef(node.str_poster) && (isDef(node.int_points)
- || isDef(node.int_views))) ? " with " : "") +
- ((!isDef(node.int_points)) ? "" :
- "<span class = 'grp_bold'>"
- + node.int_points
- + " point" + ((node.int_points > 1) ? "s" : "") + "</span>"
- ) +
- ((isDef(node.int_points) && isDef(node.int_views)) ? " and " : "") +
- ((!isDef(node.int_views)) ? "" :
- "<span class = 'grp_bold'>"
- + node.int_views
- + " view" + ((node.int_views > 1) ? "s" : "") + "</span>"
- )
- }
- if (isDef(ssdn_source.node_header.str_title)) func_detailsDisplay(true);
- contab_home.document.title = ssdn_source.node_header.str_title;
- }
- function func_pageSetup() {
- // contab_home.document.head.innerHTML = css_head ;
- // contab_home.document.body.innerHTML = html_body ;
- // contab_home.document.title = "Slideshow";
- $("html").html("<head></head><body></body>");
- $("head").html(css_head);
- $("body").html(html_body);
- tag("#btn_prev", contab_home).textContent = "<" ;
- tag("#btn_next", contab_home).textContent = ">" ;
- say("func_pageSetup completed", contab_home);
- }
- function func_pageListeners() {
- say("func_pageListeners", contab_home);
- contab_home.document.addEventListener('keydown', function(key) {
- key.cancelBubble = true;
- key.stopImmediatePropagation();
- switch(key.keyCode) {
- case 39: func_imageDisplay(int_imageCurrent + 1); break;
- case 37: func_imageDisplay(int_imageCurrent - 1); break;
- case 38: case 40: func_detailsDisplay(!bool_detailsDisplay); break;
- default: break;
- }
- return false;
- }, !contab_home.opera);
- contab_home.addEventListener("resize", function() {
- tag("#ctn_main", contab_home).style.width = contab_home.innerWidth + "px";
- tag("#ctn_main", contab_home).style.height = contab_home.innerHeight + "px";
- func_detailsDisplay();
- $.each(tag(".grp_navButtons", contab_home), function(i, elmt) {
- elmt.style.lineHeight = contab_home.innerHeight + "px";
- });
- });
- tag("#btn_prev", contab_home).onmousedown = function() {
- func_imageDisplay(int_imageCurrent - 1);
- };
- tag("#btn_next", contab_home).onmousedown = function() {
- func_imageDisplay(int_imageCurrent + 1);
- };
- tag("#act_image", contab_home).onmousedown = function() {
- func_detailsDisplay(!bool_detailsDisplay);
- };
- say("func_pageListeners completed", contab_home);
- }
- function func_main() {
- func_pageSetup();
- func_pageListeners();
- func_detailsDisplay();
- say("class_slideshow.func_main completed", contab_home);
- } func_main();
- this.meth_sourceAdd = function(ssdn_input) { try {
- if (isDef(ssdn_input.node_header)) { // Header
- ssdn_source.node_header = ssdn_input.node_header;
- func_headerUpdate();
- }
- if (isDef(ssdn_input.node_payload)) { // If input payload exists
- $.each(ssdn_input.node_payload, function(i, node) {
- ssdn_source.node_payload.push(node);
- });
- }
- if (ssdn_source.node_payload.length > 1) { // Update
- $("#p_imageNumbers").css("display", "block");
- $(".grp_navButtons").css("display", "block");
- $("#act_menuButton").css("display", "block");
- $("#btn_next").text(">");
- $("#btn_prev").text("<");
- (tag("#p_imageNumbers", contab_home)).style.display = "block";
- $.each(tag(".grp_navButtons", contab_home), function(i, elmt) {
- elmt.style.display = "block";
- });
- }
- func_imageDisplay();
- } catch(str_error) { say(str_error, contab_home); } };
- }
- /* "name": "launcher.js",
- "program": "Slideshow",
- "description": ""
- */
- function func_main(str_source) {
- window.stop();
- var obj_slideshow = new class_slideshow(window);
- if (str_source == "imgur") {
- func_imgurUrlToJson(location.href, function(json_output) {
- var ssdn_input = func_imgurJsonToSsdn(json_output);
- obj_slideshow.meth_sourceAdd(ssdn_input);
- if (ssdn_input.node_header.int_length > ssdn_input.node_payload.length) {
- func_imgurUrlToJson(location.href, function(json_output) {
- var ssdn_append = func_imgurJsonToSsdn(json_output);
- ssdn_append.node_header = null;
- ssdn_append.node_payload.splice(0, ssdn_input.node_payload.length);
- obj_slideshow.meth_sourceAdd(ssdn_append);
- }, ["album"]);
- }
- });
- }
- if (str_source == "reddit") {
- var obj_redditParser = new class_redditParser(location.href, function(ssdn_outputEntry) {
- obj_slideshow.meth_sourceAdd(ssdn_outputEntry);
- });
- }
- say("func_main completed");
- }
- function func_handler() {
- if (location.href.includes("imgur.com")) func_main("imgur");
- if (location.href.includes("reddit.com")) {
- $(function() {
- var p_launch = document.createElement("p"); {
- p_launch.textContent = "slideshow";
- p_launch.onclick = function() { func_main("reddit"); };
- { p_launch.setAttribute(
- "style", "\
- background: none !important; \
- background-color: Transparent !important;\
- padding: 0 !important;\
- font: inherit;\
- border: none !important;\
- cursor: pointer;\
- font-weight: bold;"
- ); }
- { p_launch.style.color = (
- window
- .getComputedStyle(tag(".bylink comments may-blank")[0])
- .color
- ); }
- }
- var ctn_launch = document.createElement("li"); {
- ctn_launch.appendChild(p_launch);
- }
- { tag(".flat-list buttons")[0].insertBefore(
- ctn_launch,
- tag(".flat-list buttons")[0].children[1]
- ); }
- });
- }
- } func_handler();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址