@@ -57,6 +57,29 @@ String extractReleaseAssetField(const String& payload, const char* assetName, co
5757 const String scope = payload.substring (assetPos, nextAssetPos);
5858 return sp7json::parseString (scope, fieldName, def, false );
5959}
60+
61+ const char * preferredReleaseFirmwareAssetName () {
62+ #if SOUNDPANEL7_HAS_SCREEN
63+ return " soundpanel7_ota-firmware.bin" ;
64+ #else
65+ return " soundpanel7_headless_ota-firmware.bin" ;
66+ #endif
67+ }
68+
69+ bool selectManifestOtaForCurrentProfile (const String& payload, String& otaUrl, String& otaSha256) {
70+ #if SOUNDPANEL7_HAS_SCREEN
71+ otaUrl = sp7json::parseString (payload, " otaScreenUrl" , " " , false );
72+ otaSha256 = sp7json::parseString (payload, " otaScreenSha256" , " " , false );
73+ #else
74+ otaUrl = sp7json::parseString (payload, " otaHeadlessUrl" , " " , false );
75+ otaSha256 = sp7json::parseString (payload, " otaHeadlessSha256" , " " , false );
76+ #endif
77+ if (!otaUrl.isEmpty () && otaSha256.length () == 64 ) return true ;
78+
79+ otaUrl = sp7json::parseString (payload, " url" , " " , false );
80+ otaSha256 = sp7json::parseString (payload, " sha256" , " " , false );
81+ return !otaUrl.isEmpty () && otaSha256.length () == 64 ;
82+ }
6083}
6184
6285bool ReleaseUpdateManager::begin (NetManager* net) {
@@ -489,8 +512,14 @@ bool ReleaseUpdateManager::parseLatestReleaseApiPayload(const String& payload) {
489512 const String version = stripLeadingVersionPrefix (tag);
490513 const String publishedAt = sp7json::parseString (payload, " published_at" , " " , false );
491514 const String releaseUrl = sp7json::parseString (payload, " html_url" , " " , false );
492- const String otaUrl = extractReleaseAssetField (payload, " firmware.bin" , " browser_download_url" , " " );
493- String otaSha256 = extractReleaseAssetField (payload, " firmware.bin" , " digest" , " " );
515+ const char * preferredAssetName = preferredReleaseFirmwareAssetName ();
516+ String otaUrl = extractReleaseAssetField (payload, preferredAssetName, " browser_download_url" , " " );
517+ String otaSha256 = extractReleaseAssetField (payload, preferredAssetName, " digest" , " " );
518+
519+ if (otaUrl.isEmpty () || otaSha256.isEmpty ()) {
520+ otaUrl = extractReleaseAssetField (payload, " firmware.bin" , " browser_download_url" , " " );
521+ otaSha256 = extractReleaseAssetField (payload, " firmware.bin" , " digest" , " " );
522+ }
494523
495524 if (version.isEmpty ()) {
496525 setError (" latest release missing tag_name" );
@@ -561,8 +590,9 @@ bool ReleaseUpdateManager::parseManifest(const String& payload) {
561590 String version = sp7json::parseString (payload, " version" , " " , false );
562591 String publishedAt = sp7json::parseString (payload, " published_at" , " " , false );
563592 String releaseUrl = sp7json::parseString (payload, " release_url" , " " , false );
564- String otaUrl = sp7json::parseString (payload, " url" , " " , false );
565- String otaSha256 = sp7json::parseString (payload, " sha256" , " " , false );
593+ String otaUrl;
594+ String otaSha256;
595+ selectManifestOtaForCurrentProfile (payload, otaUrl, otaSha256);
566596
567597 if (version.isEmpty ()) {
568598 setError (" manifest missing version" );
0 commit comments