Permalink
Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.
Sign up
Fetching contributors…
Cannot retrieve contributors at this time
{ | |
"translatorID": "5dd22e9a-5124-4942-9b9e-6ee779f1023e", | |
"label": "Flickr", | |
"creator": "Sean Takats, Rintze Zelle, and Aurimas Vinckevicius", | |
"target": "^https?://(www\\.)?flickr\\.com/", | |
"minVersion": "3.0", | |
"maxVersion": "", | |
"priority": 100, | |
"inRepository": true, | |
"translatorType": 4, | |
"browserSupport": "gcsbv", | |
"lastUpdated": "2016-09-20 06:21:01" | |
} | |
function detectWeb(doc, url) { | |
/* | |
if (ZU.xpath(doc,'//h1[@property="dc:title" and starts-with(@id, "title_div")]').length) { | |
return getPhotoId(doc) ? "artwork" : null; | |
} | |
var type = ZU.xpathText(doc,'//meta[@name="og:type"]/@content'); | |
if ( type && type.substr(type.length - 5) == 'photo') { | |
return getPhotoId(doc) ? "artwork" : null; | |
}*/ | |
if (getSearchResults(doc, true)) { | |
return "multiple"; | |
} | |
if (getPhotoId(doc)) { | |
return "artwork"; | |
} | |
} | |
function getSearchResults(doc, checkOnly) { | |
//some search results are hidden ("display: none") | |
//videos have a second <a/> element ("a[1]") | |
var elmts = ZU.xpath(doc, '//div[not(contains(@style, "display: none"))]\ | |
/*/span[contains(@class, "photo_container")]/a[1]'); | |
if (!elmts.length){ | |
elmts = ZU.xpath(doc, '//div[not(contains(@style, "display: none"))]\ | |
/*/a[@class="title"]'); | |
} | |
var items = {}, found = false; | |
for (var i=0, n=elmts.length; i<n; i++) { | |
var title = elmts[i].title; | |
//in photostreams, the <a> element doesn't have a title attribute | |
if (title == "") { | |
title = elmts[i].textContent; | |
//title = elmts[i].getElementsByTagName("img")[0].alt; | |
} | |
title = ZU.trimInternal(title); | |
if (!title) continue; | |
var photoId = elmts[i].href.match(/\/photos\/[^\/]*\/([0-9]+)/); | |
if (!photoId) continue; | |
if (checkOnly) return true; | |
found = true; | |
items[photoId[1]] = title; | |
} | |
return found ? items : false; | |
} | |
function getPhotoId(doc) { | |
var photoId = false; | |
var elmt = ZU.xpathText(doc, '//meta[@property="og:image" or @name="og:image"]/@content'); | |
if (elmt) { | |
photoId = elmt.substr(elmt.lastIndexOf('/')+1).match(/^[0-9]+/); | |
} | |
return photoId ? photoId[0] : false; | |
} | |
function doWeb(doc, url) { | |
if (detectWeb(doc, url) == "multiple") { | |
Zotero.selectItems(getSearchResults(doc), function (items) { | |
if (!items) return true; | |
var ids = []; | |
for (var id in items) { | |
ids.push(id); | |
} | |
fetchForIds(ids); | |
}); | |
} else { | |
fetchForIds([getPhotoId(doc)]); | |
} | |
} | |
function fetchForIds(ids) { | |
var key = "3cde2fca0879089abf827c1ec70268b5"; | |
var apiUrl = "https://api.flickr.com/services/rest/?api_key=" + key | |
+ "&method=flickr.photos.getInfo&photo_id="; | |
ZU.doGet( | |
ids.map(function(id) { return apiUrl + encodeURIComponent(id) }), | |
parseResponse | |
); | |
} | |
var licenses = [ // See https://api.flickr.com/services/rest/?api_key=3cde2fca0879089abf827c1ec70268b5&photo_id=3122503680&method=flickr.photos.licenses.getInfo | |
'All Rights Reserved', | |
'Attribution-NonCommercial-ShareAlike License', | |
'Attribution-NonCommercial License', | |
'Attribution-NonCommercial-NoDerivs License', | |
'Attribution License', | |
'Attribution-ShareAlike License', | |
'Attribution-NoDerivs License', | |
'No known copyright restrictions', | |
'United States Government Work' | |
]; | |
function parseResponse(text) { | |
var doc = (new DOMParser()).parseFromString(text, 'application/xml'); | |
var status = doc.firstElementChild.getAttribute('stat'); | |
if (status && status == 'fail') { | |
var error = doc.firstElementChild.firstElementChild; | |
throw new Error('Error retrieving metadata: ' + error.getAttribute('msg') | |
+ ' (' + error.getAttribute('code') + ')'); | |
} | |
var photo = doc.firstElementChild.firstElementChild; | |
var newItem = new Zotero.Item("artwork"); | |
var title = ZU.xpathText(photo, './title'); | |
if (title && (title = ZU.trimInternal(title))) { | |
newItem.title = title; | |
} else { | |
newItem.title = " "; | |
} | |
var tags = ZU.xpath(photo, './tags/tag'); | |
if (tags.length) { | |
for (var i=0; i<tags.length; i++) { | |
newItem.tags.push(ZU.trimInternal(tags[i].textContent)); | |
} | |
} | |
var date = ZU.xpathText(photo, './dates/@taken'); | |
if (date) { | |
newItem.date = date.substr(0, 10); | |
} | |
var owner = ZU.xpathText(photo, './owner/@realname') | |
if (owner) { | |
newItem.creators.push(ZU.cleanAuthor(owner, "artist")); | |
} else if (owner = ZU.xpathText(photo, './owner/@username')) { | |
newItem.creators.push({ | |
lastName: owner, | |
creatorType: 'artist', | |
fieldMode: 1 | |
}); | |
} | |
var url = ZU.xpath(photo, './urls/url[@type="photopage"]')[0]; | |
if (url) { | |
newItem.url = url.textContent; | |
} | |
var description; | |
if ((description = ZU.xpathText(photo, './description'))) { | |
newItem.abstractNote = description; | |
} | |
var license = photo.getAttribute('license'); | |
if (license && licenses[license * 1]) { | |
newItem.rights = licenses[license * 1]; | |
} | |
var media = photo.getAttribute('media'); // photo, screenshot, other... I think | |
if (media) { | |
newItem.artworkMedium = media; | |
} | |
// TODO: | |
// * add location where the photo was taken into Extra? | |
// We can build the original photo URL manually. See https://www.flickr.com/services/api/misc.urls.html | |
var secret = photo.getAttribute('originalsecret'); | |
var originalFormat = photo.getAttribute('originalformat'); | |
if (secret && originalFormat) { // Both of these appear to be false if the owner disables downloading | |
var fileUrl = 'https://farm' + photo.getAttribute('farm') + '.staticflickr.com/' | |
+ photo.getAttribute('server') + '/' | |
+ photo.getAttribute('id') + '_' + secret | |
+ '_o.' + originalFormat; | |
newItem.attachments.push({ | |
title: newItem.title, | |
url: fileUrl, | |
mimeType: 'image/' + photo.getAttribute('originalformat') // jpg|gif|png | |
}); | |
} | |
newItem.complete(); | |
} | |
/** BEGIN TEST CASES **/ | |
var testCases = [ | |
{ | |
"type": "web", | |
"url": "https://www.flickr.com/photos/doug88888/3122503680/in/set-72157624194059533", | |
"items": [ | |
{ | |
"itemType": "artwork", | |
"title": "The blues and the greens EXPLORED", | |
"creators": [ | |
{ | |
"lastName": "@Doug88888", | |
"creatorType": "artist", | |
"fieldMode": 1 | |
} | |
], | |
"date": "2008-12-07", | |
"abstractNote": "More xmas shopping today - gulp.\n\nCheck out my <a href=\"http://doug88888.blogspot.com/\" rel=\"nofollow\">blog</a> if you like.", | |
"artworkMedium": "photo", | |
"libraryCatalog": "Flickr", | |
"rights": "Attribution-NonCommercial-ShareAlike License", | |
"url": "https://www.flickr.com/photos/doug88888/3122503680/", | |
"attachments": [ | |
{ | |
"title": "The blues and the greens EXPLORED", | |
"mimeType": "image/jpg" | |
} | |
], | |
"tags": [ | |
"18mm", | |
"400d", | |
"55mm", | |
"beautiful", | |
"bloom", | |
"blossom", | |
"blue", | |
"bokeh", | |
"bright", | |
"buy", | |
"canon", | |
"commons", | |
"creative", | |
"dec07", | |
"december", | |
"doug88888", | |
"england", | |
"eos", | |
"fall", | |
"flower", | |
"fresh", | |
"frosty", | |
"gimp", | |
"grass", | |
"green", | |
"ham", | |
"house", | |
"image", | |
"images", | |
"isolated", | |
"isolation", | |
"leaf", | |
"living", | |
"lone", | |
"nature", | |
"picture", | |
"pictures", | |
"plant", | |
"pretty", | |
"purchase", | |
"richmond", | |
"south", | |
"southwest", | |
"strand", | |
"tones", | |
"uk", | |
"west" | |
], | |
"notes": [], | |
"seeAlso": [] | |
} | |
] | |
}, | |
{ | |
"type": "web", | |
"url": "http://www.flickr.com/search/?q=test", | |
"items": "multiple" | |
}, | |
{ | |
"type": "web", | |
"url": "http://www.flickr.com/photos/lomokev/with/4952001059/", | |
"items": "multiple" | |
}, | |
{ | |
"type": "web", | |
"url": "http://www.flickr.com/photos/tags/bmw/", | |
"items": "multiple" | |
}, | |
{ | |
"type": "web", | |
"url": "https://www.flickr.com/photos/lomokev/galleries/72157623433999749/", | |
"items": "multiple" | |
}, | |
{ | |
"type": "web", | |
"url": "https://www.flickr.com/photos/lomokev/favorites/", | |
"items": "multiple" | |
}, | |
{ | |
"type": "web", | |
"url": "https://www.flickr.com/photos/lomokev/sets/502509/", | |
"items": "multiple" | |
} | |
] | |
/** END TEST CASES **/ |