[Slim-Checkins] r11745 - in /trunk/server/Slim/Plugin/RSSNews: HTML/EN/plugins/RSSNews/settings/basic.html Plugin.pm Settings.pm strings.txt

adrian at svn.slimdevices.com adrian at svn.slimdevices.com
Wed Apr 11 09:25:38 PDT 2007


Author: adrian
Date: Wed Apr 11 09:25:38 2007
New Revision: 11745

URL: http://svn.slimdevices.com?rev=11745&view=rev
Log:
Bug: N/A
Description: migrate RSSNews to new style preferences

Modified:
    trunk/server/Slim/Plugin/RSSNews/HTML/EN/plugins/RSSNews/settings/basic.html
    trunk/server/Slim/Plugin/RSSNews/Plugin.pm
    trunk/server/Slim/Plugin/RSSNews/Settings.pm
    trunk/server/Slim/Plugin/RSSNews/strings.txt

Modified: trunk/server/Slim/Plugin/RSSNews/HTML/EN/plugins/RSSNews/settings/basic.html
URL: http://svn.slimdevices.com/trunk/server/Slim/Plugin/RSSNews/HTML/EN/plugins/RSSNews/settings/basic.html?rev=11745&r1=11744&r2=11745&view=diff
==============================================================================
--- trunk/server/Slim/Plugin/RSSNews/HTML/EN/plugins/RSSNews/settings/basic.html (original)
+++ trunk/server/Slim/Plugin/RSSNews/HTML/EN/plugins/RSSNews/settings/basic.html Wed Apr 11 09:25:38 2007
@@ -9,32 +9,33 @@
 		<div class="prefHead">[% "SETUP_PLUGIN_RSSNEWS_ITEMS_PER_FEED" | string | upper %]</div>
 		<div class="prefDesc">[% "SETUP_PLUGIN_RSSNEWS_ITEMS_PER_FEED_DESC" | string %]</div>
 
-		<input type="text" class="stdedit" name="plugin_RssNews_items_per_feed" id="plugin_RssNews_items_per_feed" value="[% prefs.plugin_RssNews_items_per_feed %]" size="5" />
+		<input type="text" class="stdedit" name="items_per_feed" value="[% prefs.items_per_feed %]" size="5" />
 
 	</div>
 
 	<div class="settingSection">
 		<div class="prefHead">[% "SETUP_PLUGIN_RSSNEWS_FEEDS" | string | upper %]</div>
-		<div class="prefDesc">[% "SETUP_PLUGIN_RSSNEWS_FEEDS_DESC" | string %]</div>
 
 		<table border="0" cellspacing="7" cellpadding="7">
 
 			<tr>
 			<td><label for="new_feed" class="stdlabel">[% "PLUGIN_RSSNEWS_ADD_NEW" | string %]</label></td>
 
-			<td><input type="text" class="stdedit" name="plugin_RssNews_feeds" id="new_feed" value="" size="60" /></td>
+			<td><input type="text" class="stdedit" name="newfeed" value="[% newfeedval %]" size="60" /></td>
 			</tr>
 
 			<tr></tr>
 			<tr></tr>
-			<tr><td><label>[% "SETUP_PLUGIN_RSSNEWS_EXISTING_FEEDS" | string %]</label></td><td></td></tr>
+			<tr><td><label>[% "SETUP_PLUGIN_RSSNEWS_EXISTING_FEEDS" | string %]</label></td><td></td><td>[% "DELETE" | string %]</td></tr>
 
 		[% FOREACH pref = prefs.feeds %]
 
 			<tr>
-			<td><label for="plugin_RssNews_feeds" class="stdlabel">[% pref.1 %]</label></td>
+			<td><label for="feeds" class="stdlabel">[% pref.1 %]</label></td>
 
-			<td><input type="text" class="stdedit" name="plugin_RssNews_feeds" id="plugin_RssNews_feeds" value="[% pref.0 %]" size="60" /></td>
+			<td><label for="urls"  class="stdlabel">[% pref.0 %]</label></td>
+
+			<td><input name="delete" type="checkbox" value="[% pref.0 %]"></td>
 
 			</tr>
 

