Monday, November 08, 2010 at 12:01 AM.
system.verbs.apps.Flickr.photos.getInfo
on getInfo (id, secret=nil, adrinfo=nil) {
<<Changes
<<8/22/07; 9:03:27 PM by DW
<<Minor tweaks & fixes.
<<8/22/07; 6:58:22 PM by DW
<<Improve organization of code, add date coercion.
<<http://www.flickr.com/services/api/misc.dates.html
<<8/22/07; 2:20:48 PM by DW
<<Created.
<<http://www.flickr.com/services/api/flickr.photos.getInfo.html
<<file.writewholefile ("macintosh hd:table.html", html.data.standardMacros.nestedTableDisplayer (@scratchpad.pictureinfo))
<<true
on getTakenDate (s) {
<<2004-11-29 16:01:26
local (year = 1970, month = 1, day = 1, hour = 0, minute = 0, second = 0);
on popto (ch) {
local (ix = string.patternmatch (ch, s));
if ix == 0 {
scripterror ("xxx")};
num = number (string.mid (s, 1, ix-1));
s = string.delete (s, 1, ix);
return (num)};
try {
year = popto ("-");
month = popto ("-");
day = popto (" ");
hour = popto (":");
minute = popto (":");
second = number (s)};
return (date.set (day, month, year, hour, minute, second))};
local (mystruct);
new (tabletype, @mystruct);
mystruct.api_key = user.flickr.prefs.apiKey;
mystruct.photo_id = id;
if secret != nil {
mystruct.secret = secret};
local (s = [user.flickr.prefs.server].flickr.photos.getInfo (mystruct), xstruct);
s = string.replaceall (s, """, "\"");
xml.compile (s, @xstruct);
<<scratchpad.infostruct = xstruct
if adrinfo != nil {
local (adrphoto = xml.getaddress (@xstruct, "photo"));
adrinfo^ = adrphoto^.["/atts"];
adrinfo^.title = xml.getvalue (adrphoto, "title");
adrinfo^.description = xml.getvalue (adrphoto, "description");
adrinfo^.comments = xml.getvalue (adrphoto, "comments");
local (adrowner = xml.getaddress (adrphoto, "owner"));
adrinfo^.owner = adrowner^.["/atts"];
local (adrvisibility = xml.getaddress (adrphoto, "visibility"));
adrinfo^.visibility = adrvisibility^.["/atts"];
bundle { //dates
local (adrdates = xml.getaddress (adrphoto, "dates"));
adrinfo^.dates = adrdates^.["/atts"];
adrinfo^.dates.lastupdate = date.unixDateToDate (adrinfo^.dateuploaded);
adrinfo^.dates.posted = date.unixDateToDate (adrinfo^.dates.posted);
adrinfo^.dates.taken = getTakenDate (adrinfo^.dates.taken);
adrinfo^.dates.dateuploaded = date.unixDateToDate (adrinfo^.dateuploaded);
delete (@adrinfo^.dateuploaded)};
local (adreditability = xml.getaddress (adrphoto, "editability"));
adrinfo^.editability = adreditability^.["/atts"];
bundle { //geoperms
try {
local (adrgeoperms = xml.getaddress (adrphoto, "geoperms"));
adrinfo^.geoperms = adrgeoperms^.["/atts"]}
else {
new (tabletype, @adrinfo^.geoperms)}};
bundle { //notes
local (adrnotes = xml.getaddress (adrphoto, "notes"), adrnote);
new (tabletype, @adrinfo^.notes);
for adrnote in adrnotes {
if nameof (adrnote^) endswith "note" {
local (adrsub = @adrinfo^.notes.[adrnote^.["/atts"].id]);
adrsub^ = adrnote^.["/atts"];
adrsub^.title = adrnote^.["/pcdata"]}}};
bundle { //tags
local (adrtags = xml.getaddress (adrphoto, "tags"), adrtag);
new (tabletype, @adrinfo^.tags);
for adrtag in adrtags {
if nameof (adrtag^) endswith "tag" {
local (adrsub = @adrinfo^.tags.[adrtag^.["/pcdata"]]);
adrsub^ = adrtag^.["/atts"]}}};
bundle { //location
try {
local (adrlocation = xml.getaddress (adrphoto, "location"));
adrinfo^.location = adrlocation^.["/atts"];
adrinfo^.location.locality = xml.getvalue (adrlocation, "locality");
adrinfo^.location.county = xml.getvalue (adrlocation, "county");
adrinfo^.location.region = xml.getvalue (adrlocation, "region");
adrinfo^.location.country = xml.getvalue (adrlocation, "country")}
else {
if not defined (adrinfo^.location) {
new (tabletype, @adrinfo^.location)}}};
bundle { //urls
local (adrurls = xml.getaddress (adrphoto, "urls"), adrurl);
new (tabletype, @adrinfo^.urls);
for adrurl in adrurls {
if nameof (adrurl^) endswith "url" {
adrinfo^.urls.[adrurl^.["/atts"].type] = adrurl^.["/pcdata"]}}}}}
<<bundle //test code
<<getinfo ("1166257196", adrinfo:@scratchpad.pictureinfo)
<<edit (@scratchpad.pictureinfo)
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.