Index: Slim/Plugin/MusicMagic/Plugin.pm =================================================================== --- Slim/Plugin/MusicMagic/Plugin.pm (revision 22327) +++ Slim/Plugin/MusicMagic/Plugin.pm (working copy) @@ -139,115 +139,114 @@ $log->info("Testing for API on $MMSHost:$MMSport"); - my $http = Slim::Player::Protocols::HTTP->new({ - 'url' => "http://$MMSHost:$MMSport/api/version", - 'create' => 0, - 'timeout' => 5, - }); + my $http = Slim::Networking::SimpleAsyncHTTP->new( + \&_initStageTwo, + \&_musicipError, + { + timeout => 30, + class => $class, + error => "Can't connect to port $MMSport - MusicIP disabled.", + }, + ); + + $http->get( "http://$MMSHost:$MMSport/api/version" ); + + $initialized = 0; +} - if (!$http) { +sub _initStageTwo { + my $http = shift; + my $class = $http->params('class'); + + my $content = $http->content; - $initialized = 0; + if ( $log->is_info ) { + $log->info($content); + } - $log->error("Can't connect to port $MMSport - MusicIP disabled."); + my $http = Slim::Networking::SimpleAsyncHTTP->new( + \&_powerSearchResult, + \&_musicipError, + { + timeout => 30, + class => $class, + error => "bad response from power search filter query", + }, + ); + + $http->get( "http://$MMSHost:$MMSport/api/mix?filter=?length>120&length=1" ); - } else { + Slim::Plugin::MusicMagic::PlayerSettings::init(); - my $content = $http->content; + # Note: Check version restrictions if any + $initialized = $content; - if ( $log->is_info ) { - $log->info($content); - } + checker($initialized); - $http->close; + # addImporter for Plugins, may include mixer function, setup function, mixerlink reference and use on/off. + Slim::Music::Import->addImporter($class, { + 'mixer' => \&mixerFunction, + 'mixerlink' => \&mixerlink, + 'use' => $prefs->get('musicip'), + 'cliBase' => { + player => 0, + cmd => ['musicip', 'mix'], + params => { + menu => '1', + }, + itemsParams => 'params', + }, + 'contextToken' => 'MUSICMAGIC_MIX', + }); - # this query should return an API error if Power Search is not available - $http = Slim::Player::Protocols::HTTP->new({ - 'url' => "http://$MMSHost:$MMSport/api/mix?filter=?length>120&length=1", - 'create' => 0, - 'timeout' => 5, - }); + Slim::Player::ProtocolHandlers->registerHandler('musicmagicplaylist', 0); - if ($http && $http->content !~ /MusicIP API error/i) { - $canPowerSearch = 1; + Slim::Plugin::MusicMagic::ClientSettings->new; - $log->info('Power Search enabled'); + Slim::Control::Request::addDispatch(['musicip', 'mix'], + [1, 1, 1, \&cliMix]); - $http->close; - } + Slim::Control::Request::addDispatch(['musicip', 'moods'], + [1, 1, 0, \&cliMoods]); - Slim::Plugin::MusicMagic::PlayerSettings::init(); + Slim::Control::Request::addDispatch(['musicip', 'play'], + [1, 0, 0, \&cliPlayMix]); - # Note: Check version restrictions if any - $initialized = $content; + Slim::Control::Request::addDispatch(['musicip', 'add'], + [1, 0, 0, \&cliPlayMix]); - checker($initialized); + Slim::Control::Request::addDispatch(['musicip', 'insert'], + [1, 0, 0, \&cliPlayMix]); - # addImporter for Plugins, may include mixer function, setup function, mixerlink reference and use on/off. - Slim::Music::Import->addImporter($class, { - 'mixer' => \&mixerFunction, - 'mixerlink' => \&mixerlink, - 'use' => $prefs->get('musicip'), - 'cliBase' => { - player => 0, - cmd => ['musicip', 'mix'], - params => { - menu => '1', - }, - itemsParams => 'params', - }, - 'contextToken' => 'MUSICMAGIC_MIX', - }); + Slim::Player::ProtocolHandlers->registerHandler( + mood => 'Slim::Plugin::MusicMagic::ProtocolHandler' + ); - Slim::Player::ProtocolHandlers->registerHandler('musicmagicplaylist', 0); + # Track Info handler + Slim::Menu::TrackInfo->registerInfoProvider( musicmagic => ( + #menuMode => 1, + above => 'favorites', + func => \&trackInfoHandler, + ) ); - Slim::Plugin::MusicMagic::ClientSettings->new; + if (scalar @{grabMoods()}) { - Slim::Control::Request::addDispatch(['musicip', 'mix'], - [1, 1, 1, \&cliMix]); + Slim::Buttons::Common::addMode('musicmagic_moods', {}, \&setMoodMode); - Slim::Control::Request::addDispatch(['musicip', 'moods'], - [1, 1, 0, \&cliMoods]); + my $params = { + 'useMode' => 'musicmagic_moods', + 'mood' => 'none', + }; + Slim::Buttons::Home::addMenuOption('MUSICMAGIC_MOODS', $params); + Slim::Buttons::Home::addSubMenu('BROWSE_MUSIC', 'MUSICMAGIC_MOODS', $params); - Slim::Control::Request::addDispatch(['musicip', 'play'], - [1, 0, 0, \&cliPlayMix]); + Slim::Web::Pages->addPageLinks("browse", { + 'MUSICMAGIC_MOODS' => "plugins/MusicMagic/musicmagic_moods.html" + }); - Slim::Control::Request::addDispatch(['musicip', 'add'], - [1, 0, 0, \&cliPlayMix]); - - Slim::Control::Request::addDispatch(['musicip', 'insert'], - [1, 0, 0, \&cliPlayMix]); - - Slim::Player::ProtocolHandlers->registerHandler( - mood => 'Slim::Plugin::MusicMagic::ProtocolHandler' - ); - - # Track Info handler - Slim::Menu::TrackInfo->registerInfoProvider( musicmagic => ( - #menuMode => 1, - above => 'favorites', - func => \&trackInfoHandler, - ) ); - - if (scalar @{grabMoods()}) { - - Slim::Buttons::Common::addMode('musicmagic_moods', {}, \&setMoodMode); - - my $params = { - 'useMode' => 'musicmagic_moods', - 'mood' => 'none', - }; - Slim::Buttons::Home::addMenuOption('MUSICMAGIC_MOODS', $params); - Slim::Buttons::Home::addSubMenu('BROWSE_MUSIC', 'MUSICMAGIC_MOODS', $params); - - Slim::Web::Pages->addPageLinks("browse", { - 'MUSICMAGIC_MOODS' => "plugins/MusicMagic/musicmagic_moods.html" - }); - - Slim::Web::Pages->addPageLinks("icons", { - 'MUSICMAGIC_MOODS' => "plugins/MusicMagic/html/images/icon.png" - }); - } + Slim::Web::Pages->addPageLinks("icons", { + 'MUSICMAGIC_MOODS' => "plugins/MusicMagic/html/images/icon.png" + }); } $mixFunctions{'play'} = \&playMix; @@ -257,8 +256,17 @@ Slim::Web::HTTP::addPageFunction("musicmagic_mix.html" => \&musicmagic_mix); Slim::Web::HTTP::addPageFunction("musicmagic_moods.html" => \&musicmagic_moods); +} - return $initialized; +sub _powerSearchResult { + my $http = shift; + my $class = $http->params('class'); + + if ($http && $http->content !~ /MusicIP API error/i) { + $canPowerSearch = 1; + + $log->info('Power Search enabled'); + } } sub defaultMap { @@ -308,32 +316,28 @@ sub isMusicLibraryFileChanged { - my $http = Slim::Player::Protocols::HTTP->new({ - 'url' => "http://$MMSHost:$MMSport/api/cacheid?contents", - 'create' => 0, - 'timeout' => 5, - }) || return 0; + my $http = Slim::Networking::SimpleAsyncHTTP->new( + \&_cacheidOK, + \&_musicipError, + { + timeout => 30, + }, + ); + + $http->get( "http://$MMSHost:$MMSport/api/cacheid?contents" ); +} - my $fileMTime = $http->content; +sub _statusOK { + my $http = shift; + my $params = $http->params('params'); + + my $content = $http->content; + chomp($content); + + $log->debug( "Read status $content" ); + + my $fileMTime = $params->{fileMTime}; - chomp($fileMTime); - - $log->info("Read cacheid of $fileMTime"); - - $http->close; - - $http = Slim::Player::Protocols::HTTP->new({ - 'url' => "http://$MMSHost:$MMSport/api/getStatus", - 'create' => 0, - 'timeout' => 5, - }) || return 0; - - if ( $log->is_info ) { - $log->info("Got status: ", $http->content); - } - - $http->close; - # Only say "yes" if it has been more than one minute since we last finished scanning # and the file mod time has changed since we last scanned. Note that if we are # just starting, $lastMMMChange is undef, so both $fileMTime @@ -364,7 +368,7 @@ if ((time - $lastScanTime) > $scanInterval) { - return 1; + Slim::Control::Request::executeRequest(undef, ['rescan']); } $log->info("Waiting for $scanInterval seconds to pass before rescanning"); @@ -380,9 +384,9 @@ return; } - if (!$firstTime && !Slim::Music::Import->stillScanning && isMusicLibraryFileChanged()) { - - Slim::Control::Request::executeRequest(undef, ['rescan']); + if (!$firstTime && !Slim::Music::Import->stillScanning) { + + isMusicLibraryFileChanged(); } # make sure we aren't doing this more than once... @@ -392,6 +396,39 @@ Slim::Utils::Timers::setTimer(undef, (Time::HiRes::time() + 120), \&checker); } +sub _cacheidOK { + my $http = shift; + my $params = $http->params('params'); + + my $content = $http->content; + chomp($content); + + $log->debug( "Read cacheid of $content" ); + + $params->{fileMTime} = $content; + + #do status check + $http = Slim::Networking::SimpleAsyncHTTP->new( + \&_statusOK, + \&_musicipError, + { + params => $params, + timeout => 30, + error => "Can't read status", + }, + ); + + $http->get( "http://$MMSHost:$MMSport/api/getStatus" ); +} + +sub _musicipError { + my $http = shift; + my $error = $http->params('error'); + my $params = $http->params('params'); + + $log->error( $error || "MusicIP: http error, no response."); +} + sub prefName { my $class = shift; Index: Slim/Plugin/RSSNews/Plugin.pm =================================================================== --- Slim/Plugin/RSSNews/Plugin.pm (revision 22327) +++ Slim/Plugin/RSSNews/Plugin.pm (working copy) @@ -378,8 +378,12 @@ my $parts = { 'line' => [ $savers->{$client}->{line1} || '' ], 'ticker' => [], + 'screen2' => Plugins::WeatherTime::Plugin::screensaverWeatherTimelines($client), }; + $client->display->screen2updateOK(1); + Plugins::WeatherTime::Plugin::setScreensaverParams($client); + # check after the update calling this function is complete to see if ticker is empty # (to refill ticker on font size change as this clears current ticker) Slim::Utils::Timers::killTimers( $client, \&tickerUpdateCheck ); @@ -498,6 +502,7 @@ 'line' => [ $line1 ], 'overlay' => [ $overlay ], 'ticker' => [ undef, $line2 ], + 'screen2' => Plugins::WeatherTime::Plugin::screensaverWeatherTimelines($client), }; $savers->{$client}->{line1} = $line1;