media-tagging 1.2.0.dev2__tar.gz → 1.2.0.dev4__tar.gz

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 (42) hide show
  1. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/PKG-INFO +3 -5
  2. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/__init__.py +4 -2
  3. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/media_tagging_service.py +28 -6
  4. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/tagging_result.py +12 -4
  5. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging.egg-info/PKG-INFO +3 -5
  6. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging.egg-info/requires.txt +2 -5
  7. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/pyproject.toml +2 -5
  8. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/LICENSE.txt +0 -0
  9. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/README.md +0 -0
  10. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/entrypoints/__init__.py +0 -0
  11. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/entrypoints/cli.py +0 -0
  12. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/entrypoints/server.py +0 -0
  13. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/entrypoints/utils.py +0 -0
  14. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/exceptions.py +0 -0
  15. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/loaders/__init__.py +0 -0
  16. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/loaders/base.py +0 -0
  17. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/loaders/entrypoints/__init__.py +0 -0
  18. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/loaders/entrypoints/cli.py +0 -0
  19. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/loaders/file.py +0 -0
  20. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/loaders/media_loader_service.py +0 -0
  21. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/media.py +0 -0
  22. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/repositories.py +0 -0
  23. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/__init__.py +0 -0
  24. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/base.py +0 -0
  25. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/google_cloud/__init__.py +0 -0
  26. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/google_cloud/tagger.py +0 -0
  27. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/google_cloud/tagging_strategies.py +0 -0
  28. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/__init__.py +0 -0
  29. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/gemini/__init__.py +0 -0
  30. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/gemini/tagger.py +0 -0
  31. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/gemini/tagging_strategies.py +0 -0
  32. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/prompts/__init__.py +0 -0
  33. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/prompts/description.txt +0 -0
  34. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/prompts/system.txt +0 -0
  35. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/prompts/tag.txt +0 -0
  36. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/utils.py +0 -0
  37. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/tools.py +0 -0
  38. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging.egg-info/SOURCES.txt +0 -0
  39. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging.egg-info/dependency_links.txt +0 -0
  40. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging.egg-info/entry_points.txt +0 -0
  41. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging.egg-info/top_level.txt +0 -0
  42. {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: media-tagging
3
- Version: 1.2.0.dev2
3
+ Version: 1.2.0.dev4
4
4
  Summary: Performs tagging of image and videos based on various taggers
5
5
  Author-email: "Google Inc. (gTech gPS CSE team)" <no-reply@google.com>
6
6
  License: Apache 2.0
@@ -23,20 +23,18 @@ Requires-Dist: pandas
23
23
  Requires-Dist: pydantic
24
24
  Requires-Dist: SQLalchemy>=2.0.0
25
25
  Requires-Dist: tenacity
26
- Requires-Dist: pandas
26
+ Requires-Dist: google-genai==1.13.0
27
27
  Provides-Extra: google-cloud-vision
28
28
  Requires-Dist: google-cloud-vision==3.9.0; extra == "google-cloud-vision"
29
29
  Provides-Extra: google-cloud-videointelligence
30
30
  Requires-Dist: google-cloud-videointelligence==2.15.0; extra == "google-cloud-videointelligence"
31
31
  Provides-Extra: google-cloud
32
32
  Requires-Dist: media-tagging[google-cloud-videointelligence,google-cloud-vision]; extra == "google-cloud"
33
- Provides-Extra: gemini
34
- Requires-Dist: google-genai==1.13.0; extra == "gemini"
35
33
  Provides-Extra: server
36
34
  Requires-Dist: fastapi==0.111.0; extra == "server"
37
35
  Requires-Dist: pydantic-settings; extra == "server"
38
36
  Provides-Extra: all
39
- Requires-Dist: media-tagging[gemini,google-cloud,server]; extra == "all"
37
+ Requires-Dist: media-tagging[google-cloud,server]; extra == "all"
40
38
  Dynamic: license-file
41
39
 
42
40
  # Media Tagger
@@ -14,15 +14,17 @@
14
14
 
15
15
  # pylint: disable=C0330, g-bad-import-order, g-multiple-import
16
16
 
17
- """Simplifies imports from inner modules."""
17
+ """Media tagging perform tagging and description operation of various media."""
18
18
 
19
19
  from media_tagging.media_tagging_service import (
20
20
  MediaTaggingRequest,
21
+ MediaTaggingResponse,
21
22
  MediaTaggingService,
22
23
  )
23
24
 
24
25
  __all__ = [
25
26
  'MediaTaggingService',
26
27
  'MediaTaggingRequest',
28
+ 'MediaTaggingResponse',
27
29
  ]
28
- __version__ = '1.2.0.dev2'
30
+ __version__ = '1.2.0.dev4'
@@ -34,6 +34,16 @@ logger = logging.getLogger('media-tagger')
34
34
 
35
35
 
36
36
  class MediaTaggingRequest(pydantic.BaseModel):
37
+ """Contains parameters to perform media tagging.
38
+
39
+ Attributes:
40
+ tagger_type: Tagger to be used.
41
+ media_type: Type of media to tag.
42
+ media_paths: Paths or URLs where media are located.
43
+ tagging_options: Tagging specific parameters.
44
+ parallel_threshold: Maximum number of parallel tagging operations.
45
+ """
46
+
37
47
  model_config = pydantic.ConfigDict(extra='ignore')
38
48
 
39
49
  tagger_type: Literal['google-cloud', 'gemini']
@@ -79,6 +89,16 @@ class MediaFetchingRequest(pydantic.BaseModel):
79
89
  tagger_type: str = 'loader'
80
90
 
81
91
 
92
+ class MediaTaggingResponse(pydantic.BaseModel):
93
+ results: list[tagging_result.TaggingResult]
94
+
95
+ def to_garf_report(self):
96
+ return tagging_result.to_garf_report(self.results)
97
+
98
+ def to_pandas(self):
99
+ return tagging_result.to_pandas(self.results)
100
+
101
+
82
102
  def discover_taggers(
83
103
  existing_taggers: Sequence[str],
84
104
  ) -> dict[str, base_tagger.BaseTagger]:
@@ -129,7 +149,7 @@ class MediaTaggingService:
129
149
  def tag_media(
130
150
  self,
131
151
  tagging_request: MediaTaggingRequest,
132
- ) -> list[tagging_result.TaggingResult]:
152
+ ) -> MediaTaggingResponse:
133
153
  """Tags media based on requested tagger.
134
154
 
135
155
  Args:
@@ -143,7 +163,7 @@ class MediaTaggingService:
143
163
  def describe_media(
144
164
  self,
145
165
  tagging_request: MediaTaggingRequest,
146
- ) -> list[tagging_result.TaggingResult]:
166
+ ) -> MediaTaggingResponse:
147
167
  """Tags media based on requested tagger.
