Slug: rsspuller-script Date: 2001-01-20 Title: RSSPuller Script layout: post

RSSPuller script:


global rssFile
set rssFile to alias "Sandbox:Users:SteveIvy:TheHub:rssSources"
global tmpFile

--return rssFile

set tmpFilePath to "FireStorm:tmp:rssTmpFile"

tell application "BrainForest"
	open {rssFile}

	set rsf to the frontmost document

	set rssSources to (the tree items of rsf whose done is true) as list

	repeat with sourceNode in rssSources
		-- all sources should be actions so we can check them on or off
		if the action of sourceNode is false then set the action of sourceNode to true

		-- clean up

		if (count of the tree items of sourceNode) is not 0 then
			repeat (the count of the tree items of sourceNode) times
				if the (count of (the tree items of (tree item 1 of sourceNode) as list)) is 0 then
					tell rsf to delete tree item 1 of sourceNode
				else
					-- BIG TIME CRASHER HERE
					-- this BREAKS the MAC
					-- if we do this without deleting subnodes first

					-- delete subnodes first
					repeat (the count of the tree items of (tree item 1 of sourceNode)) times
						tell rsf to delete tree item 1 of (tree item 1 of sourceNode)
					end repeat
					-- then delete the node
					tell rsf to delete tree item 1 of sourceNode
				end if
			end repeat
		end if

		set the_url to the note of sourceNode

		-- fetch the rss source
		with timeout of 30 seconds
			tell application "URL Access Scripting"
				--return "" & the_url & ""
				download the_url to file tmpFilePath replacing yes
			end tell
		end timeout
		tell application "URL Access Scripting" to quit

		set xmlStr to ""
		-- read in xml contents
		open for access file tmpFilePath
		set xmlStr to (read file tmpFilePath) --to (get eof file tmpFilePath))
		close access file tmpFilePath


		set xmlData to parse XML (xmlStr)

		--return xmlData
		set rssCh to ""

		repeat with anElement in the XML contents of xmlData
			if the XML tag of anElement is "channel" then
				set rssCh to anElement
				exit repeat
			end if
		end repeat

		if rssCh is not "" then
			set rssCh to the XML contents of rssCh

			set the start date of sourceNode to the current date
			set the due date of sourceNode to the current date

			repeat with anElement in rssCh
				if the XML tag of anElement is "item" then
					set rssItemData to (the XML contents of anElement)
					repeat with itemBit in rssItemData
						if the XML tag of itemBit is "title" then set theTitle to the XML contents of itemBit as string
						if the XML tag of itemBit is "link" then set theLink to the XML contents of itemBit as string
						if the XML tag of itemBit is "description" then set theDesc to the XML contents of itemBit as string
					end repeat

					--now we insert it into brainforest
					tell rsf to set newNode to make new tree item at end of sourceNode with properties {title:theTitle & " - " & theDesc}
					tell rsf to set linkNode to make new tree item at end of newNode with properties {title:theLink}
					set the expanded of newNode to false
				end if
			end repeat
		else
			error "puke"
		end if

		set theTitle to ""
		set theLink to ""
		set theDesc to ""

		set the expanded of sourceNode to false
	end repeat
	activate
	say "RSS Sources updated"
end tell