[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