mirror of
https://github.com/Yuyi-Oak/BlueArchiveToolkit.git
synced 2026-07-22 03:56:44 +08:00
feat: add official resource sync pipeline
Add the production-facing official update service and bat-official-sync watch CLI for unattended resource synchronization. Support launcher-resource discovery without installing the launcher, remote marker snapshots, local manifest audit and repair, official seed hash validation, bootstrap caching, richer Addressables coverage, SQLite resource persistence, and FFI JSON helpers.
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"m_LocatorId": "AddressablesMainContentCatalog",
|
||||
"m_InternalIdPrefixes": [],
|
||||
"m_ProviderIds": [
|
||||
"UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider"
|
||||
],
|
||||
"m_InternalIds": [
|
||||
"{PlatformUtils.AddressableLoadPath}\\academy-_mxload-prefabs-2025-07-02_assets_all_638981069.bundle",
|
||||
"{PlatformUtils.AddressableLoadPath}\\academy-_mxload-prefabs-2025-08-26_assets_all_1581352935.bundle",
|
||||
"{PlatformUtils.AddressableLoadPath}\\shared_assets_all_123.bundle"
|
||||
],
|
||||
"m_resourceTypes": [
|
||||
{
|
||||
"m_AssemblyName": "Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null",
|
||||
"m_ClassName": "UnityEngine.ResourceManagement.ResourceProviders.IAssetBundleResource"
|
||||
}
|
||||
],
|
||||
"m_KeyDataString": "BAAAAAA+AAAAYWNhZGVteS1fbXhsb2FkLXByZWZhYnMtMjAyNS0wNy0wMl9hc3NldHNfYWxsXzYzODk4MTA2OS5idW5kbGUAPwAAAGFjYWRlbXktX214bG9hZC1wcmVmYWJzLTIwMjUtMDgtMjZfYXNzZXRzX2FsbF8xNTgxMzUyOTM1LmJ1bmRsZQAcAAAAc2hhcmVkX2Fzc2V0c19hbGxfMTIzLmJ1bmRsZQAQAAAAZGVwZW5kZW5jeS1zZXQtMA==",
|
||||
"m_BucketDataString": "BAAAAAQAAAABAAAAAAAAAEcAAAABAAAAAQAAAIsAAAABAAAAAgAAAKwAAAABAAAAAgAAAA==",
|
||||
"m_EntryDataString": "AwAAAAAAAAAAAAAAAwAAAHsAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP////8AAAAARQEAAAEAAAAAAAAAAgAAAAAAAAD/////AAAAAJACAAACAAAAAAAAAA==",
|
||||
"m_ExtraDataString": "B0xVbml0eS5SZXNvdXJjZU1hbmFnZXIsIFZlcnNpb249MC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsSlVuaXR5RW5naW5lLlJlc291cmNlTWFuYWdlbWVudC5SZXNvdXJjZVByb3ZpZGVycy5Bc3NldEJ1bmRsZVJlcXVlc3RPcHRpb25zqAAAAHsAIgBtAF8ASABhAHMAaAAiADoAIgBoAGEAcwBoAC0AbQBhAGkAbgAiACwAIgBtAF8AQwByAGMAIgA6ADAALAAiAG0AXwBCAHUAbgBkAGwAZQBOAGEAbQBlACIAOgAiAGIAdQBuAGQAbABlAC0AbQBhAGkAbgAiACwAIgBtAF8AQgB1AG4AZABsAGUAUwBpAHoAZQAiADoAMQA5ADMAMgA4ADcAMgB9AAdMVW5pdHkuUmVzb3VyY2VNYW5hZ2VyLCBWZXJzaW9uPTAuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbEpVbml0eUVuZ2luZS5SZXNvdXJjZU1hbmFnZW1lbnQuUmVzb3VyY2VQcm92aWRlcnMuQXNzZXRCdW5kbGVSZXF1ZXN0T3B0aW9uc64AAAB7ACIAbQBfAEgAYQBzAGgAIgA6ACIAaABhAHMAaAAtAHMAZQBjAG8AbgBkACIALAAiAG0AXwBDAHIAYwAiADoAMAAsACIAbQBfAEIAdQBuAGQAbABlAE4AYQBtAGUAIgA6ACIAYgB1AG4AZABsAGUALQBzAGUAYwBvAG4AZAAiACwAIgBtAF8AQgB1AG4AZABsAGUAUwBpAHoAZQAiADoAMQA2ADIAMQAzADQAfQAHTFVuaXR5LlJlc291cmNlTWFuYWdlciwgVmVyc2lvbj0wLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxKVW5pdHlFbmdpbmUuUmVzb3VyY2VNYW5hZ2VtZW50LlJlc291cmNlUHJvdmlkZXJzLkFzc2V0QnVuZGxlUmVxdWVzdE9wdGlvbnOuAAAAewAiAG0AXwBIAGEAcwBoACIAOgAiAGgAYQBzAGgALQBzAGgAYQByAGUAZAAiACwAIgBtAF8AQwByAGMAIgA6ADAALAAiAG0AXwBCAHUAbgBkAGwAZQBOAGEAbQBlACIAOgAiAGIAdQBuAGQAbABlAC0AcwBoAGEAcgBlAGQAIgAsACIAbQBfAEIAdQBuAGQAbABlAFMAaQB6AGUAIgA6ADEANQAzADQAOAAwAH0A"
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"format": "AddressablesCatalog",
|
||||
"locator_id": "AddressablesMainContentCatalog",
|
||||
"cdn_prefixes": [],
|
||||
"resource_count": 3,
|
||||
"resources": [
|
||||
{
|
||||
"path": "academy-_mxload-prefabs-2025-07-02_assets_all_638981069.bundle",
|
||||
"hash": "hash-main",
|
||||
"size": 1932872,
|
||||
"resource_type": "AssetBundle",
|
||||
"address": "academy-_mxload-prefabs-2025-07-02_assets_all_638981069.bundle",
|
||||
"dependencies": [
|
||||
"shared_assets_all_123.bundle"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "academy-_mxload-prefabs-2025-08-26_assets_all_1581352935.bundle",
|
||||
"hash": "hash-second",
|
||||
"size": 162134,
|
||||
"resource_type": "AssetBundle",
|
||||
"address": "academy-_mxload-prefabs-2025-08-26_assets_all_1581352935.bundle",
|
||||
"dependencies": []
|
||||
},
|
||||
{
|
||||
"path": "shared_assets_all_123.bundle",
|
||||
"hash": "hash-shared",
|
||||
"size": 153480,
|
||||
"resource_type": "AssetBundle",
|
||||
"address": "shared_assets_all_123.bundle",
|
||||
"dependencies": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"internal_id_count": "3",
|
||||
"resource_type_count": "1",
|
||||
"key_object_count": "4",
|
||||
"bucket_record_count": "4",
|
||||
"entry_record_count": "3",
|
||||
"key_data_string_len": "260",
|
||||
"bucket_data_string_len": "72",
|
||||
"entry_data_string_len": "120",
|
||||
"extra_data_string_len": "1316"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
use bat_adapters::manifest::ManifestDriverRegistry;
|
||||
use serde_json::json;
|
||||
|
||||
#[tokio::test]
|
||||
async fn parses_real_shape_addressables_catalog_against_golden() {
|
||||
let catalog = include_str!("fixtures/real_addressables/catalog.json");
|
||||
let manifest = ManifestDriverRegistry::with_defaults()
|
||||
.parse(catalog.as_bytes())
|
||||
.await
|
||||
.expect("parse real-shape Addressables catalog");
|
||||
|
||||
let actual = json!({
|
||||
"format": format!("{:?}", manifest.format),
|
||||
"locator_id": manifest.metadata.locator_id,
|
||||
"cdn_prefixes": manifest.metadata.cdn_prefixes,
|
||||
"resource_count": manifest.resources.len(),
|
||||
"resources": manifest.resources.iter().map(|resource| {
|
||||
json!({
|
||||
"path": resource.path,
|
||||
"hash": resource.hash,
|
||||
"size": resource.size,
|
||||
"resource_type": format!("{:?}", resource.resource_type),
|
||||
"address": resource.address,
|
||||
"dependencies": resource.dependencies,
|
||||
})
|
||||
}).collect::<Vec<_>>(),
|
||||
"metadata": manifest.metadata.extra,
|
||||
});
|
||||
|
||||
let expected: serde_json::Value =
|
||||
serde_json::from_str(include_str!("golden/real_addressables.json")).unwrap();
|
||||
|
||||
assert_eq!(actual, expected);
|
||||
}
|
||||
@@ -18,4 +18,7 @@ async fn parses_local_real_addressables_catalog() {
|
||||
);
|
||||
assert!(manifest.resources.len() > 1_000);
|
||||
assert!(manifest.metadata.extra.contains_key("internal_id_count"));
|
||||
assert!(manifest.metadata.extra.contains_key("key_object_count"));
|
||||
assert!(manifest.metadata.extra.contains_key("bucket_record_count"));
|
||||
assert!(manifest.metadata.extra.contains_key("entry_record_count"));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user