Guest User

Untitled

a guest
May 27th, 2025
14
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 28.15 KB | None | 0 0
  1. {"DeviantArt-g-x-q-p":{"link":"^(?:(?:[^.]+\\.)?deviantart\\.com/(?:(?:[^/]+/)?art/[^#]+$|#/\\w+)|fav\\.me/(\\w+))","url":": $[1] ? 'http://fav.me/' + $[1] : $[0]","res":":\n//If set to true, the imagus style of media description will be used.\n//Example: {Dimensions} {Publish Date} | {Title} | {Author} | {Category} \n//Set to false to use the sieve author's preference. The description length is a useful indicator to tell if the post is worth clicking to read the description.\n//Example: {Title} | {Author} | {Description Length} \nconst imagus_description_style = true;\n\n//if set to \"high\", the largest possible media will be displayed. Useful for downloading highest quality content.\n//if set to \"low\", web-optimized media will be displayed. Best choice for fast browsing and low internet speeds.\n//if set to \"both\", the web-optimized media(s) will be first in the gallery, followed by the largest possible media(s)\nconst res_option = \"high\"\n\n//Set what the text-to-image render turns into an image.\n//Possible values: \"description\", \"text body\"\nconst text_post_render = \"description\";\n\n//Set how the text-to-image render handles the text\n//Possible values: \"preview\", \"full\"\nconst text_post_mode = \"preview\";\n\n//Set if text from posts will always render, even on image posts\n//On image posts, it will add itself after images in the popup gallery. \nconst text_post_always = true;\n\n//Set if text-to-image renders go before other media or after\n//This only matters if text_post_always = true\nconst text_post_first = false; \n\n//Set a few reading options for the text-to-image render\nconst reading_width = 900;\nconst fontsize = 22;\nconst font = 'Verdana';\nconst fontcolor = \"yellow\";\nconst linespacing = 5;\nconst padding = 10;\nconst backgroundcolor = \"black\";\nconst textalign = \"left\";\n\n//Set true to view debugging console messages\nconst debug = true;\n\n\nif(debug) console.log(\"DeviantArt Verbose Sieve V3.0\");\n\nlet pagedefinitionsJSON=$._.match(/\\.__INITIAL_STATE__\\s*=\\s*JSON\\.parse\\((\"[^\\n]+\")/)\n\n//This deviationdefinition_all let is thorough information about the deviation, including the user and related deviations\nlet deviationdefinition_all=pagedefinitionsJSON?.[1]&&JSON.parse(eval(pagedefinitionsJSON[1]))['@@entities'];\nif(!deviationdefinition_all)return this.node.src||'';\n\n\n//Grab JSON extended deviation info\nlet deviationkey=Object.keys(deviationdefinition_all.deviationExtended)[0];\nlet deviationdefinition_extended=deviationdefinition_all.deviationExtended[deviationkey];\n//Grab JSON specific deviation info\nlet deviationdefinition_specific=deviationdefinition_all.deviation[deviationkey];\n//Grab User object\nlet userkey = Object.keys(deviationdefinition_all.user)[0];\nlet deviationdefinition_user=deviationdefinition_all.user[userkey];\n\n\n//Set the media description text\nlet toptext;\n\nif(imagus_description_style) {//Imagus standard media description desired. Grab relevant info and create the top text.\n\n //Create media resolution string\n let resolutionstring = deviationdefinition_extended.originalFile == null ? \"\" : deviationdefinition_extended.originalFile.width + \"x\" + deviationdefinition_extended.originalFile.height;\n\n //Create friendly date string\n const parseddatetime = new Date();\n parseddatetime.setTime(Date.parse(deviationdefinition_specific.publishedTime));\n const months =[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec \"];\n let month = months[parseddatetime.getMonth()];\n let day = parseddatetime.getDate();\n let year = parseddatetime.getFullYear();\n let datestring = month + \" \" + day + \" \" + year\n\n //Create top 5 tags string\n let tagsstring = \"\";\n if(deviationdefinition_extended.tags) {\n for(let i=0; i<deviationdefinition_extended.tags.length; i++) {\n if(i > 0) tagsstring += \", \";//commas after the first tag\n tagsstring += deviationdefinition_extended.tags[i].name;\n\n if(i > 4) {//cut short if more than 5 tags assigned\n tagsstring += \" ...\";\n break;\n }\n }\n }\n else {\n //Assign friendly text if no tags assigned\n tagsstring = tagsstring == \"\" ? \"No Tags\" : tagsstring;\n }\n \n //Get Imagus config for prepend dimensions and an extra vertical bar if it's on\n let prependedbar = cfg.hz.capWH ? \" | \" : \"\";\n\n //Define the top text\n toptext = prependedbar + resolutionstring + \" | \" + datestring + ' | ' +\n deviationdefinition_specific.title + ' | ' + \n deviationdefinition_all.user[deviationdefinition_specific.author].username + ' | ' +\n tagsstring;\n}\nelse{\n //get length of plain text description by letting the DOM parse it for us\n let description = deviationdefinition_all.deviationExtended[deviationkey].descriptionText.html.markup;\n\n //if(debug) console.log(\"Description: \", description)\n\n let descriptionlength = 0;\n if(description != null) {//description is defined, use DOM trickery to get text length\n let tempDivElement = document.createElement(\"div\");\n tempDivElement.innerHTML = description; \n if(tempDivElement.textContent != null) {\n descriptionlength = tempDivElement.textContent.length; \n }\n else if(tempDivElement.innerText != null) {\n descriptionlength = tempDivElement.innerText.length;\n }\n }\n\n deviationdefinition_extended.additionalMedia == null ? \"\" : \" |\" \n\n //Define the top text\n toptext = deviationdefinition_specific.title + \n \" | \" + deviationdefinition_all.user[deviationdefinition_specific.author].username + \n (descriptionlength == 0 ? \"\" : \" | \" + descriptionlength) +\n (deviationdefinition_extended.additionalMedia == null ? \"\" :\n \" | \" + (deviationdefinition_extended.additionalMedia.length+1) + \" images\");\n \n} \n\n//The rest is parsing the correct media URLs\nlet mediadefinition=deviationdefinition_specific.media;\nlet baseuri=mediadefinition.baseUri;\nlet sizedpreviewdefinition=mediadefinition.types.filter(function(t){return !!t.c||!!t.b}).pop();\nlet mediatokens=mediadefinition.token;\n\n\nif(debug) console.log(\"deviationdefinition_all\", deviationdefinition_all);\nif(debug) console.log(\"deviationdefinition_specific\", deviationdefinition_specific);\nif(debug) console.log(\"deviationdefinition_extended\", deviationdefinition_extended);\nif(debug) console.log(\"mediadefinition\", mediadefinition);\nif(debug) console.log(\"baseuri\", baseuri);\nif(debug) console.log(\"sizedpreviewdefinition\", sizedpreviewdefinition);\nif(debug) console.log(\"mediatokens\", mediatokens);\n\n\n/////////////////\n// Setup Section\n\n// final goal is to fill in these objects as needed, and return concatenated in desired order\nlet text_linkobject = [];\nlet hi_res_media_linkobject = [];\nlet low_res_media_linkobject = [];\n\n//There are 0 or 1 or 2 tokens in the mediatoken definition for some reason. Which one works is guesswork.\n//Multiple post types need these, so set them up now.\nlet mediatokenstring0=mediatokens?'?token='+mediatokens[0]:'';\nlet mediatokenstring1=mediatokens&&mediatokens[1]?'?token='+mediatokens[1]:mediatokenstring0;//define the second token if it exists, otherwise default to first token\n\n//Parse and break out media resolution options\nlet do_hi_res = res_option == \"high\" || res_option == \"both\";\nlet do_low_res = res_option == \"low\" || res_option == \"both\";\nif(!(do_hi_res || do_low_res)) {//Bad option setting by user\n if(debug) console.log(\"Resolution setting res_option = \\\"\" + res_option + \"\\\" which is not a valid option. Defaulting to low resolution.\");\n do_low_res = true;\n}\n\n//Get viewport to optimize against in case of web-optimized media or attachment-style post\nconst viewportwidth = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);\nconst viewportheight = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);\nif(debug && do_low_res) console.log(\"Viewport: \" + viewportwidth + \" by \" + viewportheight);\n\n\n//////////////////////////\n// Discrimination Section\n\n// A number of different post types exists with very different JSON trees.\n// Have to figure out what kind of post is being handled first.\n\nconst POSTTYPES = Object.freeze({\n SingleImageDownloadLink: doSingleImageDownloadLink,\n SingleImageNoDownloadLink: doSingleImageNoDownloadLink,\n ImageCarousel: doImageCarousel,\n GIF: doGIF,\n Video: doVideo,\n ZIP_RAR_7Z_PDF: doZIP_RAR_7Z_PDF,\n Text: doText\n});\n\n//Work from easiest discriminators first to get them out of the list of possibilities, then do harder ones\nlet mainaction;\nif(!baseuri) mainaction = POSTTYPES.Text;\nelse if(deviationdefinition_extended?.additionalMedia?.[0]?.media?.token?.length > 0) mainaction = POSTTYPES.ImageCarousel;\nelse if(deviationdefinition_specific.isGif) mainaction = POSTTYPES.GIF;\nelse if(deviationdefinition_specific.isVideo) mainaction = POSTTYPES.Video;\nelse if(mediatokens == null) mainaction = POSTTYPES.ZIP_RAR_7Z_PDF;\nelse if(deviationdefinition_specific.isDownloadable) mainaction = POSTTYPES.SingleImageDownloadLink;\nelse mainaction = POSTTYPES.SingleImageNoDownloadLink\n\nif(debug) console.log(\"Post type: \", mainaction.name)\n\n\n/////////////////////////\n// Run Post Type Section\n\nmainaction();\nif(text_post_always && mainaction != POSTTYPES.Text)\n doText();\n\n\n////////////////////////////\n// Handle Post Type Section\n\n//These functions only execute on grabbing data and constructing the urls\n//They each append to specific medialink objects rather than give return values\n\nfunction doSingleImageDownloadLink() {\n\n if(do_hi_res) {\n let downloadlink = deviationdefinition_all.deviationExtended[deviationkey].download.url;\n hi_res_media_linkobject.push([[downloadlink,$._.match(/\"og:image\" content=\"([^\"]+)/)?.[1]], toptext]);\n }\n if(do_low_res) {\n let singleimageurl = getWebOptimizedImageURL(mediadefinition);\n low_res_media_linkobject.push([singleimageurl , toptext])\n }\n\n}\n\nfunction doSingleImageNoDownloadLink() {\n if(do_hi_res) {\n let imageurl;\n if(mediatokens.length == 1\n && !deviationdefinition_extended.pcp\n && !deviationdefinition_extended.isDaProtected\n && !deviationdefinition_extended.hasWatermark\n && !deviationdefinition_specific.isMature\n && !deviationdefinition_user.type == \"regular\")//These seem to be the sub-discriminators for if an image blocks an /intermediary/ file.\n imageurl = baseuri.replace(\"wixmp.com/f/\", \"wixmp.com/intermediary/f/\");\n else if(mediatokens.length == 2 && deviationdefinition_extended.pcp)\n imageurl = baseuri + mediatokenstring0;\n else//Default to fullview/preview image url construction.\n imageurl = constructHiResURLFromMediaDefinition();\n hi_res_media_linkobject.push([imageurl, toptext]);\n }\n if(do_low_res) {\n let singleimageurl = getWebOptimizedImageURL(mediadefinition);\n low_res_media_linkobject.push([singleimageurl , toptext])\n }\n \n}\n\nfunction doImageCarousel() {\n if(do_hi_res) {\n //single token type refers to additional media tokens, but might be signified by how many first-image tokens exist\n let issingletokentype = mediatokens.length == 1;\n\n //If the current deviation is a multi-token type, download link is correct\n let firstimageurl;\n if(deviationdefinition_specific.isDownloadable) {\n firstimageurl = [deviationdefinition_extended.download.url, $._.match(/\"og:image\" content=\"([^\"]+)/)?.[1]];\n }\n else {\n //Extra protections on base image image definitions with these flags. Go for fullview/preview fill version\n if(deviationdefinition_extended.isDaProtected || deviationdefinition_extended.hasWatermark) \n firstimageurl = constructHiResURLFromMediaDefinition();\n else{ //No extra protections, default to /f/ base version\n let type = deviationdefinition_specific.media?.types?.find(i=>i.t==='fullview')?.c||deviationdefinition_specific.media?.types?.find(i=>i.t==='preview')?.c||'';\n type = type.replace('<prettyName>', deviationdefinition_specific.media.prettyName);\n firstimageurl = [deviationdefinition_specific.media.baseUri + mediatokenstring0, deviationdefinition_specific.media.baseUri + type + mediatokenstring0];\n }\n }\n hi_res_media_linkobject.push([firstimageurl, toptext]);\n \n //Do rest of images\n for(let i=0; i<deviationdefinition_extended.additionalMedia.length; i++) {\n let mediaobject = deviationdefinition_extended.additionalMedia[i];\n let type = mediaobject.media?.types?.find(i=>i.t==='fullview')?.c||mediaobject.media?.types?.find(i=>i.t==='preview')?.c||'';\n type = type.replace('<prettyName>', mediaobject.media.prettyName);\n let currentmediatokenstring = issingletokentype ? \"?token=\" + mediaobject.media.token[0] : mediatokenstring0;\n // Tries multiple URLs\n hi_res_media_linkobject.push([[mediaobject.media.baseUri + currentmediatokenstring, mediaobject.media.baseUri + type + currentmediatokenstring, mediaobject.media.baseUri + '?token=' + mediaobject.media.token[1], mediaobject.media.baseUri + type + '?token=' + mediaobject.media.token[1]], toptext]);\n }\n if(debug) {\n let logval = structuredClone(hi_res_media_linkobject);//This is because the array gets transformed after it leaves the sieve and logs wrong\n console.log(\"hi_res_media_linkobject: \", logval);\n }\n }\n if(do_low_res) {\n //First image lives in a different tree\n let firstimageurl = getWebOptimizedImageURL(mediadefinition);\n low_res_media_linkobject.push([firstimageurl , toptext])\n for(let i=0; i<deviationdefinition_extended.additionalMedia.length; i++) {\n let mediaobject = deviationdefinition_extended.additionalMedia[i];\n let currentimageurl = getWebOptimizedImageURL(mediaobject.media);\n low_res_media_linkobject.push([currentimageurl , toptext]);\n }\n }\n}\n\nfunction doGIF() {\n if(debug) console.log(\"GIF detected.\");\n if(do_hi_res) {\n let imageurl = deviationdefinition_specific.isDownloadable ? deviationdefinition_extended.download.url : baseuri + mediatokenstring0;\n hi_res_media_linkobject.push([imageurl, toptext]);\n }\n if(do_low_res) {\n let gifurl = mediadefinition.baseUri+mediatokenstring0;\n low_res_media_linkobject.push([gifurl, toptext]);\n }\n}\n\nfunction doVideo() {\n if(do_hi_res) {\n let largestvideo;\n for(let i=0; i<mediadefinition.types.length; i++) {\n let currentdefinition = mediadefinition.types[i];\n if(currentdefinition.t != 'video') \n continue;\n\n //There may be multiple video definitions, keep the largest one\n if(largestvideo) {\n //compare widths to determine larger video, keep larger definition\n largestvideo = (largestvideo.w < currentdefinition.w) ? currentdefinition : largestvideo;\n }\n else { //assign first video definition as largest\n largestvideo = currentdefinition;\n }\n }\n hi_res_media_linkobject.push([largestvideo.b, toptext]);\n }\n if(do_low_res) {\n if(debug) console.log(\"Video detected.\");\n let bestvideosizematch;\n let bestvideosizecloseness = 10000.0;//large number is a bad fit, start this number with arbitrarily bad ratio\n for(let i=0; i<mediadefinition.types.length; i++) {\n let currentdefinition = mediadefinition.types[i];\n if(currentdefinition.t != 'video') \n continue;\n\n //There may be multiple video definitions, keep the best size fit\n if(bestvideosizematch == undefined) {\n bestvideosizematch = currentdefinition\n }\n else {\n let currentsizecloseness = Math.abs(1- (currentdefinition.h/viewportheight));\n if(debug) console.log(\"currentsizecloseness\", currentsizecloseness);\n if(currentsizecloseness < bestvideosizecloseness) {\n bestvideosizecloseness = currentsizecloseness;\n bestvideosizematch = currentdefinition;\n if(debug) console.log(\"New best match at closeness \", bestvideosizecloseness, \" type \", bestvideosizematch.t);\n }\n }\n\n }\n low_res_media_linkobject.push([bestvideosizematch.b, toptext]); \n }\n}\n\nfunction doZIP_RAR_7Z_PDF() {\n let save_low_res = do_low_res;\n let save_hi_res = do_hi_res;\n do_low_res = true;\n do_hi_res = false;\n doSingleImageNoDownloadLink();\n do_low_res = save_low_res;\n do_hi_res = save_hi_res;\n}\n\nfunction doText() {\n let desiredescription = text_post_render == \"description\";\n let desirepreview = text_post_mode == \"preview\";\n\n let hasdescription = (deviationdefinition_extended?.descriptionText?.excerpt ?? \"\") != \"\";\n let hastextbody = (deviationdefinition_specific?.textContent?.excerpt ?? \"\") != \"\";\n\n let previewavailable = true;\n if(!hasdescription && !hastextbody) {//Excerpts both are empty, signal off of html markup\n previewavailable = false;\n hasdescription = (deviationdefinition_extended?.descriptionText?.html?.markup ?? \"\") != \"\";\n hastextbody = (deviationdefinition_specific?.textContent?.html.markup ?? \"\") != \"\";\n\n if(!hasdescription && !hastextbody)//No parseable text at all available, don't add text image\n return;\n }\n\n //Start with user preference for text type, and revert to opposite if desired is unavailable\n let textobject;\n if (desiredescription && hasdescription)\n textobject = deviationdefinition_extended.descriptionText;\n else if(desiredescription && !hasdescription)\n textobject = deviationdefinition_specific.textContent\n else if(!desiredescription && hastextbody)\n textobject = deviationdefinition_specific.textContent;\n else if(!desiredescription && !hastextbody)\n textobject = deviationdefinition_extended.descriptionText;\n else {\n if(debug) console.log(\"No valid non-empty text objects found. Text render is aborting.\")\n return;\n }\n\n const charwidthguess = fontsize*1.4/3.0;\n const kerningguess = 2\n let maxcharsperline = (reading_width+kerningguess-(padding*2))/(charwidthguess+kerningguess);\n \n let textlines;\n if(desirepreview && previewavailable) {\n textlines = textobject.excerpt.split(\"\\n\");\n textlines = stripHTML(textlines);\n textlines = squareUpText(textlines, maxcharsperline);\n textlines.push(\"...\");\n }\n else {\n if(textobject.html.type == \"tiptap\") {\n let paragraphsobject = JSON.parse(textobject.html.markup).document.content;\n\n textlines = [];\n for(let i=0; i<paragraphsobject.length; i++) {\n if(paragraphsobject[i].content == null) continue;//Spacer paragraphs that accomplish nothing\n let paragraph = \"\";\n for(let j=0; j<paragraphsobject[i].content.length; j++) {\n if(paragraphsobject[i].content[j].type == \"text\")\n paragraph += paragraphsobject[i].content[j].text;\n }\n let paragraphlines = squareUpText([paragraph], maxcharsperline)\n textlines = textlines.concat(...paragraphlines);\n textlines.push(\"\");//separate paragraphs and add some empty space past the last line which is helpful for imagus.\n }\n }\n else {//type == \"writer\"\n let htmlwriting = textobject.html.markup\n\n textlines = htmlwriting.split(\"<br />\");\n textlines = stripHTML(textlines);\n textlines = squareUpText(textlines, maxcharsperline);\n textlines.push(\"...\");\n }\n \n }\n let url = generateTextLinesToImage(textlines, reading_width, fontsize, font);\n text_linkobject.push([url, toptext]);\n}\n\n//////////////////\n// Return Section\n\n// Order the link objects as defined by text_post_first\nlet returnval;\nif(text_post_first) \n returnval = [...text_linkobject, ...low_res_media_linkobject, ...hi_res_media_linkobject];\nelse \n returnval = [ ...low_res_media_linkobject, ...hi_res_media_linkobject, ...text_linkobject];\n\n//Special case, links 1 and 2 are exactly the same, reduce to a single galleryobject\nif(returnval.length >= 2 && returnval[0][0] == returnval[1][0])\n returnval = returnval.slice(1);\n\nreturnval = returnval.map(i=>[[!Array.isArray(i[0])&&i[0]?.replace(/(\\/f\\/[^.]+\\.\\w+).*/,'/intermediary$1'),i[0]],i[1]]);\n\nconst filename=deviationdefinition_specific?.media?.prettyName\nif(filename)this.CNT.filename=filename;\n\nif(debug) console.log(\"Final Return Value\", returnval)\nreturn returnval;\n\n\n///////////////////////////\n// Helper Function Section\n\n\nfunction generateTextLinesToImage(textlines) {\n// //Set a few reading options for the text-to-image render\n// const reading_width = 900;\n// const fontsize = 30;\n// const font = 'Verdana';\n// const fontcolor = \"grey\";\n// const linespacing = 5;\n// const padding = 10;\n// const backgroundcolor = \"black\";\n// const textalign = \"left\";\n\n //Prereq: the text lines in text lines have\n\n const reading_height = (textlines.length*fontsize) + (padding*2) + (linespacing*(textlines.length-1));\n \n // Image size and text coordinates understood, now render the image\n \n // Create a canvas element\n const canvas = document.createElement('canvas');\n canvas.width = reading_width;\n canvas.height = reading_height;\n\n // Get the 2D context\n const ctx = canvas.getContext('2d');\n // Set background color\n ctx.fillStyle = backgroundcolor;\n ctx.fillRect(0, 0, reading_width, reading_height);\n // Set text style\n ctx.fillStyle = fontcolor;\n ctx.font = fontsize + 'px ' + font; // Font size and family\n ctx.textAlign = textalign; // Center the text horizontally\n ctx.textBaseline = 'middle'; // Center the text vertically\n\n // Draw the text lines\n for(let i=0; i<textlines.length; i++)\n {\n const drawx = padding;\n const drawy = (fontsize/2)+padding + (linespacing*i) + (fontsize*i);\n ctx.fillText(textlines[i], drawx, drawy);\n }\n\n // Convert the canvas to a base64 PNG image\n const pngUrl = canvas.toDataURL('image/png');\n return pngUrl;\n}\n\nfunction squareUpText(textlines, maxchar) {\n let squaretextlines = [];\n for(let i=0; i<textlines.length; i++) {\n if(textlines[i].length <= maxchar) {\n squaretextlines.push(textlines[i]);\n continue;\n }\n\n let words = textlines[i].split(\" \");\n let currentsquaredtextline = \"\";\n for(let j=0; j<words.length; j++) {//Add new line just before it gets too long\n if(currentsquaredtextline.length + words[j].length > maxchar) {\n squaretextlines.push(currentsquaredtextline);\n currentsquaredtextline = \"\";//reset line construction\n }\n\n let spacer = \" \";\n if(currentsquaredtextline == \"\") spacer = \"\";\n currentsquaredtextline += spacer + words[j];\n\n if(j == words.length-1)\n squaretextlines.push(currentsquaredtextline)\n }\n }\n return squaretextlines;\n}\n\nfunction stripHTML(textlines) {\n let strippedlines = [];\n\n let domparser = new DOMParser()\n for(let i=0; i<textlines.length; i++) {\n let domdoc = domparser.parseFromString(textlines[i], 'text/html');\n strippedlines.push(domdoc.body.textContent || \"\");\n }\n\n return strippedlines;\n}\n\nfunction getWebOptimizedImageURL(mediatree) {\n const debugdimensionmath = false;\n\n // Extract meaningful objects that contain identifiers\n let preview;\n let bestimagesizematch;\n let bestimagesizecloseness = 10000.0;//large number is a bad fit, start this number with arbitrarily bad ratio \n for(let i=0; i<mediatree.types.length; i++) {\n let currentdefinition = mediatree.types[i];\n if(currentdefinition.t == 'preview') //save preview definition as a default case\n preview = currentdefinition;\n if(currentdefinition.t == 'video' || currentdefinition.t == 'gif')\n continue;\n\n //Select the largest best size fit definition\n //Imagus evaluates height first so this section does as well\n if(bestimagesizematch == undefined) {\n bestimagesizematch = currentdefinition\n }\n else {\n let currentsizecloseness = Math.abs(1- (currentdefinition.h/viewportheight));\n if(debug && debugdimensionmath) console.log(\"currentsizecloseness\", currentsizecloseness);\n if(currentsizecloseness < bestimagesizecloseness) {\n bestimagesizecloseness = currentsizecloseness;\n bestimagesizematch = currentdefinition;\n if(debug && debugdimensionmath) console.log(\"New best match at closeness \", bestimagesizecloseness, \" type \", bestimagesizematch.t);\n }\n }\n\n }\n\n //Choose best available size definition\n let singleimageurl;\n if(bestimagesizematch.b||bestimagesizematch.c) { //Use best size match if it has a complete definition\n singleimageurl = mediatree.baseUri\n + (bestimagesizematch.b||bestimagesizematch.c).replace('<prettyName>', mediatree.prettyName)\n + mediatokenstring0;\n }\n else if(preview.b||preview.c) {//Best size match was not a complete definition, use preview definition as it seems reliably available.\n if(debug) console.log(\"Best sized definition incomplete. Using preview version...\");\n singleimageurl = mediatree.baseUri\n + (preview.b||preview.c).replace('<prettyName>', mediatree.prettyName)\n + mediatokenstring0;\n }\n else {//Preview version also failed, attempt basic URL construction\n if(debug) console.log(\"No sized preview definition found. Attempting basic url construction...\");\n singleimageurl = mediatree.baseUri + mediatokenstring0;\n }\n\n return singleimageurl;\n}\n\nfunction constructHiResURLFromMediaDefinition() {\n let returnval = \"\";\n\n let fullview;\n let preview;\n for(let i=0; i<mediadefinition.types.length; i++) {\n let currentdefinition = mediadefinition.types[i];\n if(currentdefinition.t == 'preview') {\n preview = currentdefinition;\n continue;\n }\n if(currentdefinition.t == 'fullview') {\n fullview = currentdefinition;\n continue;\n }\n }\n let fillconstruction = fullview.c||fullview.b||(preview.c.replace(/\\/w_\\d+,h_\\d+/i,\"/w_\"+fullview.w+\",h_\"+fullview.h));\n returnval = baseuri\n + fillconstruction.replace('<prettyName>', deviationdefinition_specific.media['prettyName'])\n + mediatokenstring0;\n return returnval;\n}","img":"^images-wixmp-ed30a86b8c4ca887773594c2\\.wixmp\\.com/[a-z]/[\\da-f-]{36}/([\\da-z]+)-.*","note":"iceiller9999 + Imagus_fan (edit)\nhttps://www.reddit.com/r/imagus/comments/1k0ufv3/comment/mpsxqy0\nOLD\nhttps://www.reddit.com/r/imagus/comments/1k0ufv3/comment/moe7kd8\nhttps://www.reddit.com/r/imagus/comments/z0zyox/comment/mo8bfyh/\n\n\n\n!!!\nДанный фильтр имеет несколько настроек (вкл/откл высокого или низкого разрешения, текста описания, формата заголовка) - смотри поле RES (третье сверху). Переключение стандартное: true/false.\n==\nThis sieve has several settings (on/off high or low resolution, description text, title format) - see the RES field (third from the top). Switching is standard: true/false."}}
Add Comment
Please, Sign In to add comment