tamar-file-hub-client 0.1.2__py3-none-any.whl → 0.1.4__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tamar-file-hub-client
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Summary: A Python SDK for gRPC-based file management system
5
5
  Home-page: https://github.com/Tamar-Edge-AI/file-hub-client
6
6
  Author: Oscar Ou
@@ -60,6 +60,7 @@ Dynamic: summary
60
60
  - 🔁 **自动重试**:连接失败时自动重试,提高可靠性
61
61
  - 📝 **类型注解**:完整的类型提示支持
62
62
  - 🧩 **模块化设计**:清晰的代码结构,易于扩展
63
+ - 🎨 **图片和视频压缩**:支持多种规格的媒体文件压缩变体生成和管理
63
64
  - 🏗️ **分层服务架构**:文件服务分为传统文件(blob)和自定义类型(结构化数据),每种类型独立服务,语义清晰
64
65
  - 🔧 **环境变量配置**:支持通过环境变量配置所有参数
65
66
  - 👤 **用户上下文管理**:支持区分资源所有权(ownership)和操作者(operator)
@@ -209,6 +210,8 @@ File Hub Client 采用分层服务架构,将文件服务按类型和语义进
209
210
  - 智能选择上传模式(根据文件大小)
210
211
  - 生成上传/下载 URL
211
212
  - 支持临时文件上传
213
+ - **媒体文件压缩**:支持图片和视频的多规格压缩变体生成
214
+ - **压缩管理**:获取压缩状态、管理变体、触发重新压缩
212
215
  - 适用类型:PDF、图片、视频、音频、压缩包等
213
216
  - **file_service**: 处理文件元数据操作(所有类型通用)
214
217
  - 获取、重命名、删除文件
@@ -243,6 +246,11 @@ File Hub Client 采用分层服务架构,将文件服务按类型和语义进
243
246
  - `UploadUrlResponse`: URL上传响应
244
247
  - `ShareLinkRequest`: 分享链接请求
245
248
  - `FileListResponse`: 文件列表响应
249
+ - `CompressedVariant`: 压缩变体信息
250
+ - `CompressionStatusResponse`: 压缩状态响应
251
+ - `GetVariantsResponse`: 获取变体响应
252
+ - `RecompressionResponse`: 重新压缩响应
253
+ - `VariantDownloadUrlResponse`: 变体下载URL响应
246
254
 
247
255
  - **folder.py**: 文件夹相关的数据模型
248
256
  - `FolderInfo`: 文件夹信息
@@ -641,6 +649,30 @@ async with AsyncTamarFileHubClient() as client:
641
649
  )
