feat(immich): add Immich self-hosted import support

Adds an ImmichClient for Android to connect to a self-hosted Immich
server, fetch albums and assets, and import selected images locally.
API keys are encrypted with Android Keystore and stored securely.
The plugin now exposes connect, disconnect and import actions and
is documented for Immich import usage.

- Encrypted Immich API keys with Android Keystore
- Exposed connect, disconnect and import actions in the plugin
- Updated docs and metadata to reflect Immich import flow
This commit is contained in:
2026-08-21 20:29:26 +02:00
parent 6e43d52680
commit 8e5a53ade8
33 changed files with 1508 additions and 29 deletions
@@ -0,0 +1,13 @@
# Automatically generated - DO NOT EDIT!
"$schema" = "../../schemas/schema.json"
[[permission]]
identifier = "allow-connect-immich"
description = "Enables the connect_immich command without any pre-configured scope."
commands.allow = ["connect_immich"]
[[permission]]
identifier = "deny-connect-immich"
description = "Denies the connect_immich command without any pre-configured scope."
commands.deny = ["connect_immich"]
@@ -0,0 +1,13 @@
# Automatically generated - DO NOT EDIT!
"$schema" = "../../schemas/schema.json"
[[permission]]
identifier = "allow-disconnect-immich"
description = "Enables the disconnect_immich command without any pre-configured scope."
commands.allow = ["disconnect_immich"]
[[permission]]
identifier = "deny-disconnect-immich"
description = "Denies the disconnect_immich command without any pre-configured scope."
commands.deny = ["disconnect_immich"]
@@ -0,0 +1,13 @@
# Automatically generated - DO NOT EDIT!
"$schema" = "../../schemas/schema.json"
[[permission]]
identifier = "allow-get-immich-albums"
description = "Enables the get_immich_albums command without any pre-configured scope."
commands.allow = ["get_immich_albums"]
[[permission]]
identifier = "deny-get-immich-albums"
description = "Denies the get_immich_albums command without any pre-configured scope."
commands.deny = ["get_immich_albums"]
@@ -0,0 +1,13 @@
# Automatically generated - DO NOT EDIT!
"$schema" = "../../schemas/schema.json"
[[permission]]
identifier = "allow-get-immich-assets"
description = "Enables the get_immich_assets command without any pre-configured scope."
commands.allow = ["get_immich_assets"]
[[permission]]
identifier = "deny-get-immich-assets"
description = "Denies the get_immich_assets command without any pre-configured scope."
commands.deny = ["get_immich_assets"]
@@ -0,0 +1,13 @@
# Automatically generated - DO NOT EDIT!
"$schema" = "../../schemas/schema.json"
[[permission]]
identifier = "allow-get-immich-connection"
description = "Enables the get_immich_connection command without any pre-configured scope."
commands.allow = ["get_immich_connection"]
[[permission]]
identifier = "deny-get-immich-connection"
description = "Denies the get_immich_connection command without any pre-configured scope."
commands.deny = ["get_immich_connection"]
@@ -0,0 +1,13 @@
# Automatically generated - DO NOT EDIT!
"$schema" = "../../schemas/schema.json"
[[permission]]
identifier = "allow-import-immich-assets"
description = "Enables the import_immich_assets command without any pre-configured scope."
commands.allow = ["import_immich_assets"]
[[permission]]
identifier = "deny-import-immich-assets"
description = "Denies the import_immich_assets command without any pre-configured scope."
commands.deny = ["import_immich_assets"]
@@ -14,6 +14,12 @@ Allow the LockScreenWallpaper app to manage its wallpaper collection
- `allow-set-setting`
- `allow-set-interval`
- `allow-next-wallpaper`
- `allow-get-immich-connection`
- `allow-connect-immich`
- `allow-disconnect-immich`
- `allow-get-immich-albums`
- `allow-get-immich-assets`
- `allow-import-immich-assets`
## Permission Table
@@ -24,6 +30,32 @@ Allow the LockScreenWallpaper app to manage its wallpaper collection
</tr>
<tr>
<td>
`wallpaper:allow-connect-immich`
</td>
<td>
Enables the connect_immich command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`wallpaper:deny-connect-immich`
</td>
<td>
Denies the connect_immich command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
@@ -79,6 +111,32 @@ Denies the delete_images command without any pre-configured scope.
<tr>
<td>
`wallpaper:allow-disconnect-immich`
</td>
<td>
Enables the disconnect_immich command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`wallpaper:deny-disconnect-immich`
</td>
<td>
Denies the disconnect_immich command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`wallpaper:allow-get-gallery`
</td>
@@ -131,6 +189,84 @@ Denies the get_image_ids command without any pre-configured scope.
<tr>
<td>
`wallpaper:allow-get-immich-albums`
</td>
<td>
Enables the get_immich_albums command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`wallpaper:deny-get-immich-albums`
</td>
<td>
Denies the get_immich_albums command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`wallpaper:allow-get-immich-assets`
</td>
<td>
Enables the get_immich_assets command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`wallpaper:deny-get-immich-assets`
</td>
<td>
Denies the get_immich_assets command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`wallpaper:allow-get-immich-connection`
</td>
<td>
Enables the get_immich_connection command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`wallpaper:deny-get-immich-connection`
</td>
<td>
Denies the get_immich_connection command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`wallpaper:allow-get-state`
</td>
@@ -157,6 +293,32 @@ Denies the get_state command without any pre-configured scope.
<tr>
<td>
`wallpaper:allow-import-immich-assets`
</td>
<td>
Enables the import_immich_assets command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`wallpaper:deny-import-immich-assets`
</td>
<td>
Denies the import_immich_assets command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`wallpaper:allow-next-wallpaper`
</td>
+1 -1
View File
@@ -1,3 +1,3 @@
[default]
description = "Allow the LockScreenWallpaper app to manage its wallpaper collection"
permissions = ["allow-get-state", "allow-get-gallery", "allow-select-images", "allow-delete-image", "allow-get-image-ids", "allow-delete-images", "allow-set-image-crop", "allow-set-setting", "allow-set-interval", "allow-next-wallpaper"]
permissions = ["allow-get-state", "allow-get-gallery", "allow-select-images", "allow-delete-image", "allow-get-image-ids", "allow-delete-images", "allow-set-image-crop", "allow-set-setting", "allow-set-interval", "allow-next-wallpaper", "allow-get-immich-connection", "allow-connect-immich", "allow-disconnect-immich", "allow-get-immich-albums", "allow-get-immich-assets", "allow-import-immich-assets"]
+74 -2
View File
@@ -294,6 +294,18 @@
"PermissionKind": {
"type": "string",
"oneOf": [
{
"description": "Enables the connect_immich command without any pre-configured scope.",
"type": "string",
"const": "allow-connect-immich",
"markdownDescription": "Enables the connect_immich command without any pre-configured scope."
},
{
"description": "Denies the connect_immich command without any pre-configured scope.",
"type": "string",
"const": "deny-connect-immich",
"markdownDescription": "Denies the connect_immich command without any pre-configured scope."
},
{
"description": "Enables the delete_image command without any pre-configured scope.",
"type": "string",
@@ -318,6 +330,18 @@
"const": "deny-delete-images",
"markdownDescription": "Denies the delete_images command without any pre-configured scope."
},
{
"description": "Enables the disconnect_immich command without any pre-configured scope.",
"type": "string",
"const": "allow-disconnect-immich",
"markdownDescription": "Enables the disconnect_immich command without any pre-configured scope."
},
{
"description": "Denies the disconnect_immich command without any pre-configured scope.",
"type": "string",
"const": "deny-disconnect-immich",
"markdownDescription": "Denies the disconnect_immich command without any pre-configured scope."
},
{
"description": "Enables the get_gallery command without any pre-configured scope.",
"type": "string",
@@ -342,6 +366,42 @@
"const": "deny-get-image-ids",
"markdownDescription": "Denies the get_image_ids command without any pre-configured scope."
},
{
"description": "Enables the get_immich_albums command without any pre-configured scope.",
"type": "string",
"const": "allow-get-immich-albums",
"markdownDescription": "Enables the get_immich_albums command without any pre-configured scope."
},
{
"description": "Denies the get_immich_albums command without any pre-configured scope.",
"type": "string",
"const": "deny-get-immich-albums",
"markdownDescription": "Denies the get_immich_albums command without any pre-configured scope."
},
{
"description": "Enables the get_immich_assets command without any pre-configured scope.",
"type": "string",
"const": "allow-get-immich-assets",
"markdownDescription": "Enables the get_immich_assets command without any pre-configured scope."
},
{
"description": "Denies the get_immich_assets command without any pre-configured scope.",
"type": "string",
"const": "deny-get-immich-assets",
"markdownDescription": "Denies the get_immich_assets command without any pre-configured scope."
},
{
"description": "Enables the get_immich_connection command without any pre-configured scope.",
"type": "string",
"const": "allow-get-immich-connection",
"markdownDescription": "Enables the get_immich_connection command without any pre-configured scope."
},
{
"description": "Denies the get_immich_connection command without any pre-configured scope.",
"type": "string",
"const": "deny-get-immich-connection",
"markdownDescription": "Denies the get_immich_connection command without any pre-configured scope."
},
{
"description": "Enables the get_state command without any pre-configured scope.",
"type": "string",
@@ -354,6 +414,18 @@
"const": "deny-get-state",
"markdownDescription": "Denies the get_state command without any pre-configured scope."
},
{
"description": "Enables the import_immich_assets command without any pre-configured scope.",
"type": "string",
"const": "allow-import-immich-assets",
"markdownDescription": "Enables the import_immich_assets command without any pre-configured scope."
},
{
"description": "Denies the import_immich_assets command without any pre-configured scope.",
"type": "string",
"const": "deny-import-immich-assets",
"markdownDescription": "Denies the import_immich_assets command without any pre-configured scope."
},
{
"description": "Enables the next_wallpaper command without any pre-configured scope.",
"type": "string",
@@ -415,10 +487,10 @@
"markdownDescription": "Denies the set_setting command without any pre-configured scope."
},
{
"description": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`",
"description": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`\n- `allow-get-immich-connection`\n- `allow-connect-immich`\n- `allow-disconnect-immich`\n- `allow-get-immich-albums`\n- `allow-get-immich-assets`\n- `allow-import-immich-assets`",
"type": "string",
"const": "default",
"markdownDescription": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`"
"markdownDescription": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`\n- `allow-get-immich-connection`\n- `allow-connect-immich`\n- `allow-disconnect-immich`\n- `allow-get-immich-albums`\n- `allow-get-immich-assets`\n- `allow-import-immich-assets`"
}
]
}