Modified: trunk/server/Slim/Plugin/RSSNews/Plugin.pm
URL: http://svn.slimdevices.com/trunk/server/Slim/Plugin/RSSNews/Plugin.pm?rev=11745&r1=11744&r2=11745&view=diff
==============================================================================
--- trunk/server/Slim/Plugin/RSSNews/Plugin.pm (original)
+++ trunk/server/Slim/Plugin/RSSNews/Plugin.pm Wed Apr 11 09:25:38 2007
@@ -15,12 +15,8 @@
 use strict;
 use base qw(Slim::Plugin::Base);
 
-use constant FEEDS_VERSION => 1.0;
-
 use HTML::Entities;
 use XML::Simple;
-
-use Slim::Plugin::RSSNews::Settings;
 
 use Slim::Buttons::XMLBrowser;
 use Slim::Formats::XML;
@@ -28,34 +24,7 @@
 use Slim::Utils::Log;
 use Slim::Utils::Misc;
 use Slim::Utils::Strings qw(string);
-
-# Default feed list
-my @default_feeds = (
-	{
-		name  => 'BBC News World Edition',
-		value => 'http://news.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xml',
-	},
-	{
-		name  => 'CNET News.com',
-		value => 'http://news.com.com/2547-1_3-0-5.xml',
-	},
-	{
-		name  => 'New York Times Home Page',
-		value => 'http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml',
-	},
-	{
-		name  => 'RollingStone.com Music News',
-		value => 'http://www.rollingstone.com/rssxml/music_news.xml',
-	},
-	{
-		name  => 'Slashdot',
-		value => 'http://rss.slashdot.org/Slashdot/slashdot',
-	},
-	{
-		name  => 'Yahoo! News: Business',
-		value => 'http://rss.news.yahoo.com/rss/business',
-	},
-);
+use Slim::Utils::Prefs;
 
 my $log = Slim::Utils::Log->addLogCategory({
 	'category'     => 'plugin.rssnews',
@@ -63,11 +32,9 @@
 	'description'  => getDisplayName(),
 });
 
-my @feeds = ();
-my %feed_names; # cache of feed names
-
-# in screensaver mode, number of items to display per channel before switching
-my $screensaver_items_per_feed;
+use Slim::Plugin::RSSNews::Settings;
+
+my $prefs = preferences('rssnews');
 
 # $refresh_sec is the minimum time in seconds between refreshes of the ticker from the RSS.
 # Please do not lower this value. It prevents excessive queries to the RSS.
@@ -86,20 +53,6 @@
 	Slim::Plugin::RSSNews::Settings->new;
 
 	Slim::Buttons::Common::addMode('PLUGIN.RSS', getFunctions(), \&setMode);
-
-	my @feedURLPrefs  = Slim::Utils::Prefs::getArray("plugin_RssNews_feeds");
-	my @feedNamePrefs = Slim::Utils::Prefs::getArray("plugin_RssNews_names");
-	my $feedsModified = Slim::Utils::Prefs::get("plugin_RssNews_feeds_modified");
-	my $version       = Slim::Utils::Prefs::get("plugin_RssNews_feeds_version");
-	
-	$screensaver_items_per_feed = Slim::Utils::Prefs::get('plugin_RssNews_items_per_feed');
-	if (!defined $screensaver_items_per_feed) {
-
-		$screensaver_items_per_feed = 3;
-		Slim::Utils::Prefs::set('plugin_RssNews_items_per_feed', $screensaver_items_per_feed);
-	}
-
-	@feeds = ();
 
 #        |requires Client
 #        |  |is a Query
@@ -117,32 +70,11 @@
 		'PLUGIN_RSSNEWS_SCREENSAVER'
 	);
 
