|  | @@ -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();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			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;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -				$log->error(sprintf("Failed to get firmware image from Github: %s (%s)", $error || $http->error, $url));
 | 
	
		
			
				|  |  | -			}, $url) if $url && $url =~ /^https?/;
 | 
	
		
			
				|  |  | +				$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) {
 |