diff --git a/plugin/SqueezeESP32/FirmwareHelper.pm b/plugin/SqueezeESP32/FirmwareHelper.pm index 271d9ba3..f6fdae6a 100644 --- a/plugin/SqueezeESP32/FirmwareHelper.pm +++ b/plugin/SqueezeESP32/FirmwareHelper.pm @@ -38,26 +38,33 @@ sub init { } sub initFirmwareDownload { - my ($client) = @_; + my ($client, $cb) = @_; Slim::Utils::Timers::killTimers($client, \&initFirmwareDownload); + return unless preferences('server')->get('checkVersion') || $cb; + Slim::Networking::SimpleAsyncHTTP->new( sub { my $http = shift; my $content = eval { from_json( $http->content ) }; if ($content && ref $content) { - my $releaseInfo = _getFirmwareTag($content->{version}); + my $releaseInfo = getFirmwareTag($content->{version}); if ($releaseInfo && ref $releaseInfo) { - prefetchFirmware($releaseInfo); + prefetchFirmware($releaseInfo, $cb); + } + else { + $cb->() if $cb; } } }, sub { my ($http, $error) = @_; $log->error("Failed to get releases from Github: $error"); + + $cb->() if $cb; }, { timeout => 10 @@ -68,7 +75,7 @@ sub initFirmwareDownload { } sub prefetchFirmware { - my ($releaseInfo) = @_; + my ($releaseInfo, $cb) = @_; return unless $releaseInfo; @@ -93,15 +100,21 @@ sub prefetchFirmware { } } - downloadFirmwareFile(sub { - main::INFOLOG && $log->is_info && $log->info("Pre-cached firmware file: " . $_[0]); - }, sub { - my ($http, $error, $url, $code) = @_; - $error ||= ($http && $http->error) || 'unknown error'; - $url ||= ($http && $http->url) || 'no URL'; + my $customFwUrl = sprintf('%s/plugins/SqueezeESP32/firmware/custom.bin', Slim::Utils::Network::serverURL()) if $cb && -f _customFirmwareFile(); - $log->error(sprintf("Failed to get firmware image from Github: %s (%s)", $error || $http->error, $url)); - }, $url) if $url && $url =~ /^https?/; + if ( ($url && $url =~ /^https?/) || $customFwUrl ) { + downloadFirmwareFile(sub { + main::INFOLOG && $log->is_info && $log->info("Pre-cached firmware file: " . $_[0]); + }, sub { + my ($http, $error, $url, $code) = @_; + $error ||= ($http && $http->error) || 'unknown error'; + $url ||= ($http && $http->url) || 'no URL'; + + $log->error(sprintf("Failed to get firmware image from Github: %s (%s)", $error || $http->error, $url)); + }, $url) if $url; + + $cb->($releaseInfo, _gh2lmsUrl($url), $customFwUrl) if $cb; + } }, sub { my ($http, $error) = @_; @@ -115,6 +128,18 @@ sub prefetchFirmware { )->get(GITHUB_RELEASES_URI); } +sub _gh2lmsUrl { + my ($url) = @_; + my $ghPrefix = GITHUB_DOWNLOAD_URI; + my $baseUrl = Slim::Utils::Network::serverURL(); + $url =~ s/$ghPrefix/$baseUrl\/plugins\/SqueezeESP32\/firmware\//; + return $url; +} + +sub _customFirmwareFile { + return catfile(scalar Slim::Utils::OSDetect::dirsFor('updates'), 'squeezelite-esp32-custom.bin'); +} + sub handleFirmwareDownload { my ($httpClient, $response) = @_; @@ -139,7 +164,7 @@ sub handleFirmwareDownload { } if ($path =~ $FW_CUSTOM_REGEX) { - my $firmwareFile = catfile(scalar Slim::Utils::OSDetect::dirsFor('updates'), 'squeezelite-esp32-custom.bin'); + my $firmwareFile = _customFirmwareFile(); if (! -f $firmwareFile) { main::INFOLOG && $log->is_info && $log->info("Failed to find custom firmware build: $firmwareFile"); @@ -167,7 +192,7 @@ sub downloadFirmwareFile { my ($cb, $ecb, $url, $name) = @_; # keep track of the last firmware we requested, to prefetch it in the future - my $releaseInfo = _getFirmwareTag($url); + my $releaseInfo = getFirmwareTag($url); $name ||= basename($url); @@ -207,7 +232,7 @@ sub downloadFirmwareFile { return; } -sub _getFirmwareTag { +sub getFirmwareTag { my ($info) = @_; if (my ($model, $resolution, $version, $branch) = $info =~ $FW_TAG_REGEX) { diff --git a/plugin/SqueezeESP32/HTML/EN/plugins/SqueezeESP32/settings/player.html b/plugin/SqueezeESP32/HTML/EN/plugins/SqueezeESP32/settings/player.html index a37121c5..85e9d6e8 100644 --- a/plugin/SqueezeESP32/HTML/EN/plugins/SqueezeESP32/settings/player.html +++ b/plugin/SqueezeESP32/HTML/EN/plugins/SqueezeESP32/settings/player.html @@ -2,6 +2,18 @@ [% WRAPPER setting title="PLUGIN_SQUEEZEESP32_FIRMWARE" desc="" %]
[% "PLUGIN_SQUEEZEESP32_PLAYERSETTINGS" | string %] ([% player_ip %])
+ [% IF fwUpdateAvailable %] +
+ + [% fwUpdateAvailable %] +
+ [% END %] + [% IF fwCustomUpdateAvailable %] +
+ + [% fwCustomUpdateAvailable | string %] +
+ [% END %] [% END %] [% IF prefs.pref_width %] diff --git a/plugin/SqueezeESP32/PlayerSettings.pm b/plugin/SqueezeESP32/PlayerSettings.pm index b466c77b..83be9d07 100644 --- a/plugin/SqueezeESP32/PlayerSettings.pm +++ b/plugin/SqueezeESP32/PlayerSettings.pm @@ -2,6 +2,7 @@ package Plugins::SqueezeESP32::PlayerSettings; use strict; use base qw(Slim::Web::Settings); +use JSON::XS::VersionOneAndTwo; use List::Util qw(first); use Slim::Utils::Log; @@ -36,7 +37,7 @@ sub prefs { } sub handler { - my ($class, $client, $paramRef) = @_; + my ($class, $client, $paramRef, $callback, @args) = @_; my ($cprefs, @prefs) = $class->prefs($client); @@ -62,7 +63,7 @@ sub handler { x => $paramRef->{'pref_artwork_x'} || 0, y => $paramRef->{'pref_artwork_y'} || 0, }; - + $cprefs->set('artwork', $artwork); $client->display->modes($client->display->build_modes); # the display update will be done below, after all is completed @@ -76,14 +77,14 @@ sub handler { } - if ($client->depth == 16) { + if ($client->can('depth') && $client->depth == 16) { my $equalizer = $cprefs->get('equalizer'); for my $i (0 .. $#{$equalizer}) { $equalizer->[$i] = $paramRef->{"pref_equalizer.$i"} || 0; } $cprefs->set('equalizer', $equalizer); $client->update_tones($equalizer); - } + } } if ($client->displayWidth) { @@ -93,10 +94,46 @@ sub handler { $paramRef->{'pref_artwork'} = $cprefs->get('artwork'); } - $paramRef->{'pref_equalizer'} = $cprefs->get('equalizer') if $client->depth == 16; + $paramRef->{'pref_equalizer'} = $cprefs->get('equalizer') if $client->can('depth') && $client->depth == 16; $paramRef->{'player_ip'} = $client->ip; - return $class->SUPER::handler($client, $paramRef); + Plugins::SqueezeESP32::FirmwareHelper::initFirmwareDownload($client, sub { + my ($currentFWInfo, $newFWUrl, $customFwUrl) = @_; + + $currentFWInfo ||= {}; + my $newFWInfo = Plugins::SqueezeESP32::FirmwareHelper::getFirmwareTag($newFWUrl) || {}; + + if ($paramRef->{installUpdate} || $paramRef->{installCustomUpdate}) { + my $http = Slim::Networking::SimpleAsyncHTTP->new(sub { + main::INFOLOG && $log->is_info && $log->info("Firmware update triggered"); + }, sub { + main::INFOLOG && $log->is_info && $log->info("Failed to trigger firmware update"); + main::DEBUGLOG && $log->is_debug && $log->debug(Data::Dump::dump(@_)); + })->post(sprintf('http://%s/config.json', $client->ip), to_json({ + timestamp => int(Time::HiRes::time() * 1000) * 1, + config => { + fwurl => { + value => $paramRef->{installCustomUpdate} ? $customFwUrl : $newFWUrl, + type => 33 + } + } + })); + } + else { + if ($currentFWInfo->{version} && $newFWInfo->{version} && $currentFWInfo->{version} > $newFWInfo->{version}) { + main::INFOLOG && $log->is_info && $log->info("There's an update for your SqueezeESP32 player: $newFWUrl"); + $paramRef->{fwUpdateAvailable} = sprintf($client->string('PLUGIN_SQUEEZEESP32_FIRMWARE_AVAILABLE'), $newFWInfo->{version}, $currentFWInfo->{version}); + } + if ($customFwUrl) { + main::INFOLOG && $log->is_info && $log->info("There's a custom firmware for your SqueezeESP32 player: $customFwUrl"); + $paramRef->{fwCustomUpdateAvailable} = 'PLUGIN_SQUEEZEESP32_CUSTOM_FIRMWARE_AVAILABLE'; + } + } + + $callback->( $client, $paramRef, $class->SUPER::handler($client, $paramRef), @args ); + }); + + return; } 1; \ No newline at end of file diff --git a/plugin/SqueezeESP32/strings.txt b/plugin/SqueezeESP32/strings.txt index b3ca6087..0b70fa2d 100644 --- a/plugin/SqueezeESP32/strings.txt +++ b/plugin/SqueezeESP32/strings.txt @@ -24,6 +24,14 @@ PLUGIN_SQUEEZEESP32_PLAYERSETTINGS PLUGIN_SQUEEZEESP32_FIRMWARE EN Firmware +PLUGIN_SQUEEZEESP32_FIRMWARE_AVAILABLE + DE Es steht eine neue Firmware Version v%s zur Verfügung (aktuell installiert: v%s). + EN A new firmware version v%s is available (currently installed: v%s). + +PLUGIN_SQUEEZEESP32_CUSTOM_FIRMWARE_AVAILABLE + DE Es steht eine benutzerdefinierte Firmware Version zur Verfügung. + EN A custom firmware image is available for installation. + PLUGIN_SQUEEZEESP32_WIDTH DE Displaybreite EN Screen width