Flickr Large Embed

Based on 'Flickr Original Link' (https://greasyfork.org/scripts/1190-flickr-original-link). Adds an 'Embed' field containing HTML code for each photo.

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        Flickr Large Embed
// @namespace   https://greasyfork.org/en/scripts/6699-flickr-large-embed
// @description Based on 'Flickr Original Link' (https://greasyfork.org/scripts/1190-flickr-original-link). Adds an 'Embed' field containing HTML code for each photo. 
// @include 	/flickr\.com/
// @version     2015-05-30
// @grant       GM_getValue
// @grant       GM_setValue
// @require 	http://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js
// ==/UserScript==
//

// TODO : fix 'Loading' bug on photostream

var postfix = ".";

var imageSizeOrder = [ "o", "k", "h", "l", "c", "z" ];
var globalObserver = null;

function log(s) {
    console.log(s);
}


function checkAlwaysShow() {
	$('div.interaction-view').css('opacity', '1');
}

function action_single_page() {
    var strCss = ".commonButton{display:inline-block;cursor:pointer;border-radius:1.5em;margin:0.3em;font-size:90%} .bigButton{border-width:2px;padding:1em;font-weight:bold;border-style:solid} .smallButton{padding:0.5em;background-color:pink}";
    $('head').append('<style>' + strCss + '</style>');
    var target = $('#content')[0];
    var config = {
			childList : true,
			subtree : true,
    };
    var action = function(sourceCode) {
			var size = sourceCode.match(/modelExport: {.+?"sizes":{.+?}}/i);
			var mSize = size[0].match(/"width":"?\d+"?,"height":"?\d+"?,/ig);
			var mLink = size[0].match(/"displayUrl":"[^"]+"/ig);
			var length = mLink.length;
			
			var embedSize = 0;
			var linkSize = 0;
			var embedHeight = 0;
			var embedWidth = 0;
			
			for (var k = 0; k < length; k++) {
				
				var myArray = mSize[k].match(/:\w+,/g);
				var width = parseInt(myArray[0].replace(':','').replace(',',''));
				var height = parseInt(myArray[1].replace(':','').replace(',',''));
				
				mLink[k] = "http:" + mLink[k].replace(/"displayUrl":"([^"]+)"/i, "$1").replace(/\\/g, "").replace(/(_[a-z])\.([a-z]{3,4})/i, '$1' + postfix + '$2');
				
				if (embedSize == 0 && (width >= 800 || height >= 600) ) {
					embedSize = k;
					embedHeight = height;
					embedWidth = width;
				}

				if (linkSize == 0 && (width >= 2048 || height >= 1024) ) {
					linkSize = k;
				}

				if (embedSize == 0 && k == length-1) {
					embedSize = k;
					embedHeight = height;
					embedWidth = width;
				}
				if (linkSize == 0 && k == length-1) {
					linkSize = k;
				}
				
			}
			
			var maxWidth = '';
			if (embedHeight < embedWidth) {
				// Landscape image: full width and auto-height
				maxWidth= 'style="max-width: ' + embedWidth + 'px"';
				embedWidth = '100%';
			} else {
				embedWidth += 'px';
			}
			
			var embedHTML = '<p><a href="' + mLink[linkSize] + '" target="_blank" border="0"><img src="' + mLink[embedSize] + '"  width="' + embedWidth + '" height="auto" border="0" ' + maxWidth + ' /></a></p>';	
			var embedBB = '[url=' + mLink[linkSize] + '][img]' + mLink[embedSize] + '[/img][/url]';	
			
			var insertLocation = $('.sub-photo-right-row1').filter(':first');
    	if (insertLocation.length > 0) {
				insertLocation.append('<p>Embed</p><div style="color: black; display:block;">HTML <input type="text" name="textfield" onclick="this.select();" style="width:350px;" id="EMBED_HTML" value="Loading"/></div>');
				$('#EMBED_HTML').val(embedHTML);
				insertLocation.append('<div style="color: black; display:block;">BB <input type="text" name="textfield" onclick="this.select();" style="width:350px;" id="EMBED_BB" value="Loading"/></div>');
				$('#EMBED_BB').val(embedBB);
    	}
			
    };
    var oldUrl = document.URL;
    $.get(oldUrl, action);
    globalObserver = new MutationObserver(function(mutations, ob) {
			if (document.URL == oldUrl) return false; // page is not changed
			oldUrl = document.URL;
			$.get(oldUrl, action);
    });
    globalObserver.observe(target, config);
}

