Flickr - People in this photo
By Jacob DeHart
—
Last update Apr 8, 2008
—
Installed
1,350 times.
// ==UserScript==
// @name Flickr - People in this photo
// @namespace http://jacobdehart.com/js/greasemonkey
// @description Tag a photo with flickr:user=username (replacing username with their actual flickr username) and this script will display a link to the user in the photo! It also displays a fancy little thumbnail image of the user
// @include http://*flickr.com/*
// @exclude http://*flickr.com/photos/tags/*
// @exclude http://*flickr.com/photos/organize/*
// ==/UserScript==
/*
Updates
------
1st June 2007 added a "Photos of this user" menu item to user's buddy menus, when selected the user is
redirected to the flickr:user=username tag page for that user, but only if there are tagged photos available
*/
( function () {
// function that will be added to the buddy menu
unsafeWindow.viewimagesofthisuser=function(node) {
if(node.getElementsByTagName("strong")[0])
username=node.getElementsByTagName("strong")[0].innerHTML;
else if (node.getElementsByTagName('p')[0].innerHTML.match(/^You are blocking/))
username=node.getElementsByTagName('p')[0].innerHTML.split('You are blocking')[1];
else
alert('Error retrieving username, so cant display any photos of them, sorry :(');
if(username) {
var listener = {
flickr_photos_search_onLoad: function(success, responseXML, responseText, params){
if(success) {
if(responseText.match(/rsp stat="ok"/)) {
if(!responseText.match(/pages="0"/)) // if theres at least one photo available
document.location.href='http://flickr.com/photos/tags/flickr:user=' + username;
else
alert('There are no photos available tagged with "flickr:user=' + username + '"');
}
else
alert('error accessing the api');
}
}
}; // end api listener
unsafeWindow.F.API.callMethod('flickr.photos.search', { per_page:1,machine_tags:"flickr:user=" + username } , listener); //desc
}
} // end viewimagesofthisuser function
// add new menu item "Photos of this user" to buddy icon menu
photosofuserlink=document.createElement('a');
photosofuserlink.setAttribute('class','block');
photosofuserlink.setAttribute('id','user_photos_link');
photosofuserlink.setAttribute('href','javascript:;');
photosofuserlink.setAttribute('onclick','viewimagesofthisuser(this.parentNode.parentNode)');
photosofuserlink.textContent='Photos of this User';
buddymenuinpoint=document.getElementById('personmenu_contacts_link');
if(buddymenuinpoint)
buddymenuinpoint.parentNode.insertBefore(photosofuserlink,buddymenuinpoint.nextSibling);
// check if we are on a photo page
picid=unsafeWindow.page_photo_id;
if (!picid)
return;
//check for person tags
foundpeople = [];
if(!unsafeWindow.global_photos[picid])
return;
for (i in unsafeWindow.global_photos[picid].tags_rawA) {
uname='';
if (unsafeWindow.global_photos[picid].tags_rawA[i].match(/flickr\:user=/i)) {
uname=unsafeWindow.global_photos[picid].tags_rawA[i].split(/flickr\:user=/i)[1];
}
if (unsafeWindow.global_photos[picid].tags_rawA[i].match('person:')) {
uname=unsafeWindow.global_photos[picid].tags_rawA[i].split('person:')[1];
}
if (uname) {
foundpeople.push([uname]);
}
}
// Person Object
flickr_Person = function(uname){
this.getNSID = function(uname){
self = this;
return GM_xmlhttpRequest({
method : "GET",
onload : function(res){
matches = res.responseText.match(/<user id="([0-9@N]+)"/);
if(matches && (matches.length==2)){ // Found it!
self.getInfo(matches[1],uname);
}
},
url : "http://www.flickr.com/services/rest/?method=flickr.people.findByUsername&api_key="+unsafeWindow.global_magisterLudi+"&username="+uname
});
}
this.getInfo = function(nsid,uname){
self = this;
return GM_xmlhttpRequest({
method : "GET",
onload : function(res){
iconserver = res.responseText.match(/iconserver="([0-9]+)"/)[1];
photosurl = res.responseText.match(/<photosurl>(.*)<\/photosurl>/)[1];
self.buildLink(nsid,uname,iconserver,photosurl);
},
url : "http://www.flickr.com/services/rest/?method=flickr.people.getInfo&api_key="+unsafeWindow.global_magisterLudi+"&user_id="+nsid
});
}
this.buildLink = function(nsid,uname,iconserver,photosurl){
try { // handle whether flickrPM is installed or not
pmlinks=unsafeWindow.makeLinks(nsid); // makeLinks is defined in flickr.pm.user.js
}
catch(e) {
pmlinks='';
}
this.dv = document.getElementById('person'+uname);
this.dv.innerHTML = '<table cellspacing="3" cellpadding="0" border="0"><tr><td><a href="'+photosurl+'"><img id="FriendBuddyIcon' + nsid + '" alt="view profile" class="FriendBuddyIcon" src="http://static.flickr.com/'+iconserver+'/buddyicons/'+nsid+'.jpg" width="24" height="24"></a></td><td> <a href="'+photosurl+'" class="plain">'+uname+'</a> ' + pmlinks + '</td></tr></table>';
unsafeWindow.newbuddyfunction("FriendBuddyIcon" + nsid);
}
this.getNSID(uname);
}
// Build Person Objects
if(foundpeople.length>0){
otherdiv = document.getElementById('other_contexts_p');
anotherdiv = document.getElementById('otherContexts_div');
newdiv = document.createElement("DIV");
if(!otherdiv)
anotherdiv.appendChild(newdiv);
else
otherdiv.parentNode.insertBefore(newdiv,otherdiv);
newdiv.className = "TagList";
newdiv.id = "peopleinphoto";
newdiv.innerHTML = '<h4>People in this photo</h4>';
for(i in foundpeople){
newdiv.innerHTML += '<div style="height:22px;" id="person'+foundpeople[i][0]+'"></div>';
new flickr_Person(foundpeople[i][0]);
}
}
unsafeWindow.getObjectMethodClosure=function(object, method) {
return function(arg) {
return object[method](arg);
}
}
unsafeWindow.newbuddyfunction=function(theimgid){ //adds buddymenu to usericon
// many thanks to mortimer? for the help with this part! :D
imgs=document.getElementById(theimgid);
if((imgs.getAttribute('id')) && (imgs.getAttribute('id').match('FriendBuddyIcon'))) {
var bid = imgs.getAttribute('id').split('FriendBuddyIcon')[1];
var img2 = unsafeWindow.document.getElementById('FriendBuddyIcon'+bid);
img2.nsid = bid;
imgs.addEventListener('mouseover',unsafeWindow.getObjectMethodClosure(unsafeWindow.document.getElementById('person_hover'),'icon_mouseover'),true);
imgs.addEventListener('mouseout',unsafeWindow.getObjectMethodClosure(unsafeWindow.document.getElementById("person_hover"),'icon_mouseout'),true);
var id="hover_img" + bid;
if (!unsafeWindow.document.getElementById(id)) {
var new_img = document.createElement("IMG");
new_img.id = id;
new_img.nsid = bid;
new_img.src = imgs.getAttribute('src');
new_img.className = "person_hover_img";
document.getElementById("person_hover_link").appendChild(new_img);
var new_img2 = unsafeWindow.document.getElementById(id);
new_img2.nsid = bid;
}
}
} // end new buddy function
// if user is not logged in, no need to continue
tadid=document.getElementById('tagadder');
if(!tadid)
return;
unsafeWindow.addusertag= function(form) {
//alert(form.to_nsid[form.to_nsid.selectedIndex].value + ' ' + form.to_nsid[form.to_nsid.selectedIndex].textContent);
if(form.to_nsid[form.to_nsid.selectedIndex].value !='' && form.to_nsid[form.to_nsid.selectedIndex].value!=0) {
retval=unsafeWindow.tagrs_addTag(unsafeWindow.page_photo_id, "\"flickr:user=" + form.to_nsid[form.to_nsid.selectedIndex].textContent +'\"');
}
return false;
}
unsafeWindow.dspadduserform=function () {
GM_xmlhttpRequest({
method: 'GET',
url: 'http://www.flickr.com/messages_write.gne',
headers: {
'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey - Add user to picture',
'Referer': 'http://flickr.com/messages_write.gne',
},
onload: function(responseDetails) {
//alert(responseDetails.responseStatus + ' ' + responseDetails.responseText )
conselbox="<p><form action='' onSubmit='return addusertag(this);'><select id='conselbox' " + responseDetails.responseText.split("\<select")[1].split("\<\/select\>")[0] + "</select><input class='Butt' type='submit' value='Add User to Photo'></form></p>";
document.getElementById('conseldiv').innerHTML=conselbox;
//add current user
document.getElementById('conselbox').options[1].value =unsafeWindow.global_nsid;
document.getElementById('conselbox').options[1].textContent =unsafeWindow.global_name;
}
});
}
conseldiv=document.createElement('div');
conseldiv.setAttribute('id','conseldiv');
conseldiv.innerHTML="<p><A class='plain' href='javascript:;' onclick='dspadduserform();return false;'>Add a user to this photo</a></p>";
tadid.parentNode.insertBefore(conseldiv, tadid.nextSibling);
}) (); // end anonymous function