MeUtils 2024.3.4.13.4.45__py3-none-any.whl → 2025.1.16.17.15.52__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 (582) hide show
  1. {MeUtils-2024.3.4.13.4.45.dist-info → MeUtils-2025.1.16.17.15.52.dist-info}/METADATA +38 -32
  2. MeUtils-2025.1.16.17.15.52.dist-info/RECORD +864 -0
  3. {MeUtils-2024.3.4.13.4.45.dist-info → MeUtils-2025.1.16.17.15.52.dist-info}/WHEEL +1 -1
  4. {MeUtils-2024.3.4.13.4.45.dist-info → MeUtils-2025.1.16.17.15.52.dist-info}/entry_points.txt +1 -0
  5. apps/spider.py +24 -8
  6. examples/_openaisdk/4v.py +110 -0
  7. examples/_openaisdk/__init__.py +11 -0
  8. examples/_openaisdk/baichuan.py +38 -0
  9. examples/_openaisdk/bpo.py +138 -0
  10. examples/_openaisdk/chat_latex.py +95 -0
  11. examples/_openaisdk/chattts.py +85 -0
  12. examples/_openaisdk/copilot.py +48 -0
  13. examples/_openaisdk/dalle3.py +48 -0
  14. examples/_openaisdk/deeplx.py +31 -0
  15. examples/_openaisdk/demo.py +77 -0
  16. examples/_openaisdk/embeddings.py +34 -0
  17. examples/_openaisdk/gpt4all.py +69 -0
  18. examples/_openaisdk/gpt_fc.py +23 -0
  19. examples/_openaisdk/gr_vl.py +46 -0
  20. examples/_openaisdk/json_mode.py +12 -0
  21. examples/_openaisdk/kimi.py +91 -0
  22. examples/_openaisdk/kimi_qa.py +57 -0
  23. examples/_openaisdk/minimax.py +75 -0
  24. examples/_openaisdk/open_router.py +48 -0
  25. examples/_openaisdk/openai_aiplus.py +54 -0
  26. examples/_openaisdk/openai_audio.py +20 -0
  27. examples/_openaisdk/openai_baichuan.py +59 -0
  28. examples/_openaisdk/openai_cache.py +37 -0
  29. examples/_openaisdk/openai_chatfire.py +228 -0
  30. examples/_openaisdk/openai_chatfire_all.py +166 -0
  31. examples/_openaisdk/openai_deepinfra.py +55 -0
  32. examples/_openaisdk/openai_deepseek.py +29 -0
  33. examples/_openaisdk/openai_doubao.py +43 -0
  34. examples/_openaisdk/openai_embeddings.py +36 -0
  35. examples/_openaisdk/openai_files.py +57 -0
  36. examples/_openaisdk/openai_gitee.py +33 -0
  37. examples/_openaisdk/openai_god.py +45 -0
  38. examples/_openaisdk/openai_groq.py +240 -0
  39. examples/_openaisdk/openai_images.py +203 -0
  40. examples/_openaisdk/openai_json.py +78 -0
  41. examples/_openaisdk/openai_lingyi.py +59 -0
  42. examples/_openaisdk/openai_modelscope.py +54 -0
  43. examples/_openaisdk/openai_moon.py +55 -0
  44. examples/_openaisdk/openai_oi.py +61 -0
  45. examples/_openaisdk/openai_ppu.py +47 -0
  46. examples/_openaisdk/openai_qwen.py +58 -0
  47. examples/_openaisdk/openai_search.py +42 -0
  48. examples/_openaisdk/openai_sensenova.py +81 -0
  49. examples/_openaisdk/openai_siliconflow.py +52 -0
  50. examples/_openaisdk/openai_step.py +45 -0
  51. examples/_openaisdk/openai_test.py +66 -0
  52. examples/_openaisdk/openai_together.py +57 -0
  53. examples/_openaisdk/openai_tune.py +38 -0
  54. examples/_openaisdk/openai_zhipu.py +59 -0
  55. examples/_openaisdk/ppu.py +28 -0
  56. examples/_openaisdk/rag.py +54 -0
  57. examples/_openaisdk/rag_.py +26 -0
  58. examples/_openaisdk/test.py +52 -0
  59. examples/_openaisdk/x.py +32 -0
  60. examples/_openaisdk/xx.py +29 -0
  61. examples/_openaisdk/zhipu_files.py +47 -0
  62. examples/_openaisdk/zhipu_/346/231/272/350/203/275/344/275/223.py +45 -0
  63. examples/_openaisdk//345/205/234/345/272/225/346/265/213/350/257/225.py +50 -0
  64. examples/_openaisdk//345/244/232/346/250/241/346/200/201/346/265/213/350/257/225.py +76 -0
  65. examples/_openaisdk//345/244/232/346/250/241/346/200/201/346/265/213/350/257/225_.py +56 -0
  66. examples/_openaisdk//346/226/207/344/273/266/351/227/256/347/255/224.py +36 -0
  67. examples/_openaisdk//346/226/207/346/241/243/350/247/243/346/236/220.py +34 -0
  68. examples/_openaisdk//346/250/241/345/236/213/346/265/213/350/257/225.py +53 -0
  69. examples/_openaisdk//351/230/277/351/207/214.py +80 -0
  70. {meutils/serving/jina/__demo → examples/ann}/__init__.py +1 -1
  71. examples/ann/main.py +31 -0
  72. examples/apis/kl.py +28 -0
  73. examples/apis/x.py +17 -0
  74. examples/apis/xx.py +17 -0
  75. examples/arq_demo/demo.py +3 -0
  76. examples/backgroundtasks.py +25 -0
  77. examples/bserver.py +513 -21
  78. examples/cache_demo/HermesCache_demo.py +81 -0
  79. examples/cache_demo/acacge.py +26 -0
  80. examples/cache_demo/x.py +31 -0
  81. {meutils/docarray_utils → examples/caches}/__init__.py +1 -1
  82. examples/caches/llmcache.py +18 -0
  83. examples/celery_demo/product_task.py +2 -0
  84. examples/demo.py +17 -1
  85. examples/fastapi_caching.py +59 -0
  86. {meutils/dependencies → examples/gr}/__init__.py +1 -1
  87. examples/gr/d.py +22 -0
  88. examples/gr/demo.py +30 -0
  89. examples/ip2/345/234/260/345/214/272.py +16 -0
  90. examples/jinja2_demo/j2_demo.py +20 -1
  91. examples/json/346/240/207/345/207/206/345/214/226.py +54 -0
  92. examples/md.py +29 -0
  93. {meutils/serving/jina → examples/nesc}/__init__.py +1 -1
  94. examples/nesc/main.py +76 -0
  95. examples/orm/mysql_orm.py +113 -0
  96. examples/orm/sql_creater.py +57 -0
  97. examples/orm/sqlm.py +134 -0
  98. examples/rq_demo/fns.py +18 -0
  99. examples/rq_demo/redis/351/230/237/345/210/227.py +14 -7
  100. examples/rq_demo/redis/351/230/237/345/210/227_add_chatfire.py +30 -0
  101. examples/size_map.py +43 -0
  102. examples/test.py +59 -0
  103. examples/webs/__init__.py +11 -0
  104. examples/webs/main.py +34 -0
  105. examples/x.py +13 -0
  106. examples//345/216/273/346/260/264/345/215/260.py +20 -0
  107. examples//346/226/207/346/241/243/346/231/272/350/203/275/__init__.py +11 -0
  108. meutils/_utils.py +15 -6
  109. meutils/ai_audio/asr/__init__.py +3 -2
  110. meutils/ai_audio/asr/cf_asr.py +53 -0
  111. meutils/ai_audio/asr/de.py +11 -0
  112. meutils/ai_audio/asr/fast_asr.py +15 -7
  113. meutils/ai_audio/asr/openai_asr.py +83 -6
  114. meutils/ai_audio/fast_asr.py +8 -4
  115. meutils/ai_audio/tts/EdgeTTS.py +33 -7
  116. meutils/ai_audio/tts/openai_tts.py +24 -20
  117. meutils/ai_audio/tts/tts_ui.py +1 -0
  118. meutils/ai_audio/utils.py +9 -0
  119. meutils/ai_cv/__init__.py +0 -1
  120. meutils/ai_cv/ocr.py +3 -2
  121. meutils/ai_cv/utils.py +154 -0
  122. meutils/ai_video/avmerge.py +6 -0
  123. meutils/ai_video/video.py +11 -2
  124. meutils/{api → apis}/__init__.py +1 -1
  125. meutils/apis/ali_apis.py +60 -0
  126. meutils/apis/audio/__init__.py +10 -0
  127. meutils/apis/audio/deepinfra.py +59 -0
  128. meutils/apis/audio/fish.py +248 -0
  129. meutils/apis/baidu/__init__.py +9 -0
  130. meutils/apis/baidu/bdaitpzs.py +229 -0
  131. meutils/apis/baidu/test.py +78 -0
  132. meutils/apis/chatglm/__init__.py +11 -0
  133. meutils/apis/chatglm/glm_video.py +273 -0
  134. meutils/apis/chatglm/glm_video_api.py +116 -0
  135. meutils/apis/chatglm/images.py +63 -0
  136. meutils/apis/chatglm/temp.py +259 -0
  137. meutils/apis/chatglm/x.py +31 -0
  138. meutils/{api → apis}/common.py +10 -6
  139. meutils/apis/fal/__init__.py +11 -0
  140. meutils/apis/fal/files.py +53 -0
  141. meutils/apis/fal/images.py +57 -0
  142. meutils/apis/fal/images_.py +72 -0
  143. meutils/apis/fal/videos.py +77 -0
  144. meutils/apis/firecrawl.py +45 -0
  145. meutils/apis/gitee/__init__.py +11 -0
  146. meutils/apis/gitee/images/__init__.py +9 -0
  147. meutils/apis/gitee/images/kolors.py +99 -0
  148. meutils/apis/hailuoai/__init__.py +11 -0
  149. meutils/apis/hailuoai/demo.py +34 -0
  150. meutils/apis/hailuoai/hasha_new.py +248 -0
  151. meutils/apis/hailuoai/music.py +11 -0
  152. meutils/apis/hailuoai/upload.py +116 -0
  153. meutils/apis/hailuoai/videos.py +460 -0
  154. meutils/apis/hailuoai/yy.py +242 -0
  155. meutils/apis/hf/__init__.py +11 -0
  156. meutils/apis/hf/got_ocr.py +64 -0
  157. meutils/apis/hf/gradio.py +34 -0
  158. meutils/apis/hf/hivisionidphotos.py +80 -0
  159. meutils/apis/hf/kolors.py +68 -0
  160. meutils/apis/hf/kolors_virtual_try_on.py +107 -0
  161. meutils/apis/hf/r.py +53 -0
  162. meutils/apis/hf/x.py +26 -0
  163. meutils/apis/hf//350/257/201/344/273/266/347/205/247.py +41 -0
  164. meutils/apis/hunyuan/__init__.py +11 -0
  165. meutils/apis/hunyuan/image_tools.py +84 -0
  166. meutils/apis/images/__init__.py +11 -0
  167. meutils/apis/images/deepinfra.py +92 -0
  168. meutils/apis/images/demo.py +150 -0
  169. meutils/apis/images/eidt.py +36 -0
  170. meutils/apis/images/flux/__init__.py +11 -0
  171. meutils/apis/images/flux/fluxpro.py +108 -0
  172. meutils/apis/images/flux/mystic.py +116 -0
  173. meutils/apis/images/ideogram/__init__.py +10 -0
  174. meutils/apis/images/ideogram/ideogram_images.py +193 -0
  175. meutils/apis/images/prodia/__init__.py +12 -0
  176. meutils/apis/images/prodia/faceswap.py +76 -0
  177. meutils/apis/images/recraft.py +152 -0
  178. meutils/apis/images/virtual_try_on/__init__.py +11 -0
  179. meutils/apis/images/virtual_try_on/images.py +65 -0
  180. meutils/apis/jiema/24mail.py +96 -0
  181. meutils/apis/jiema/__init__.py +11 -0
  182. meutils/apis/jiema/yezi.py +97 -0
  183. meutils/apis/jimeng/__init__.py +11 -0
  184. meutils/apis/jimeng/common.py +328 -0
  185. meutils/apis/jimeng/doubao.py +68 -0
  186. meutils/apis/jimeng/doubao_utils.py +175 -0
  187. meutils/apis/jimeng/files.py +263 -0
  188. meutils/apis/jimeng/images.py +140 -0
  189. meutils/apis/jimeng/lip_sync.py +11 -0
  190. meutils/apis/jina.py +55 -0
  191. meutils/apis/kling/__init__.py +11 -0
  192. meutils/apis/kling/api.py +60 -0
  193. meutils/apis/kling/images.py +174 -0
  194. meutils/apis/kling/kolors_virtual_try_on.py +111 -0
  195. meutils/apis/kling/kolors_virtual_try_on_web.py +126 -0
  196. meutils/apis/kling/videos.py +67 -0
  197. meutils/apis/kling//351/211/264/346/235/203.py +34 -0
  198. meutils/apis/kuaidi.py +32 -0
  199. meutils/apis/kuaishou/__init__.py +10 -0
  200. meutils/apis/kuaishou/klingai.py +523 -0
  201. meutils/apis/kuaishou/klingai_video.py +197 -0
  202. meutils/apis/kuaishou/kolors.py +189 -0
  203. meutils/apis/llm_qa.py +55 -0
  204. meutils/apis/luma/__init__.py +11 -0
  205. meutils/apis/luma/luma.py +123 -0
  206. meutils/apis/minicpm/__init__.py +9 -0
  207. meutils/apis/minicpm/luca.py +137 -0
  208. meutils/apis/monica/__init__.py +11 -0
  209. meutils/apis/monica/llm.py +11 -0
  210. meutils/apis/napkin/__init__.py +11 -0
  211. meutils/apis/napkin/icons.py +42 -0
  212. meutils/apis/niutrans.py +73 -0
  213. meutils/apis/oneapi/__init__.py +11 -0
  214. meutils/apis/oneapi/channel.py +68 -0
  215. meutils/apis/oneapi/common.py +135 -0
  216. meutils/apis/oneapi/log.py +47 -0
  217. meutils/apis/oneapi/token.py +48 -0
  218. meutils/apis/oneapi/token_.py +112 -0
  219. meutils/apis/oneapi/user.py +100 -0
  220. meutils/apis/oneapi/utils.py +47 -0
  221. meutils/apis/pixverse/__init__.py +11 -0
  222. meutils/apis/pixverse/pixverse.py +150 -0
  223. meutils/apis/proxy/__init__.py +11 -0
  224. meutils/apis/proxy/ips.py +178 -0
  225. meutils/apis/remini/__init__.py +11 -0
  226. meutils/apis/remini/remini.py +89 -0
  227. meutils/apis/replicateai/__init__.py +11 -0
  228. meutils/apis/replicateai/images.py +79 -0
  229. meutils/apis/replicateai/raw.py +53 -0
  230. meutils/apis/runwayml/__init__.py +10 -0
  231. meutils/apis/runwayml/gen.py +143 -0
  232. meutils/apis/search/__init__.py +11 -0
  233. meutils/apis/search/baichuan.py +11 -0
  234. meutils/apis/search/metaso.py +218 -0
  235. meutils/apis/search/metaso_.py +77 -0
  236. meutils/apis/search/n.py +99 -0
  237. meutils/apis/search/searxng.py +42 -0
  238. meutils/apis/search_music.py +39 -0
  239. meutils/apis/siliconflow/__init__.py +9 -0
  240. meutils/apis/siliconflow/audio.py +63 -0
  241. meutils/apis/siliconflow/image_to_image.py +116 -0
  242. meutils/apis/siliconflow/images.py +154 -0
  243. meutils/apis/siliconflow/rerankers.py +40 -0
  244. meutils/apis/siliconflow/text_to_image.py +132 -0
  245. meutils/apis/siliconflow/utils.py +66 -0
  246. meutils/apis/siliconflow/videos.py +102 -0
  247. meutils/apis/sunoai/__init__.py +10 -0
  248. meutils/apis/sunoai/haimian.py +135 -0
  249. meutils/apis/sunoai/suno.py +373 -0
  250. meutils/apis/textcard/__init__.py +11 -0
  251. meutils/apis/textcard/demo.py +25 -0
  252. meutils/apis/textcard/hanyuxinjie.py +81 -0
  253. meutils/apis/textin.py +159 -0
  254. meutils/apis/to_image/__init__.py +11 -0
  255. meutils/apis/to_image/html2image.py +29 -0
  256. meutils/apis/to_image/md.py +29 -0
  257. meutils/apis/to_image/url2image.py +41 -0
  258. meutils/apis/together/__init__.py +11 -0
  259. meutils/apis/together/images.py +80 -0
  260. meutils/apis/translator/__init__.py +9 -0
  261. meutils/apis/translator/deeplx.py +55 -0
  262. meutils/apis/tripo3d/__init__.py +11 -0
  263. meutils/apis/tripo3d/images.py +106 -0
  264. meutils/apis/ts.py +60 -0
  265. meutils/apis/uptime_kuma/__init__.py +11 -0
  266. meutils/apis/uptime_kuma/common.py +56 -0
  267. meutils/apis/uptime_kuma//345/233/275/344/272/247/345/210/206/347/273/204.py +68 -0
  268. meutils/apis/utils.py +47 -0
  269. meutils/apis/videos/__init__.py +11 -0
  270. meutils/apis/videos/sora.py +16 -0
  271. meutils/apis/vidu/__init__.py +9 -0
  272. meutils/apis/vidu/vidu_video.py +254 -0
  273. meutils/apis/vidu/x.py +14 -0
  274. meutils/apis/voice_clone/__init__.py +10 -0
  275. meutils/apis/voice_clone/fish.py +236 -0
  276. meutils/apis/voice_clone/fish_api.py +16 -0
  277. meutils/apis/web_search.py +31 -0
  278. meutils/apis/yezi.py +97 -0
  279. meutils/async_task/__init__.py +13 -0
  280. meutils/async_task/celery_config.py +106 -0
  281. meutils/async_task/common.py +37 -0
  282. meutils/async_task/demo_create_tasks.py +73 -0
  283. meutils/async_task/tasks/__init__.py +11 -0
  284. meutils/async_task/tasks/_all.py +20 -0
  285. meutils/async_task/tasks/hailuo.py +24 -0
  286. meutils/async_task/tasks/kling.py +30 -0
  287. meutils/async_task/tasks/replicateai.py +24 -0
  288. meutils/async_task/tasks/test.py +124 -0
  289. meutils/async_task/tasks/vidu.py +28 -0
  290. meutils/async_task/utils.py +191 -0
  291. meutils/async_task//351/200/232/347/224/250/350/256/276/350/256/241.py +119 -0
  292. meutils/async_utils/asyncer_.py +37 -0
  293. meutils/async_utils/background.py +68 -0
  294. meutils/async_utils/common.py +136 -16
  295. meutils/async_utils/test.py +47 -0
  296. meutils/cache_utils.py +29 -23
  297. meutils/caches/__init__.py +9 -0
  298. meutils/caches/acache.py +45 -0
  299. meutils/caches/redis_cache.py +63 -0
  300. meutils/clis/check_api.py +66 -0
  301. meutils/clis/cli.py +1 -1
  302. meutils/common.py +56 -17
  303. meutils/config_utils/__init__.py +11 -0
  304. meutils/config_utils/lark_utils/__init__.py +11 -0
  305. meutils/config_utils/lark_utils/common.py +385 -0
  306. meutils/config_utils/lark_utils/demo.py +13 -0
  307. meutils/config_utils/lark_utils/x.py +50 -0
  308. meutils/config_utils/manager.py +108 -0
  309. meutils/crawlers/__init__.py +11 -0
  310. meutils/data/VERSION +1 -1
  311. meutils/data/cowboy-hat-face.webp +0 -0
  312. meutils/data/oneapi/FOOTER.md +7 -0
  313. meutils/data/oneapi/NOTICE.md +138 -0
  314. meutils/data/oneapi/__init__.py +15 -0
  315. meutils/db/orm.py +179 -0
  316. meutils/db/redis_db.py +87 -0
  317. meutils/decorators/cache.py +1 -1
  318. meutils/decorators/common.py +84 -5
  319. meutils/decorators/contextmanagers.py +17 -6
  320. meutils/decorators/fastapi_decorator.py +77 -3
  321. meutils/decorators/polling.py +46 -0
  322. meutils/decorators/retry.py +150 -26
  323. meutils/fastapi_utils/__init__.py +11 -0
  324. meutils/fastapi_utils/exceptions/http_error.py +72 -0
  325. meutils/fastapi_utils/exceptions/validation_error.py +44 -0
  326. meutils/hash_utils.py +9 -4
  327. meutils/hooks/__init__.py +11 -0
  328. meutils/hooks/hook_test.py +174 -0
  329. meutils/hooks/wechat.py +162 -0
  330. meutils/hooks/wechat_channel.py +303 -0
  331. meutils/init/evn.py +1 -1
  332. meutils/io/files_utils.py +232 -0
  333. meutils/io/image.py +148 -10
  334. meutils/io/x.py +75 -0
  335. meutils/llm/__init__.py +10 -0
  336. meutils/llm/check_api.py +109 -0
  337. meutils/llm/check_utils.py +106 -0
  338. meutils/llm/clients.py +38 -0
  339. meutils/llm/completions/__init__.py +11 -0
  340. meutils/llm/completions/agents/__init__.py +11 -0
  341. meutils/llm/completions/agents/file.py +125 -0
  342. meutils/llm/completions/cp.py +112 -0
  343. meutils/llm/completions/delilegal.py +135 -0
  344. meutils/llm/completions/dify.py +81 -0
  345. meutils/llm/completions/kimi.py +47 -0
  346. meutils/llm/completions/modelscope.py +11 -0
  347. meutils/{fileparser/filetype.py → llm/completions/oi.py} +5 -3
  348. meutils/llm/completions/rag/__init__.py +11 -0
  349. meutils/llm/completions/rag/fire.py +157 -0
  350. meutils/llm/completions/rag/qwen.py +11 -0
  351. meutils/llm/completions/rag/rag.py +41 -0
  352. meutils/llm/completions/rag.py +38 -0
  353. meutils/llm/completions/tryblend.py +201 -0
  354. meutils/llm/completions/tune.py +284 -0
  355. meutils/llm/completions/x.py +26 -0
  356. meutils/llm/completions/xx.py +61 -0
  357. meutils/llm/completions/yuanbao.py +176 -0
  358. meutils/llm/demo.py +114 -0
  359. meutils/llm/functions/__init__.py +11 -0
  360. meutils/llm/mappers.py +15 -0
  361. meutils/llm/openai_utils/__init__.py +11 -0
  362. meutils/llm/openai_utils/common.py +284 -0
  363. meutils/llm/openai_utils/tool_outputs.py +45 -0
  364. meutils/llm/output_parsers/__init__.py +80 -0
  365. meutils/llm/prompts/__init__.py +244 -0
  366. meutils/llm/prompts/demo.py +155 -0
  367. meutils/llm/prompts/html2image_test.py +19 -0
  368. meutils/llm/utils.py +133 -0
  369. meutils/llm/x.py +75 -0
  370. meutils/notice/feishu.py +40 -9
  371. meutils/notice/wechat.py +23 -21
  372. meutils/np_utils.py +10 -1
  373. meutils/office_automation/pdf.py +6 -1
  374. meutils/oss/__init__.py +20 -0
  375. meutils/oss/minio_oss.py +184 -0
  376. meutils/oss/minio_utils.py +48 -0
  377. meutils/other/__demo.py +6 -4
  378. meutils/pandas_utils/__init__.py +1 -0
  379. meutils/pandas_utils/common.py +31 -0
  380. meutils/pandas_utils/pd_utils.py +10 -6
  381. meutils/parsers/__init__.py +10 -0
  382. meutils/parsers/file_parsers.py +110 -0
  383. meutils/parsers/fileparser/demo.py +41 -0
  384. meutils/parsers/fileparser/filetype.py +41 -0
  385. meutils/pay.py +37 -0
  386. meutils/pipe.py +37 -4
  387. meutils/playwright_utils/common.py +20 -12
  388. meutils/plots/common.py +35 -34
  389. meutils/queues/demo.py +56 -0
  390. meutils/queues/smooth_queue.py +120 -0
  391. meutils/queues/uniform_queue.py +3 -1
  392. meutils/request_utils/__init__.py +26 -2
  393. meutils/request_utils/ark.py +47 -0
  394. meutils/request_utils/crawler.py +34 -5
  395. meutils/request_utils/jwt_utils/__init__.py +11 -0
  396. meutils/request_utils/jwt_utils/common.py +42 -0
  397. meutils/request_utils/volc.py +160 -0
  398. meutils/schemas/__init__.py +0 -1
  399. meutils/schemas/baidu_types.py +70 -0
  400. meutils/schemas/batch_types.py +450 -0
  401. meutils/schemas/celery_types.py +64 -0
  402. meutils/schemas/chatfire_types.py +15 -0
  403. meutils/schemas/chatglm_types.py +197 -0
  404. meutils/schemas/db/__init__.py +11 -0
  405. meutils/schemas/db/oneapi_types.py +117 -0
  406. meutils/schemas/dify_types.py +40 -0
  407. meutils/schemas/embedding.py +31 -0
  408. meutils/schemas/fal_types.py +13 -0
  409. meutils/schemas/fish_types.py +11 -0
  410. meutils/schemas/hailuo_types.py +208 -0
  411. meutils/schemas/haimian_types.py +51 -0
  412. meutils/schemas/idphoto_types.py +43 -0
  413. meutils/schemas/image_types.py +476 -0
  414. meutils/schemas/jimeng_types.py +28 -0
  415. meutils/schemas/jina_types.py +67 -0
  416. meutils/schemas/kimi_types.py +86 -0
  417. meutils/schemas/kling_types.py +235 -0
  418. meutils/schemas/kuaishou_types.py +328 -0
  419. meutils/schemas/luma_types.py +59 -0
  420. meutils/schemas/message_types.py +165 -0
  421. meutils/schemas/message_types_.py +219 -0
  422. meutils/schemas/metaso_types.py +64 -0
  423. meutils/schemas/napkin_types.py +85 -0
  424. meutils/schemas/ocr_types.py +37 -0
  425. meutils/schemas/oneapi/__init__.py +11 -0
  426. meutils/schemas/oneapi/_types.py +49 -0
  427. meutils/schemas/oneapi/common.py +883 -0
  428. meutils/schemas/oneapi/icons.py +30 -0
  429. meutils/schemas/oneapi/model_group_info.py +48 -0
  430. meutils/schemas/oneapi/model_info.py +34 -0
  431. meutils/schemas/oneapi/models.py +26 -0
  432. meutils/schemas/oneapi/x.py +26 -0
  433. meutils/schemas/oneapi//351/207/215/345/256/232/345/220/221.py +132 -0
  434. meutils/schemas/openai_api_protocol.py +411 -0
  435. meutils/schemas/openai_types.py +366 -0
  436. meutils/schemas/pixverse_types.py +88 -0
  437. meutils/schemas/playwright_types.py +57 -0
  438. meutils/schemas/prodia_types.py +19 -0
  439. meutils/schemas/replicate_types.py +112 -0
  440. meutils/schemas/request_types.py +20 -0
  441. meutils/schemas/runwayml_types.py +190 -0
  442. meutils/schemas/siliconflow_types.py +80 -0
  443. meutils/schemas/step_types.py +19 -0
  444. meutils/schemas/suno_types.py +319 -0
  445. meutils/schemas/task_types.py +192 -0
  446. meutils/schemas/translator_types.py +29 -0
  447. meutils/schemas/tripo3d_types.py +57 -0
  448. meutils/schemas/tryblend_types.py +51 -0
  449. meutils/schemas/video_types.py +62 -0
  450. meutils/schemas/vidu_types.py +350 -0
  451. meutils/schemas/wechat_types.py +316 -0
  452. meutils/schemas/yuanbao_types.py +260 -0
  453. meutils/serving/celery/__init__.py +8 -0
  454. meutils/serving/celery/config.py +115 -0
  455. meutils/serving/celery/router.py +4 -6
  456. meutils/serving/celery/tasks.py +6 -4
  457. meutils/serving/celery//351/200/232/347/224/250/350/256/276/350/256/241.py +119 -0
  458. meutils/serving/fastapi/common.py +27 -31
  459. meutils/serving/fastapi/dependencies/__init__.py +0 -1
  460. meutils/serving/fastapi/dependencies/auth.py +55 -2
  461. meutils/serving/fastapi/exceptions/http_error.py +67 -2
  462. meutils/serving/fastapi/exceptions/validation_error.py +18 -2
  463. meutils/serving/fastapi/lifespans.py +73 -0
  464. meutils/serving/fastapi/routers/scheduler.py +12 -0
  465. meutils/serving/fastapi/routers/screenshot.py +47 -0
  466. meutils/serving/fastapi/routers/spider.py +8 -3
  467. meutils/serving/fastapi/routers/task.py +48 -0
  468. meutils/serving/fastapi/utils.py +48 -1
  469. meutils/serving/streamlit/common.py +1 -1
  470. meutils/smooth_utils.py +3 -0
  471. meutils/str_utils/__init__.py +22 -3
  472. meutils/str_utils/json_utils.py +7 -0
  473. meutils/str_utils/regular_expression.py +102 -10
  474. meutils/templates/xx.html +21 -0
  475. meutils/templates/xxx.html +117 -0
  476. meutils/todo.py +12 -0
  477. meutils/tools/token_monitor.py +33 -0
  478. MeUtils-2024.3.4.13.4.45.dist-info/RECORD +0 -540
  479. meutils/ai_audio/asr/subtitle.srt +0 -40
  480. meutils/ai_audio/demo.ipynb +0 -1215
  481. meutils/ai_audio/example.srt +0 -348
  482. meutils/ai_audio/new.srt +0 -179
  483. meutils/ai_audio/subtitles.srt +0 -696
  484. meutils/ai_audio/tts/new.srt +0 -179
  485. meutils/ai_audio//350/247/206/351/242/221/345/220/210/345/271/266.sh +0 -32
  486. meutils/ai_cv/1.jpg +0 -0
  487. meutils/ai_cv/197.jpg +0 -0
  488. meutils/ai_cv/2.jpg +0 -0
  489. meutils/ai_cv/img.png +0 -0
  490. meutils/ai_cv/invoice.jpg +0 -0
  491. meutils/ai_cv/tbl.png +0 -0
  492. meutils/ai_cv/test.png +0 -0
  493. meutils/ann/README.md +0 -33
  494. meutils/ann/README_gensim.md +0 -47
  495. meutils/ann/examples/client.py +0 -59
  496. meutils/ann/examples/demo.py +0 -24
  497. meutils/api/deeplx.py +0 -29
  498. meutils/api/qr.png +0 -0
  499. meutils/clis/README.md +0 -29
  500. meutils/clis/__test.sh +0 -17
  501. meutils/clis/deepseek.txt +0 -8
  502. meutils/clis/deepseek_13003330042.json +0 -1
  503. meutils/clis/deepseek_13003872192.json +0 -1
  504. meutils/clis/deepseek_13852263862.json +0 -1
  505. meutils/clis/deepseek_13913898681.json +0 -1
  506. meutils/clis/deepseek_13962978617.json +0 -1
  507. meutils/clis/deepseek_15251801790.json +0 -1
  508. meutils/clis/deepseek_15720826383.json +0 -1
  509. meutils/clis/deepseek_18395563611.json +0 -1
  510. meutils/clis/deepseek_313303303@qq.com.json +0 -1
  511. meutils/clis/kimi_state.json +0 -1
  512. meutils/cmds/README.md +0 -55
  513. meutils/coding/__init__.py +0 -11
  514. meutils/coding/find132.py +0 -40
  515. meutils/db/README.md +0 -51
  516. meutils/decorators/README.md +0 -17
  517. meutils/docarray_utils/demo_es.py +0 -34
  518. meutils/docarray_utils/demo_hnsw.py +0 -55
  519. meutils/docarray_utils/in_memory.py +0 -38
  520. meutils/docarray_utils//346/224/271/351/200/240/344/270/213hnsw.py +0 -43
  521. meutils/io/file.py +0 -20
  522. meutils/io/img.png +0 -0
  523. meutils/io/x.yml +0 -1
  524. meutils/notice/img.png +0 -0
  525. meutils/notice/todo.md +0 -10
  526. meutils/office_automation//346/212/225/350/265/204/347/256/241/347/220/206/347/263/273/347/273/237O3.2_/344/272/244/346/230/223/347/273/204.pdm +0 -22469
  527. meutils/playwright_utils/__test.sh +0 -2
  528. meutils/playwright_utils/kimi1_cookies.json +0 -1
  529. meutils/playwright_utils/kimi2_cookies.json +0 -1
  530. meutils/playwright_utils/kimi_cookies.json +0 -93
  531. meutils/serving/README.md +0 -1
  532. meutils/serving/celery/_run.sh +0 -10
  533. meutils/serving/gui/run.sh +0 -9
  534. meutils/serving/jina/__demo/client.py +0 -42
  535. meutils/serving/jina/__demo/flow.svg +0 -1
  536. meutils/serving/jina/__demo/s.py +0 -34
  537. meutils/serving/jina/__demo/s2.py +0 -37
  538. meutils/serving/jina/__demo/server.py +0 -83
  539. meutils/serving/jina/__demo/test.py +0 -40
  540. meutils/serving/jina/executors/SentenceEncoder.py +0 -62
  541. meutils/serving/jina/executors/SentenceEncoder_.py +0 -63
  542. meutils/serving/jina/executors/__init__.py +0 -46
  543. meutils/serving/jina/executors/base.py +0 -40
  544. meutils/serving/jina/nlp_serving/__init__.py +0 -11
  545. meutils/serving/jina/nlp_serving/word_segmentation.py +0 -40
  546. meutils/serving/streamlit/conf.yaml +0 -5
  547. meutils/serving/streamlit/ocr.png +0 -0
  548. meutils/serving/streamlit/run.sh +0 -17
  549. meutils/serving/webui/.streamlit/_config.toml +0 -186
  550. meutils/serving/webui/.streamlit/config.toml +0 -26
  551. meutils/serving/webui/pages/_1_/345/210/206/350/257/215.py +0 -56
  552. meutils/serving/webui/pages/_2_/350/257/215/346/200/247/346/240/207/346/263/250/344/270/216/345/256/236/344/275/223/350/257/206/345/210/253.py +0 -54
  553. meutils/serving/webui/pages/_3_/346/226/207/346/234/254/345/214/271/351/205/215.py +0 -64
  554. meutils/serving/webui/run.sh +0 -9
  555. meutils/spark/__init__.py +0 -26
  556. meutils/tools/monitor.yml +0 -29
  557. {MeUtils-2024.3.4.13.4.45.dist-info → MeUtils-2025.1.16.17.15.52.dist-info}/LICENSE +0 -0
  558. {MeUtils-2024.3.4.13.4.45.dist-info → MeUtils-2025.1.16.17.15.52.dist-info}/top_level.txt +0 -0
  559. {meutils → examples}/comp_utils/__init__.py +0 -0
  560. {meutils → examples}/comp_utils/reverse_metric.py +0 -0
  561. /meutils/{fileparser/README.md → fastapi_utils/exceptions/__init__.py} +0 -0
  562. /meutils/{fileparser → parsers/fileparser}/PDF/346/212/275/345/217/226.py" +0 -0
  563. /meutils/{fileparser → parsers/fileparser}/__init__.py +0 -0
  564. /meutils/{fileparser → parsers/fileparser}/common.py +0 -0
  565. /meutils/{fileparser → parsers/fileparser}/filetype/__init__.py +0 -0
  566. /meutils/{fileparser → parsers/fileparser}/filetype/__main__.py +0 -0
  567. /meutils/{fileparser → parsers/fileparser}/filetype/filetype.py +0 -0
  568. /meutils/{fileparser → parsers/fileparser}/filetype/helpers.py +0 -0
  569. /meutils/{fileparser → parsers/fileparser}/filetype/match.py +0 -0
  570. /meutils/{fileparser → parsers/fileparser}/filetype/types/__init__.py +0 -0
  571. /meutils/{fileparser → parsers/fileparser}/filetype/types/application.py +0 -0
  572. /meutils/{fileparser → parsers/fileparser}/filetype/types/archive.py +0 -0
  573. /meutils/{fileparser → parsers/fileparser}/filetype/types/audio.py +0 -0
  574. /meutils/{fileparser → parsers/fileparser}/filetype/types/base.py +0 -0
  575. /meutils/{fileparser → parsers/fileparser}/filetype/types/document.py +0 -0
  576. /meutils/{fileparser → parsers/fileparser}/filetype/types/font.py +0 -0
  577. /meutils/{fileparser → parsers/fileparser}/filetype/types/image.py +0 -0
  578. /meutils/{fileparser → parsers/fileparser}/filetype/types/isobmff.py +0 -0
  579. /meutils/{fileparser → parsers/fileparser}/filetype/types/video.py +0 -0
  580. /meutils/{fileparser → parsers/fileparser}/filetype/utils.py +0 -0
  581. /meutils/{fileparser → parsers/fileparser}/pdf.py +0 -0
  582. /meutils/{fileparser → parsers/fileparser}//350/241/250/346/240/274/346/212/275/345/217/226.py" +0 -0