-	# No prefs set or we've had a version change and they weren't modified, 
-	# so we'll use the defaults
-	if (scalar(@feedURLPrefs) == 0 ||
-		(!$feedsModified && (!$version  || $version != FEEDS_VERSION))) {
-		# use defaults
-		# set the prefs so the web interface will work.
-		revertToDefaults();
-	} else {
-		# use prefs
-		my $i = 0;
-		while ($i < scalar(@feedNamePrefs)) {
-
-			push @feeds, {
-				name  => $feedNamePrefs[$i],
-				value => $feedURLPrefs[$i],
-				type  => 'link',
-			};
-			$i++;
-		}
-	}
-
 	if ($log->is_debug) {
 
 		$log->debug("RSS Feed Info:");
 
-		for my $feed (@feeds) {
+		for my $feed (@{ $prefs->get('feeds') }) {
 
 			$log->debug(join(', ', ($feed->{'name'}, $feed->{'value'})));
 		}
@@ -150,30 +82,7 @@
 		$log->debug("");
 	}
 
-	# feed_names should reflect current names
-	%feed_names = ();
-
-	map { $feed_names{$_->{'value'} } = $_->{'name'}} @feeds;
-	
-	updateOPMLCache( \@feeds );
-}
-
-sub revertToDefaults {
-	@feeds = @default_feeds;
-
-	my @urls  = map { $_->{'value'} } @feeds;
-	my @names = map { $_->{'name'}  } @feeds;
-
-	Slim::Utils::Prefs::set('plugin_RssNews_feeds', \@urls);
-	Slim::Utils::Prefs::set('plugin_RssNews_names', \@names);
-	Slim::Utils::Prefs::set('plugin_RssNews_feeds_version', FEEDS_VERSION);
-
-	# feed_names should reflect current names
-	%feed_names = ();
-
-	map { $feed_names{$_->{'value'}} = $_->{'name'} } @feeds;
-	
-	updateOPMLCache( \@feeds );
+	updateOPMLCache( $prefs->get('feeds') );
 }
 
 sub getDisplayName {
@@ -197,7 +106,7 @@
 	# use INPUT.Choice to display the list of feeds
 	my %params = (
 		header => '{PLUGIN_RSSNEWS} {count}',
-		listRef => \@feeds,
+		listRef => $prefs->get('feeds'),
 		modeName => 'RSS Plugin',
 		onRight => sub {
 			my $client = shift;
@@ -227,7 +136,6 @@
 	Slim::Buttons::XMLBrowser::cliQuery('rss', $opml, $request, $refresh_sec);
 }
 
-
 # Update the hashref of RSS feeds for use with the web UI
 sub updateOPMLCache {
 	my $feeds = shift;
@@ -254,92 +162,6 @@
 	$cache->set( 'rss_opml', $opml, '10days' );
 }
 
-sub updateFeedNames {
-	my @feedURLPrefs = Slim::Utils::Prefs::getArray("plugin_RssNews_feeds");
-	my @feedNamePrefs;
-
-	# verbose debug
-	$log->debug("URLs: " . Data::Dump::dump(\@feedURLPrefs));
-
-	# case 1: we're reverting to default
-	if (scalar(@feedURLPrefs) == 0) {
-		revertToDefaults();
-	} else {
-		# case 2: url list edited
-
-		my $i = 0;
-		while ($i < scalar(@feedURLPrefs)) {
-
-			my $url = $feedURLPrefs[$i];
-			my $name = $feed_names{$url};
-
-			if ($name && $name !~ /^http\:/) {
-
-				# no change
-				$feedNamePrefs[$i] = $name;
-
-			} elsif ($url =~ /^http\:/) {
-
-				# does a synchronous get
-				# XXX: This should use async instead, but not a very high priority 
-				# as this code is not used very much
-				my $xml = Slim::Formats::XML->getFeedSync($url);
-
-				if ($xml && exists $xml->{'channel'}->{'title'}) {
-
-					# here for podcasts and RSS
-					$feedNamePrefs[$i] = Slim::Formats::XML::unescapeAndTrim($xml->{'channel'}->{'title'});
-
-				} elsif ($xml && exists $xml->{'head'}->{'title'}) {
-
-					# here for OPML
-					$feedNamePrefs[$i] = Slim::Formats::XML::unescapeAndTrim($xml->{'head'}->{'title'});
-
-				} else {
-					# use url as title since we have nothing else
-					$feedNamePrefs[$i] = $url;
-				}
-
-			} else {
-				# use url as title since we have nothing else
-				$feedNamePrefs[$i] = $url;
-			}
-
-			$i++;
-		}
-
-		# if names array contains more than urls, delete the extras
-		while ($feedNamePrefs[$i]) {
-			delete $feedNamePrefs[$i];
-			$i++;
-		}
-
-		# save updated names to prefs
-		Slim::Utils::Prefs::set('plugin_RssNews_names', \@feedNamePrefs);
-
-		# runtime list must reflect changes
-		@feeds = ();
-		$i = 0;
-
-		while ($i < scalar(@feedNamePrefs)) {
-
-			push @feeds, {
-				name => $feedNamePrefs[$i],
-				value => $feedURLPrefs[$i]
-			};
-
-			$i++;
-		}
-
-		# feed_names should reflect current names
-		%feed_names = ();
-
-		map { $feed_names{$_->{'value'}} = $_->{'name'} } @feeds;
-		
-		updateOPMLCache( \@feeds );
-	}
-}
-
 ################################
 # ScreenSaver Mode
 
@@ -405,6 +227,8 @@
 
 sub getNextFeed {
 	my $client = shift;
+
+	my @feeds = @{ $prefs->get('feeds') };
 	
 	# select the next feed and fetch it
 	my $index = $savers->{$client}->{feed_index} || 0;
@@ -472,7 +296,7 @@
 	$errors++;
 	$savers->{$client}->{feed_error} = $errors;
 	
-	if ( $errors == scalar @feeds ) {
+	if ( $errors == scalar @{ $prefs->get('feeds') } ) {
 
 		logError("All feeds failed, giving up!!");
 		
@@ -598,6 +422,8 @@
 		# we need to limit the number of characters we add to the ticker, 
 		# because the server could crash rendering on pre-SqueezeboxG displays.
 		my $screensaver_chars_per_item = 1024;
+
+		my $screensaver_items_per_feed = $prefs->get('items_per_feed');
 		
 		my $line2 = sprintf(
 			$screensaver_item_format,

Modified: trunk/server/Slim/Plugin/RSSNews/Settings.pm
URL: http://svn.slimdevices.com/trunk/server/Slim/Plugin/RSSNews/Settings.pm?rev=11745&r1=11744&r2=11745&view=diff
==============================================================================
--- trunk/server/Slim/Plugin/RSSNews/Settings.pm (original)
+++ trunk/server/Slim/Plugin/RSSNews/Settings.pm Wed Apr 11 09:25:38 2007
@@ -8,56 +8,164 @@
 use strict;
 use base qw(Slim::Web::Settings);
 
+use Slim::Utils::Log;
+use Slim::Utils::Prefs;
+
+my $log   = logger('plugin.rssnews');
+my $prefs = preferences('rssnews');
+
+use constant FEED_VERSION => 2; # bump this number when changing the defaults below
+
+# Default feed list
+my @default_feeds = (
+	{
+		name  => 'BBC News World Edition',
+		value => 'http://news.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xml',
+	},
+	{
+		name  => 'CNET News.com',
+		value => 'http://news.com.com/2547-1_3-0-5.xml',
+	},
+	{
+		name  => 'New York Times Home Page',
+		value => 'http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml',
+	},
+	{
+		name  => 'RollingStone.com Music News',
+		value => 'http://www.rollingstone.com/rssxml/music_news.xml',
+	},
+	{
+		name  => 'Slashdot',
+		value => 'http://rss.slashdot.org/Slashdot/slashdot',
+	},
+	{
+		name  => 'Yahoo! News: Business',
+		value => 'http://rss.news.yahoo.com/rss/business',
+	},
+);
+
+# migrate old prefs across
+$prefs->migrate(1, sub {
+	my @names  = @{Slim::Utils::Prefs::OldPrefs->get('plugin_RssNews_names')};
+	my @values = @{Slim::Utils::Prefs::OldPrefs->get('plugin_RssNews_feeds')};
+	my @feeds;
+
+	for my $name (@names) {
+		push @feeds, { 'name' => $name, 'value' => shift @values };
+	}
+
+	if (@feeds) {
+		$prefs->set('feeds', \@feeds);
+		$prefs->set('modified', 1);
+	}
+
+	$prefs->set('items_per_feed', Slim::Utils::Prefs::OldPrefs->get('plugin_RssNews_items_per_feed') || 3);
+});
+
+# migrate to latest version of default feeds if they have not been modified
+$prefs->migrate(FEED_VERSION, sub {
+	$prefs->set('feeds', \@default_feeds) unless $prefs->get('modified');
+	1;
+});
+
 sub name {
-        return 'PLUGIN_RSSNews';
+	return 'PLUGIN_RSSNews';
 }
 
 sub page {
-        return 'plugins/RSSNews/settings/basic.html';
+	return 'plugins/RSSNews/settings/basic.html';
+}
+
+sub prefs {
+	return ($prefs, 'items_per_feed');
 }
 
 sub handler {
 	my ($class, $client, $params) = @_;
 
-	my @prefs = qw(
-		plugin_RssNews_items_per_feed
-	);
+	if ($params->{'reset'}) {
 
-	if ($params->{'reset'}) {
-		Slim::Plugin::RSSNews::Plugin::revertToDefaults();
+		$prefs->set('feeds', \@default_feeds);
+		$prefs->set('modified', 0);
+
+		Slim::Plugin::RSSNews::Plugin::updateOPMLCache(\@default_feeds);
 	}
 
 	if ($params->{'saveSettings'}) {
 
-		# Remove empty feeds.
-		my @feeds = grep { $_ ne '' } @{$params->{'plugin_RssNews_feeds'}};
+		my @feeds       = @{ $prefs->get('feeds') };
+		my $newFeedUrl  = $params->{'newfeed'};
+		my $newFeedName = validateFeed($newFeedUrl);
 
-		Slim::Utils::Prefs::set('plugin_RssNews_feeds', \@feeds);
+		if ($newFeedUrl && $newFeedName) {
 
-		Slim::Plugin::RSSNews::Plugin::updateFeedNames();
+			push @feeds, {
+				'name'  => $newFeedName,
+				'value' => $newFeedUrl,
+			};
 
-		for my $pref (@prefs) {
+		} elsif ($newFeedUrl) {
 
-			Slim::Utils::Prefs::set($pref, $params->{$pref});
+			$params->{'warning'} .= sprintf Slim::Utils::Strings::string('SETUP_PLUGIN_RSSNEWS_INVALID_FEED'), $newFeedUrl;
+			$params->{'newfeedval'} = $params->{'newfeed'};
 		}
+
+		my @delete = @{ ref $params->{'delete'} eq 'ARRAY' ? $params->{'delete'} : [ $params->{'delete'} ] };
+
+		for my $deleteItem (@delete) {
+			my $i = 0;
+			while ($i < scalar @feeds) {
+				if ($deleteItem eq $feeds[$i]->{'value'}) {
+					splice @feeds, $i, 1;
+					next;
+				}
+				$i++;
+			}
+		}
+
+		$prefs->set('feeds', \@feeds);
+		$prefs->set('modified', 1);
+
+		Slim::Plugin::RSSNews::Plugin::updateOPMLCache(\@feeds);
 	}
 
-	my @feeds = Slim::Utils::Prefs::getArray('plugin_RssNews_feeds');
-	my @names = Slim::Utils::Prefs::getArray('plugin_RssNews_names');
+	for my $feed (@{ $prefs->get('feeds') }) {
 
-	for (my $i = 0; $i < @feeds; $i++) {
-
-		push @{$params->{'prefs'}->{'feeds'}}, [ $feeds[$i], $names[$i] ];
-	}
-
-	for my $pref (@prefs) {
-
-		$params->{'prefs'}->{$pref} = Slim::Utils::Prefs::get($pref);
+		push @{$params->{'prefs'}->{'feeds'}}, [ $feed->{'value'}, $feed->{'name'} ];
 	}
 
 	return $class->SUPER::handler($client, $params);
 }
 
+sub validateFeed {
+	my $url = shift || return undef;
+
+	$log->info("validating $url");
+
+	# this is synchronous at present
+	my $xml = Slim::Formats::XML->getFeedSync($url);
+
+	if ($xml && exists $xml->{'channel'}->{'title'}) {
+
+		# here for podcasts and RSS
+		return Slim::Formats::XML::unescapeAndTrim($xml->{'channel'}->{'title'});
+
+	} elsif ($xml && exists $xml->{'head'}->{'title'}) {
+
+		# here for OPML
+		return Slim::Formats::XML::unescapeAndTrim($xml->{'head'}->{'title'});
+
+	} elsif ($xml) {
+
+		# got xml but can't find title - use url
+		return $url;
+	}
+
+	$log->warn("unable to connect to $url");
+
+	return undef;
+}
+
 1;
 
 __END__

Modified: trunk/server/Slim/Plugin/RSSNews/strings.txt
URL: http://svn.slimdevices.com/trunk/server/Slim/Plugin/RSSNews/strings.txt?rev=11745&r1=11744&r2=11745&view=diff
==============================================================================
--- trunk/server/Slim/Plugin/RSSNews/strings.txt (original)
+++ trunk/server/Slim/Plugin/RSSNews/strings.txt Wed Apr 11 09:25:38 2007
@@ -145,14 +145,6 @@
 	IT	Modifica i feed RSS
 	NL	Wijzig RSS kanalen
 
-SETUP_PLUGIN_RSSNEWS_FEEDS_DESC
-	DE	Dies ist die Liste der anzuzeigenden RSS Feeds. Um einen neuen zu abonnieren, tippen Sie einfach dessen URL in eine leere Zeile. Um einen Feed zu entfernen, löschen Sie dessen URL. Bestehende URLs können im entsprechenden Feld bearbeitet werden. Klicken Sie auf Ändern, um die Änderungen zu aktivieren.
-	EN	This is the list of RSS Feeds to display. To add a new one, just type its URL into the empty line. To remove one, simply delete the URL from the corresponding line. To change the URL of an existing feed, edit its text value. Click on the Change button when you are done.
-	ES	Esta es la lista de feeds de RSS. Para añadir un nuevo feed, escribir la URL en la línea vacía. Para elminar uno, simplemente borrar la URL de la línea correspondiente. Para cambiar la URL de un feed existente, editar el texto correspondiente. Hacer click en Cambiar cuando se haya finalizado.
-	FR	Ceci est la liste des flux RSS à afficher. Pour ajouter un flux, tapez son URL sur une ligne vide. Pour supprimer un flux, effacer l'URL de la ligne correspondante. Pour changer l'URL d'un flux existant, modifiez la ligne correspondante. Cliquez sur Modifier une fois les changements effectués.
-	IT	Questa e' la lista dei feed RSS da visualizzare. Per aggiungerne uno nuovo, digita la sua URL in una linea vuota. Per rimuoverne uno, cancella semplicemente la URL dalla linea corrispondente. Per cambiare la URL di un feed esistente, modifica il contenuto del testo. Premi il bottone Cambia quando hai finito.
-	NL	Dit is de lijst van RSS kanalen. Om een nieuwe toe te voegen type je de URL op een lege regel. Om een RSS kanaal te verwijderen maak je de regel leeg. Om een URL te wijzigen wijzig je de tekst. Klik op Veranderen als de wijzigingen compleet zijn.
-
 SETUP_PLUGIN_RSSNEWS_RESET
 	DE	Standard Feeds wieder herstellen
 	EN	Reset default RSS feeds
@@ -199,14 +191,9 @@
 	IT	E' il numero massimo di argomenti visualizzati per ogni feed mentre il salvaschermo e' attivo. Un valore piu' grande implica che il salvaschermo visualizzera' piu' argomenti prima di passare al prossimo feed.
 	NL	Het maximum aantal te tonen items per kanaal terwijl de schermbeveiliger actief is. Een hogere waarde laat meer items van een kanaal zien voordat naar het volgende kanaal gesprongen wordt.
 
-SETUP_PLUGIN_RSSNEWS_FEEDS_CHANGE
-	DE	RSS Feed Liste wurde geändert.
-	EN	RSS Feeds list changed.
-	ES	Lista de feeds de RSS modificada.
-	FR	Liste des flux RSS modifiée.
-	IT	Lista dei feed RSS cambiata.
-	NL	RSS kanalenlijst gewijzigd.
-
 SETUP_PLUGIN_RSSNEWS_EXISTING_FEEDS
 	DE	Eingetragene Feeds:
-	EN	Existing feeds:
+	EN	Existing feeds:
+
+SETUP_PLUGIN_RSSNEWS_INVALID_FEED
+	EN	Invalid Feed - Could not connect to %s



More information about the checkins mailing list