immichpy 1.6.5__py3-none-any.whl → 1.7.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. immichpy/cli/__main__.py +1 -1
  2. immichpy/cli/commands/activities.py +23 -11
  3. immichpy/cli/commands/albums.py +34 -20
  4. immichpy/cli/commands/api_keys.py +6 -4
  5. immichpy/cli/commands/assets.py +274 -65
  6. immichpy/cli/commands/authentication.py +115 -25
  7. immichpy/cli/commands/database_backups_admin.py +111 -0
  8. immichpy/cli/commands/download.py +13 -5
  9. immichpy/cli/commands/duplicates.py +1 -1
  10. immichpy/cli/commands/faces.py +17 -11
  11. immichpy/cli/commands/jobs.py +6 -4
  12. immichpy/cli/commands/libraries.py +15 -9
  13. immichpy/cli/commands/maintenance_admin.py +39 -2
  14. immichpy/cli/commands/map.py +8 -8
  15. immichpy/cli/commands/memories.py +35 -21
  16. immichpy/cli/commands/notifications.py +16 -8
  17. immichpy/cli/commands/notifications_admin.py +43 -17
  18. immichpy/cli/commands/partners.py +9 -3
  19. immichpy/cli/commands/people.py +30 -24
  20. immichpy/cli/commands/plugins.py +14 -0
  21. immichpy/cli/commands/queues.py +8 -6
  22. immichpy/cli/commands/search.py +395 -189
  23. immichpy/cli/commands/server.py +6 -2
  24. immichpy/cli/commands/sessions.py +6 -4
  25. immichpy/cli/commands/shared_links.py +42 -25
  26. immichpy/cli/commands/stacks.py +4 -4
  27. immichpy/cli/commands/sync.py +26 -10
  28. immichpy/cli/commands/system_config.py +216 -115
  29. immichpy/cli/commands/system_metadata.py +3 -1
  30. immichpy/cli/commands/tags.py +9 -9
  31. immichpy/cli/commands/trash.py +1 -1
  32. immichpy/cli/commands/users.py +57 -29
  33. immichpy/cli/commands/users_admin.py +79 -45
  34. immichpy/cli/commands/workflows.py +40 -11
  35. immichpy/cli/main.py +10 -2
  36. immichpy/cli/utils.py +2 -2
  37. immichpy/cli/wrapper/setup.py +1 -1
  38. immichpy/client/.openapi-generator/FILES +26 -2
  39. immichpy/client/generated/__init__.py +101 -7
  40. immichpy/client/generated/api/__init__.py +3 -0
  41. immichpy/client/generated/api/activities_api.py +73 -43
  42. immichpy/client/generated/api/albums_api.py +40 -19
  43. immichpy/client/generated/api/api_keys_api.py +1 -1
  44. immichpy/client/generated/api/assets_api.py +1768 -366
  45. immichpy/client/generated/api/authentication_admin_api.py +1 -1
  46. immichpy/client/generated/api/authentication_api.py +1 -1
  47. immichpy/client/generated/api/database_backups_admin_api.py +1224 -0
  48. immichpy/client/generated/api/deprecated_api.py +103 -73
  49. immichpy/client/generated/api/download_api.py +1 -1
  50. immichpy/client/generated/api/duplicates_api.py +1 -1
  51. immichpy/client/generated/api/faces_api.py +7 -7
  52. immichpy/client/generated/api/jobs_api.py +7 -7
  53. immichpy/client/generated/api/libraries_api.py +1 -1
  54. immichpy/client/generated/api/maintenance_admin_api.py +459 -1
  55. immichpy/client/generated/api/map_api.py +103 -49
  56. immichpy/client/generated/api/memories_api.py +109 -61
  57. immichpy/client/generated/api/notifications_admin_api.py +1 -1
  58. immichpy/client/generated/api/notifications_api.py +52 -25
  59. immichpy/client/generated/api/partners_api.py +7 -7
  60. immichpy/client/generated/api/people_api.py +37 -19
  61. immichpy/client/generated/api/plugins_api.py +230 -1
  62. immichpy/client/generated/api/queues_api.py +37 -31
  63. immichpy/client/generated/api/search_api.py +529 -283
  64. immichpy/client/generated/api/server_api.py +1 -1
  65. immichpy/client/generated/api/sessions_api.py +1 -1
  66. immichpy/client/generated/api/shared_links_api.py +53 -19
  67. immichpy/client/generated/api/stacks_api.py +13 -7
  68. immichpy/client/generated/api/sync_api.py +1 -1
  69. immichpy/client/generated/api/system_config_api.py +1 -1
  70. immichpy/client/generated/api/system_metadata_api.py +1 -1
  71. immichpy/client/generated/api/tags_api.py +1 -1
  72. immichpy/client/generated/api/timeline_api.py +1 -1
  73. immichpy/client/generated/api/trash_api.py +1 -1
  74. immichpy/client/generated/api/users_admin_api.py +55 -31
  75. immichpy/client/generated/api/users_api.py +16 -7
  76. immichpy/client/generated/api/views_api.py +1 -1
  77. immichpy/client/generated/api/workflows_api.py +1 -1
  78. immichpy/client/generated/api_client.py +1 -1
  79. immichpy/client/generated/configuration.py +2 -2
  80. immichpy/client/generated/exceptions.py +1 -1
  81. immichpy/client/generated/models/__init__.py +56 -3
  82. immichpy/client/generated/models/activity_create_dto.py +11 -5
  83. immichpy/client/generated/models/activity_response_dto.py +10 -6
  84. immichpy/client/generated/models/activity_statistics_response_dto.py +4 -4
  85. immichpy/client/generated/models/add_users_dto.py +2 -2
  86. immichpy/client/generated/models/admin_onboarding_update_dto.py +4 -2
  87. immichpy/client/generated/models/album_response_dto.py +28 -16
  88. immichpy/client/generated/models/album_statistics_response_dto.py +6 -4
  89. immichpy/client/generated/models/album_user_add_dto.py +3 -3
  90. immichpy/client/generated/models/album_user_create_dto.py +3 -3
  91. immichpy/client/generated/models/album_user_response_dto.py +3 -3
  92. immichpy/client/generated/models/album_user_role.py +2 -2
  93. immichpy/client/generated/models/albums_add_assets_dto.py +3 -3
  94. immichpy/client/generated/models/albums_add_assets_response_dto.py +4 -4
  95. immichpy/client/generated/models/albums_response.py +4 -2
  96. immichpy/client/generated/models/albums_update.py +5 -3
  97. immichpy/client/generated/models/api_key_create_dto.py +5 -3
  98. immichpy/client/generated/models/api_key_create_response_dto.py +2 -2
  99. immichpy/client/generated/models/api_key_response_dto.py +6 -6
  100. immichpy/client/generated/models/api_key_update_dto.py +5 -3
  101. immichpy/client/generated/models/asset_bulk_delete_dto.py +6 -4
  102. immichpy/client/generated/models/asset_bulk_update_dto.py +28 -12
  103. immichpy/client/generated/models/asset_bulk_upload_check_dto.py +3 -3
  104. immichpy/client/generated/models/asset_bulk_upload_check_item.py +3 -3
  105. immichpy/client/generated/models/asset_bulk_upload_check_response_dto.py +5 -3
  106. immichpy/client/generated/models/asset_bulk_upload_check_result.py +12 -6
  107. immichpy/client/generated/models/asset_copy_dto.py +16 -8
  108. immichpy/client/generated/models/asset_delta_sync_dto.py +5 -3
  109. immichpy/client/generated/models/asset_delta_sync_response_dto.py +6 -4
  110. immichpy/client/generated/models/asset_edit_action.py +35 -0
  111. immichpy/client/generated/models/asset_edit_action_crop.py +95 -0
  112. immichpy/client/generated/models/asset_edit_action_list_dto.py +104 -0
  113. immichpy/client/generated/models/asset_edit_action_list_dto_edits_inner.py +188 -0
  114. immichpy/client/generated/models/asset_edit_action_mirror.py +95 -0
  115. immichpy/client/generated/models/asset_edit_action_rotate.py +95 -0
  116. immichpy/client/generated/models/asset_edits_dto.py +107 -0
  117. immichpy/client/generated/models/asset_face_create_dto.py +13 -9
  118. immichpy/client/generated/models/asset_face_delete_dto.py +3 -3
  119. immichpy/client/generated/models/asset_face_response_dto.py +26 -10
  120. immichpy/client/generated/models/asset_face_update_dto.py +3 -3
  121. immichpy/client/generated/models/asset_face_update_item.py +3 -3
  122. immichpy/client/generated/models/asset_face_without_person_response_dto.py +23 -9
  123. immichpy/client/generated/models/asset_full_sync_dto.py +13 -5
  124. immichpy/client/generated/models/asset_ids_dto.py +2 -2
  125. immichpy/client/generated/models/asset_ids_response_dto.py +6 -4
  126. immichpy/client/generated/models/asset_job_name.py +2 -2
  127. immichpy/client/generated/models/asset_jobs_dto.py +3 -3
  128. immichpy/client/generated/models/asset_media_response_dto.py +4 -4
  129. immichpy/client/generated/models/asset_media_size.py +2 -1
  130. immichpy/client/generated/models/asset_media_status.py +2 -2
  131. immichpy/client/generated/models/asset_metadata_bulk_delete_dto.py +103 -0
  132. immichpy/client/generated/models/asset_metadata_bulk_delete_item_dto.py +86 -0
  133. immichpy/client/generated/models/asset_metadata_bulk_response_dto.py +93 -0
  134. immichpy/client/generated/models/asset_metadata_bulk_upsert_dto.py +103 -0
  135. immichpy/client/generated/models/asset_metadata_bulk_upsert_item_dto.py +91 -0
  136. immichpy/client/generated/models/asset_metadata_response_dto.py +5 -6
  137. immichpy/client/generated/models/asset_metadata_upsert_dto.py +5 -3
  138. immichpy/client/generated/models/asset_metadata_upsert_item_dto.py +4 -5
  139. immichpy/client/generated/models/asset_ocr_response_dto.py +1 -1
  140. immichpy/client/generated/models/asset_order.py +2 -2
  141. immichpy/client/generated/models/asset_response_dto.py +66 -24
  142. immichpy/client/generated/models/asset_stack_response_dto.py +8 -4
  143. immichpy/client/generated/models/asset_stats_response_dto.py +5 -5
  144. immichpy/client/generated/models/asset_type_enum.py +2 -2
  145. immichpy/client/generated/models/asset_visibility.py +2 -2
  146. immichpy/client/generated/models/audio_codec.py +2 -2
  147. immichpy/client/generated/models/auth_status_response_dto.py +12 -6
  148. immichpy/client/generated/models/avatar_update.py +3 -3
  149. immichpy/client/generated/models/bulk_id_error_reason.py +2 -2
  150. immichpy/client/generated/models/bulk_id_response_dto.py +14 -5
  151. immichpy/client/generated/models/bulk_ids_dto.py +3 -3
  152. immichpy/client/generated/models/cast_response.py +4 -2
  153. immichpy/client/generated/models/cast_update.py +4 -2
  154. immichpy/client/generated/models/change_password_dto.py +6 -4
  155. immichpy/client/generated/models/check_existing_assets_dto.py +3 -3
  156. immichpy/client/generated/models/check_existing_assets_response_dto.py +4 -2
  157. immichpy/client/generated/models/clip_config.py +5 -3
  158. immichpy/client/generated/models/colorspace.py +1 -1
  159. immichpy/client/generated/models/contributor_count_response_dto.py +5 -3
  160. immichpy/client/generated/models/cq_mode.py +2 -2
  161. immichpy/client/generated/models/create_album_dto.py +9 -5
  162. immichpy/client/generated/models/create_library_dto.py +9 -5
  163. immichpy/client/generated/models/create_profile_image_response_dto.py +8 -4
  164. immichpy/client/generated/models/crop_parameters.py +105 -0
  165. immichpy/client/generated/models/database_backup_config.py +6 -4
  166. immichpy/client/generated/models/database_backup_delete_dto.py +82 -0
  167. immichpy/client/generated/models/database_backup_dto.py +85 -0
  168. immichpy/client/generated/models/database_backup_list_response_dto.py +98 -0
  169. immichpy/client/generated/models/download_archive_info.py +5 -3
  170. immichpy/client/generated/models/download_info_dto.py +11 -5
  171. immichpy/client/generated/models/download_response.py +8 -3
  172. immichpy/client/generated/models/download_response_dto.py +3 -3
  173. immichpy/client/generated/models/download_update.py +5 -3
  174. immichpy/client/generated/models/duplicate_detection_config.py +6 -3
  175. immichpy/client/generated/models/duplicate_response_dto.py +5 -3
  176. immichpy/client/generated/models/email_notifications_response.py +10 -4
  177. immichpy/client/generated/models/email_notifications_update.py +14 -4
  178. immichpy/client/generated/models/exif_response_dto.py +47 -23
  179. immichpy/client/generated/models/face_dto.py +3 -3
  180. immichpy/client/generated/models/facial_recognition_config.py +15 -6
  181. immichpy/client/generated/models/folders_response.py +5 -3
  182. immichpy/client/generated/models/folders_update.py +9 -3
  183. immichpy/client/generated/models/image_format.py +2 -2
  184. immichpy/client/generated/models/job_create_dto.py +3 -3
  185. immichpy/client/generated/models/job_name.py +3 -2
  186. immichpy/client/generated/models/job_settings_dto.py +4 -2
  187. immichpy/client/generated/models/library_response_dto.py +16 -10
  188. immichpy/client/generated/models/library_stats_response_dto.py +6 -6
  189. immichpy/client/generated/models/license_key_dto.py +7 -3
  190. immichpy/client/generated/models/license_response_dto.py +8 -4
  191. immichpy/client/generated/models/log_level.py +1 -1
  192. immichpy/client/generated/models/login_credential_dto.py +4 -4
  193. immichpy/client/generated/models/login_response_dto.py +13 -9
  194. immichpy/client/generated/models/logout_response_dto.py +3 -3
  195. immichpy/client/generated/models/machine_learning_availability_checks_dto.py +3 -3
  196. immichpy/client/generated/models/maintenance_action.py +4 -2
  197. immichpy/client/generated/models/maintenance_auth_dto.py +3 -3
  198. immichpy/client/generated/models/maintenance_detect_install_response_dto.py +101 -0
  199. immichpy/client/generated/models/maintenance_detect_install_storage_folder_dto.py +95 -0
  200. immichpy/client/generated/models/maintenance_login_dto.py +3 -3
  201. immichpy/client/generated/models/maintenance_status_response_dto.py +109 -0
  202. immichpy/client/generated/models/manual_job_name.py +2 -2
  203. immichpy/client/generated/models/map_marker_response_dto.py +8 -8
  204. immichpy/client/generated/models/map_reverse_geocode_response_dto.py +5 -5
  205. immichpy/client/generated/models/memories_response.py +4 -4
  206. immichpy/client/generated/models/memories_update.py +7 -3
  207. immichpy/client/generated/models/memory_create_dto.py +12 -6
  208. immichpy/client/generated/models/memory_response_dto.py +20 -12
  209. immichpy/client/generated/models/memory_search_order.py +1 -1
  210. immichpy/client/generated/models/memory_statistics_response_dto.py +3 -3
  211. immichpy/client/generated/models/memory_type.py +1 -1
  212. immichpy/client/generated/models/memory_update_dto.py +10 -4
  213. immichpy/client/generated/models/merge_person_dto.py +3 -3
  214. immichpy/client/generated/models/metadata_search_dto.py +124 -46
  215. immichpy/client/generated/models/{asset_metadata_key.py → mirror_axis.py} +6 -5
  216. immichpy/client/generated/models/mirror_parameters.py +83 -0
  217. immichpy/client/generated/models/notification_create_dto.py +18 -8
  218. immichpy/client/generated/models/notification_delete_all_dto.py +3 -3
  219. immichpy/client/generated/models/notification_dto.py +15 -9
  220. immichpy/client/generated/models/notification_level.py +1 -1
  221. immichpy/client/generated/models/notification_type.py +1 -1
  222. immichpy/client/generated/models/notification_update_all_dto.py +5 -3
  223. immichpy/client/generated/models/notification_update_dto.py +4 -2
  224. immichpy/client/generated/models/o_auth_authorize_response_dto.py +3 -3
  225. immichpy/client/generated/models/o_auth_callback_dto.py +8 -4
  226. immichpy/client/generated/models/o_auth_config_dto.py +10 -4
  227. immichpy/client/generated/models/o_auth_token_endpoint_auth_method.py +2 -2
  228. immichpy/client/generated/models/ocr_config.py +14 -6
  229. immichpy/client/generated/models/on_this_day_dto.py +2 -2
  230. immichpy/client/generated/models/onboarding_dto.py +4 -2
  231. immichpy/client/generated/models/onboarding_response_dto.py +4 -2
  232. immichpy/client/generated/models/partner_create_dto.py +4 -2
  233. immichpy/client/generated/models/partner_direction.py +1 -1
  234. immichpy/client/generated/models/partner_response_dto.py +16 -8
  235. immichpy/client/generated/models/partner_update_dto.py +4 -2
  236. immichpy/client/generated/models/people_response.py +5 -3
  237. immichpy/client/generated/models/people_response_dto.py +7 -5
  238. immichpy/client/generated/models/people_update.py +9 -3
  239. immichpy/client/generated/models/people_update_dto.py +3 -3
  240. immichpy/client/generated/models/people_update_item.py +10 -10
  241. immichpy/client/generated/models/permission.py +13 -2
  242. immichpy/client/generated/models/person_create_dto.py +8 -8
  243. immichpy/client/generated/models/person_response_dto.py +17 -9
  244. immichpy/client/generated/models/person_statistics_response_dto.py +3 -3
  245. immichpy/client/generated/models/person_update_dto.py +9 -9
  246. immichpy/client/generated/models/person_with_faces_response_dto.py +20 -10
  247. immichpy/client/generated/models/pin_code_change_dto.py +10 -4
  248. immichpy/client/generated/models/pin_code_reset_dto.py +7 -3
  249. immichpy/client/generated/models/pin_code_setup_dto.py +2 -2
  250. immichpy/client/generated/models/places_response_dto.py +11 -7
  251. immichpy/client/generated/models/plugin_action_response_dto.py +13 -9
  252. immichpy/client/generated/models/{plugin_context.py → plugin_context_type.py} +4 -4
  253. immichpy/client/generated/models/plugin_filter_response_dto.py +13 -9
  254. immichpy/client/generated/models/plugin_response_dto.py +11 -11
  255. immichpy/client/generated/models/plugin_trigger_response_dto.py +89 -0
  256. immichpy/client/generated/models/plugin_trigger_type.py +2 -2
  257. immichpy/client/generated/models/purchase_response.py +7 -3
  258. immichpy/client/generated/models/purchase_update.py +7 -3
  259. immichpy/client/generated/models/queue_command.py +2 -2
  260. immichpy/client/generated/models/queue_command_dto.py +6 -4
  261. immichpy/client/generated/models/queue_delete_dto.py +1 -1
  262. immichpy/client/generated/models/queue_job_response_dto.py +6 -6
  263. immichpy/client/generated/models/queue_job_status.py +1 -1
  264. immichpy/client/generated/models/queue_name.py +2 -1
  265. immichpy/client/generated/models/queue_response_dto.py +5 -3
  266. immichpy/client/generated/models/queue_response_legacy_dto.py +1 -1
  267. immichpy/client/generated/models/queue_statistics_dto.py +8 -8
  268. immichpy/client/generated/models/queue_status_legacy_dto.py +8 -3
  269. immichpy/client/generated/models/queue_update_dto.py +4 -2
  270. immichpy/client/generated/models/queues_response_legacy_dto.py +9 -1
  271. immichpy/client/generated/models/random_search_dto.py +96 -34
  272. immichpy/client/generated/models/ratings_response.py +3 -3
  273. immichpy/client/generated/models/ratings_update.py +5 -3
  274. immichpy/client/generated/models/reaction_level.py +1 -1
  275. immichpy/client/generated/models/reaction_type.py +1 -1
  276. immichpy/client/generated/models/reverse_geocoding_state_response_dto.py +7 -3
  277. immichpy/client/generated/models/rotate_parameters.py +84 -0
  278. immichpy/client/generated/models/search_album_response_dto.py +4 -4
  279. immichpy/client/generated/models/search_asset_response_dto.py +6 -4
  280. immichpy/client/generated/models/search_explore_item.py +3 -3
  281. immichpy/client/generated/models/search_explore_response_dto.py +2 -2
  282. immichpy/client/generated/models/search_facet_count_response_dto.py +4 -4
  283. immichpy/client/generated/models/search_facet_response_dto.py +3 -3
  284. immichpy/client/generated/models/search_response_dto.py +1 -1
  285. immichpy/client/generated/models/search_statistics_response_dto.py +3 -3
  286. immichpy/client/generated/models/search_suggestion_type.py +1 -1
  287. immichpy/client/generated/models/server_about_response_dto.py +46 -22
  288. immichpy/client/generated/models/server_apk_links_dto.py +12 -6
  289. immichpy/client/generated/models/server_config_dto.py +36 -12
  290. immichpy/client/generated/models/server_features_dto.py +32 -16
  291. immichpy/client/generated/models/server_media_types_response_dto.py +5 -5
  292. immichpy/client/generated/models/server_ping_response.py +1 -1
  293. immichpy/client/generated/models/server_stats_response_dto.py +10 -6
  294. immichpy/client/generated/models/server_storage_response_dto.py +21 -8
  295. immichpy/client/generated/models/server_theme_dto.py +4 -2
  296. immichpy/client/generated/models/server_version_history_response_dto.py +6 -4
  297. immichpy/client/generated/models/server_version_response_dto.py +5 -5
  298. immichpy/client/generated/models/session_create_dto.py +8 -4
  299. immichpy/client/generated/models/session_create_response_dto.py +17 -11
  300. immichpy/client/generated/models/session_response_dto.py +16 -10
  301. immichpy/client/generated/models/session_unlock_dto.py +7 -3
  302. immichpy/client/generated/models/session_update_dto.py +2 -2
  303. immichpy/client/generated/models/set_maintenance_mode_dto.py +17 -7
  304. immichpy/client/generated/models/shared_link_create_dto.py +25 -11
  305. immichpy/client/generated/models/shared_link_edit_dto.py +19 -9
  306. immichpy/client/generated/models/shared_link_response_dto.py +18 -14
  307. immichpy/client/generated/models/shared_link_type.py +2 -2
  308. immichpy/client/generated/models/shared_links_response.py +5 -3
  309. immichpy/client/generated/models/shared_links_update.py +9 -3
  310. immichpy/client/generated/models/sign_up_dto.py +5 -5
  311. immichpy/client/generated/models/smart_search_dto.py +102 -36
  312. immichpy/client/generated/models/source_type.py +2 -2
  313. immichpy/client/generated/models/stack_create_dto.py +2 -2
  314. immichpy/client/generated/models/stack_response_dto.py +6 -4
  315. immichpy/client/generated/models/stack_update_dto.py +4 -2
  316. immichpy/client/generated/models/statistics_search_dto.py +86 -30
  317. immichpy/client/generated/models/storage_folder.py +38 -0
  318. immichpy/client/generated/models/sync_ack_delete_dto.py +5 -3
  319. immichpy/client/generated/models/sync_ack_dto.py +4 -4
  320. immichpy/client/generated/models/sync_ack_set_dto.py +4 -2
  321. immichpy/client/generated/models/sync_album_delete_v1.py +2 -2
  322. immichpy/client/generated/models/sync_album_to_asset_delete_v1.py +3 -3
  323. immichpy/client/generated/models/sync_album_to_asset_v1.py +3 -3
  324. immichpy/client/generated/models/sync_album_user_delete_v1.py +3 -3
  325. immichpy/client/generated/models/sync_album_user_v1.py +4 -4
  326. immichpy/client/generated/models/sync_album_v1.py +13 -9
  327. immichpy/client/generated/models/sync_asset_delete_v1.py +2 -2
  328. immichpy/client/generated/models/sync_asset_exif_v1.py +46 -26
  329. immichpy/client/generated/models/sync_asset_face_delete_v1.py +2 -2
  330. immichpy/client/generated/models/sync_asset_face_v1.py +5 -5
  331. immichpy/client/generated/models/sync_asset_metadata_delete_v1.py +3 -4
  332. immichpy/client/generated/models/sync_asset_metadata_v1.py +4 -5
  333. immichpy/client/generated/models/sync_asset_v1.py +47 -18
  334. immichpy/client/generated/models/sync_auth_user_v1.py +22 -12
  335. immichpy/client/generated/models/sync_entity_type.py +2 -2
  336. immichpy/client/generated/models/sync_memory_asset_delete_v1.py +3 -3
  337. immichpy/client/generated/models/sync_memory_asset_v1.py +3 -3
  338. immichpy/client/generated/models/sync_memory_delete_v1.py +2 -2
  339. immichpy/client/generated/models/sync_memory_v1.py +13 -13
  340. immichpy/client/generated/models/sync_partner_delete_v1.py +5 -3
  341. immichpy/client/generated/models/sync_partner_v1.py +6 -4
  342. immichpy/client/generated/models/sync_person_delete_v1.py +2 -2
  343. immichpy/client/generated/models/sync_person_v1.py +13 -11
  344. immichpy/client/generated/models/sync_request_type.py +2 -2
  345. immichpy/client/generated/models/sync_stack_delete_v1.py +2 -2
  346. immichpy/client/generated/models/sync_stack_v1.py +8 -6
  347. immichpy/client/generated/models/sync_stream_dto.py +4 -4
  348. immichpy/client/generated/models/sync_user_delete_v1.py +2 -2
  349. immichpy/client/generated/models/sync_user_metadata_delete_v1.py +3 -3
  350. immichpy/client/generated/models/sync_user_metadata_v1.py +4 -4
  351. immichpy/client/generated/models/sync_user_v1.py +16 -8
  352. immichpy/client/generated/models/system_config_backups_dto.py +1 -1
  353. immichpy/client/generated/models/system_config_dto.py +1 -1
  354. immichpy/client/generated/models/system_config_f_fmpeg_dto.py +44 -22
  355. immichpy/client/generated/models/system_config_faces_dto.py +2 -2
  356. immichpy/client/generated/models/system_config_generated_fullsize_image_dto.py +13 -7
  357. immichpy/client/generated/models/system_config_generated_image_dto.py +14 -8
  358. immichpy/client/generated/models/system_config_image_dto.py +5 -3
  359. immichpy/client/generated/models/system_config_job_dto.py +9 -1
  360. immichpy/client/generated/models/system_config_library_dto.py +1 -1
  361. immichpy/client/generated/models/system_config_library_scan_dto.py +2 -2
  362. immichpy/client/generated/models/system_config_library_watch_dto.py +3 -3
  363. immichpy/client/generated/models/system_config_logging_dto.py +3 -3
  364. immichpy/client/generated/models/system_config_machine_learning_dto.py +2 -2
  365. immichpy/client/generated/models/system_config_map_dto.py +2 -2
  366. immichpy/client/generated/models/system_config_metadata_dto.py +1 -1
  367. immichpy/client/generated/models/system_config_new_version_check_dto.py +3 -3
  368. immichpy/client/generated/models/system_config_nightly_tasks_dto.py +16 -6
  369. immichpy/client/generated/models/system_config_notifications_dto.py +1 -1
  370. immichpy/client/generated/models/system_config_o_auth_dto.py +28 -18
  371. immichpy/client/generated/models/system_config_password_login_dto.py +3 -3
  372. immichpy/client/generated/models/system_config_reverse_geocoding_dto.py +3 -3
  373. immichpy/client/generated/models/system_config_server_dto.py +8 -4
  374. immichpy/client/generated/models/system_config_smtp_dto.py +8 -4
  375. immichpy/client/generated/models/system_config_smtp_transport_dto.py +9 -7
  376. immichpy/client/generated/models/system_config_storage_template_dto.py +6 -4
  377. immichpy/client/generated/models/system_config_template_emails_dto.py +1 -1
  378. immichpy/client/generated/models/system_config_template_storage_option_dto.py +32 -9
  379. immichpy/client/generated/models/system_config_templates_dto.py +1 -1
  380. immichpy/client/generated/models/system_config_theme_dto.py +4 -2
  381. immichpy/client/generated/models/system_config_trash_dto.py +3 -3
  382. immichpy/client/generated/models/system_config_user_dto.py +4 -2
  383. immichpy/client/generated/models/tag_bulk_assets_dto.py +3 -3
  384. immichpy/client/generated/models/tag_bulk_assets_response_dto.py +3 -3
  385. immichpy/client/generated/models/tag_create_dto.py +8 -4
  386. immichpy/client/generated/models/tag_response_dto.py +10 -8
  387. immichpy/client/generated/models/tag_update_dto.py +3 -3
  388. immichpy/client/generated/models/tag_upsert_dto.py +3 -3
  389. immichpy/client/generated/models/tags_response.py +5 -3
  390. immichpy/client/generated/models/tags_update.py +9 -3
  391. immichpy/client/generated/models/template_dto.py +3 -3
  392. immichpy/client/generated/models/template_response_dto.py +4 -4
  393. immichpy/client/generated/models/test_email_response_dto.py +2 -2
  394. immichpy/client/generated/models/time_bucket_asset_response_dto.py +2 -3
  395. immichpy/client/generated/models/time_buckets_response_dto.py +1 -1
  396. immichpy/client/generated/models/tone_mapping.py +2 -2
  397. immichpy/client/generated/models/transcode_hw_accel.py +2 -2
  398. immichpy/client/generated/models/transcode_policy.py +2 -2
  399. immichpy/client/generated/models/trash_response_dto.py +3 -3
  400. immichpy/client/generated/models/update_album_dto.py +12 -6
  401. immichpy/client/generated/models/update_album_user_dto.py +3 -3
  402. immichpy/client/generated/models/update_asset_dto.py +21 -9
  403. immichpy/client/generated/models/update_library_dto.py +8 -4
  404. immichpy/client/generated/models/usage_by_user_dto.py +16 -9
  405. immichpy/client/generated/models/user_admin_create_dto.py +20 -10
  406. immichpy/client/generated/models/user_admin_delete_dto.py +5 -3
  407. immichpy/client/generated/models/user_admin_response_dto.py +35 -18
  408. immichpy/client/generated/models/user_admin_update_dto.py +20 -10
  409. immichpy/client/generated/models/user_avatar_color.py +2 -2
  410. immichpy/client/generated/models/user_license.py +6 -4
  411. immichpy/client/generated/models/user_metadata_key.py +2 -2
  412. immichpy/client/generated/models/user_preferences_response_dto.py +1 -1
  413. immichpy/client/generated/models/user_preferences_update_dto.py +1 -1
  414. immichpy/client/generated/models/user_response_dto.py +13 -7
  415. immichpy/client/generated/models/user_status.py +2 -2
  416. immichpy/client/generated/models/user_update_me_dto.py +10 -5
  417. immichpy/client/generated/models/validate_access_token_response_dto.py +4 -2
  418. immichpy/client/generated/models/validate_library_dto.py +9 -3
  419. immichpy/client/generated/models/validate_library_import_path_response_dto.py +4 -4
  420. immichpy/client/generated/models/validate_library_response_dto.py +4 -2
  421. immichpy/client/generated/models/version_check_state_response_dto.py +7 -3
  422. immichpy/client/generated/models/video_codec.py +2 -2
  423. immichpy/client/generated/models/video_container.py +2 -2
  424. immichpy/client/generated/models/workflow_action_item_dto.py +7 -3
  425. immichpy/client/generated/models/workflow_action_response_dto.py +10 -6
  426. immichpy/client/generated/models/workflow_create_dto.py +11 -7
  427. immichpy/client/generated/models/workflow_filter_item_dto.py +7 -3
  428. immichpy/client/generated/models/workflow_filter_response_dto.py +10 -6
  429. immichpy/client/generated/models/workflow_response_dto.py +14 -27
  430. immichpy/client/generated/models/workflow_update_dto.py +19 -7
  431. immichpy/client/generated/rest.py +1 -1
  432. immichpy/client/main.py +4 -1
  433. {immichpy-1.6.5.dist-info → immichpy-1.7.6.dist-info}/METADATA +1 -3
  434. immichpy-1.7.6.dist-info/RECORD +464 -0
  435. immichpy-1.6.5.dist-info/RECORD +0 -439
  436. {immichpy-1.6.5.dist-info → immichpy-1.7.6.dist-info}/WHEEL +0 -0
  437. {immichpy-1.6.5.dist-info → immichpy-1.7.6.dist-info}/entry_points.txt +0 -0
  438. {immichpy-1.6.5.dist-info → immichpy-1.7.6.dist-info}/licenses/LICENSE +0 -0
