|
|
|
@ -95,32 +95,27 @@ class ImmichService {
|
|
|
|
final fileModifiedAt = fileStat.modified;
|
|
|
|
final fileModifiedAt = fileStat.modified;
|
|
|
|
|
|
|
|
|
|
|
|
// Determine MIME type from file extension
|
|
|
|
// Determine MIME type from file extension
|
|
|
|
String mimeType = 'image/jpeg'; // default
|
|
|
|
|
|
|
|
final extension = fileName.split('.').last.toLowerCase();
|
|
|
|
final extension = fileName.split('.').last.toLowerCase();
|
|
|
|
switch (extension) {
|
|
|
|
switch (extension) {
|
|
|
|
case 'png':
|
|
|
|
case 'png':
|
|
|
|
mimeType = 'image/png';
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case 'jpg':
|
|
|
|
case 'jpg':
|
|
|
|
case 'jpeg':
|
|
|
|
case 'jpeg':
|
|
|
|
mimeType = 'image/jpeg';
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case 'gif':
|
|
|
|
case 'gif':
|
|
|
|
mimeType = 'image/gif';
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case 'webp':
|
|
|
|
case 'webp':
|
|
|
|
mimeType = 'image/webp';
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case 'heic':
|
|
|
|
case 'heic':
|
|
|
|
case 'heif':
|
|
|
|
case 'heif':
|
|
|
|
mimeType = 'image/heic';
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Generate device IDs (required by Immich API)
|
|
|
|
// Generate device IDs (required by Immich API)
|
|
|
|
// Using a consistent device ID based on the app
|
|
|
|
// Using a consistent device ID based on the app
|
|
|
|
const deviceId = 'flutter-app-boilerplate';
|
|
|
|
const deviceId = 'flutter-app-boilerplate';
|
|
|
|
final deviceAssetId = 'device-asset-${fileCreatedAt.millisecondsSinceEpoch}';
|
|
|
|
final deviceAssetId =
|
|
|
|
|
|
|
|
'device-asset-${fileCreatedAt.millisecondsSinceEpoch}';
|
|
|
|
|
|
|
|
|
|
|
|
// Format dates in ISO 8601 format (UTC)
|
|
|
|
// Format dates in ISO 8601 format (UTC)
|
|
|
|
final fileCreatedAtIso = fileCreatedAt.toUtc().toIso8601String();
|
|
|
|
final fileCreatedAtIso = fileCreatedAt.toUtc().toIso8601String();
|
|
|
|
@ -211,7 +206,8 @@ class ImmichService {
|
|
|
|
? (response.data as Map)['message']?.toString() ??
|
|
|
|
? (response.data as Map)['message']?.toString() ??
|
|
|
|
response.statusMessage
|
|
|
|
response.statusMessage
|
|
|
|
: response.statusMessage;
|
|
|
|
: response.statusMessage;
|
|
|
|
debugPrint('Upload failed with status ${response.statusCode}: $errorMessage');
|
|
|
|
debugPrint(
|
|
|
|
|
|
|
|
'Upload failed with status ${response.statusCode}: $errorMessage');
|
|
|
|
throw ImmichException(
|
|
|
|
throw ImmichException(
|
|
|
|
'Upload failed: $errorMessage',
|
|
|
|
'Upload failed: $errorMessage',
|
|
|
|
response.statusCode,
|
|
|
|
response.statusCode,
|
|
|
|
@ -223,7 +219,8 @@ class ImmichService {
|
|
|
|
debugPrint('Response is Map with keys: ${(response.data as Map).keys}');
|
|
|
|
debugPrint('Response is Map with keys: ${(response.data as Map).keys}');
|
|
|
|
debugPrint('Full response map: ${response.data}');
|
|
|
|
debugPrint('Full response map: ${response.data}');
|
|
|
|
} else if (response.data is List) {
|
|
|
|
} else if (response.data is List) {
|
|
|
|
debugPrint('Response is List with ${(response.data as List).length} items');
|
|
|
|
debugPrint(
|
|
|
|
|
|
|
|
'Response is List with ${(response.data as List).length} items');
|
|
|
|
debugPrint('First item: ${(response.data as List).first}');
|
|
|
|
debugPrint('First item: ${(response.data as List).first}');
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
debugPrint('Response type: ${response.data.runtimeType}');
|
|
|
|
debugPrint('Response type: ${response.data.runtimeType}');
|
|
|
|
|