import 'package:aves/model/image_entry.dart'; import 'package:aves/model/image_metadata.dart'; import 'package:aves/services/service_policy.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; class MetadataService { static const platform = MethodChannel('deckers.thibault/aves/metadata'); // return Map> (map of directories, each directory being a map of metadata label and value description) static Future getAllMetadata(ImageEntry entry) async { if (entry.isSvg) return null; try { final result = await platform.invokeMethod('getAllMetadata', { 'mimeType': entry.mimeType, 'path': entry.path, 'uri': entry.uri, }); return result as Map; } on PlatformException catch (e) { debugPrint('getAllMetadata failed with code=${e.code}, exception=${e.message}, details=${e.details}'); } return {}; } static Future getCatalogMetadata(ImageEntry entry) async { if (entry.isSvg) return null; return servicePolicy.call( () async { try { // return map with: // 'dateMillis': date taken in milliseconds since Epoch (long) // 'isAnimated': animated gif/webp (bool) // 'latitude': latitude (double) // 'longitude': longitude (double) // 'videoRotation': video rotation degrees (int) // 'xmpSubjects': ';' separated XMP subjects (string) // 'xmpTitleDescription': XMP title or XMP description (string) final result = await platform.invokeMethod('getCatalogMetadata', { 'mimeType': entry.mimeType, 'path': entry.path, 'uri': entry.uri, }) as Map; result['contentId'] = entry.contentId; return CatalogMetadata.fromMap(result); } on PlatformException catch (e) { debugPrint('getCatalogMetadata failed with code=${e.code}, exception=${e.message}, details=${e.details}'); } return null; }, priority: ServiceCallPriority.background, debugLabel: 'getCatalogMetadata-${entry.path}', ); } static Future getOverlayMetadata(ImageEntry entry) async { if (entry.isSvg) return null; try { // return map with string descriptions for: 'aperture' 'exposureTime' 'focalLength' 'iso' final result = await platform.invokeMethod('getOverlayMetadata', { 'mimeType': entry.mimeType, 'path': entry.path, 'uri': entry.uri, }) as Map; return OverlayMetadata.fromMap(result); } on PlatformException catch (e) { debugPrint('getOverlayMetadata failed with code=${e.code}, exception=${e.message}, details=${e.details}'); } return null; } }