meutils/init/evn.py CHANGED
@@ -35,7 +35,7 @@ os.environ['PROMPT_TEMPLATE'] = """
35
35
  # 如果无法从中得到答案,请回答“根据已知信息无法回答该问题”或“没有提供足够的信息”。请使用中文回答,不允许添加编造内容。
36
36
  # """
37
37
 
38
- # MODELSCOPE_CACHE
38
+ # modelscope_cache
39
39
  # PPNLP
40
40
  if __name__ == '__main__':
41
41
  from pprint import pprint
@@ -0,0 +1,232 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : MeUtils.
4
+ # @File : file
5
+ # @Time : 2022/7/5 下午3:31
6
+ # @Author : yuanjie
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+
11
+ import mimetypes
12
+ from meutils.pipe import *
13
+ from meutils.decorators.retry import retrying
14
+ from meutils.caches.redis_cache import cache
15
+
16
+ # from fastapi import UploadFile 有点区别
17
+ from starlette.datastructures import UploadFile
18
+ from contextlib import asynccontextmanager
19
+ from httpx import AsyncClient
20
+
21
+
22
+ def guess_mime_type(file):
23
+ mime_type = None
24
+ if isinstance(file, str):
25
+ mime_type, _ = mimetypes.guess_type(file)
26
+ return mime_type or "application/octet-stream"
27
+
28
+
29
+ def file_append_firstline(line):
30
+ with open('untitled.txt', "r+") as f:
31
+ old = f.read()
32
+
33
+ f.seek(0)
34
+ f.write(line)
35
+ f.write(old)
36
+
37
+
38
+ def base64_to_bytes(base64_image_string):
39
+ """
40
+ # 将字节数据写入图片文件
41
+ image_data = base64_to_bytes(...)
42
+ with open(filename, 'wb') as file:
43
+ file.write(image_data)
44
+ """
45
+ return base64.b64decode(base64_image_string.split(",", 1)[-1])
46
+
47
+
48
+ async def to_bytes(
49
+ file: Union[UploadFile, str, bytes],
50
+ headers: Optional[dict] = None
51
+ ):
52
+ """
53
+
54
+ :param file: 文件对象、路径、base64、url
55
+ :param headers: httpx
56
+
57
+ :return: todo: bytes、filepath、io.BytesIO
58
+ """
59
+ # assert file
60
+
61
+ logger.debug(type(file))
62
+
63
+ if isinstance(file, bytes): return file
64
+
65
+ file_bytes = None
66
+ if isinstance(file, UploadFile):
67
+ file_bytes = await file.read()
68
+
69
+ elif isinstance(file, str) and file.startswith('http'): # url
70
+ async with AsyncClient(headers=headers or {}, timeout=60) as cilent:
71
+ resp = await cilent.get(file)
72
+ file_bytes = resp.content
73
+
74
+ elif isinstance(file, str) and len(file) > 256: # base64
75
+ file_bytes = base64_to_bytes(file)
76
+
77
+ elif isinstance(file, str) and len(file) < 256 and Path(file).is_file(): # file
78
+ file_bytes = Path(file).read_bytes()
79
+
80
+ return file_bytes
81
+
82
+
83
+ @asynccontextmanager
84
+ async def to_tempfile(file: Union[UploadFile, str]):
85
+ """
86
+
87
+ :param file: 文件对象、路径、base64、url
88
+ :return: todo: bytes、filepath、io.BytesIO
89
+ """
90
+ file_bytes = await to_bytes(file)
91
+
92
+ with tempfile.NamedTemporaryFile(mode='wb+') as temp:
93
+ temp.write(file_bytes)
94
+ temp.seek(0)
95
+
96
+ logger.debug(temp.name)
97
+
98
+ yield temp.name
99
+
100
+
101
+ @cache(ttl=7 * 24 * 3600)
102
+ async def to_url_fal(
103
+ file: Union[str, bytes, List],
104
+ filename: Optional[str] = None,
105
+ headers: Optional[dict] = None,
106
+ content_type: str = "application/octet-stream",
107
+ ):
108
+ """对象存储"""
109
+ if isinstance(file, list):
110
+ tasks = [to_url_fal(_, filename, headers, content_type) for _ in file]
111
+ urls = await asyncio.gather(*tasks)
112
+ return urls
113
+
114
+ if not file: return
115
+
116
+ if isinstance(file, str) and file.startswith("http"): # 转存: todo: base64
117
+ content_type = mimetypes.guess_type(file)[0] or content_type
118
+
119
+ file = await to_bytes(file, headers=headers)
120
+ content_type = (
121
+ mimetypes.guess_type(filename or '')[0]
122
+ or mimetypes.guess_type(f"x.{content_type}")[0] # format: image/png
123
+ or content_type
124
+ )
125
+
126
+ import fal_client
127
+
128
+ url = await fal_client.upload_async(data=file, content_type=content_type, file_name=filename)
129
+ return url
130
+
131
+
132
+ async def to_url(
133
+ file: Union[UploadFile, str, bytes],
134
+ filename: Optional[str] = None,
135
+ headers: Optional[dict] = None,
136
+ content_type: Optional[str] = "image/*" # todo: 适配 mime_type = "application/octet-stream"
137
+ ):
138
+ """对象存储"""
139
+ if not file: return
140
+
141
+ from openai.types.file_object import FileObject
142
+ from meutils.oss.minio_oss import Minio
143
+ uploads = [partial(Minio().put_object_for_openai, filename=filename)]
144
+
145
+ if len(file) < 1024 and isinstance(file, str) or filename: # 不指定就自行判断 url
146
+ content_type = mimetypes.guess_type(filename)[0] or mimetypes.guess_type(file)[0] or content_type
147
+
148
+ if content_type and content_type.startswith("image"):
149
+ from meutils.apis.chatglm.glm_video import upload_task as glm_upload
150
+
151
+ uploads = [glm_upload, ] + uploads
152
+
153
+ for upload in uploads:
154
+ try:
155
+ file = await to_bytes(file, headers=headers)
156
+ url = await upload(file)
157
+ if isinstance(url, FileObject):
158
+ url = url.filename
159
+ return url
160
+ except Exception as e:
161
+ logger.error(e)
162
+
163
+
164
+ async def to_base64(file: Union[UploadFile, str, bytes]):
165
+ _ = base64.b64encode(await to_bytes(file)).decode('utf-8')
166
+ return _
167
+
168
+
169
+ def base64_to_file(base64_image_string, filename):
170
+ image_data = base64_to_bytes(base64_image_string)
171
+ with open(filename, 'wb') as file:
172
+ file.write(image_data)
173
+
174
+
175
+ def file_to_base64(file):
176
+ _ = base64.b64encode(Path(file).read_bytes()).decode('utf-8')
177
+ content_type = mimetypes.guess_type('img.webp')[0] or "data:image/jpeg"
178
+
179
+ return f"data:{content_type},{_}"
180
+
181
+
182
+ async def to_file(file: Union[UploadFile, str, bytes], filename: Optional[str] = None):
183
+ file = await to_bytes(file)
184
+ if not filename: # 临时文件
185
+ with tempfile.NamedTemporaryFile(mode='wb+', delete=False) as temp:
186
+ temp.write(file)
187
+ temp.seek(0)
188
+ return temp.name
189
+ else:
190
+ Path(filename).write_bytes(file)
191
+ return Path(filename).resolve()
192
+
193
+
194
+ if __name__ == '__main__':
195
+ # import tempfile
196
+ #
197
+ # # 使用上下文管理器自动处理文件的关闭和删除
198
+ # with tempfile.NamedTemporaryFile(mode='wb+') as temp:
199
+ # temp.write(b"This is a temporary file.")
200
+ # temp.seek(0)
201
+ # print(f"文件内容: {temp.read()}")
202
+ # print(f"临时文件名: {temp.name}")
203
+ # 文件在这里自动关闭和删除
204
+
205
+ # arun(to_bytes(''))
206
+
207
+ # arun(to_url("x.png"))
208
+
209
+ # url = "https://storage.googleapis.com/bsp-remini-image-in-web-us-central1-autodelete/54a2d77f-3070-4a95-8a1b-906ac1c74d44/64439c90-c628-47e0-9e1b-36dbbbd06664/ba502f58/input.jpg?X-Goog-Algorithm=GOOG4-HMAC-SHA256&X-Goog-Credential=GOOG1ETQDJI557KBP4YD5TQG6FMZHVKCP3S53FHI6XLBYYMT24W3PZAZNZZWQ%2F20241014%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20241014T060335Z&X-Goog-Expires=3600&X-Goog-SignedHeaders=host&X-Goog-Signature=b7745e3639a1cb81465409bfa7ed20801c5b997945739810c32cb4af02304893"
210
+
211
+ # arun(to_base64(url))[:100]
212
+
213
+ url = "https://oss.ffire.cc/files/kling_watermark.png"
214
+
215
+ # arun(to_file(url, filename='x.jpg'))
216
+
217
+ file = Path("/Users/betterme/PycharmProjects/AI/MeUtils/meutils/io/x.py").read_bytes()
218
+
219
+ arun(to_url_fal([file] * 10))
220
+
221
+ # print(mimetypes.guess_type("x.jpg"))
222
+ # print(mimetypes.guess_type("x.png"))
223
+ # print(mimetypes.guess_type("x.jpg"))
224
+
225
+ # print(mimetypes.guess_extension("x.mp4", False))
226
+
227
+ # arun(to_url(
228
+ # "https://cdn.hailuoai.video/moss/prod/2024-11-11-09/video/1731287464150180347-video_raw_8ba15c5c206f8d393a9248f4f9215ed8_312186282087260162.mp4",
229
+ # content_type=None))
230
+
231
+ # arun(to_url_fal(url))
232
+ # print(guess_mime_type("base64xxxxxxxxxxxxxxxxxx.png"))
meutils/io/image.py CHANGED
@@ -9,10 +9,65 @@
9
9
  # @Description : https://blog.csdn.net/Q_452086192/article/details/125014538