148
168
 
149
169
  Args:
@@ -158,7 +178,7 @@ class MediaTaggingService:
158
178
  self,
159
179
  action: Literal['tag', 'describe'],
160
180
  tagging_request: MediaTaggingRequest,
161
- ) -> list[tagging_result.TaggingResult]:
181
+ ) -> MediaTaggingResponse:
162
182
  """Gets media information based on tagger and output type.
163
183
 
164
184
  Args:
@@ -198,10 +218,10 @@ class MediaTaggingService:
198
218
  ):
199
219
  untagged_media.add(media_path)
200
220
  if not untagged_media:
201
- return tagged_media
221
+ return MediaTaggingResponse(results=tagged_media)
202
222
 
203
223
  if not tagging_request.parallel_threshold:
204
- return (
224
+ results = (
205
225
  self._process_media_sequentially(
206
226
  action,
207
227
  concrete_tagger,
@@ -211,6 +231,7 @@ class MediaTaggingService:
211
231
  )
212
232
  + tagged_media
213
233
  )
234
+ return MediaTaggingResponse(results=results)
214
235
  with futures.ThreadPoolExecutor(
215
236
  max_workers=tagging_request.parallel_threshold
216
237
  ) as executor:
@@ -231,7 +252,8 @@ class MediaTaggingService:
231
252
  for future in futures.as_completed(future_to_media_path)
232
253
  ]
233
254
  )
234
- return list(untagged_media) + tagged_media
255
+ results = list(untagged_media) + tagged_media
256
+ return MediaTaggingResponse(results=results)
235
257
 
236
258
  def _process_media_sequentially(
237
259
  self,
@@ -22,8 +22,9 @@ import json
22
22
  from collections.abc import Sequence
23
23
  from typing import Any, Literal
24
24
 
25
- import garf_core
25
+ import pandas as pd
26
26
  import pydantic
27
+ from garf_core import report
27
28
 
28
29
  from media_tagging import exceptions
29
30
 
@@ -149,9 +150,9 @@ class TaggingResultsFileInput:
149
150
  score_name: str
150
151
 
151
152
 
152
- def convert_tagging_results_to_garf_report(
153
+ def to_garf_report(
153
154
  tagging_results: Sequence[TaggingResult],
154
- ) -> garf_core.report.GarfReport:
155
+ ) -> report.GarfReport:
155
156
  """Converts results of tagging to GarfReport for further writing."""
156
157
  results = []
157
158
  column_names = [
@@ -173,4 +174,11 @@ def convert_tagging_results_to_garf_report(
173
174
  else:
174
175
  parsed_result.append({tag.name: tag.score for tag in result.content})
175
176
  results.append(parsed_result)
176
- return garf_core.report.GarfReport(results=results, column_names=column_names)
177
+ return report.GarfReport(results=results, column_names=column_names)
178
+
179
+
180
+ def to_pandas(
181
+ tagging_results: Sequence[TaggingResult],
182
+ ) -> pd.DataFrame:
183
+ """Converts results of tagging to pandas DataFrame."""
184
+ return to_garf_report(tagging_results).to_pandas()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: media-tagging
3
- Version: 1.2.0.dev2
3
+ Version: 1.2.0.dev4
4
4
  Summary: Performs tagging of image and videos based on various taggers
5
5
  Author-email: "Google Inc. (gTech gPS CSE team)" <no-reply@google.com>
6
6
  License: Apache 2.0
@@ -23,20 +23,18 @@ Requires-Dist: pandas
23
23
  Requires-Dist: pydantic
24
24
  Requires-Dist: SQLalchemy>=2.0.0
25
25
  Requires-Dist: tenacity
26
- Requires-Dist: pandas
26
+ Requires-Dist: google-genai==1.13.0
27
27
  Provides-Extra: google-cloud-vision
28
28
  Requires-Dist: google-cloud-vision==3.9.0; extra == "google-cloud-vision"
29
29
  Provides-Extra: google-cloud-videointelligence
30
30
  Requires-Dist: google-cloud-videointelligence==2.15.0; extra == "google-cloud-videointelligence"
31
31
  Provides-Extra: google-cloud
32
32
  Requires-Dist: media-tagging[google-cloud-videointelligence,google-cloud-vision]; extra == "google-cloud"
33
- Provides-Extra: gemini
34
- Requires-Dist: google-genai==1.13.0; extra == "gemini"
35
33
  Provides-Extra: server
36
34
  Requires-Dist: fastapi==0.111.0; extra == "server"
37
35
  Requires-Dist: pydantic-settings; extra == "server"
38
36
  Provides-Extra: all
39
- Requires-Dist: media-tagging[gemini,google-cloud,server]; extra == "all"
37
+ Requires-Dist: media-tagging[google-cloud,server]; extra == "all"
40
38
  Dynamic: license-file
41
39
 
42
40
  # Media Tagger
@@ -6,13 +6,10 @@ pandas
6
6
  pydantic
7
7
  SQLalchemy>=2.0.0
8
8
  tenacity
9
- pandas
9
+ google-genai==1.13.0
10
10
 
11
11
  [all]
12
- media-tagging[gemini,google-cloud,server]
13
-
14
- [gemini]
15
- google-genai==1.13.0
12
+ media-tagging[google-cloud,server]
16
13
 
17
14
  [google-cloud]
18
15
  media-tagging[google-cloud-videointelligence,google-cloud-vision]
@@ -13,7 +13,7 @@ dependencies = [
13
13
  "pydantic",
14
14
  "SQLalchemy>=2.0.0",
15
15
  "tenacity",
16
- "pandas",
16
+ "google-genai==1.13.0",
17
17
  ]
18
18
  authors = [
19
19
  {name = "Google Inc. (gTech gPS CSE team)", email = "no-reply@google.com"},
@@ -48,15 +48,12 @@ google-cloud-videointelligence=[
48
48
  google-cloud=[
49
49
  "media-tagging[google-cloud-vision,google-cloud-videointelligence]",
50
50
  ]
51
- gemini=[
52
- "google-genai==1.13.0",
53
- ]
54
51
  server = [
55
52
  "fastapi==0.111.0",
56
53
  "pydantic-settings",
57
54
  ]
58
55
  all = [
59
- "media-tagging[google-cloud,gemini,server]"
56
+ "media-tagging[google-cloud,server]"
60
57
  ]
61
58
 
62
59
  [project.entry-points.creative_assistant]