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
translators/Flickr.js
Find file
Copy path
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 **/ |