10
10
  # https://www.jb51.net/article/207138.htm
11
11
 
12
- import cv2
13
- from PIL import Image
12
+ import mimetypes
13
+ from PIL import Image, ImageDraw
14
14
 
15
15
  from meutils.pipe import *
16
+ from meutils.io.files_utils import to_url, to_bytes
17
+
18
+
19
+ async def describe_image(image: Union[str, bytes]):
20
+ """
21
+ 图片转base64 webp会报错
22
+ :param image: 图片路径或图片对象
23
+ :return: base64字符串
24
+ """
25
+ _ = await to_bytes(image)
26
+ img = Image.open(io.BytesIO(_))
27
+
28
+ info = {
29
+ 'format': img.format, # 图片格式
30
+ 'mode': img.mode, # 颜色模式
31
+
32
+ 'width': img.width, # 宽度
33
+ 'height': img.height, # 高度
34
+ 'size': img.size, # (宽度, 高度)
35
+
36
+ 'is_animated': getattr(img, 'is_animated', False), # 是否是动图
37
+ 'n_frames': getattr(img, 'n_frames', 1), # 帧数
38
+ 'info': img.info, # 图片附加信息
39
+ }
40
+ return info
41
+
42
+
43
+ def crop_polygon(image: Union[str, bytes], outline_points, inline_points):
44
+ if isinstance(image, bytes):
45
+ image = io.BytesIO(image)
46
+
47
+ # 打开图像
48
+ img = Image.open(image)
49
+
50
+ # 创建一个与原图大小相同的黑色遮罩
51
+ mask = Image.new('L', img.size, 0)
52
+
53
+ # 在遮罩上绘制白色多边形
54
+ for points in outline_points:
55
+ ImageDraw.Draw(mask).polygon(points, outline=1, fill=255)
56
+
57
+ for points in inline_points:
58
+ ImageDraw.Draw(mask).polygon(points, outline=1, fill=0)
59
+
60
+ # 将遮罩应用到原图
61
+ output = Image.new('RGBA', img.size, (0, 0, 0, 0))
62
+ output.paste(img, (0, 0), mask)
63
+
64
+ # # 将 PIL Image 转换为字节
65
+ # buffer = io.BytesIO()
66
+ # output.save(buffer, format="PNG")
67
+ # byte_data = buffer.getvalue()
68
+ #
69
+ # return byte_data
70
+ return output
16
71
 
