[Slim-Checkins] r8789 - in /trunk/server/Slim: Buttons/XMLBrowser.pm Web/XMLBrowser.pm

andy at svn.slimdevices.com andy at svn.slimdevices.com
Fri Aug 4 09:27:21 PDT 2006


Author: andy
Date: Fri Aug  4 09:27:19 2006
New Revision: 8789

URL: http://svn.slimdevices.com?rev=8789&view=rev
Log:
Callback support for XMLBrowser-based plugins, to allow them to fetch and return data however they would like

Modified:
    trunk/server/Slim/Buttons/XMLBrowser.pm
    trunk/server/Slim/Web/XMLBrowser.pm

Modified: trunk/server/Slim/Buttons/XMLBrowser.pm
URL: http://svn.slimdevices.com/trunk/server/Slim/Buttons/XMLBrowser.pm?rev=8789&r1=8788&r2=8789&view=diff
==============================================================================
--- trunk/server/Slim/Buttons/XMLBrowser.pm (original)
+++ trunk/server/Slim/Buttons/XMLBrowser.pm Fri Aug  4 09:27:19 2006
@@ -63,12 +63,23 @@
 		# RSS plugin on SN to log errors.
 		my $onSuccess = $client->param('onSuccess');
 		my $onFailure = $client->param('onFailure');
+		
+		# the item is passed as a param so we can get passthrough params
+		my $item = $client->param('item');
 
 		# give user feedback while loading
 		$client->block(
 			$client->string('XML_LOADING'),
 			$title || $url,
 		);
+		
+		# Some plugins may give us a callback we should use to get OPML data
+		# instead of fetching it ourselves.
+		if ( ref $url eq 'CODE' ) {
+			# get passthrough params if supplied
+			my $pt = $item->{'passthrough'} || [];
+			return $url->( $client, \&gotFeed, @{$pt} );
+		}
 		
 		Slim::Formats::XML->getFeedAsync( 
 			\&gotFeed,
@@ -311,7 +322,7 @@
 			my $client = shift;
 			my $item   = shift;
 
-			my $hasItems = scalar @{$item->{'items'}};
+			my $hasItems = ( ref $item->{'items'} eq 'ARRAY' ) ? scalar @{$item->{'items'}} : 0;
 			my $isAudio  = ($item->{'type'} && $item->{'type'} eq 'audio') ? 1 : 0;
 			my $itemURL  = $item->{'url'}  || $item->{'value'};
 			my $title    = $item->{'name'} || $item->{'title'};
@@ -323,6 +334,7 @@
 					'url'    => $itemURL,
 					'title'  => $title,
 					'header' => fitTitle( $client, $title ),
+					'item'   => $item,
 				);
 
 				if ($isAudio) {
@@ -728,6 +740,13 @@
 			$client->string('XML_LOADING'),
 			$title || $url,
 		);
+		
+		# we may have a callback as URL
+		if ( ref $url eq 'CODE' ) {
+			# get passthrough params if supplied
+			my $pt = $item->{'passthrough'} || [];
+			return $url->( $client, \&gotPlaylist, @{$pt} );
+		}
 		
 		Slim::Formats::XML->getFeedAsync(
 			\&gotPlaylist,

Modified: trunk/server/Slim/Web/XMLBrowser.pm
URL: http://svn.slimdevices.com/trunk/server/Slim/Web/XMLBrowser.pm?rev=8789&r1=8788&r2=8789&view=diff
==============================================================================
--- trunk/server/Slim/Web/XMLBrowser.pm (original)
+++ trunk/server/Slim/Web/XMLBrowser.pm Fri Aug  4 09:27:19 2006
@@ -26,6 +26,7 @@
 	my $search    = $args->{'search'};
 	my $expires   = $args->{'expires'};
 	my $asyncArgs = $args->{'args'};
+	my $item      = $args->{'item'} || {};
 	
 	# If the feed is already XML data (Podcast List), send it to handleFeed
 	if ( ref $feed eq 'HASH' ) {
@@ -38,6 +39,19 @@
 			'args'    => $asyncArgs,
 		} );
 
+		return;
+	}
+	
+	# Handle plugins that want to use callbacks to fetch their own URLs
+	if ( ref $feed eq 'CODE' ) {
+		# get passthrough params if supplied
+		my $pt = $item->{'passthrough'} || [];
+		
+		# Passthrough all our web params
+		push @{$pt}, $asyncArgs;
+		
+		# first param is a $client object, but undef from webpages
+		$feed->( undef, \&handleFeed, @{$pt} );
 		return;
 	}
 
@@ -112,18 +126,28 @@
 			# current cached feed
 			$subFeed->{'type'} ||= '';
 			if ( $subFeed->{'type'} ne 'audio' && defined $subFeed->{'url'} ) {
+				
+				# Setup passthrough args
+				my $args = {
+					'url'          => $subFeed->{'url'},
+					'expires'      => $params->{'expires'},
+					'parent'       => $feed,
+					'parentURL'    => $params->{'parentURL'} || $params->{'url'},
+					'currentIndex' => \@crumbIndex,
+					'args'         => [ $client, $stash, $callback, $httpClient, $response ],
+				};
+				
+				if ( ref $subFeed->{'url'} eq 'CODE' ) {
+					my $pt = $subFeed->{'passthrough'} || [];
+					push @{$pt}, $args;
+					$subFeed->{'url'}->( undef, \&handleSubFeed, @{$pt} );
+					return;
+				}
 
 				Slim::Formats::XML->getFeedAsync(
 					\&handleSubFeed,
 					\&handleError,
-					{
-						'url'          => $subFeed->{'url'},
-						'expires'      => $params->{'expires'},
-						'parent'       => $feed,
-						'parentURL'    => $params->{'parentURL'} || $params->{'url'},
-						'currentIndex' => \@crumbIndex,
-						'args'         => [ $client, $stash, $callback, $httpClient, $response ],
-					},
+					$args,
 				);
 				return;
 			}
@@ -286,13 +310,30 @@
 		$subFeed = $subFeed->{'items'}->[$i];
 	}
 	$subFeed->{'items'} = $feed->{'items'};
-	$subFeed->{'url'}   = undef;
-	
-	# re-cache the parsed XML to include the sub-feed
-	my $cache = Slim::Utils::Cache->new();
-	my $expires = $Slim::Formats::XML::XML_CACHE_TIME;
-	$::d_plugins && msg("Web::XML: re-caching parsed XML for $expires seconds\n");
-	$cache->set( $params->{'parentURL'} . '_parsedXML', $parent, $expires );
+	
+	# No caching for callback-based plugins
+	# XXX: this is a bit slow as it has to re-fetch each level
+	if ( ref $subFeed->{'url'} eq 'CODE' ) {
+		
+		# Clear URL so it's not fetched again
+		$subFeed->{'url'} = undef;
+		
+		# Clear passthrough data as it won't be needed again
+		delete $subFeed->{'passthrough'};
+	}
+	else {
+		
+		# Clear URL so it's not fetched again
+		$subFeed->{'url'} = undef;
+		
+		# re-cache the parsed XML to include the sub-feed
+		my $cache = Slim::Utils::Cache->new();
+		my $expires = $Slim::Formats::XML::XML_CACHE_TIME;
+		$::d_plugins && msg("Web::XML: re-caching parsed XML for $expires seconds\n");
+		$cache->set( $params->{'parentURL'} . '_parsedXML', $parent, $expires );
+	}
+	
+	warn Data::Dump::dump($parent);
 	
 	handleFeed( $parent, $params );
 }



More information about the checkins mailing list