function getLinkFromSource(data) {
    if (data === null) return;// source code is not loaded, or empty, or has nothing good
    var sizes = data.match(/"sizes":.+?}}/ig);
    if (sizes === null) return false; // source code is not loaded, or empty, or has nothing good
    var e2 = $('div.photo-list-photo-view').get();
    checkAlwaysShow();
    for (var index = 0; index < e2.length; index++) {
			var e = $(e2[index]);
			if (e.find('.myEmbedLink').filter(':first').length > 0) continue;
			//e.find('.interaction-bar').append('<div class="myEmbedLink" style="color: white; display: block; opacity: 0.5">HTML <input type="text" name="textfield" onclick="this.select();" style="width:100px;" value="Loading" class="htmlCode"/> BB <input type="text" name="textfield" onclick="this.select();" style="width:100px;" value="Loading" class="bbCode"/></div>');
e.find('.interaction-bar').css('padding-bottom', '15px');
			e.append('<div class="myEmbedLink" style="color: white; display: block; opacity: 0.5">HTML <input type="text" name="textfield" onclick="this.select();" style="width:100px;" value="Loading" class="htmlCode"/> BB <input type="text" name="textfield" onclick="this.select();" style="width:100px;" value="Loading" class="bbCode"/></div>');
			
					
			var embedUrl = false;
			var linkUrl = false;
			var currentEmbedWidth = 100000;
			var currentEmbedHeight = 100000;
			var currentLinkWidth = 100000;
			var currentLinkHeight = 100000;
			var maxWidth = 0;
			var maxHeight = 0;
			var maxUrl = false;
			
			for (var i = 0; i < imageSizeOrder.length; ++i) {
					var photo = sizes[index].match(new RegExp('"' + imageSizeOrder[i] + '":{"displayUrl":"([^"]+)","width":(\\d+),"height":(\\d+)', "i"));
					if (photo === null) continue;
					var width = parseInt(photo[2]);
					var height = parseInt(photo[3]);
					var url = "http:" + photo[1].replace(/\\/g, "").replace(/(_[a-z])\.([a-z]{3,4})/i, '$1' + postfix + '$2');
					if ((width >= 800 || height >= 600) && width < currentEmbedWidth && height < currentEmbedHeight) {
						embedUrl = url;
						currentEmbedHeight = height;
						currentEmbedWidth = width;
					}

					if ((width >= 2048 || height >= 1024) && width < currentLinkWidth && height < currentLinkHeight ) {
						linkUrl = url;
						currentLinkHeight = height;
						currentLinkWidth = width;
					}

					if (width > maxWidth && height > maxHeight) {
						maxWidth = width;
						maxHeight = height;
						maxUrl = url;
					}
			}
			
			if (!linkUrl) {
				linkUrl = maxUrl;
				currentLinkHeight = maxHeight;
				currentLinkWidth = maxWidth;
			}
			if (!embedUrl) {
				embedUrl = maxUrl;
				currentEmbedHeight = maxHeight;
				currentEmbedWidth = maxWidth;
			}

			if (linkUrl && embedUrl) {
				var maxWidth= '';
				if (currentEmbedHeight < currentEmbedWidth) {
					// Landscape image: full width and auto-height
					maxWidth= 'style="max-width: ' + currentEmbedWidth + 'px"';
					currentEmbedWidth = '100%';
				} else {
					currentEmbedWidth += 'px';
				}
			
				var htmlCode = '<p><a href="' + linkUrl + '" target="_blank" border="0"><img src="' + embedUrl + '" width="' + currentEmbedWidth + '" height="auto" border="0" ' + maxWidth + ' /></a></p>';	
				var bbCode = '[url=' + linkUrl + '][img]' + embedUrl + '[/img][/url]';	

				e.find('.htmlCode').val(htmlCode);
				e.find('.bbCode').val(bbCode);
			}		
    }
}

function load_links(sourceCode) {
    // empty
}

function action_normal_page() {
    var target = $('#content')[0];
    var config = {
			childList : true,
			subtree : true,
    };
    var strCss = ".myEmbedLink{position:absolute;right:3px;bottom:0px;z-index:999;display:inline-block;color:white!important;}";
    $('head').append('<style>' + strCss + '</style>');
    var prevLink = "none";
    var prevUrl = "none";
    var prevThumbLength = 0;
    var sourceCode = null;

		var action = function() {
			var e3 = $('div.photo-list-photo-view');
			if (document.URL == prevUrl) {
				if (e3.length == prevThumbLength) return false; // number of thumbnail is not change, no need to process further
				prevThumbLength = e3.length;
				log("Number of thumb: " + prevThumbLength);
				// source code is get, use it now
				getLinkFromSource(sourceCode);
			}
			else {
				var e1 = e3.find('a').filter(':first');
				if (e1.length < 1) return false; // not found any link to valid single image page
				// show image information for newly added nodes
				// get full source code for this page
				sourceCode = null;
				prevUrl = document.URL;
				var link1 = e1.attr('href');
				console.time("GetSource");
				$('#content').append('<div id="embedLoadingIndicator" style="position:fixed;left:5px;top:4em;display:block;background-color:pink;border:solid;padding:3px; z-index:999;">Getting embed links<br>Please wait...</div>');
				log("Begin find source code, start with: " + link1);
				$.get(link1, function(data) {// process single image page source to get entry-type link
					var link2 = data.match(/<a\s+class='entry-type'\s+href='([^']+)/i)[1];
					$.get(link2, function(data) {// process page source to get image links
						log("Got page source: " + link2);
						console.timeEnd("GetSource");
						$('#embedLoadingIndicator').remove();
						sourceCode = data;
						getLinkFromSource(sourceCode);
					});
				});
			}
    }
    action();
    globalObserver = new MutationObserver(function(mutations, ob) {
			action();
    });
    globalObserver.observe(target, config);
}

function pageType() {
    var t = "none";
    var htmlClass = $('html').attr('class');
    console.log("HTML class: " + htmlClass);
    if (htmlClass.match(/html-photo-page.+scrappy-view/i) !== null) t = 'single';
    else if (htmlClass.match(/html-search-photos-unified-page-view/i) !== null) t = 'hover';
    else if ($('div.photo-list-photo-view').filter(':first').length > 0) t = 'normal';
    console.log("Page type: " + t);
    return t;
}

var target = $('html')[0];
var config = {
    childList : false,
    attributes : true,
};

var prevType = "none";
var type = "none";
var observer = new MutationObserver(function(mutations, ob) {
	type = pageType();
    
  if (type != prevType) {
		if (globalObserver != null) { 
			globalObserver.disconnect();
		}
		prevType = type;
		if (type == 'single') {
			action_single_page();
		} else if (type == 'normal') {
			action_normal_page();
		}
	}
});
observer.observe(target, config);