642
650
  ```
643
651
 
652
+ #### 保留原始文件名上传
653
+
654
+ ```python
655
+ from file_hub_client import AsyncTamarFileHubClient
656
+
657
+ async with AsyncTamarFileHubClient() as client:
658
+ # 设置用户上下文
659
+ client.set_user_context(org_id="123", user_id="456")
660
+
661
+ # 上传时保留原始文件名
662
+ file_info = await client.blobs.upload(
663
+ "document.pdf",
664
+ keep_original_filename=True # 保留原始文件名,默认为False
665
+ )
666
+
667
+ # 也可以指定文件夹和其他参数
668
+ file_info = await client.blobs.upload(
669
+ "report.xlsx",
670
+ folder_id="folder-123",
671
+ keep_original_filename=True, # 保留原始文件名
672
+ is_temporary=False
673
+ )
674
+ ```
675
+
644
676
  ### 文件下载
645
677
 
646
678
  File Hub Client 提供了统一的下载接口,支持两种结构返回:
@@ -813,6 +845,149 @@ with TamarFileHubClient() as client:
813
845
  - 错误信息通过 `error` 字段返回
814
846
  - 建议在批量操作时做好错误处理和重试逻辑
815
847
 
848
+ ### 媒体文件压缩服务
849
+
850
+ File Hub Client 支持图片和视频文件的自动压缩处理,提供多种规格的压缩变体以满足不同使用场景的需求。
851
+
852
+ #### 获取文件压缩状态
853
+
854
+ ```python
855
+ from file_hub_client import AsyncTamarFileHubClient
856
+
857
+ async with AsyncTamarFileHubClient() as client:
858
+ client.set_user_context(org_id="123", user_id="456")
859
+
860
+ # 获取文件压缩状态
861
+ status = await client.blobs.get_compression_status(file_id="file-001")
862
+
863
+ print(f"压缩状态: {status.status}") # pending, processing, completed, failed
864
+ if status.error_message:
865
+ print(f"错误信息: {status.error_message}")
866
+
867
+ # 查看可用的压缩变体
868
+ for variant in status.variants:
869
+ print(f"变体: {variant.variant_name}")
870
+ print(f" 类型: {variant.variant_type}") # image, video, thumbnail
871
+ print(f" 尺寸: {variant.width}x{variant.height}")
872
+ print(f" 大小: {variant.file_size} bytes")
873
+ print(f" 格式: {variant.format}")
874
+ print(f" 压缩比: {variant.compression_ratio:.2f}")
875
+ ```
876
+
877
+ #### 获取压缩变体列表
878
+
879
+ ```python
880
+ # 获取所有压缩变体
881
+ variants = await client.blobs.get_compressed_variants(file_id="file-001")
882
+
883
+ # 按类型过滤变体
884
+ image_variants = await client.blobs.get_compressed_variants(
885
+ file_id="file-001",
886
+ variant_type="image" # image, video, thumbnail
887
+ )
888
+
889
+ # 处理变体信息
890
+ for variant in variants.variants:
891
+ print(f"变体名称: {variant.variant_name}") # large, medium, small, thumbnail
892
+ print(f"媒体类型: {variant.media_type}")
893
+ print(f"文件格式: {variant.format}")
894
+ if variant.quality:
895
+ print(f"质量: {variant.quality}")
896
+ if variant.duration:
897
+ print(f"时长: {variant.duration}秒")
898
+ if variant.bitrate:
899
+ print(f"比特率: {variant.bitrate}")
900
+ ```
901
+
902
+ #### 下载压缩变体
903
+
904
+ ```python
905
+ # 生成压缩变体的下载URL
906
+ variant_url = await client.blobs.generate_variant_download_url(
907
+ file_id="file-001",
908
+ variant_name="medium", # large, medium, small, thumbnail
909
+ expire_seconds=3600, # URL有效期
910
+ is_cdn=True # 是否使用CDN
911
+ )
912
+
913
+ print(f"下载URL: {variant_url.url}")
914
+ if variant_url.error:
915
+ print(f"生成URL错误: {variant_url.error}")
916
+
917
+ # 查看变体详细信息
918
+ if variant_url.variant_info:
919
+ info = variant_url.variant_info
920
+ print(f"变体信息:")
921
+ print(f" 尺寸: {info.width}x{info.height}")
922
+ print(f" 格式: {info.format}")
923
+ print(f" 文件大小: {info.file_size} bytes")
924
+ ```
925
+
926
+ #### 触发重新压缩
927
+
928
+ ```python
929
+ # 触发文件重新压缩(当需要更新压缩设置时)
930
+ recompression = await client.blobs.trigger_recompression(
931
+ file_id="file-001",
932
+ force_reprocess=False # 是否强制重新处理
933
+ )
934
+
935
+ print(f"任务ID: {recompression.task_id}")
936
+ print(f"状态: {recompression.status}")
937
+
938
+ # 监控压缩进度
939
+ import asyncio
940
+ while True:
941
+ status = await client.blobs.get_compression_status(file_id="file-001")
942
+ print(f"当前状态: {status.status}")
943
+
944
+ if status.status in ["completed", "failed"]:
945
+ break
946
+
947
+ await asyncio.sleep(5) # 等待5秒后再次检查
948
+ ```
949
+
950
+ #### 同步客户端压缩服务
951
+
952
+ ```python
953
+ from file_hub_client import TamarFileHubClient
954
+
955
+ with TamarFileHubClient() as client:
956
+ client.set_user_context(org_id="123", user_id="456")
957
+
958
+ # 所有压缩服务方法都有对应的同步版本
959
+ status = client.blobs.get_compression_status(file_id="file-001")
960
+ variants = client.blobs.get_compressed_variants(file_id="file-001")
961
+ recompression = client.blobs.trigger_recompression(file_id="file-001")
962
+ variant_url = client.blobs.generate_variant_download_url(
963
+ file_id="file-001",
964
+ variant_name="thumbnail"
965
+ )
966
+ ```
967
+
968
+ #### 压缩服务使用场景
969
+
970
+ 1. **多设备适配**:
971
+ - `large` - 高分辨率显示设备
972
+ - `medium` - 标准桌面和平板
973
+ - `small` - 手机端显示
974
+ - `thumbnail` - 缩略图预览
975
+
976
+ 2. **带宽优化**:
977
+ - 根据网络状况选择合适的变体
978
+ - 移动端使用压缩变体节省流量
979
+ - 预览场景使用缩略图快速加载
980
+
981
+ 3. **存储优化**:
982
+ - 自动生成多种规格,无需手动处理
983
+ - 智能压缩算法平衡质量和大小
984
+ - 支持视频和图片的不同压缩策略
985
+
986
+ 4. **性能优化**:
987
+ - 异步压缩处理,不阻塞上传流程
988
+ - 支持重新压缩以应用新的压缩设置
989
+ - 批量状态查询减少网络请求
990
+
816
991
  ### 文件管理操作
817
992
 
818
993
  File Hub Client 提供了完整的文件管理功能,通过 `files` 服务访问:
@@ -2150,10 +2325,21 @@ MIT License
2150
2325
 
2151
2326
  ## 更新日志
2152
2327
 
2328
+ ### v0.0.6 (2025-08)
2329
+ - 新增媒体文件压缩服务功能
2330
+ - 支持获取文件压缩状态 (get_compression_status)
2331
+ - 支持获取压缩变体列表 (get_compressed_variants)
2332
+ - 支持触发文件重新压缩 (trigger_recompression)
2333
+ - 支持生成变体下载URL (generate_variant_download_url)
2334
+ - 添加压缩相关数据模型 (CompressedVariant 等)
2335
+ - 在所有文件服务类中实现压缩功能支持
2336
+ - 更新文档包含压缩服务使用示例
2337
+
2153
2338
  ### v0.0.5 (2025-01)
2154
2339
  - 新增批量下载URL生成接口 (batch_generate_download_url)
2155
2340
  - 新增GCS URL获取接口 (get_gcs_url, batch_get_gcs_url)
2156
2341
  - GCS URL接口返回MIME类型信息,便于文件类型识别
2342
+ - 新增 keep_original_filename 参数支持保留原始文件名
2157
2343
  - 更新相关文档和测试用例
2158
2344
 
2159
2345
  ### v0.0.4 (2025-01)
@@ -1,5 +1,5 @@
1
1
  file_hub_client/__init__.py,sha256=5pOOgw8YLzsQ49o81j5xCFtiH7VHFObNlbAYZwsU7ts,2918
2
- file_hub_client/client.py,sha256=kOis7hw0WAi-YAmEM_1PEzp0hsOD9JSxLbJi2cvTd_o,17338
2
+ file_hub_client/client.py,sha256=n1HYk08B6jH_2k8pewqt_fThDZGLPJsq5DWxnQG6WSA,18120
3
3
  file_hub_client/py.typed,sha256=Nqnn8clbgv-5l0PgxcTOldg8mkMKrFn4TvPL-rYUUGg,1
4
4
  file_hub_client/enums/__init__.py,sha256=e3Io6-IC9Nezbdc8H4TzuWqiDw0T1fsdbSi-fsgSQM4,203
5
5
  file_hub_client/enums/export_format.py,sha256=C9P0q8v5eTszUBqKBmERxoA9UrTgLuX3a_bZeUxkdlQ,296
@@ -8,32 +8,32 @@ file_hub_client/enums/upload_mode.py,sha256=_7caGZks1AI1RBGlZliruQIFGfAtwh9NWL8X
8
8
  file_hub_client/errors/__init__.py,sha256=_Ud6yaBPuFB-luxeFIVhbG_0xIy05vONUkMuG8pX2xo,561
9
9
  file_hub_client/errors/exceptions.py,sha256=0RDkAv4t2GeVefm1H5eaXGxd6Od-drXzPIVJZ-8sRGc,2648
10
10
  file_hub_client/rpc/__init__.py,sha256=dhRt0D_US3j2Dam47nhd23RowVZ-nvVowhPsNFf4GZo,204
11
- file_hub_client/rpc/async_client.py,sha256=vMi4Aqc_Ajg2sdOgXHiLjP_4FkPtg5tDpSDPK6hg-cM,14038
11
+ file_hub_client/rpc/async_client.py,sha256=qWrqRA3UhsKgCjM5G-jncnN2Xgu8-XqMFI2i5nBRSSs,15348
12
12
  file_hub_client/rpc/generate_grpc.py,sha256=opzstxWdW7vqR9OxrgUCSUkZe8IqgcOdruqWGIzCneI,2158
13
13
  file_hub_client/rpc/interceptors.py,sha256=UeQ8u-olMiYwScXJrlzqPS-odGomH-h3xJqOwPznRUo,22071
14
- file_hub_client/rpc/sync_client.py,sha256=ZWBmP-TU8eeAfl2lV8sLu9nsxo_aOPAVmt9ww_T8Hwg,14054
14
+ file_hub_client/rpc/sync_client.py,sha256=iaow1Lpi0moq9kwlUVNP0p4ucgHKCP8y5cvmP32dkQU,15364
15
15
  file_hub_client/rpc/gen/__init__.py,sha256=NJLqr9ezUXeOyy1J0sMPn3Kl_8IyGw7GAzzzewO3MIw,45
16
- file_hub_client/rpc/gen/file_service_pb2.py,sha256=f6PkMS-JGFtDSpbqv77Bf-QqOGY__osHg6WmUtuxlLY,11009
17
- file_hub_client/rpc/gen/file_service_pb2_grpc.py,sha256=F7u-n6doSz1HxmaYAL0y_nNB1NVR8CRlZVKAMe63P4A,26083
16
+ file_hub_client/rpc/gen/file_service_pb2.py,sha256=RbyXc10c_XKPrZyz6Ruo2wbklc-MDUg6FY-IEXxgx7w,14770
17
+ file_hub_client/rpc/gen/file_service_pb2_grpc.py,sha256=a5tjnCqO_ZVBBQK5COUgZ_Eb7hlv81yseg-8goOROls,33372
18
18
  file_hub_client/rpc/gen/folder_service_pb2.py,sha256=OPNYHThmL1k2KH1ll2L_Gj76oWBWqcymXKHu8mk1Zvk,4126
19
19
  file_hub_client/rpc/gen/folder_service_pb2_grpc.py,sha256=pOHFsVThdAu5DAKd8QK3_zQvUmFgGlh4KBqIYnYDZ_U,10411
20
20
  file_hub_client/rpc/gen/taple_service_pb2.py,sha256=8BJCFRFJ_khl_Uaw-5jWCabljWJo6zaqOYWe1368xEw,48254
21
21
  file_hub_client/rpc/gen/taple_service_pb2_grpc.py,sha256=DCL-45PlEZ0guLz1u2fFH_sDIT_awuSvp9Ak6fa2GO8,64773
22
- file_hub_client/rpc/protos/file_service.proto,sha256=d6xMVohY3_tLJOQv1nV04pNUlgTM-9v9bkZYnebzraE,4821
22
+ file_hub_client/rpc/protos/file_service.proto,sha256=P4ZtnvACPSGfSxAnr8pVQ7DaHjpmCA-LysS9X0LmX4c,6897
23
23
  file_hub_client/rpc/protos/folder_service.proto,sha256=cgIbJT2slXMMRGrtrzN3kjae9-4CB1zXCmceiUgE6fI,1542
24
24
  file_hub_client/rpc/protos/taple_service.proto,sha256=0mwhyBwD3yvFhMiiSA6J3Ni6pyHc369iD4oDXXl7DIU,29765
25
- file_hub_client/schemas/__init__.py,sha256=9BvyqWBkeEav47vUBZ6eDyCt_iKATCOwakcrmOTdVWA,2396
26
- file_hub_client/schemas/context.py,sha256=bs-KXGBBo_9i1KbvozY8KjYzV5ZtMbjqpPW_ssN7qMs,5516
27
- file_hub_client/schemas/file.py,sha256=s4_gYriOn_UP9gcDRqB2YNvNN-FqEZEbfJCOVE5JUTQ,4899
25
+ file_hub_client/schemas/__init__.py,sha256=oaXrODfBI-Oe-MyAyL6bKDZ1mPRC_IyMmxzGic4BbEU,2692
26
+ file_hub_client/schemas/context.py,sha256=E4TKqUJBaq9s31cGIRsztS-mQBUYAKyyLK8knVgWNb8,5805
27
+ file_hub_client/schemas/file.py,sha256=IOR50AJ2Q8F9d7O6jvKSkzfFVdg0CppZQ8rJWfHDyvE,6821
28
28
  file_hub_client/schemas/folder.py,sha256=D7UFsLCou-7CCXCQvuRObaBQEGmETsm1cgGOG1ceSrk,1026
29
29
  file_hub_client/schemas/taple.py,sha256=LYsECsDbcioPXcvjRBcCEbh083iEB-eFCapJrGMJ8w0,17790
30
30
  file_hub_client/services/__init__.py,sha256=yh5mir0dKB_LtJMk2hTpQI9WSlguaxtVD2KomMnzxdM,514
31
31
  file_hub_client/services/file/__init__.py,sha256=aJygo_AzYk5NN-ezp-a9YlugJ82wVIP9e5e54fl0UsI,342
32
- file_hub_client/services/file/async_blob_service.py,sha256=St0FdvzSpJJErhJ3V1vCSSbRN14jggEMS9U8QPqZFiQ,24716
33
- file_hub_client/services/file/async_file_service.py,sha256=wJuoy-3CiIow5Xef_4JNJRKEOoMTKfs9nxqbkaYI4Ig,9110
32
+ file_hub_client/services/file/async_blob_service.py,sha256=1gIvQz6ORIGmhBgDY2D3aHuZkftZKdRFPQ3LFMiogU0,35382
33
+ file_hub_client/services/file/async_file_service.py,sha256=lFMfnHKsbTIOpMAdFvER4B2JqVGz9SNzgxlmA1kY3Js,17197
34
34
  file_hub_client/services/file/base_file_service.py,sha256=wTxplrTk9klfwIHOPfTL0TQd6gX4nEmkYtIhpiZ3GVo,4791
35
- file_hub_client/services/file/sync_blob_service.py,sha256=3VbJGuW7PHCQFK-ip0Y2NRnU39ps3rHnQoxFQp46e3s,24443
36
- file_hub_client/services/file/sync_file_service.py,sha256=fMTq91dXwZzuMsPTZ1whaQBxzpyHfSP-A4W15pWSNfs,8964
35
+ file_hub_client/services/file/sync_blob_service.py,sha256=mCre0YVsWu143K2CurK648OZnM9Hy19FQcVsiYkoCJw,35029
36
+ file_hub_client/services/file/sync_file_service.py,sha256=3VEgFiWYfoWD4iZObJ8uylUtNmK08snXWUaVEosUPDo,16979
37
37
  file_hub_client/services/folder/__init__.py,sha256=vGbMOlNiEBdnWZB1xE74RJtoroI28hKHCWfQV1GqKQc,210
38
38
  file_hub_client/services/folder/async_folder_service.py,sha256=uFEmtW8EXYvaKYT2JCitWbdTGR1EtHlx_eBN5P3JUZg,7293
39
39
  file_hub_client/services/folder/sync_folder_service.py,sha256=T00k1nD0txjOFQXxeIbF_ZOkNUhsBF45sDxyaDk8rf8,7167
@@ -42,16 +42,17 @@ file_hub_client/services/taple/async_taple_service.py,sha256=XZqMBN69FSJ8-n0nyIf
42
42
  file_hub_client/services/taple/base_taple_service.py,sha256=m_RZjvlXD8CzsB4gtZWDKiL7TNYYtRuSeY4yrFDnGIs,15842
43
43
  file_hub_client/services/taple/idempotent_taple_mixin.py,sha256=lZeMF59dU-KVnc2p7epGrclidCv0nYg8TP_qVUezJ48,4295
44
44
  file_hub_client/services/taple/sync_taple_service.py,sha256=LIfpJjZjUPpee5zidrmiRD-tTXPouSlU4RpScy5kNZY,87392
45
- file_hub_client/utils/__init__.py,sha256=0WS1R9VEPEqIN6_ksHEbO6Eu0G1Ps6oNTuOtoDMdDMM,1832
45
+ file_hub_client/utils/__init__.py,sha256=Chz4dEBbI2LyatrLLorWBx_kkNsg4LeFa-veUczlrPQ,2152
46
46
  file_hub_client/utils/converter.py,sha256=TX69Bqk-PwNdv2hYQ07_tW6HQnQycHcJkGeRnskeF3A,3734
47
47
  file_hub_client/utils/download_helper.py,sha256=Mc8TQSWjHxIglJMkKlGy9r3LZe8e_Mwe6D3sfn6IOnY,13338
48
- file_hub_client/utils/file_utils.py,sha256=Ly8R5KJS_3lbgJxNZkc4sSBKuGgn-fYeh17GEY4pyy8,4359
48
+ file_hub_client/utils/file_utils.py,sha256=x4Oky_ZpmZ3TuLB7SjmCuzYiSqOyCuAMLe_2A6OjdFg,5537
49
49
  file_hub_client/utils/idempotency.py,sha256=zuXDlpAc9VTkTsarlnkO0VuJ77yON6j1TX0GvL9Xd9k,6029
50
+ file_hub_client/utils/ip_detector.py,sha256=S1pHn5CSdLLOrIeIxU_qI7zA7bRW6pUOXVIbRuGHunc,6184
50
51
  file_hub_client/utils/logging.py,sha256=IxcvWkA0G9s9BMiXIeFAdJX5G-Lc5-JFlS2yxOX1Swo,11741
51
52
  file_hub_client/utils/retry.py,sha256=A2MBdJCEY-Ks0guq8dd5wXX22sD27N30Qy3nQIW1B_s,18019
52
53
  file_hub_client/utils/smart_retry.py,sha256=RjBhyG6SNDfMXxNxKU_qayWDD6Ihp7ow6_BPjhgflM0,16465
53
54
  file_hub_client/utils/upload_helper.py,sha256=gEtn9OXVJiGUpVev_fqrDnRQ6AFiiP9goLzFrVpqXmU,22569
54
- tamar_file_hub_client-0.1.2.dist-info/METADATA,sha256=IDzFkdNun5NF-ugAkJ7URmNpga0Hh9e9RzsYCFp3aAU,70429
55
- tamar_file_hub_client-0.1.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
56
- tamar_file_hub_client-0.1.2.dist-info/top_level.txt,sha256=9wcR7hyAJQdJg_kuH6WR3nmpJ8O-j8aJNK8f_kcFy6U,16
57
- tamar_file_hub_client-0.1.2.dist-info/RECORD,,
55
+ tamar_file_hub_client-0.1.4.dist-info/METADATA,sha256=hsBL8px3zXCoOm5qZVw_weT7uT-6Z8wiXHU3k6asZn0,76776
56
+ tamar_file_hub_client-0.1.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
57
+ tamar_file_hub_client-0.1.4.dist-info/top_level.txt,sha256=9wcR7hyAJQdJg_kuH6WR3nmpJ8O-j8aJNK8f_kcFy6U,16
58
+ tamar_file_hub_client-0.1.4.dist-info/RECORD,,