mirror of
https://github.com/home-assistant/core.git
synced 2025-07-17 18:27:09 +00:00
Simplify google_photos service actions (#146744)
This commit is contained in:
parent
3d2dca5f0c
commit
56aa809074
@ -78,86 +78,85 @@ def _read_file_contents(
|
|||||||
return results
|
return results
|
||||||
|
|
||||||
|
|
||||||
|
async def _async_handle_upload(call: ServiceCall) -> ServiceResponse:
|
||||||
|
"""Generate content from text and optionally images."""
|
||||||
|
config_entry: GooglePhotosConfigEntry | None = (
|
||||||
|
call.hass.config_entries.async_get_entry(call.data[CONF_CONFIG_ENTRY_ID])
|
||||||
|
)
|
||||||
|
if not config_entry:
|
||||||
|
raise ServiceValidationError(
|
||||||
|
translation_domain=DOMAIN,
|
||||||
|
translation_key="integration_not_found",
|
||||||
|
translation_placeholders={"target": DOMAIN},
|
||||||
|
)
|
||||||
|
scopes = config_entry.data["token"]["scope"].split(" ")
|
||||||
|
if UPLOAD_SCOPE not in scopes:
|
||||||
|
raise HomeAssistantError(
|
||||||
|
translation_domain=DOMAIN,
|
||||||
|
translation_key="missing_upload_permission",
|
||||||
|
translation_placeholders={"target": DOMAIN},
|
||||||
|
)
|
||||||
|
coordinator = config_entry.runtime_data
|
||||||
|
client_api = coordinator.client
|
||||||
|
upload_tasks = []
|
||||||
|
file_results = await call.hass.async_add_executor_job(
|
||||||
|
_read_file_contents, call.hass, call.data[CONF_FILENAME]
|
||||||
|
)
|
||||||
|
|
||||||
|
album = call.data[CONF_ALBUM]
|
||||||
|
try:
|
||||||
|
album_id = await coordinator.get_or_create_album(album)
|
||||||
|
except GooglePhotosApiError as err:
|
||||||
|
raise HomeAssistantError(
|
||||||
|
translation_domain=DOMAIN,
|
||||||
|
translation_key="create_album_error",
|
||||||
|
translation_placeholders={"message": str(err)},
|
||||||
|
) from err
|
||||||
|
|
||||||
|
for mime_type, content in file_results:
|
||||||
|
upload_tasks.append(client_api.upload_content(content, mime_type))
|
||||||
|
try:
|
||||||
|
upload_results = await asyncio.gather(*upload_tasks)
|
||||||
|
except GooglePhotosApiError as err:
|
||||||
|
raise HomeAssistantError(
|
||||||
|
translation_domain=DOMAIN,
|
||||||
|
translation_key="upload_error",
|
||||||
|
translation_placeholders={"message": str(err)},
|
||||||
|
) from err
|
||||||
|
try:
|
||||||
|
upload_result = await client_api.create_media_items(
|
||||||
|
[
|
||||||
|
NewMediaItem(SimpleMediaItem(upload_token=upload_result.upload_token))
|
||||||
|
for upload_result in upload_results
|
||||||
|
],
|
||||||
|
album_id=album_id,
|
||||||
|
)
|
||||||
|
except GooglePhotosApiError as err:
|
||||||
|
raise HomeAssistantError(
|
||||||
|
translation_domain=DOMAIN,
|
||||||
|
translation_key="api_error",
|
||||||
|
translation_placeholders={"message": str(err)},
|
||||||
|
) from err
|
||||||
|
if call.return_response:
|
||||||
|
return {
|
||||||
|
"media_items": [
|
||||||
|
{"media_item_id": item_result.media_item.id}
|
||||||
|
for item_result in upload_result.new_media_item_results
|
||||||
|
if item_result.media_item and item_result.media_item.id
|
||||||
|
],
|
||||||
|
"album_id": album_id,
|
||||||
|
}
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def async_setup_services(hass: HomeAssistant) -> None:
|
def async_setup_services(hass: HomeAssistant) -> None:
|
||||||
"""Register Google Photos services."""
|
"""Register Google Photos services."""
|
||||||
|
|
||||||
async def async_handle_upload(call: ServiceCall) -> ServiceResponse:
|
|
||||||
"""Generate content from text and optionally images."""
|
|
||||||
config_entry: GooglePhotosConfigEntry | None = (
|
|
||||||
hass.config_entries.async_get_entry(call.data[CONF_CONFIG_ENTRY_ID])
|
|
||||||
)
|
|
||||||
if not config_entry:
|
|
||||||
raise ServiceValidationError(
|
|
||||||
translation_domain=DOMAIN,
|
|
||||||
translation_key="integration_not_found",
|
|
||||||
translation_placeholders={"target": DOMAIN},
|
|
||||||
)
|
|
||||||
scopes = config_entry.data["token"]["scope"].split(" ")
|
|
||||||
if UPLOAD_SCOPE not in scopes:
|
|
||||||
raise HomeAssistantError(
|
|
||||||
translation_domain=DOMAIN,
|
|
||||||
translation_key="missing_upload_permission",
|
|
||||||
translation_placeholders={"target": DOMAIN},
|
|
||||||
)
|
|
||||||
coordinator = config_entry.runtime_data
|
|
||||||
client_api = coordinator.client
|
|
||||||
upload_tasks = []
|
|
||||||
file_results = await hass.async_add_executor_job(
|
|
||||||
_read_file_contents, hass, call.data[CONF_FILENAME]
|
|
||||||
)
|
|
||||||
|
|
||||||
album = call.data[CONF_ALBUM]
|
|
||||||
try:
|
|
||||||
album_id = await coordinator.get_or_create_album(album)
|
|
||||||
except GooglePhotosApiError as err:
|
|
||||||
raise HomeAssistantError(
|
|
||||||
translation_domain=DOMAIN,
|
|
||||||
translation_key="create_album_error",
|
|
||||||
translation_placeholders={"message": str(err)},
|
|
||||||
) from err
|
|
||||||
|
|
||||||
for mime_type, content in file_results:
|
|
||||||
upload_tasks.append(client_api.upload_content(content, mime_type))
|
|
||||||
try:
|
|
||||||
upload_results = await asyncio.gather(*upload_tasks)
|
|
||||||
except GooglePhotosApiError as err:
|
|
||||||
raise HomeAssistantError(
|
|
||||||
translation_domain=DOMAIN,
|
|
||||||
translation_key="upload_error",
|
|
||||||
translation_placeholders={"message": str(err)},
|
|
||||||
) from err
|
|
||||||
try:
|
|
||||||
upload_result = await client_api.create_media_items(
|
|
||||||
[
|
|
||||||
NewMediaItem(
|
|
||||||
SimpleMediaItem(upload_token=upload_result.upload_token)
|
|
||||||
)
|
|
||||||
for upload_result in upload_results
|
|
||||||
],
|
|
||||||
album_id=album_id,
|
|
||||||
)
|
|
||||||
except GooglePhotosApiError as err:
|
|
||||||
raise HomeAssistantError(
|
|
||||||
translation_domain=DOMAIN,
|
|
||||||
translation_key="api_error",
|
|
||||||
translation_placeholders={"message": str(err)},
|
|
||||||
) from err
|
|
||||||
if call.return_response:
|
|
||||||
return {
|
|
||||||
"media_items": [
|
|
||||||
{"media_item_id": item_result.media_item.id}
|
|
||||||
for item_result in upload_result.new_media_item_results
|
|
||||||
if item_result.media_item and item_result.media_item.id
|
|
||||||
],
|
|
||||||
"album_id": album_id,
|
|
||||||
}
|
|
||||||
return None
|
|
||||||
|
|
||||||
hass.services.async_register(
|
hass.services.async_register(
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
UPLOAD_SERVICE,
|
UPLOAD_SERVICE,
|
||||||
async_handle_upload,
|
_async_handle_upload,
|
||||||
schema=UPLOAD_SERVICE_SCHEMA,
|
schema=UPLOAD_SERVICE_SCHEMA,
|
||||||
supports_response=SupportsResponse.OPTIONAL,
|
supports_response=SupportsResponse.OPTIONAL,
|
||||||
)
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user