| 1 | // ==UserScript== |
|---|
| 2 | // @name Flickr Adds Focal Length on a 35mm |
|---|
| 3 | // @namespace http://codefairy.org/ns/userscripts |
|---|
| 4 | // @include http://www.flickr.com/*/meta/* |
|---|
| 5 | // @include http://flickr.com/*/meta/* |
|---|
| 6 | // @version 0.2.5 |
|---|
| 7 | // @license MIT License |
|---|
| 8 | // ==/UserScript== |
|---|
| 9 | |
|---|
| 10 | new function() { |
|---|
| 11 | var cacheable = (typeof GM_setValue == 'function' && typeof GM_getValue == 'function'); |
|---|
| 12 | |
|---|
| 13 | var camera = $X('id("Inbox")//tr/td[preceding-sibling::td/b[text()="Camera:"]]/b'); |
|---|
| 14 | var focalLength = $X('id("Inbox")//tr/td[preceding-sibling::td/b[text()="Focal Length:"]]/b'); |
|---|
| 15 | if (!camera || !focalLength) return; |
|---|
| 16 | camera = camera[0]; |
|---|
| 17 | focalLength = focalLength[0]; |
|---|
| 18 | |
|---|
| 19 | var w = typeof unsafeWindow != 'undefined' ? unsafeWindow : window; |
|---|
| 20 | var now = new Date().getTime(); |
|---|
| 21 | var uri = 'http://wedata.net/databases/AngleOfView/items'; |
|---|
| 22 | |
|---|
| 23 | var callback = function(data) { |
|---|
| 24 | var text = 'unknown on a 35mm camera. <a href="'+uri+'">add angle of view data?</a>'; |
|---|
| 25 | for (var i = 0, length = data.length; i < length; i++) { |
|---|
| 26 | var item = data[i]; |
|---|
| 27 | if (item.name == camera.textContent) { |
|---|
| 28 | if (item.data.ratio == 1) |
|---|
| 29 | text = 'with a full-frame'; |
|---|
| 30 | else { |
|---|
| 31 | var angleOfView = Math.round(parseFloat(focalLength.textContent) * parseFloat(item.data.ratio)); |
|---|
| 32 | text = angleOfView+' mm on a 35 mm camera'; |
|---|
| 33 | } |
|---|
| 34 | break; |
|---|
| 35 | } |
|---|
| 36 | } |
|---|
| 37 | focalLength.innerHTML += ' ('+text+')'; |
|---|
| 38 | }; |
|---|
| 39 | |
|---|
| 40 | var load = function() { |
|---|
| 41 | return eval(GM_getValue('stash')); |
|---|
| 42 | }; |
|---|
| 43 | |
|---|
| 44 | var save = function(data) { |
|---|
| 45 | var stash = data ? |
|---|
| 46 | uneval({ |
|---|
| 47 | data : data, |
|---|
| 48 | expires: now + 1000 * 60 * 60 * 24 |
|---|
| 49 | }) : |
|---|
| 50 | ''; |
|---|
| 51 | GM_setValue('stash', stash); |
|---|
| 52 | return data; |
|---|
| 53 | }; |
|---|
| 54 | |
|---|
| 55 | |
|---|
| 56 | if (cacheable && typeof GM_registerMenuCommand == 'function') |
|---|
| 57 | GM_registerMenuCommand('Clear Angle of View Data Cache', save); |
|---|
| 58 | |
|---|
| 59 | var api = uri+'.json'; |
|---|
| 60 | if (cacheable) { |
|---|
| 61 | var complete = false; |
|---|
| 62 | var stash = load(); |
|---|
| 63 | |
|---|
| 64 | if (stash && stash.expires >= now) |
|---|
| 65 | callback(stash.data); |
|---|
| 66 | else { |
|---|
| 67 | GM_xmlhttpRequest({ |
|---|
| 68 | method: 'GET', |
|---|
| 69 | url : api, |
|---|
| 70 | onload: function(r) { |
|---|
| 71 | var data = eval(r.responseText); |
|---|
| 72 | save(data); |
|---|
| 73 | if (!complete) callback(data); |
|---|
| 74 | } |
|---|
| 75 | }); |
|---|
| 76 | if (stash) |
|---|
| 77 | setTimeout(function() { |
|---|
| 78 | complete = true; |
|---|
| 79 | callback(save(stash.data)); |
|---|
| 80 | }, 1000 * 30); |
|---|
| 81 | } |
|---|
| 82 | } |
|---|
| 83 | else { |
|---|
| 84 | w['jsonp'+now] = callback; |
|---|
| 85 | |
|---|
| 86 | var s = document.createElement('script'); |
|---|
| 87 | s.type = 'text/javascript'; |
|---|
| 88 | s.src = api+'?callback=jsonp'+now; |
|---|
| 89 | s.charset = 'utf-8'; |
|---|
| 90 | document.body.appendChild(s); |
|---|
| 91 | } |
|---|
| 92 | |
|---|
| 93 | |
|---|
| 94 | // @source http://gist.github.com/29681.txt |
|---|
| 95 | function $X (exp, context, resolver, result_type) { |
|---|
| 96 | context || (context = document); |
|---|
| 97 | var Doc = context.ownerDocument || context; |
|---|
| 98 | var result = Doc.evaluate(exp, context, resolver, result_type || XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); |
|---|
| 99 | if (result_type) return result; |
|---|
| 100 | for (var i = 0, len = result.snapshotLength, res = []; i < len; i++) { |
|---|
| 101 | res.push(result.snapshotItem(i)); |
|---|
| 102 | } |
|---|
| 103 | return res; |
|---|
| 104 | } |
|---|
| 105 | }; |
|---|