Monday, November 08, 2010 at 12:01 AM.
system.verbs.apps.Flickr.folderWatcher.scan
on scan () {
<<Changes
<<1/8/08; 3:37:20 PM by DW
<<Support for callbacks.
<<1/6/08; 6:56:35 PM by DW
<<Support default tags.
<<12/4/07; 4:31:01 PM by DW
<<Nested folders correspond to tags.
<<If a picture is dropped in the top level of the folder it has no tags. If it's dropped in a sub-folder named Iowa it is uploaded with one tag -- Iowa. If it's dropped in a sub-sub-folder named Ames, it is uploaded with two tags, Iowa and Ames. You can nest to any level supported by the OS. Scanning is still very fast.
<<12/3/07; 11:12:27 AM by DW
<<Respect user.flickr.folderWatcher.flBeepAfterUpload.
<<6/15/07; 5:21:11 PM by DW
<<Archive to S3.
<<6/15/07; 4:58:54 PM by DW
<<Add a flag to control local archiving, user.flickr.folderWatcher.flLocalArchive.
<<6/15/07; 3:40:15 PM by DW
<<Support for archive folder on local hard disk.
<<Track the number of errors (but it isn't reported anywhere).
<<6/13/07; 11:55:50 AM by DW
<<Remove whitespace at end of HTML text.
<<6/12/07; 2:06:52 PM by DW
<<Respect the new user.flickr.folderWatcher.enabled and user.flickr.prefs.enableds boolean.
<<6/11/07; 12:10:33 PM by DW
<<Created.
local (ctcopied = 0, cterrors = 0, s = "");
loop { //loop until the folder is empty -- the user could be copying while we're copying
local (f, ctcopiedthisloop = 0);
fileloop (f in user.flickr.folderWatcher.folder, infinity) {
local (fname = string.lower (file.filefrompath (f)));
if (fname endswith ".gif") or (fname endswith ".jpg") or (fname endswith ".jpeg") {
try {
local (tags);
bundle { //set tags
tags = string.delete (file.folderfrompath (f), 1, sizeof (user.flickr.folderWatcher.folder));
if sizeof (tags) == 0 {
tags = user.flickr.folderWatcher.defaults.tags} //1/6/08 by DW
else {
<<Louisiana:New Orleans:Uptown:
tags = string.delete (tags, sizeof (tags), 1);
<<Louisiana:New Orleans:Uptown
tags = "\"" + string.replaceall (tags, file.getpathchar (), "\" \"") + "\"";
<<"Louisiana" "New Orleans" "Uptown"
tags = user.flickr.folderWatcher.defaults.tags + " " + tags}}; //1/6/08 by DW
s = s + Flickr.getImgHtml (Flickr.uploadPhoto (f, tags:tags), flRightAlign:true) + "\r\r";
if user.flickr.folderWatcher.flBeepAfterUpload {
speaker.beep ()};
ctcopiedthisloop++;
ctcopied++}
else {
cterrors++};
bundle { //archive the image locally
if user.flickr.folderWatcher.flLocalArchive {
local (farchive = user.flickr.folderWatcher.archiveFolder + file.getDatePath () + file.filefrompath (f));
file.surefilepath (farchive);
file.copy (f, farchive)}};
bundle { //archive the image to S3
if user.flickr.folderWatcher.flS3Archive {
local (path = user.flickr.folderWatcher.s3Path + file.getDatePath ("/") + file.filefrompath (f));
s3.newObject (path, file.readwholefile (f))}}};
file.delete (f)};
if ctcopiedthisloop == 0 {
break}};
if sizeof (s) > 0 {
wp.newtextobject (string.trimwhitespace (s), @user.flickr.imageHtml);
edit (@user.flickr.imageHtml, "Copy/Paste into your web page");
bundle { //callbacks, 1/8/08 by DW
local (adrscript);
for adrscript in @user.flickr.folderWatcher.callbacks.afterUpload {
while typeof (adrscript^) == addresstype {
adrscript = adrscript^};
try {
adrscript^ ()}}}}}
<<bundle //test code
<<scan ()
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.