Skip to content

Commit 5ce3ed9

Browse files
authored
new: MachineTranslation Provider API (#208)
Ref: nextcloud/app_api#210 The same flow and API as for Speech2Text and TextProcessing. --------- Signed-off-by: Alexander Piskun <[email protected]>
1 parent ed0b49b commit 5ce3ed9

File tree

8 files changed

+315
-31
lines changed

8 files changed

+315
-31
lines changed

CHANGELOG.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22

33
All notable changes to this project will be documented in this file.
44

5-
## [0.8.1 - 2024-0x-xx]
5+
## [0.8.1 - 2024-01-xx]
66

77
### Added
88

9-
- NextcloudApp: `AppAPIAuthMiddleware` for easy cover all endpoints. #205
109
- class `Share`: added missing `file_source_id`, `can_edit`, `can_delete` properties. #206
10+
- NextcloudApp: `AppAPIAuthMiddleware` for easy cover all endpoints. #205
11+
- NextcloudApp: API for registering `MachineTranslation` providers(*avalaible from Nextcloud 29*). #207
1112

1213
### Changed
1314

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ Python library that provides a robust and well-documented API that allows develo
3838
| AI Providers API** | N/A | N/A | N/A ||
3939

4040
&ast;_available only for **NextcloudApp**_<br>
41-
&ast;&ast;_available only for **NextcloudApp**: SpeechToText, TextProcessing_<br>
41+
&ast;&ast;_available only for **NextcloudApp**: SpeechToText, TextProcessing, Translation_<br>
4242
&ast;&ast;&ast;_Activity, Notes_
4343

4444
### Differences between the Nextcloud and NextcloudApp classes

docs/reference/ExApp.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,9 @@ UI methods should be accessed with the help of :class:`~nc_py_api.nextcloud.Next
7171

7272
.. autoclass:: nc_py_api.ex_app.providers.text_processing._TextProcessingProviderAPI
7373
:members:
74+
75+
.. autoclass:: nc_py_api.ex_app.providers.translations.TranslationsProvider
76+
:members:
77+
78+
.. autoclass:: nc_py_api.ex_app.providers.translations._TranslationsProviderAPI
79+
:members:

nc_py_api/ex_app/providers/providers.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from ..._session import AsyncNcSessionApp, NcSessionApp
44
from .speech_to_text import _AsyncSpeechToTextProviderAPI, _SpeechToTextProviderAPI
55
from .text_processing import _AsyncTextProcessingProviderAPI, _TextProcessingProviderAPI
6+
from .translations import _AsyncTranslationsProviderAPI, _TranslationsProviderAPI
67

78

89
class ProvidersApi:
@@ -12,10 +13,13 @@ class ProvidersApi:
1213
"""SpeechToText Provider API."""
1314
text_processing: _TextProcessingProviderAPI
1415
"""TextProcessing Provider API."""
16+
translations: _TranslationsProviderAPI
17+
"""Translations Provider API."""
1518

1619
def __init__(self, session: NcSessionApp):
1720
self.speech_to_text = _SpeechToTextProviderAPI(session)
1821
self.text_processing = _TextProcessingProviderAPI(session)
22+
self.translations = _TranslationsProviderAPI(session)
1923

2024

2125
class AsyncProvidersApi:
@@ -25,7 +29,10 @@ class AsyncProvidersApi:
2529
"""SpeechToText Provider API."""
2630
text_processing: _AsyncTextProcessingProviderAPI
2731
"""TextProcessing Provider API."""
32+
translations: _AsyncTranslationsProviderAPI
33+
"""Translations Provider API."""
2834

2935
def __init__(self, session: AsyncNcSessionApp):
3036
self.speech_to_text = _AsyncSpeechToTextProviderAPI(session)
3137
self.text_processing = _AsyncTextProcessingProviderAPI(session)
38+
self.translations = _AsyncTranslationsProviderAPI(session)

nc_py_api/ex_app/providers/speech_to_text.py

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
from ..._misc import require_capabilities
88
from ..._session import AsyncNcSessionApp, NcSessionApp
99

10+
_EP_SUFFIX: str = "ai_provider/speech_to_text"
11+
1012

1113
@dataclasses.dataclass
1214
class SpeechToTextProvider:
@@ -35,9 +37,7 @@ def __repr__(self):
3537

3638

3739
class _SpeechToTextProviderAPI:
38-
"""API for registering Speech2Text providers."""
39-
40-
_ep_suffix: str = "ai_provider/speech_to_text"
40+
"""API for Speech2Text providers."""
4141

4242
def __init__(self, session: NcSessionApp):
4343
self._session = session
@@ -50,13 +50,13 @@ def register(self, name: str, display_name: str, callback_url: str) -> None:
5050
"displayName": display_name,
5151
"actionHandler": callback_url,
5252
}
53-
self._session.ocs("POST", f"{self._session.ae_url}/{self._ep_suffix}", json=params)
53+
self._session.ocs("POST", f"{self._session.ae_url}/{_EP_SUFFIX}", json=params)
5454

5555
def unregister(self, name: str, not_fail=True) -> None:
5656
"""Removes SpeechToText provider."""
5757
require_capabilities("app_api", self._session.capabilities)
5858
try:
59-
self._session.ocs("DELETE", f"{self._session.ae_url}/{self._ep_suffix}", params={"name": name})
59+
self._session.ocs("DELETE", f"{self._session.ae_url}/{_EP_SUFFIX}", params={"name": name})
6060
except NextcloudExceptionNotFound as e:
6161
if not not_fail:
6262
raise e from None
@@ -66,7 +66,7 @@ def get_entry(self, name: str) -> SpeechToTextProvider | None:
6666
require_capabilities("app_api", self._session.capabilities)
6767
try:
6868
return SpeechToTextProvider(
69-
self._session.ocs("GET", f"{self._session.ae_url}/{self._ep_suffix}", params={"name": name})
69+
self._session.ocs("GET", f"{self._session.ae_url}/{_EP_SUFFIX}", params={"name": name})
7070
)
7171
except NextcloudExceptionNotFound:
7272
return None
@@ -77,15 +77,13 @@ def report_result(self, task_id: int, result: str = "", error: str = "") -> None
7777
with contextlib.suppress(NextcloudException):
7878
self._session.ocs(
7979
"PUT",
80-
f"{self._session.ae_url}/{self._ep_suffix}",
80+
f"{self._session.ae_url}/{_EP_SUFFIX}",
8181
json={"taskId": task_id, "result": result, "error": error},
8282
)
8383

8484

8585
class _AsyncSpeechToTextProviderAPI:
86-
"""API for registering Speech2Text providers."""
87-
88-
_ep_suffix: str = "ai_provider/speech_to_text"
86+
"""API for Speech2Text providers."""
8987

9088
def __init__(self, session: AsyncNcSessionApp):
9189
self._session = session
@@ -98,13 +96,13 @@ async def register(self, name: str, display_name: str, callback_url: str) -> Non
9896
"displayName": display_name,
9997
"actionHandler": callback_url,
10098
}
101-
await self._session.ocs("POST", f"{self._session.ae_url}/{self._ep_suffix}", json=params)
99+
await self._session.ocs("POST", f"{self._session.ae_url}/{_EP_SUFFIX}", json=params)
102100

103101
async def unregister(self, name: str, not_fail=True) -> None:
104102
"""Removes SpeechToText provider."""
105103
require_capabilities("app_api", await self._session.capabilities)
106104
try:
107-
await self._session.ocs("DELETE", f"{self._session.ae_url}/{self._ep_suffix}", params={"name": name})
105+
await self._session.ocs("DELETE", f"{self._session.ae_url}/{_EP_SUFFIX}", params={"name": name})
108106
except NextcloudExceptionNotFound as e:
109107
if not not_fail:
110108
raise e from None
@@ -114,7 +112,7 @@ async def get_entry(self, name: str) -> SpeechToTextProvider | None:
114112
require_capabilities("app_api", await self._session.capabilities)
115113
try:
116114
return SpeechToTextProvider(
117-
await self._session.ocs("GET", f"{self._session.ae_url}/{self._ep_suffix}", params={"name": name})
115+
await self._session.ocs("GET", f"{self._session.ae_url}/{_EP_SUFFIX}", params={"name": name})
118116
)
119117
except NextcloudExceptionNotFound:
120118
return None
@@ -125,6 +123,6 @@ async def report_result(self, task_id: int, result: str = "", error: str = "") -
125123
with contextlib.suppress(NextcloudException):
126124
await self._session.ocs(
127125
"PUT",
128-
f"{self._session.ae_url}/{self._ep_suffix}",
126+
f"{self._session.ae_url}/{_EP_SUFFIX}",
129127
json={"taskId": task_id, "result": result, "error": error},
130128
)

nc_py_api/ex_app/providers/text_processing.py

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
from ..._misc import require_capabilities
88
from ..._session import AsyncNcSessionApp, NcSessionApp
99

10+
_EP_SUFFIX: str = "ai_provider/text_processing"
11+
1012

1113
@dataclasses.dataclass
1214
class TextProcessingProvider:
@@ -40,9 +42,7 @@ def __repr__(self):
4042

4143

4244
class _TextProcessingProviderAPI:
43-
"""API for registering TextProcessing providers."""
44-
45-
_ep_suffix: str = "ai_provider/text_processing"
45+
"""API for TextProcessing providers."""
4646

4747
def __init__(self, session: NcSessionApp):
4848
self._session = session
@@ -56,13 +56,13 @@ def register(self, name: str, display_name: str, callback_url: str, task_type: s
5656
"actionHandler": callback_url,
5757
"taskType": task_type,
5858
}
59-
self._session.ocs("POST", f"{self._session.ae_url}/{self._ep_suffix}", json=params)
59+
self._session.ocs("POST", f"{self._session.ae_url}/{_EP_SUFFIX}", json=params)
6060

6161
def unregister(self, name: str, not_fail=True) -> None:
6262
"""Removes TextProcessing provider."""
6363
require_capabilities("app_api", self._session.capabilities)
6464
try:
65-
self._session.ocs("DELETE", f"{self._session.ae_url}/{self._ep_suffix}", params={"name": name})
65+
self._session.ocs("DELETE", f"{self._session.ae_url}/{_EP_SUFFIX}", params={"name": name})
6666
except NextcloudExceptionNotFound as e:
6767
if not not_fail:
6868
raise e from None
@@ -72,7 +72,7 @@ def get_entry(self, name: str) -> TextProcessingProvider | None:
7272
require_capabilities("app_api", self._session.capabilities)
7373
try:
7474
return TextProcessingProvider(
75-
self._session.ocs("GET", f"{self._session.ae_url}/{self._ep_suffix}", params={"name": name})
75+
self._session.ocs("GET", f"{self._session.ae_url}/{_EP_SUFFIX}", params={"name": name})
7676
)
7777
except NextcloudExceptionNotFound:
7878
return None
@@ -83,15 +83,13 @@ def report_result(self, task_id: int, result: str = "", error: str = "") -> None
8383
with contextlib.suppress(NextcloudException):
8484
self._session.ocs(
8585
"PUT",
86-
f"{self._session.ae_url}/{self._ep_suffix}",
86+
f"{self._session.ae_url}/{_EP_SUFFIX}",
8787
json={"taskId": task_id, "result": result, "error": error},
8888
)
8989

9090

9191
class _AsyncTextProcessingProviderAPI:
92-
"""API for registering TextProcessing providers."""
93-
94-
_ep_suffix: str = "ai_provider/text_processing"
92+
"""API for TextProcessing providers."""
9593

9694
def __init__(self, session: AsyncNcSessionApp):
9795
self._session = session
@@ -105,13 +103,13 @@ async def register(self, name: str, display_name: str, callback_url: str, task_t
105103
"actionHandler": callback_url,
106104
"taskType": task_type,
107105
}
108-
await self._session.ocs("POST", f"{self._session.ae_url}/{self._ep_suffix}", json=params)
106+
await self._session.ocs("POST", f"{self._session.ae_url}/{_EP_SUFFIX}", json=params)
109107

110108
async def unregister(self, name: str, not_fail=True) -> None:
111109
"""Removes TextProcessing provider."""
112110
require_capabilities("app_api", await self._session.capabilities)
113111
try:
114-
await self._session.ocs("DELETE", f"{self._session.ae_url}/{self._ep_suffix}", params={"name": name})
112+
await self._session.ocs("DELETE", f"{self._session.ae_url}/{_EP_SUFFIX}", params={"name": name})
115113
except NextcloudExceptionNotFound as e:
116114
if not not_fail:
117115
raise e from None
@@ -121,7 +119,7 @@ async def get_entry(self, name: str) -> TextProcessingProvider | None:
121119
require_capabilities("app_api", await self._session.capabilities)
122120
try:
123121
return TextProcessingProvider(
124-
await self._session.ocs("GET", f"{self._session.ae_url}/{self._ep_suffix}", params={"name": name})
122+
await self._session.ocs("GET", f"{self._session.ae_url}/{_EP_SUFFIX}", params={"name": name})
125123
)
126124
except NextcloudExceptionNotFound:
127125
return None
@@ -132,6 +130,6 @@ async def report_result(self, task_id: int, result: str = "", error: str = "") -
132130
with contextlib.suppress(NextcloudException):
133131
await self._session.ocs(
134132
"PUT",
135-
f"{self._session.ae_url}/{self._ep_suffix}",
133+
f"{self._session.ae_url}/{_EP_SUFFIX}",
136134
json={"taskId": task_id, "result": result, "error": error},
137135
)

0 commit comments

Comments
 (0)