parse static method
Implementation
static ObservantInfo? parse(String? body) {
final json = decodeJsonObject(body);
final ok = json?['ok'];
if (json == null || ok is! bool) {
return null;
}
final frame = json['frame'];
// `cat` before ObservANT (2026-10-14).
final cat = json['detection'] ?? json['cat'];
int? field(Object? map, String key) =>
map is Map<String, dynamic> && map[key] is int ? map[key] as int : null;
return ObservantInfo(
camera: json['camera'] is String ? json['camera'] as String : '',
version: json['version'] is String ? json['version'] as String : '',
pixelated: json['privacy'] == 'pixelate',
width: field(frame, 'width'),
height: field(frame, 'height'),
fps: field(frame, 'fps'),
inference: json['inference'] == true,
modelRuns: field(json, 'model_runs') ?? 0,
visits: field(cat, 'visits') ?? 0,
problem: ok
? null
: (json['problem'] is String ? json['problem'] as String : ''),
boxes: parseZones(cat is Map<String, dynamic> ? cat['boxes'] : null),
detections: <RecentDetection>[
if (cat is Map<String, dynamic> && cat['recent'] is List)
for (final visit in cat['recent'] as List)
if (visit is Map<String, dynamic> &&
visit['arrived'] is int &&
parseZones(visit['boxes']).isNotEmpty)
RecentDetection(
DateTime.fromMillisecondsSinceEpoch(
(visit['arrived'] as int) * 1000,
),
parseZones(visit['boxes']),
),
].take(_keptPictures).toList(),
lastScore: cat is Map<String, dynamic> && cat['last_score'] is num
? (cat['last_score'] as num).toDouble()
: null,
);
}