You've already forked immich
							
							
				mirror of
				https://github.com/immich-app/immich.git
				synced 2025-10-31 00:18:28 +02:00 
			
		
		
		
	* feat: delta sync * fix: ignore iCloud assets * feat: dev logs * add full sync button * remove photo_manager dep for sync * misc logs and fix * add time taken to DLog * fix: build release iOS * ios sync go brrr * rename local sync service * update isar fork * rename to platform assets / albums * fix ci check --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex <alex.tran1502@gmail.com>
		
			
				
	
	
		
			90 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:pigeon/pigeon.dart';
 | |
| 
 | |
| @ConfigurePigeon(
 | |
|   PigeonOptions(
 | |
|     dartOut: 'lib/platform/native_sync_api.g.dart',
 | |
|     swiftOut: 'ios/Runner/Sync/Messages.g.swift',
 | |
|     swiftOptions: SwiftOptions(),
 | |
|     kotlinOut:
 | |
|         'android/app/src/main/kotlin/app/alextran/immich/sync/Messages.g.kt',
 | |
|     kotlinOptions: KotlinOptions(package: 'app.alextran.immich.sync'),
 | |
|     dartOptions: DartOptions(),
 | |
|     dartPackageName: 'immich_mobile',
 | |
|   ),
 | |
| )
 | |
| class PlatformAsset {
 | |
|   final String id;
 | |
|   final String name;
 | |
|   // Follows AssetType enum from base_asset.model.dart
 | |
|   final int type;
 | |
|   // Seconds since epoch
 | |
|   final int? createdAt;
 | |
|   final int? updatedAt;
 | |
|   final int durationInSeconds;
 | |
| 
 | |
|   const PlatformAsset({
 | |
|     required this.id,
 | |
|     required this.name,
 | |
|     required this.type,
 | |
|     this.createdAt,
 | |
|     this.updatedAt,
 | |
|     this.durationInSeconds = 0,
 | |
|   });
 | |
| }
 | |
| 
 | |
| class PlatformAlbum {
 | |
|   final String id;
 | |
|   final String name;
 | |
|   // Seconds since epoch
 | |
|   final int? updatedAt;
 | |
|   final bool isCloud;
 | |
|   final int assetCount;
 | |
| 
 | |
|   const PlatformAlbum({
 | |
|     required this.id,
 | |
|     required this.name,
 | |
|     this.updatedAt,
 | |
|     this.isCloud = false,
 | |
|     this.assetCount = 0,
 | |
|   });
 | |
| }
 | |
| 
 | |
| class SyncDelta {
 | |
|   final bool hasChanges;
 | |
|   final List<PlatformAsset> updates;
 | |
|   final List<String> deletes;
 | |
|   // Asset -> Album mapping
 | |
|   final Map<String, List<String>> assetAlbums;
 | |
| 
 | |
|   const SyncDelta({
 | |
|     this.hasChanges = false,
 | |
|     this.updates = const [],
 | |
|     this.deletes = const [],
 | |
|     this.assetAlbums = const {},
 | |
|   });
 | |
| }
 | |
| 
 | |
| @HostApi()
 | |
| abstract class NativeSyncApi {
 | |
|   bool shouldFullSync();
 | |
| 
 | |
|   @TaskQueue(type: TaskQueueType.serialBackgroundThread)
 | |
|   SyncDelta getMediaChanges();
 | |
| 
 | |
|   void checkpointSync();
 | |
| 
 | |
|   void clearSyncCheckpoint();
 | |
| 
 | |
|   @TaskQueue(type: TaskQueueType.serialBackgroundThread)
 | |
|   List<String> getAssetIdsForAlbum(String albumId);
 | |
| 
 | |
|   @TaskQueue(type: TaskQueueType.serialBackgroundThread)
 | |
|   List<PlatformAlbum> getAlbums();
 | |
| 
 | |
|   @TaskQueue(type: TaskQueueType.serialBackgroundThread)
 | |
|   int getAssetsCountSince(String albumId, int timestamp);
 | |
| 
 | |
|   @TaskQueue(type: TaskQueueType.serialBackgroundThread)
 | |
|   List<PlatformAsset> getAssetsForAlbum(String albumId, {int? updatedTimeCond});
 | |
| }
 |