- // ==UserScript==
- // @name slideshow
- // @namespace https://greatest.deepsurf.us/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();