Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
set flickr_folder to ((path to home folder as text) & "scripts:flickr") set the_xml_folder to flickr_folder & ":photoinfo" set the_download_folder to flickr_folder & ":download" set already_downloaded to list folder the_download_folder set the_xml_files to get_xml_files(the_xml_folder) repeat with i from 1 to the count of the_xml_files set the_xml_file to (item i of the_xml_files as text) set the_data to load_xml(the_xml_folder & ":" & the_xml_file) set the_xml to parse_it(the_data) -- generate the full URL to the original photo file set photo to getAnElement(the_xml, "photo") set photo_id to |id| of XML attributes of photo set server to server of XML attributes of photo set secret to secret of XML attributes of photo set photo_file_name to photo_id & "_" & secret & "_o.jpg" if already_downloaded contains photo_file_name then log "skipping " & photo_file_name else -- do it set photo_url to "http://static.flickr.com/" & server & "/" & photo_file_name --set the_title to getElementValue(getElementFromPath(the_xml, {"photo", "title"})) --set the_description to getElementValue(getElementFromPath(the_xml, {"photo", "description"})) -- get a list of the tags associated with this photo --set the_tags to getElements(getElementFromPath(the_xml, {"photo", "tags"}), "tag") --set tags to {} --repeat with j from 1 to count of the_tags -- set tag to (item j of the_tags) -- set end of tags to getElementValue(tag) --end repeat download_photo(photo_url, the_download_folder, photo_file_name) --set imported_photo_ok to import_photo(photo_file_name, the_title, the_description) --if imported_photo_ok then -- assign_to_selection_keywords(tags) --end if end if end repeat on import_photo(photo_file_name, the_title, the_comment) tell application "iPhoto" --import from "~/scripts/flickr/download/" & photo_file_name with force copy --return false set found_photo to false set the photo_list to photos of photo library album repeat with i from 1 to count of photo_list set the_photo to (item i of photo_list) tell the_photo set the_image_filename to the image filename if the_image_filename is the photo_file_name then set found_photo to true select the_photo set i to count of photo_list end if end tell end repeat if found_photo then set sel to selection set this_photo to last item of sel tell this_photo set the title to the_title set the comment to the_comment end tell else log "FAILED TO FIND PHOTO" end if end tell return found_photo end import_photo on download_photo(photo_url, the_download_folder, photo_file_name) tell application "URL Access Scripting" download photo_url to (the_download_folder & ":" & photo_file_name) end tell end download_photo on assign_to_selection_keywords(keywords_list) tell application "iPhoto" set keywords_count to the count of the keywords_list repeat with i from 1 to keywords_count set the_keyword to (item i of the keywords_list) «event KAnewkey» given name:the_keyword assign keyword string the_keyword end repeat end tell end assign_to_selection_keywords on getElementValue(theXML) if theXML is missing value or theXML is {} then return "" else if class of theXML is string then return theXML else try return item 1 of XML contents of theXML on error number -1728 return "" end try end if end getElementValue on getElementFromPath(theXML, theElementPath) if theElementPath is {} then return theXML else local foundElement set foundElement to getAnElement(theXML, item 1 of theElementPath) if foundElement is not missing value and ¬ class of foundElement is XML element then return getElementFromPath(foundElement, rest of theElementPath) else return missing value end if end if end getElementFromPath on getAnElement(theXML, theElementName) -- find and return a particular element (this presumes there is only one instance of the element) repeat with anElement in XML contents of theXML if class of anElement is XML element and ¬ XML tag of anElement is theElementName then return contents of anElement end if end repeat return missing value end getAnElement on getNamedElement(theXML, theElementName, theName) -- find and return the first element with a particular name attribute if class of theXML is XML element or class of theXML is XML document then repeat with anElement in XML contents of theXML try if class of anElement is XML element and ¬ XML tag of anElement is theElementName and ¬ |name| of XML attributes of anElement is theName then return contents of anElement end if on error number -1728 -- ignore this error end try end repeat else if class of theXML is list then repeat with anElement in theXML try if class of anElement is XML element and ¬ XML tag of anElement is theElementName and ¬ |name| of XML attributes of anElement is theName then return contents of anElement end if on error number -1728 -- ignore this error end try end repeat end if return missing value end getNamedElement on getElements(theXML, theElementName) local theResult set theResult to {} repeat with anElement in XML contents of theXML if class of anElement is XML element and XML tag of anElement is theElementName then set end of theResult to contents of anElement end if end repeat return theResult as list end getElements on get_xml_files(the_xml_folder) return list folder the_xml_folder end get_xml_files on load_xml(the_file) set fRef to open for access file the_file without write permission set the_contents to (read fRef) close access fRef return the_contents end load_xml on parse_it(the_xml_data) set the_xml to parse XML the_xml_data return the_xml end parse_it
This paste will be private.
From the Design Piracy series on my blog: