Tuesday, March 29, 2011 at 1:07 AM.


on subscribeFeed (url, adrname=nil, adruser=nil) {
		<<3/24/11; 12:38:47 PM by DW
			<<Add optional adruser param to be passed to subscribeList.
		<<12/27/09; 10:10:57 AM by DW
			<<Set adrdata^.stats.cloudPipeClient.flFeedsDirty true on subscribe.
		<<9/16/09; 10:37:20 AM by DW
			<<Add optional adrname parameter, returns the name of the thing you subscribed to.
		<<9/16/09; 8:16:52 AM by DW
			<<Try to get the items from the feed before calling the read-feed routine. 
		<<9/7/09; 12:25:51 PM by DW
			<<After subscribing, renew subscriptions, in case the feed you're subscribed to is cloud-enabled.
		<<9/1/09; 11:49:26 AM by DW
			<<If it's an OPML file, delegate to the list-subscribing code.
		<<8/16/09; 7:03:39 PM by DW
			<<For feeds that are subscribed "naturally" and not from a reading list, we set adrdata^.prefs.flNonListSubscribe true, so they will not be deleted when all lists that reference them are unsubbed. It's *very* important that this routine not be called to subscribe to a feed from a mail list. Note that such feeds could be referenced from a reading list.
		<<8/11/09; 1:15:54 PM by DW
			<<Tweak log message.
		<<6/16/09; 1:36:33 PM by DW
	local (adrdata = river2Suite.init (), now = clock.now (), startticks = clock.ticks ());
	if defined (adrdata^.feeds.[url]) {
		scriptError ("Dude. You're already subscribed to that feed.")};
	bundle { //if it's an OPML file, delegate 9/1/09 by DW
		local (s = tcp.httpreadurl (url), xstruct, flopml = false);
		xml.compile (s, @xstruct);
		try {
			xml.getaddress (@xstruct, "opml");
			flopml = true};
		if flopml {
			return (river2Suite.subscribeList (url, adrname, adruser))}};
	bundle { //if we can't get the feed items, can't subscribe, 9/16/09 by DW
		local (items, feedinfo);
		new (tabletype, @feedinfo);
		xml.rss.getFeedItems (url, @items, @feedinfo);
		if adrname != nil {
			adrname^ = feedinfo.title}};
	try {
		river2Suite.readFeed (url);
		local (adrfeed = river2suite.initfeed (url));
		adrfeed^.stats.whenSubscribed = now;
		adrdata^.prefs.flNonListSubscribe = true; //8/16/09 by DW
		if adrdata^.prefs.flRequestCloudNotify { //9/7/09 by DW
			thread.callscript (@river2Suite.renewSubscriptions, {})};
		adrdata^.stats.cloudPipeClient.flFeedsDirty = true; //12/27/09 by DW
		log2.add (river2Info.name, "Subscribe", "<a href=\"" + url + "\">" + adrfeed^.feedinfo.title + "</a>.", startticks)}
	else {
		local (s = tryerror);
		local (adrfeed = river2suite.initfeed (url));
		log2.add (river2Info.name, "Subscribe", "Error subscribing to \"" + url + "\": " + s, startticks);
		delete (adrfeed);
		scripterror (s)}};
bundle { //test code
	local (url = "http://newsriver.org/podcastReadingList.opml");
	url = "http://static.newsriver.org/afp/texn.xml";
	url = "http://newsriver.org/podcastReadingList.opml";
	subscribeFeed (url);
	<<if dialog.ask ("URL?", @config.river2.prefs.lastFeedUrl)
		<<subscribeFeed (config.river2.prefs.lastFeedUrl)

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.