17
72
 
18
73
  def img2bytes(img, format=None):
@@ -22,16 +77,21 @@ def img2bytes(img, format=None):
22
77
  @param format:
23
78
  @return:
24
79
  """
25
- if isinstance(img, Image):
26
- a = np.asarray(img)
80
+ # cv2 = try_import("cv2", pip_name="opencv-python")
81
+ import cv2
82
+
83
+ # if isinstance(img, Image):
84
+ # img = np.asarray(img)
27
85
 
28
86
  # a = cv2.cvtColor(a, cv2.COLOR_RGB2BGR)
29
- _, img_encode = cv2.imencode(format, a)
87
+ _, img_encode = cv2.imencode(format, img)
30
88
 
31
89
  return img_encode.tobytes()
32
90
 
33
91
 
34
92
  def bytes2img(_bytes):
93
+ import cv2
94
+
35
95
  np_arr = np.frombuffer(_bytes, dtype=np.uint8)
36
96
  # np.asarray(bytearray(bs), dtype=np.uint8)
37
97
  img = cv2.imdecode(np_arr, cv2.IMREAD_COLOR)
@@ -39,10 +99,12 @@ def bytes2img(_bytes):
39
99
 
40
100
 
41
101
  def image_read(filename):
102
+ import cv2
103
+
42
104
  filename = str(filename)
43
105
  _bytes = b''
44
106
  if filename.startswith('http'):
45
- _bytes = requests.get(url, stream=True).content
107
+ _bytes = requests.get(filename, stream=True).content
46
108
 
47
109
  elif Path(filename).exists():
48
110
  _bytes = Path(filename).read_bytes()
@@ -74,17 +136,93 @@ def base64_to_image(base64_str):
74
136
  return img_array
75
137
 
76
138
 
77
- def image_to_base64(image_path, for_image_url: bool = True):
78
- _ = base64.b64encode(Path(image_path).read_bytes()).decode('utf-8')
139
+ def image_to_base64(image_path_or_url, for_image_url: bool = True):
140
+ content_type = mimetypes.guess_type(image_path_or_url)[0] or "image/jpeg"
141
+ logger.debug(content_type)
142
+
143
+ if image_path_or_url.startswith('http'):
144
+ data = httpx.get(image_path_or_url, follow_redirects=True, timeout=100).content
145
+ else:
146
+ data = Path(image_path_or_url).read_bytes()
147
+
148
+ _ = base64.b64encode(data).decode('utf-8')
79
149
  if for_image_url:
80
- _ = f"data:image/jpeg;base64,{_}"
150
+ _ = f"data:{content_type};base64,{_}"
81
151
  return _
82
152
 
83
153
 
154
+ def base64_to_bytes(base64_image_string):
155
+ """
156
+ # 将字节数据写入图片文件
157
+ image_data = base64_to_bytes(...)
158
+ with open(filename, 'wb') as file:
159
+ file.write(image_data)
160
+ """
161
+ return base64.b64decode(base64_image_string.split(",", 1)[-1])
162
+
163
+
164
+ @alru_cache()
165
+ async def image2nowatermark_image(url, picinfo: str = '', oss: str = 'glm', token: Optional[str] = None):
166
+ if not url: return
167
+
168
+ from meutils.apis.baidu.bdaitpzs import create_task, BDAITPZSRequest
169
+
170
+ # response = await httpx.AsyncClient(timeout=100, headers=headers, follow_redirects=True).get(url)
171
+ # response.raise_for_status()
172
+
173
+ # 去水印
174
+ # request = BDAITPZSRequest(original_url=url, thumb_url=url) # 网络错误
175
+ request = BDAITPZSRequest(picInfo=image_to_base64(url), picInfo2=picinfo)
176
+ if picinfo:
177
+ request.type = 2
178
+ request.picInfo2 = picinfo
179
+
180
+ data = await create_task(request, is_async=False, token=token)
181
+ base64_string = data['picArr'][-1]['src']
182
+ file = base64_to_bytes(base64_string)
183
+
184
+ if oss == 'kling': # kuaishou
185
+ from meutils.apis.kuaishou import klingai
186
+
187
+ file_task = await klingai.upload(file, cookie=token)
188
+ return file_task and file_task.url
189
+
190
+ else:
191
+ url = await to_url(file) or url
192
+ return url
193
+
194
+
84
195
  # alias
85
196
  base64_to_img = base64_to_image
86
197
 
87
198
  if __name__ == '__main__':
88
199
  url = "https://i1.mifile.cn/f/i/mioffice/img/slogan_5.png?1604383825042"
200
+ #
201
+ # print(image_read(url))
202
+ # base64_image_string = image_to_base64("img.png").split(",")[1]
203
+ # # print(base64_to_bytes(image_to_base64("img.png")))
204
+ # image_data = base64.b64decode(base64_image_string)
205
+ #
206
+ # with open("demo1.png", 'wb') as file:
207
+ # file.write(base64_to_bytes(image_to_base64("img.png")))
208
+
209
+ # import mimetypes
210
+
211
+ # print(mimetypes.guess_type('img.webp')[0])
212
+ # image_to_base64(url)
213
+ s = """
214
+ """
215
+ # base64_to_file(s, 'x.png')
216
+
217
+ # url = "https://sfile.chatglm.cn/chatglm-videoserver/image/50/5049bae9.png"
218
+ url = "https://oss.ffire.cc/files/kling_watermark.png"
219
+ # arun(image2nowatermark_image(url))
220
+ # arun(url2url(url))
221
+
222
+ from meutils.schemas.baidu_types import PICINFO2_RIGHT_BOTTOM
223
+
224
+ url = "https://s22-def.ap4r.com/bs2/upload-ylab-stunt-sgp/se/ai_portal_sgp_queue_mmu_img2img_aiweb/7de17faa-cc11-48a6-b94a-e80fe7a34841/1.png"
89
225
 
90
- print(image_read(url))
226
+ # arun(image2nowatermark_image(url, picinfo=PICINFO2_RIGHT_BOTTOM))
227
+ with timer():
228
+ arun(describe_image("https://oss.ffire.cc/files/kling_watermark.png"))
meutils/io/x.py ADDED
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : x
5
+ # @Time : 2024/9/25 15:27
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+
11
+ from meutils.pipe import *
12
+ # from minio import Minio
13
+ from meutils.oss.minio_oss import Minio
14
+
15
+ # MinIO client setup
16
+ # minio_client = Minio(
17
+ # "minio-server-url:9000",
18
+ # access_key="your-access-key",
19
+ # secret_key="your-secret-key",
20
+ # secure=True # set to False if not using HTTPS
21
+ # )
22
+ minio_client = Minio()
23
+
24
+
25
+ async def download_and_upload(video_url, bucket_name, object_name):
26
+ buffer_size = 5 * 1024 * 1024 # 5MB buffer to meet MinIO's minimum part size
27
+
28
+ async with httpx.AsyncClient() as client:
29
+ try:
30
+ async with client.stream("GET", video_url) as response:
31
+ response.raise_for_status()
32
+
33
+ total_size = int(response.headers.get('content-length', 0))
34
+ buffer = io.BytesIO()
35
+ uploaded = 0
36
+
37
+ async for chunk in response.aiter_bytes(chunk_size=buffer_size):
38
+ buffer.write(chunk)
39
+ buffer_size = buffer.tell()
40
+ buffer.seek(0)
41
+
42
+ if buffer_size >= 5 * 1024 * 1024 or response.is_closed:
43
+ try:
44
+ minio_client.put_object(
45
+ bucket_name,
46
+ object_name,
47
+ buffer,
48
+ length=buffer_size,
49
+ part_size=5 * 1024 * 1024,
50
+ content_type='video/mp4'
51
+ )
52
+ uploaded += buffer_size
53
+ print(f"Uploaded {uploaded}/{total_size} bytes")
54
+
55
+ except Exception as upload_error:
56
+ print(f"Unexpected upload error: {upload_error}")
57
+ raise
58
+
59
+ buffer = io.BytesIO() # Reset buffer after upload
60
+
61
+ print("Upload completed")
62
+ except httpx.HTTPStatusError as http_error:
63
+ print(f"HTTP error occurred: {http_error}")
64
+ except Exception as e:
65
+ print(f"An unexpected error occurred: {e}")
66
+
67
+
68
+ if __name__ == '__main__':
69
+ # Usage
70
+ url = "https://s22-def.ap4r.com/bs2/upload-ylab-stunt-sgp/se/ai_portal_sgp_queue_m2v_txt2video_camera/b7eded0c-452c-4282-ad0a-02d96bd97f3e/0.mp4"
71
+ bucket_name = "videos"
72
+ object_name = "video11.mp4"
73
+
74
+ with timer():
75
+ arun(download_and_upload(url, bucket_name, object_name))
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : __init__.py
5
+ # @Time : 2024/4/24 13:35
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+
@@ -0,0 +1,109 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : check_api_key
5
+ # @Time : 2024/6/17 08:42
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+
11
+ from meutils.pipe import *
12
+
13
+
14
+ @alru_cache()
15
+ async def check(api_key_or_token, check_url):
16
+ headers = {
17
+ "Authorization": f"Bearer {api_key_or_token}",
18
+ "Accept": "application/json"
19
+ }
20
+ payload = {
21
+ "token": api_key_or_token
22
+ }
23
+ try:
24
+ async with httpx.AsyncClient(headers=headers, timeout=60) as client:
25
+
26
+ if api_key_or_token.startswith("ey"):
27
+
28
+ response: httpx.Response = await client.post(check_url, json=payload) # free-api: POST /token/check
29
+ else:
30
+ response: httpx.Response = await client.get(check_url)
31
+
32
+ # todo: 可扩展
33
+
34
+ logger.debug(response.text)
35
+ logger.debug(response.status_code)
36
+
37
+ return (
38
+ response.is_success
39
+ and response.json().get("is_available") # deepseek
40
+ or response.json().get("status", False) # moonshot、siliconflow
41
+ or response.json().get("live", False) # free-api: POST /token/check
42
+ )
43
+
44
+ except httpx.RequestError as exc:
45
+ logger.error(exc)
46
+ return False
47
+
48
+
49
+ async def check_api_key_or_token(
50
+ api_keys: Union[str, List[str]],
51
+ check_url: Optional[str] = "https://api.deepseek.com/user/balance",
52
+ return_api_keys: bool = True
53
+ ):
54
+ """
55
+ {
56
+ "is_available": false,
57
+ "balance_infos": [
58
+ {
59
+ "currency": "CNY",
60
+ "total_balance": "-0.00",
61
+ "granted_balance": "0.00",
62
+ "topped_up_balance": "-0.00"
63
+ }
64
+ ]
65
+ }
66
+ """
67
+ if isinstance(api_keys, str):
68
+ api_keys = [api_keys]
69
+
70
+ if not check_url: return api_keys
71
+
72
+ tasks = map(partial(check, check_url=check_url), tqdm(api_keys))
73
+ responses = await asyncio.gather(*tasks, return_exceptions=True)
74
+ # responses = await asyncio.gather(*tasks)
75
+ if return_api_keys:
76
+ responses = [k for k, v in zip(api_keys, responses) if v is True]
77
+
78
+ return responses
79
+
80
+
81
+
82
+
83
+ if __name__ == '__main__':
84
+ from meutils.config_utils.lark_utils import get_spreadsheet_values, get_next_token_for_polling
85
+
86
+ #
87
+ # api_keys = get_spreadsheet_values(feishu_url="https://xchatllm.feishu.cn/sheets/Bmjtst2f6hfMqFttbhLcdfRJnNf?sheet=lVghgx", to_dataframe=True)[0].tolist()
88
+ # print(arun(check_deepseek_api_key(api_keys)))
89
+
90
+ # api_keys = os.getenv("DEEPSEEK_API_KEY")
91
+ #
92
+ # # arun(check_api_key_or_token(api_keys))
93
+ #
94
+ # # print(arun(check_deepseek_api_key(api_keys)))
95
+ # # print(arun(check('sk-f42b2fdc036247e79cd471ab63b1142d', "https://api.deepseek.com/user/balance")))
96
+ #
97
+ # api_keys = os.getenv("SILICONFLOW_API_KEY").split()
98
+ # for api_key in api_keys:
99
+ # arun(check(api_key, "https://api.siliconflow.cn/v1/user/info"))
100
+
101
+ # api_keys = get_spreadsheet_values(feishu_url="https://xchatllm.feishu.cn/sheets/Bmjtst2f6hfMqFttbhLcdfRJnNf?sheet=EOZuBW", to_dataframe=True)[0].tolist()
102
+
103
+ # kimi
104
+ api_keys = get_spreadsheet_values(feishu_url="https://xchatllm.feishu.cn/sheets/Bmjtst2f6hfMqFttbhLcdfRJnNf?sheet=Y7HVfo", to_dataframe=True)[0].tolist()
105
+ l = []
106
+ for api_key in api_keys:
107
+ if api_key:
108
+ if arun(check(api_key, "https://all.chatfire.cn/kimi/token/check")):
109
+ l.append(api_key)