@@ -20,12 +20,22 @@ app = typer.Typer(
20
20
  def change_password(
21
21
  ctx: typer.Context,
22
22
  invalidate_sessions: Literal["true", "false"] | None = typer.Option(
23
- None, "--invalidate-sessions", help=""""""
23
+ None, "--invalidate-sessions", help="""Invalidate all other sessions"""
24
24
  ),
25
25
  new_password: str = typer.Option(
26
- ..., "--new-password", help="""Example: password"""
26
+ ...,
27
+ "--new-password",
28
+ help="""New password (min 8 characters)
29
+
30
+ Example: password""",
31
+ ),
32
+ password: str = typer.Option(
33
+ ...,
34
+ "--password",
35
+ help="""Current password
36
+
37
+ Example: password""",
27
38
  ),
28
- password: str = typer.Option(..., "--password", help="""Example: password"""),
29
39
  ) -> None:
30
40
  """Change password
31
41
 
@@ -49,9 +59,25 @@ def change_password(
49
59
  @app.command("change-pin-code", deprecated=False, rich_help_panel="API commands")
50
60
  def change_pin_code(
51
61
  ctx: typer.Context,
52
- new_pin_code: str = typer.Option(..., "--new-pin-code", help="""Example: 123456"""),
53
- password: str | None = typer.Option(None, "--password", help=""""""),
54
- pin_code: str | None = typer.Option(None, "--pin-code", help="""Example: 123456"""),
62
+ new_pin_code: str = typer.Option(
63
+ ...,
64
+ "--new-pin-code",
65
+ help="""New PIN code (4-6 digits)
66
+
67
+ Example: 123456""",
68
+ ),
69
+ password: str | None = typer.Option(
70
+ None,
71
+ "--password",
72
+ help="""User password (required if PIN code is not provided)""",
73
+ ),
74
+ pin_code: str | None = typer.Option(
75
+ None,
76
+ "--pin-code",
77
+ help="""New PIN code (4-6 digits)
78
+
79
+ Example: 123456""",
80
+ ),
55
81
  ) -> None:
56
82
  """Change pin code
57
83
 
@@ -74,9 +100,11 @@ def change_pin_code(
74
100
  @app.command("finish-o-auth", deprecated=False, rich_help_panel="API commands")
75
101
  def finish_o_auth(
76
102
  ctx: typer.Context,
77
- code_verifier: str | None = typer.Option(None, "--code-verifier", help=""""""),
78
- state: str | None = typer.Option(None, "--state", help=""""""),
79
- url: str = typer.Option(..., "--url", help=""""""),
103
+ code_verifier: str | None = typer.Option(
104
+ None, "--code-verifier", help="""OAuth code verifier (PKCE)"""
105
+ ),
106
+ state: str | None = typer.Option(None, "--state", help="""OAuth state parameter"""),
107
+ url: str = typer.Option(..., "--url", help="""OAuth callback URL"""),
80
108
  ) -> None:
81
109
  """Finish OAuth
82
110
 
@@ -113,9 +141,11 @@ def get_auth_status(
113
141
  @app.command("link-o-auth-account", deprecated=False, rich_help_panel="API commands")
114
142
  def link_o_auth_account(
115
143
  ctx: typer.Context,
116
- code_verifier: str | None = typer.Option(None, "--code-verifier", help=""""""),
117
- state: str | None = typer.Option(None, "--state", help=""""""),
118
- url: str = typer.Option(..., "--url", help=""""""),
144
+ code_verifier: str | None = typer.Option(
145
+ None, "--code-verifier", help="""OAuth code verifier (PKCE)"""
146
+ ),
147
+ state: str | None = typer.Option(None, "--state", help="""OAuth state parameter"""),
148
+ url: str = typer.Option(..., "--url", help="""OAuth callback URL"""),
119
149
  ) -> None:
120
150
  """Link OAuth account
121
151
 
@@ -152,8 +182,20 @@ def lock_auth_session(
152
182
  @app.command("login", deprecated=False, rich_help_panel="API commands")
153
183
  def login(
154
184
  ctx: typer.Context,
155
- email: str = typer.Option(..., "--email", help="""Example: testuser@email.com"""),
156
- password: str = typer.Option(..., "--password", help="""Example: password"""),
185
+ email: str = typer.Option(
186
+ ...,
187
+ "--email",
188
+ help="""User email
189
+
190
+ Example: testuser@email.com""",
191
+ ),
192
+ password: str = typer.Option(
193
+ ...,
194
+ "--password",
195
+ help="""User password
196
+
197
+ Example: password""",
198
+ ),
157
199
  ) -> None:
158
200
  """Login
159
201
 
@@ -205,8 +247,18 @@ def redirect_o_auth_to_mobile(
205
247
  @app.command("reset-pin-code", deprecated=False, rich_help_panel="API commands")
206
248
  def reset_pin_code(
207
249
  ctx: typer.Context,
208
- password: str | None = typer.Option(None, "--password", help=""""""),
209
- pin_code: str | None = typer.Option(None, "--pin-code", help="""Example: 123456"""),
250
+ password: str | None = typer.Option(
251
+ None,
252
+ "--password",
253
+ help="""User password (required if PIN code is not provided)""",
254
+ ),
255
+ pin_code: str | None = typer.Option(
256
+ None,
257
+ "--pin-code",
258
+ help="""New PIN code (4-6 digits)
259
+
260
+ Example: 123456""",
261
+ ),
210
262
  ) -> None:
211
263
  """Reset pin code
212
264
 
@@ -228,7 +280,13 @@ def reset_pin_code(
228
280
  @app.command("setup-pin-code", deprecated=False, rich_help_panel="API commands")
229
281
  def setup_pin_code(
230
282
  ctx: typer.Context,
231
- pin_code: str = typer.Option(..., "--pin-code", help="""Example: 123456"""),
283
+ pin_code: str = typer.Option(
284
+ ...,
285
+ "--pin-code",
286
+ help="""PIN code (4-6 digits)
287
+
288
+ Example: 123456""",
289
+ ),
232
290
  ) -> None:
233
291
  """Setup pin code
234
292
 
@@ -247,9 +305,27 @@ def setup_pin_code(
247
305
  @app.command("sign-up-admin", deprecated=False, rich_help_panel="API commands")
248
306
  def sign_up_admin(
249
307
  ctx: typer.Context,
250
- email: str = typer.Option(..., "--email", help="""Example: testuser@email.com"""),
251
- name: str = typer.Option(..., "--name", help="""Example: Admin"""),
252
- password: str = typer.Option(..., "--password", help="""Example: password"""),
308
+ email: str = typer.Option(
309
+ ...,
310
+ "--email",
311
+ help="""User email
312
+
313
+ Example: testuser@email.com""",
314
+ ),
315
+ name: str = typer.Option(
316
+ ...,
317
+ "--name",
318
+ help="""User name
319
+
320
+ Example: Admin""",
321
+ ),
322
+ password: str = typer.Option(
323
+ ...,
324
+ "--password",
325
+ help="""User password
326
+
327
+ Example: password""",
328
+ ),
253
329
  ) -> None:
254
330
  """Register admin
255
331
 
@@ -270,9 +346,13 @@ def sign_up_admin(
270
346
  @app.command("start-o-auth", deprecated=False, rich_help_panel="API commands")
271
347
  def start_o_auth(
272
348
  ctx: typer.Context,
273
- code_challenge: str | None = typer.Option(None, "--code-challenge", help=""""""),
274
- redirect_uri: str = typer.Option(..., "--redirect-uri", help=""""""),
275
- state: str | None = typer.Option(None, "--state", help=""""""),
349
+ code_challenge: str | None = typer.Option(
350
+ None, "--code-challenge", help="""OAuth code challenge (PKCE)"""
351
+ ),
352
+ redirect_uri: str = typer.Option(
353
+ ..., "--redirect-uri", help="""OAuth redirect URI"""
354
+ ),
355
+ state: str | None = typer.Option(None, "--state", help="""OAuth state parameter"""),
276
356
  ) -> None:
277
357
  """Start OAuth
278
358
 
@@ -309,8 +389,18 @@ def unlink_o_auth_account(
309
389
  @app.command("unlock-auth-session", deprecated=False, rich_help_panel="API commands")
310
390
  def unlock_auth_session(
311
391
  ctx: typer.Context,
312
- password: str | None = typer.Option(None, "--password", help=""""""),
313
- pin_code: str | None = typer.Option(None, "--pin-code", help="""Example: 123456"""),
392
+ password: str | None = typer.Option(
393
+ None,
394
+ "--password",
395
+ help="""User password (required if PIN code is not provided)""",
396
+ ),
397
+ pin_code: str | None = typer.Option(
398
+ None,
399
+ "--pin-code",
400
+ help="""New PIN code (4-6 digits)
401
+
402
+ Example: 123456""",
403
+ ),
314
404
  ) -> None:
315
405
  """Unlock auth session
316
406
 
@@ -0,0 +1,111 @@
1
+ """Generated CLI commands for Database Backups (admin) tag (auto-generated, do not edit)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import typer
6
+ from pathlib import Path
7
+ from typing import TYPE_CHECKING
8
+
9
+ if TYPE_CHECKING:
10
+ from immichpy import AsyncClient
11
+
12
+ from immichpy.cli.runtime import print_response, run_command, set_nested
13
+ from immichpy.client.generated.models import *
14
+
15
+ app = typer.Typer(
16
+ help="""Manage backups of the Immich database.\n\n[link=https://api.immich.app/endpoints/database-backups-admin]Immich API documentation[/link]"""
17
+ )
18
+
19
+
20
+ @app.command("delete-database-backup", deprecated=False, rich_help_panel="API commands")
21
+ def delete_database_backup(
22
+ ctx: typer.Context,
23
+ backups: list[str] = typer.Option(..., "--backups", help=""""""),
24
+ ) -> None:
25
+ """Delete database backup
26
+
27
+ [link=https://api.immich.app/endpoints/database-backups-admin/deleteDatabaseBackup]Immich API documentation[/link]
28
+ """
29
+ kwargs = {}
30
+ json_data = {}
31
+ set_nested(json_data, ["backups"], backups)
32
+ database_backup_delete_dto = DatabaseBackupDeleteDto.model_validate(json_data)
33
+ kwargs["database_backup_delete_dto"] = database_backup_delete_dto
34
+ client: "AsyncClient" = ctx.obj["client"]
35
+ result = run_command(
36
+ client, client.backups, "delete_database_backup", ctx, **kwargs
37
+ )
38
+ print_response(result, ctx)
39
+
40
+
41
+ @app.command(
42
+ "download-database-backup", deprecated=False, rich_help_panel="API commands"
43
+ )
44
+ def download_database_backup(
45
+ ctx: typer.Context,
46
+ filename: str = typer.Argument(..., help=""""""),
47
+ ) -> None:
48
+ """Download database backup
49
+
50
+ [link=https://api.immich.app/endpoints/database-backups-admin/downloadDatabaseBackup]Immich API documentation[/link]
51
+ """
52
+ kwargs = {}
53
+ kwargs["filename"] = filename
54
+ client: "AsyncClient" = ctx.obj["client"]
55
+ result = run_command(
56
+ client, client.backups, "download_database_backup", ctx, **kwargs
57
+ )
58
+ print_response(result, ctx)
59
+
60
+
61
+ @app.command("list-database-backups", deprecated=False, rich_help_panel="API commands")
62
+ def list_database_backups(
63
+ ctx: typer.Context,
64
+ ) -> None:
65
+ """List database backups
66
+
67
+ [link=https://api.immich.app/endpoints/database-backups-admin/listDatabaseBackups]Immich API documentation[/link]
68
+ """
69
+ kwargs = {}
70
+ client: "AsyncClient" = ctx.obj["client"]
71
+ result = run_command(client, client.backups, "list_database_backups", ctx, **kwargs)
72
+ print_response(result, ctx)
73
+
74
+
75
+ @app.command(
76
+ "start-database-restore-flow", deprecated=False, rich_help_panel="API commands"
77
+ )
78
+ def start_database_restore_flow(
79
+ ctx: typer.Context,
80
+ ) -> None:
81
+ """Start database backup restore flow
82
+
83
+ [link=https://api.immich.app/endpoints/database-backups-admin/startDatabaseRestoreFlow]Immich API documentation[/link]
84
+ """
85
+ kwargs = {}
86
+ client: "AsyncClient" = ctx.obj["client"]
87
+ result = run_command(
88
+ client, client.backups, "start_database_restore_flow", ctx, **kwargs
89
+ )
90
+ print_response(result, ctx)
91
+
92
+
93
+ @app.command("upload-database-backup", deprecated=False, rich_help_panel="API commands")
94
+ def upload_database_backup(
95
+ ctx: typer.Context,
96
+ file: Path | None = typer.Option(None, "--file", help="""""", exists=True),
97
+ ) -> None:
98
+ """Upload database backup
99
+
100
+ [link=https://api.immich.app/endpoints/database-backups-admin/uploadDatabaseBackup]Immich API documentation[/link]
101
+ """
102
+ kwargs = {}
103
+ json_data = {}
104
+ if file is not None:
105
+ set_nested(json_data, ["file"], (file.name, file.read_bytes()))
106
+ kwargs.update(json_data)
107
+ client: "AsyncClient" = ctx.obj["client"]
108
+ result = run_command(
109
+ client, client.backups, "upload_database_backup", ctx, **kwargs
110
+ )
111
+ print_response(result, ctx)
@@ -19,7 +19,7 @@ app = typer.Typer(
19
19
  @app.command("download-archive", deprecated=False, rich_help_panel="API commands")
20
20
  def download_archive(
21
21
  ctx: typer.Context,
22
- asset_ids: list[str] = typer.Option(..., "--asset-ids", help=""""""),
22
+ asset_ids: list[str] = typer.Option(..., "--asset-ids", help="""Asset IDs"""),
23
23
  key: str | None = typer.Option(None, "--key", help=""""""),
24
24
  slug: str | None = typer.Option(None, "--slug", help=""""""),
25
25
  ) -> None:
@@ -44,12 +44,20 @@ def download_archive(
44
44
  @app.command("get-download-info", deprecated=False, rich_help_panel="API commands")
45
45
  def get_download_info(
46
46
  ctx: typer.Context,
47
- album_id: str | None = typer.Option(None, "--album-id", help=""""""),
48
- archive_size: int | None = typer.Option(None, "--archive-size", help="""""", min=1),
49
- asset_ids: list[str] | None = typer.Option(None, "--asset-ids", help=""""""),
47
+ album_id: str | None = typer.Option(
48
+ None, "--album-id", help="""Album ID to download"""
49
+ ),
50
+ archive_size: int | None = typer.Option(
51
+ None, "--archive-size", help="""Archive size limit in bytes""", min=1
52
+ ),
53
+ asset_ids: list[str] | None = typer.Option(
54
+ None, "--asset-ids", help="""Asset IDs to download"""
55
+ ),
50
56
  key: str | None = typer.Option(None, "--key", help=""""""),
51
57
  slug: str | None = typer.Option(None, "--slug", help=""""""),
52
- user_id: str | None = typer.Option(None, "--user-id", help=""""""),
58
+ user_id: str | None = typer.Option(
59
+ None, "--user-id", help="""User ID to download assets from"""
60
+ ),
53
61
  ) -> None:
54
62
  """Retrieve download information
55
63
 
@@ -35,7 +35,7 @@ def delete_duplicate(
35
35
  @app.command("delete-duplicates", deprecated=False, rich_help_panel="API commands")
36
36
  def delete_duplicates(
37
37
  ctx: typer.Context,
38
- ids: list[str] = typer.Option(..., "--ids", help=""""""),
38
+ ids: list[str] = typer.Option(..., "--ids", help="""IDs to process"""),
39
39
  ) -> None:
40
40
  """Delete duplicates
41
41
 
@@ -19,14 +19,18 @@ app = typer.Typer(
19
19
  @app.command("create-face", deprecated=False, rich_help_panel="API commands")
20
20
  def create_face(
21
21
  ctx: typer.Context,
22
- asset_id: str = typer.Option(..., "--asset-id", help=""""""),
23
- height: int = typer.Option(..., "--height", help=""""""),
24
- image_height: int = typer.Option(..., "--image-height", help=""""""),
25
- image_width: int = typer.Option(..., "--image-width", help=""""""),
26
- person_id: str = typer.Option(..., "--person-id", help=""""""),
27
- width: int = typer.Option(..., "--width", help=""""""),
28
- x: int = typer.Option(..., "--x", help=""""""),
29
- y: int = typer.Option(..., "--y", help=""""""),
22
+ asset_id: str = typer.Option(..., "--asset-id", help="""Asset ID"""),
23
+ height: int = typer.Option(..., "--height", help="""Face bounding box height"""),
24
+ image_height: int = typer.Option(
25
+ ..., "--image-height", help="""Image height in pixels"""
26
+ ),
27
+ image_width: int = typer.Option(
28
+ ..., "--image-width", help="""Image width in pixels"""
29
+ ),
30
+ person_id: str = typer.Option(..., "--person-id", help="""Person ID"""),
31
+ width: int = typer.Option(..., "--width", help="""Face bounding box width"""),
32
+ x: int = typer.Option(..., "--x", help="""Face bounding box X coordinate"""),
33
+ y: int = typer.Option(..., "--y", help="""Face bounding box Y coordinate"""),
30
34
  ) -> None:
31
35
  """Create a face
32
36
 
@@ -53,7 +57,9 @@ def create_face(
53
57
  def delete_face(
54
58
  ctx: typer.Context,
55
59
  id: str = typer.Argument(..., help=""""""),
56
- force: bool = typer.Option(..., "--force", help=""""""),
60
+ force: bool = typer.Option(
61
+ ..., "--force", help="""Force delete even if person has other faces"""
62
+ ),
57
63
  ) -> None:
58
64
  """Delete a face
59
65
 
@@ -73,7 +79,7 @@ def delete_face(
73
79
  @app.command("get-faces", deprecated=False, rich_help_panel="API commands")
74
80
  def get_faces(
75
81
  ctx: typer.Context,
76
- id: str = typer.Option(..., "--id", help=""""""),
82
+ id: str = typer.Option(..., "--id", help="""Face ID"""),
77
83
  ) -> None:
78
84
  """Retrieve faces for asset
79
85
 
@@ -90,7 +96,7 @@ def get_faces(
90
96
  def reassign_faces_by_id(
91
97
  ctx: typer.Context,
92
98
  id: str = typer.Argument(..., help=""""""),
93
- body_id: str = typer.Option(..., "--body-id", help=""""""),
99
+ body_id: str = typer.Option(..., "--body-id", help="""Face ID"""),
94
100
  ) -> None:
95
101
  """Re-assign a face to another person
96
102
 
@@ -19,7 +19,7 @@ app = typer.Typer(
19
19
  @app.command("create-job", deprecated=False, rich_help_panel="API commands")
20
20
  def create_job(
21
21
  ctx: typer.Context,
22
- name: str = typer.Option(..., "--name", help=""""""),
22
+ name: str = typer.Option(..., "--name", help="""Job name"""),
23
23
  ) -> None:
24
24
  """Create a manual job
25
25
 
@@ -54,9 +54,11 @@ def get_queues_legacy(
54
54
  )
55
55
  def run_queue_command_legacy(
56
56
  ctx: typer.Context,
57
- name: QueueName = typer.Argument(..., help=""""""),
58
- command: str = typer.Option(..., "--command", help=""""""),
59
- force: Literal["true", "false"] | None = typer.Option(None, "--force", help=""""""),
57
+ name: QueueName = typer.Argument(..., help="""Queue name"""),
58
+ command: str = typer.Option(..., "--command", help="""Queue command to execute"""),
59
+ force: Literal["true", "false"] | None = typer.Option(
60
+ None, "--force", help="""Force the command execution (if applicable)"""
61
+ ),
60
62
  ) -> None:
61
63
  """Run jobs
62
64
 
@@ -20,11 +20,13 @@ app = typer.Typer(
20
20
  def create_library(
21
21
  ctx: typer.Context,
22
22
  exclusion_patterns: list[str] | None = typer.Option(
23
- None, "--exclusion-patterns", help=""""""
23
+ None, "--exclusion-patterns", help="""Exclusion patterns (max 128)"""
24
24
  ),
25
- import_paths: list[str] | None = typer.Option(None, "--import-paths", help=""""""),
26
- name: str | None = typer.Option(None, "--name", help=""""""),
27
- owner_id: str = typer.Option(..., "--owner-id", help=""""""),
25
+ import_paths: list[str] | None = typer.Option(
26
+ None, "--import-paths", help="""Import paths (max 128)"""
27
+ ),
28
+ name: str | None = typer.Option(None, "--name", help="""Library name"""),
29
+ owner_id: str = typer.Option(..., "--owner-id", help="""Owner user ID"""),
28
30
  ) -> None:
29
31
  """Create a library
30
32
 
@@ -131,10 +133,12 @@ def update_library(
131
133
  ctx: typer.Context,
132
134
  id: str = typer.Argument(..., help=""""""),
133
135
  exclusion_patterns: list[str] | None = typer.Option(
134
- None, "--exclusion-patterns", help=""""""
136
+ None, "--exclusion-patterns", help="""Exclusion patterns (max 128)"""
137
+ ),
138
+ import_paths: list[str] | None = typer.Option(
139
+ None, "--import-paths", help="""Import paths (max 128)"""
135
140
  ),
136
- import_paths: list[str] | None = typer.Option(None, "--import-paths", help=""""""),
137
- name: str | None = typer.Option(None, "--name", help=""""""),
141
+ name: str | None = typer.Option(None, "--name", help="""Library name"""),
138
142
  ) -> None:
139
143
  """Update a library
140
144
 
@@ -161,9 +165,11 @@ def validate(
161
165
  ctx: typer.Context,
162
166
  id: str = typer.Argument(..., help=""""""),
163
167
  exclusion_patterns: list[str] | None = typer.Option(
164
- None, "--exclusion-patterns", help=""""""
168
+ None, "--exclusion-patterns", help="""Exclusion patterns (max 128)"""
169
+ ),
170
+ import_paths: list[str] | None = typer.Option(
171
+ None, "--import-paths", help="""Import paths to validate (max 128)"""
165
172
  ),
166
- import_paths: list[str] | None = typer.Option(None, "--import-paths", help=""""""),
167
173
  ) -> None:
168
174
  """Validate library settings
169
175
 
@@ -16,10 +16,42 @@ app = typer.Typer(
16
16
  )
17
17
 
18
18
 
19
+ @app.command("detect-prior-install", deprecated=False, rich_help_panel="API commands")
20
+ def detect_prior_install(
21
+ ctx: typer.Context,
22
+ ) -> None:
23
+ """Detect existing install
24
+
25
+ [link=https://api.immich.app/endpoints/maintenance-admin/detectPriorInstall]Immich API documentation[/link]
26
+ """
27
+ kwargs = {}
28
+ client: "AsyncClient" = ctx.obj["client"]
29
+ result = run_command(
30
+ client, client.maintenance_admin, "detect_prior_install", ctx, **kwargs
31
+ )
32
+ print_response(result, ctx)
33
+
34
+
35
+ @app.command("get-maintenance-status", deprecated=False, rich_help_panel="API commands")
36
+ def get_maintenance_status(
37
+ ctx: typer.Context,
38
+ ) -> None:
39
+ """Get maintenance mode status
40
+
41
+ [link=https://api.immich.app/endpoints/maintenance-admin/getMaintenanceStatus]Immich API documentation[/link]
42
+ """
43
+ kwargs = {}
44
+ client: "AsyncClient" = ctx.obj["client"]
45
+ result = run_command(
46
+ client, client.maintenance_admin, "get_maintenance_status", ctx, **kwargs
47
+ )
48
+ print_response(result, ctx)
49
+
50
+
19
51
  @app.command("maintenance-login", deprecated=False, rich_help_panel="API commands")
20
52
  def maintenance_login(
21
53
  ctx: typer.Context,
22
- token: str | None = typer.Option(None, "--token", help=""""""),
54
+ token: str | None = typer.Option(None, "--token", help="""Maintenance token"""),
23
55
  ) -> None:
24
56
  """Log into maintenance mode
25
57
 
@@ -41,7 +73,10 @@ def maintenance_login(
41
73
  @app.command("set-maintenance-mode", deprecated=False, rich_help_panel="API commands")
42
74
  def set_maintenance_mode(
43
75
  ctx: typer.Context,
44
- action: str = typer.Option(..., "--action", help=""""""),
76
+ action: str = typer.Option(..., "--action", help="""Maintenance action"""),
77
+ restore_backup_filename: str | None = typer.Option(
78
+ None, "--restore-backup-filename", help="""Restore backup filename"""
79
+ ),
45
80
  ) -> None:
46
81
  """Set maintenance mode
47
82
 
@@ -50,6 +85,8 @@ def set_maintenance_mode(
50
85
  kwargs = {}
51
86
  json_data = {}
52
87
  set_nested(json_data, ["action"], action)
88
+ if restore_backup_filename is not None:
89
+ set_nested(json_data, ["restore_backup_filename"], restore_backup_filename)
53
90
  set_maintenance_mode_dto = SetMaintenanceModeDto.model_validate(json_data)
54
91
  kwargs["set_maintenance_mode_dto"] = set_maintenance_mode_dto
55
92
  client: "AsyncClient" = ctx.obj["client"]
@@ -21,22 +21,22 @@ app = typer.Typer(
21
21
  def get_map_markers(
22
22
  ctx: typer.Context,
23
23
  file_created_after: datetime | None = typer.Option(
24
- None, "--file-created-after", help=""""""
24
+ None, "--file-created-after", help="""Filter assets created after this date"""
25
25
  ),
26
26
  file_created_before: datetime | None = typer.Option(
27
- None, "--file-created-before", help=""""""
27
+ None, "--file-created-before", help="""Filter assets created before this date"""
28
28
  ),
29
29
  is_archived: Literal["true", "false"] | None = typer.Option(
30
- None, "--is-archived", help=""""""
30
+ None, "--is-archived", help="""Filter by archived status"""
31
31
  ),
32
32
  is_favorite: Literal["true", "false"] | None = typer.Option(
33
- None, "--is-favorite", help=""""""
33
+ None, "--is-favorite", help="""Filter by favorite status"""
34
34
  ),
35
35
  with_partners: Literal["true", "false"] | None = typer.Option(
36
- None, "--with-partners", help=""""""
36
+ None, "--with-partners", help="""Include partner assets"""
37
37
  ),
38
38
  with_shared_albums: Literal["true", "false"] | None = typer.Option(
39
- None, "--with-shared-albums", help=""""""
39
+ None, "--with-shared-albums", help="""Include shared album assets"""
40
40
  ),
41
41
  ) -> None:
42
42
  """Retrieve map markers
@@ -64,8 +64,8 @@ def get_map_markers(
64
64
  @app.command("reverse-geocode", deprecated=False, rich_help_panel="API commands")
65
65
  def reverse_geocode(
66
66
  ctx: typer.Context,
67
- lat: float = typer.Option(..., "--lat", help=""""""),
68
- lon: float = typer.Option(..., "--lon", help=""""""),
67
+ lat: float = typer.Option(..., "--lat", help="""Latitude (-90 to 90)"""),
68
+ lon: float = typer.Option(..., "--lon", help="""Longitude (-180 to 180)"""),
69
69
  ) -> None:
70
70
  """Reverse geocode coordinates
71
71