webscout 8.2.2__py3-none-any.whl → 2026.1.19__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.
- webscout/AIauto.py +524 -143
- webscout/AIbase.py +247 -123
- webscout/AIutel.py +68 -132
- webscout/Bard.py +1072 -535
- webscout/Extra/GitToolkit/__init__.py +2 -2
- webscout/Extra/GitToolkit/gitapi/__init__.py +20 -12
- webscout/Extra/GitToolkit/gitapi/gist.py +142 -0
- webscout/Extra/GitToolkit/gitapi/organization.py +91 -0
- webscout/Extra/GitToolkit/gitapi/repository.py +308 -195
- webscout/Extra/GitToolkit/gitapi/search.py +162 -0
- webscout/Extra/GitToolkit/gitapi/trending.py +236 -0
- webscout/Extra/GitToolkit/gitapi/user.py +128 -96
- webscout/Extra/GitToolkit/gitapi/utils.py +82 -62
- webscout/Extra/YTToolkit/README.md +443 -0
- webscout/Extra/YTToolkit/YTdownloader.py +953 -957
- webscout/Extra/YTToolkit/__init__.py +3 -3
- webscout/Extra/YTToolkit/transcriber.py +595 -476
- webscout/Extra/YTToolkit/ytapi/README.md +230 -0
- webscout/Extra/YTToolkit/ytapi/__init__.py +22 -6
- webscout/Extra/YTToolkit/ytapi/captions.py +190 -0
- webscout/Extra/YTToolkit/ytapi/channel.py +302 -307
- webscout/Extra/YTToolkit/ytapi/errors.py +13 -13
- webscout/Extra/YTToolkit/ytapi/extras.py +178 -45
- webscout/Extra/YTToolkit/ytapi/hashtag.py +120 -0
- webscout/Extra/YTToolkit/ytapi/https.py +89 -88
- webscout/Extra/YTToolkit/ytapi/patterns.py +61 -61
- webscout/Extra/YTToolkit/ytapi/playlist.py +59 -59
- webscout/Extra/YTToolkit/ytapi/pool.py +8 -8
- webscout/Extra/YTToolkit/ytapi/query.py +143 -40
- webscout/Extra/YTToolkit/ytapi/shorts.py +122 -0
- webscout/Extra/YTToolkit/ytapi/stream.py +68 -63
- webscout/Extra/YTToolkit/ytapi/suggestions.py +97 -0
- webscout/Extra/YTToolkit/ytapi/utils.py +66 -62
- webscout/Extra/YTToolkit/ytapi/video.py +189 -18
- webscout/Extra/__init__.py +2 -3
- webscout/Extra/gguf.py +1298 -682
- webscout/Extra/tempmail/README.md +488 -0
- webscout/Extra/tempmail/__init__.py +28 -28
- webscout/Extra/tempmail/async_utils.py +143 -141
- webscout/Extra/tempmail/base.py +172 -161
- webscout/Extra/tempmail/cli.py +191 -187
- webscout/Extra/tempmail/emailnator.py +88 -84
- webscout/Extra/tempmail/mail_tm.py +378 -361
- webscout/Extra/tempmail/temp_mail_io.py +304 -292
- webscout/Extra/weather.py +196 -194
- webscout/Extra/weather_ascii.py +17 -15
- webscout/Provider/AISEARCH/PERPLEXED_search.py +175 -0
- webscout/Provider/AISEARCH/Perplexity.py +237 -304
- webscout/Provider/AISEARCH/README.md +106 -0
- webscout/Provider/AISEARCH/__init__.py +16 -10
- webscout/Provider/AISEARCH/brave_search.py +298 -0
- webscout/Provider/AISEARCH/iask_search.py +130 -209
- webscout/Provider/AISEARCH/monica_search.py +200 -246
- webscout/Provider/AISEARCH/webpilotai_search.py +242 -281
- webscout/Provider/Algion.py +413 -0
- webscout/Provider/Andi.py +74 -69
- webscout/Provider/Apriel.py +313 -0
- webscout/Provider/Ayle.py +323 -0
- webscout/Provider/ChatSandbox.py +329 -0
- webscout/Provider/ClaudeOnline.py +365 -0
- webscout/Provider/Cohere.py +232 -208
- webscout/Provider/DeepAI.py +367 -0
- webscout/Provider/Deepinfra.py +343 -173
- webscout/Provider/EssentialAI.py +217 -0
- webscout/Provider/ExaAI.py +274 -261
- webscout/Provider/Gemini.py +60 -54
- webscout/Provider/GithubChat.py +385 -367
- webscout/Provider/Gradient.py +286 -0
- webscout/Provider/Groq.py +556 -670
- webscout/Provider/HadadXYZ.py +323 -0
- webscout/Provider/HeckAI.py +392 -233
- webscout/Provider/HuggingFace.py +387 -0
- webscout/Provider/IBM.py +340 -0
- webscout/Provider/Jadve.py +317 -266
- webscout/Provider/K2Think.py +306 -0
- webscout/Provider/Koboldai.py +221 -381
- webscout/Provider/Netwrck.py +273 -228
- webscout/Provider/Nvidia.py +310 -0
- webscout/Provider/OPENAI/DeepAI.py +489 -0
- webscout/Provider/OPENAI/K2Think.py +423 -0
- webscout/Provider/OPENAI/PI.py +463 -0
- webscout/Provider/OPENAI/README.md +890 -0
- webscout/Provider/OPENAI/TogetherAI.py +405 -0
- webscout/Provider/OPENAI/TwoAI.py +255 -0
- webscout/Provider/OPENAI/__init__.py +148 -25
- webscout/Provider/OPENAI/ai4chat.py +348 -0
- webscout/Provider/OPENAI/akashgpt.py +436 -0
- webscout/Provider/OPENAI/algion.py +303 -0
- webscout/Provider/OPENAI/ayle.py +365 -0
- webscout/Provider/OPENAI/base.py +253 -46
- webscout/Provider/OPENAI/cerebras.py +296 -0
- webscout/Provider/OPENAI/chatgpt.py +514 -193
- webscout/Provider/OPENAI/chatsandbox.py +233 -0
- webscout/Provider/OPENAI/deepinfra.py +403 -272
- webscout/Provider/OPENAI/e2b.py +2370 -1350
- webscout/Provider/OPENAI/elmo.py +278 -0
- webscout/Provider/OPENAI/exaai.py +186 -138
- webscout/Provider/OPENAI/freeassist.py +446 -0
- webscout/Provider/OPENAI/gradient.py +448 -0
- webscout/Provider/OPENAI/groq.py +380 -0
- webscout/Provider/OPENAI/hadadxyz.py +292 -0
- webscout/Provider/OPENAI/heckai.py +100 -104
- webscout/Provider/OPENAI/huggingface.py +321 -0
- webscout/Provider/OPENAI/ibm.py +425 -0
- webscout/Provider/OPENAI/llmchat.py +253 -0
- webscout/Provider/OPENAI/llmchatco.py +378 -327
- webscout/Provider/OPENAI/meta.py +541 -0
- webscout/Provider/OPENAI/netwrck.py +110 -84
- webscout/Provider/OPENAI/nvidia.py +317 -0
- webscout/Provider/OPENAI/oivscode.py +348 -0
- webscout/Provider/OPENAI/openrouter.py +328 -0
- webscout/Provider/OPENAI/pydantic_imports.py +1 -0
- webscout/Provider/OPENAI/sambanova.py +397 -0
- webscout/Provider/OPENAI/sonus.py +126 -115
- webscout/Provider/OPENAI/textpollinations.py +218 -133
- webscout/Provider/OPENAI/toolbaz.py +136 -166
- webscout/Provider/OPENAI/typefully.py +419 -0
- webscout/Provider/OPENAI/typliai.py +279 -0
- webscout/Provider/OPENAI/utils.py +314 -211
- webscout/Provider/OPENAI/wisecat.py +103 -125
- webscout/Provider/OPENAI/writecream.py +185 -156
- webscout/Provider/OPENAI/x0gpt.py +227 -136
- webscout/Provider/OPENAI/zenmux.py +380 -0
- webscout/Provider/OpenRouter.py +386 -0
- webscout/Provider/Openai.py +337 -496
- webscout/Provider/PI.py +443 -344
- webscout/Provider/QwenLM.py +346 -254
- webscout/Provider/STT/__init__.py +28 -0
- webscout/Provider/STT/base.py +303 -0
- webscout/Provider/STT/elevenlabs.py +264 -0
- webscout/Provider/Sambanova.py +317 -0
- webscout/Provider/TTI/README.md +69 -0
- webscout/Provider/TTI/__init__.py +37 -12
- webscout/Provider/TTI/base.py +147 -0
- webscout/Provider/TTI/claudeonline.py +393 -0
- webscout/Provider/TTI/magicstudio.py +292 -0
- webscout/Provider/TTI/miragic.py +180 -0
- webscout/Provider/TTI/pollinations.py +331 -0
- webscout/Provider/TTI/together.py +334 -0
- webscout/Provider/TTI/utils.py +14 -0
- webscout/Provider/TTS/README.md +186 -0
- webscout/Provider/TTS/__init__.py +43 -7
- webscout/Provider/TTS/base.py +523 -0
- webscout/Provider/TTS/deepgram.py +286 -156
- webscout/Provider/TTS/elevenlabs.py +189 -111
- webscout/Provider/TTS/freetts.py +218 -0
- webscout/Provider/TTS/murfai.py +288 -113
- webscout/Provider/TTS/openai_fm.py +364 -0
- webscout/Provider/TTS/parler.py +203 -111
- webscout/Provider/TTS/qwen.py +334 -0
- webscout/Provider/TTS/sherpa.py +286 -0
- webscout/Provider/TTS/speechma.py +693 -180
- webscout/Provider/TTS/streamElements.py +275 -333
- webscout/Provider/TTS/utils.py +280 -280
- webscout/Provider/TextPollinationsAI.py +221 -121
- webscout/Provider/TogetherAI.py +450 -0
- webscout/Provider/TwoAI.py +309 -199
- webscout/Provider/TypliAI.py +311 -0
- webscout/Provider/UNFINISHED/ChatHub.py +219 -0
- webscout/Provider/{OPENAI/glider.py → UNFINISHED/ChutesAI.py} +160 -145
- webscout/Provider/UNFINISHED/GizAI.py +300 -0
- webscout/Provider/UNFINISHED/Marcus.py +218 -0
- webscout/Provider/UNFINISHED/Qodo.py +481 -0
- webscout/Provider/UNFINISHED/XenAI.py +330 -0
- webscout/Provider/{Youchat.py → UNFINISHED/Youchat.py} +64 -47
- webscout/Provider/UNFINISHED/aihumanizer.py +41 -0
- webscout/Provider/UNFINISHED/grammerchecker.py +37 -0
- webscout/Provider/UNFINISHED/liner.py +342 -0
- webscout/Provider/UNFINISHED/liner_api_request.py +246 -0
- webscout/Provider/UNFINISHED/samurai.py +231 -0
- webscout/Provider/WiseCat.py +256 -196
- webscout/Provider/WrDoChat.py +390 -0
- webscout/Provider/__init__.py +115 -198
- webscout/Provider/ai4chat.py +181 -202
- webscout/Provider/akashgpt.py +330 -342
- webscout/Provider/cerebras.py +397 -242
- webscout/Provider/cleeai.py +236 -213
- webscout/Provider/elmo.py +291 -234
- webscout/Provider/geminiapi.py +343 -208
- webscout/Provider/julius.py +245 -223
- webscout/Provider/learnfastai.py +333 -266
- webscout/Provider/llama3mitril.py +230 -180
- webscout/Provider/llmchat.py +308 -213
- webscout/Provider/llmchatco.py +321 -311
- webscout/Provider/meta.py +996 -794
- webscout/Provider/oivscode.py +332 -0
- webscout/Provider/searchchat.py +316 -293
- webscout/Provider/sonus.py +264 -208
- webscout/Provider/toolbaz.py +359 -320
- webscout/Provider/turboseek.py +332 -219
- webscout/Provider/typefully.py +262 -280
- webscout/Provider/x0gpt.py +332 -256
- webscout/__init__.py +31 -38
- webscout/__main__.py +5 -5
- webscout/cli.py +585 -293
- webscout/client.py +1497 -0
- webscout/conversation.py +140 -565
- webscout/exceptions.py +383 -339
- webscout/litagent/__init__.py +29 -29
- webscout/litagent/agent.py +492 -455
- webscout/litagent/constants.py +60 -60
- webscout/models.py +505 -181
- webscout/optimizers.py +32 -378
- webscout/prompt_manager.py +376 -274
- webscout/sanitize.py +1514 -0
- webscout/scout/README.md +452 -0
- webscout/scout/__init__.py +8 -8
- webscout/scout/core/__init__.py +7 -7
- webscout/scout/core/crawler.py +330 -140
- webscout/scout/core/scout.py +800 -568
- webscout/scout/core/search_result.py +51 -96
- webscout/scout/core/text_analyzer.py +64 -63
- webscout/scout/core/text_utils.py +412 -277
- webscout/scout/core/web_analyzer.py +54 -52
- webscout/scout/element.py +872 -460
- webscout/scout/parsers/__init__.py +70 -69
- webscout/scout/parsers/html5lib_parser.py +182 -172
- webscout/scout/parsers/html_parser.py +238 -236
- webscout/scout/parsers/lxml_parser.py +203 -178
- webscout/scout/utils.py +38 -37
- webscout/search/__init__.py +47 -0
- webscout/search/base.py +201 -0
- webscout/search/bing_main.py +45 -0
- webscout/search/brave_main.py +92 -0
- webscout/search/duckduckgo_main.py +57 -0
- webscout/search/engines/__init__.py +127 -0
- webscout/search/engines/bing/__init__.py +15 -0
- webscout/search/engines/bing/base.py +35 -0
- webscout/search/engines/bing/images.py +114 -0
- webscout/search/engines/bing/news.py +96 -0
- webscout/search/engines/bing/suggestions.py +36 -0
- webscout/search/engines/bing/text.py +109 -0
- webscout/search/engines/brave/__init__.py +19 -0
- webscout/search/engines/brave/base.py +47 -0
- webscout/search/engines/brave/images.py +213 -0
- webscout/search/engines/brave/news.py +353 -0
- webscout/search/engines/brave/suggestions.py +318 -0
- webscout/search/engines/brave/text.py +167 -0
- webscout/search/engines/brave/videos.py +364 -0
- webscout/search/engines/duckduckgo/__init__.py +25 -0
- webscout/search/engines/duckduckgo/answers.py +80 -0
- webscout/search/engines/duckduckgo/base.py +189 -0
- webscout/search/engines/duckduckgo/images.py +100 -0
- webscout/search/engines/duckduckgo/maps.py +183 -0
- webscout/search/engines/duckduckgo/news.py +70 -0
- webscout/search/engines/duckduckgo/suggestions.py +22 -0
- webscout/search/engines/duckduckgo/text.py +221 -0
- webscout/search/engines/duckduckgo/translate.py +48 -0
- webscout/search/engines/duckduckgo/videos.py +80 -0
- webscout/search/engines/duckduckgo/weather.py +84 -0
- webscout/search/engines/mojeek.py +61 -0
- webscout/search/engines/wikipedia.py +77 -0
- webscout/search/engines/yahoo/__init__.py +41 -0
- webscout/search/engines/yahoo/answers.py +19 -0
- webscout/search/engines/yahoo/base.py +34 -0
- webscout/search/engines/yahoo/images.py +323 -0
- webscout/search/engines/yahoo/maps.py +19 -0
- webscout/search/engines/yahoo/news.py +258 -0
- webscout/search/engines/yahoo/suggestions.py +140 -0
- webscout/search/engines/yahoo/text.py +273 -0
- webscout/search/engines/yahoo/translate.py +19 -0
- webscout/search/engines/yahoo/videos.py +302 -0
- webscout/search/engines/yahoo/weather.py +220 -0
- webscout/search/engines/yandex.py +67 -0
- webscout/search/engines/yep/__init__.py +13 -0
- webscout/search/engines/yep/base.py +34 -0
- webscout/search/engines/yep/images.py +101 -0
- webscout/search/engines/yep/suggestions.py +38 -0
- webscout/search/engines/yep/text.py +99 -0
- webscout/search/http_client.py +172 -0
- webscout/search/results.py +141 -0
- webscout/search/yahoo_main.py +57 -0
- webscout/search/yep_main.py +48 -0
- webscout/server/__init__.py +48 -0
- webscout/server/config.py +78 -0
- webscout/server/exceptions.py +69 -0
- webscout/server/providers.py +286 -0
- webscout/server/request_models.py +131 -0
- webscout/server/request_processing.py +404 -0
- webscout/server/routes.py +642 -0
- webscout/server/server.py +351 -0
- webscout/server/ui_templates.py +1171 -0
- webscout/swiftcli/__init__.py +79 -809
- webscout/swiftcli/core/__init__.py +7 -0
- webscout/swiftcli/core/cli.py +574 -0
- webscout/swiftcli/core/context.py +98 -0
- webscout/swiftcli/core/group.py +268 -0
- webscout/swiftcli/decorators/__init__.py +28 -0
- webscout/swiftcli/decorators/command.py +243 -0
- webscout/swiftcli/decorators/options.py +247 -0
- webscout/swiftcli/decorators/output.py +392 -0
- webscout/swiftcli/exceptions.py +21 -0
- webscout/swiftcli/plugins/__init__.py +9 -0
- webscout/swiftcli/plugins/base.py +134 -0
- webscout/swiftcli/plugins/manager.py +269 -0
- webscout/swiftcli/utils/__init__.py +58 -0
- webscout/swiftcli/utils/formatting.py +251 -0
- webscout/swiftcli/utils/parsing.py +368 -0
- webscout/update_checker.py +280 -136
- webscout/utils.py +28 -14
- webscout/version.py +2 -1
- webscout/version.py.bak +3 -0
- webscout/zeroart/__init__.py +218 -55
- webscout/zeroart/base.py +70 -60
- webscout/zeroart/effects.py +155 -99
- webscout/zeroart/fonts.py +1799 -816
- webscout-2026.1.19.dist-info/METADATA +638 -0
- webscout-2026.1.19.dist-info/RECORD +312 -0
- {webscout-8.2.2.dist-info → webscout-2026.1.19.dist-info}/WHEEL +1 -1
- webscout-2026.1.19.dist-info/entry_points.txt +4 -0
- webscout-2026.1.19.dist-info/top_level.txt +1 -0
- inferno/__init__.py +0 -6
- inferno/__main__.py +0 -9
- inferno/cli.py +0 -6
- webscout/DWEBS.py +0 -477
- webscout/Extra/autocoder/__init__.py +0 -9
- webscout/Extra/autocoder/autocoder.py +0 -849
- webscout/Extra/autocoder/autocoder_utiles.py +0 -332
- webscout/LLM.py +0 -442
- webscout/Litlogger/__init__.py +0 -67
- webscout/Litlogger/core/__init__.py +0 -6
- webscout/Litlogger/core/level.py +0 -23
- webscout/Litlogger/core/logger.py +0 -165
- webscout/Litlogger/handlers/__init__.py +0 -12
- webscout/Litlogger/handlers/console.py +0 -33
- webscout/Litlogger/handlers/file.py +0 -143
- webscout/Litlogger/handlers/network.py +0 -173
- webscout/Litlogger/styles/__init__.py +0 -7
- webscout/Litlogger/styles/colors.py +0 -249
- webscout/Litlogger/styles/formats.py +0 -458
- webscout/Litlogger/styles/text.py +0 -87
- webscout/Litlogger/utils/__init__.py +0 -6
- webscout/Litlogger/utils/detectors.py +0 -153
- webscout/Litlogger/utils/formatters.py +0 -200
- webscout/Local/__init__.py +0 -12
- webscout/Local/__main__.py +0 -9
- webscout/Local/api.py +0 -576
- webscout/Local/cli.py +0 -516
- webscout/Local/config.py +0 -75
- webscout/Local/llm.py +0 -287
- webscout/Local/model_manager.py +0 -253
- webscout/Local/server.py +0 -721
- webscout/Local/utils.py +0 -93
- webscout/Provider/AI21.py +0 -177
- webscout/Provider/AISEARCH/DeepFind.py +0 -250
- webscout/Provider/AISEARCH/ISou.py +0 -256
- webscout/Provider/AISEARCH/felo_search.py +0 -228
- webscout/Provider/AISEARCH/genspark_search.py +0 -208
- webscout/Provider/AISEARCH/hika_search.py +0 -194
- webscout/Provider/AISEARCH/scira_search.py +0 -324
- webscout/Provider/Aitopia.py +0 -292
- webscout/Provider/AllenAI.py +0 -413
- webscout/Provider/Blackboxai.py +0 -229
- webscout/Provider/C4ai.py +0 -432
- webscout/Provider/ChatGPTClone.py +0 -226
- webscout/Provider/ChatGPTES.py +0 -237
- webscout/Provider/ChatGPTGratis.py +0 -194
- webscout/Provider/Chatify.py +0 -175
- webscout/Provider/Cloudflare.py +0 -273
- webscout/Provider/DeepSeek.py +0 -196
- webscout/Provider/ElectronHub.py +0 -709
- webscout/Provider/ExaChat.py +0 -342
- webscout/Provider/Free2GPT.py +0 -241
- webscout/Provider/GPTWeb.py +0 -193
- webscout/Provider/Glider.py +0 -211
- webscout/Provider/HF_space/__init__.py +0 -0
- webscout/Provider/HF_space/qwen_qwen2.py +0 -206
- webscout/Provider/HuggingFaceChat.py +0 -462
- webscout/Provider/Hunyuan.py +0 -272
- webscout/Provider/LambdaChat.py +0 -392
- webscout/Provider/Llama.py +0 -200
- webscout/Provider/Llama3.py +0 -204
- webscout/Provider/Marcus.py +0 -148
- webscout/Provider/OLLAMA.py +0 -396
- webscout/Provider/OPENAI/c4ai.py +0 -367
- webscout/Provider/OPENAI/chatgptclone.py +0 -460
- webscout/Provider/OPENAI/exachat.py +0 -433
- webscout/Provider/OPENAI/freeaichat.py +0 -352
- webscout/Provider/OPENAI/opkfc.py +0 -488
- webscout/Provider/OPENAI/scirachat.py +0 -463
- webscout/Provider/OPENAI/standardinput.py +0 -425
- webscout/Provider/OPENAI/typegpt.py +0 -346
- webscout/Provider/OPENAI/uncovrAI.py +0 -455
- webscout/Provider/OPENAI/venice.py +0 -413
- webscout/Provider/OPENAI/yep.py +0 -327
- webscout/Provider/OpenGPT.py +0 -199
- webscout/Provider/Perplexitylabs.py +0 -415
- webscout/Provider/Phind.py +0 -535
- webscout/Provider/PizzaGPT.py +0 -198
- webscout/Provider/Reka.py +0 -214
- webscout/Provider/StandardInput.py +0 -278
- webscout/Provider/TTI/AiForce/__init__.py +0 -22
- webscout/Provider/TTI/AiForce/async_aiforce.py +0 -224
- webscout/Provider/TTI/AiForce/sync_aiforce.py +0 -245
- webscout/Provider/TTI/FreeAIPlayground/__init__.py +0 -9
- webscout/Provider/TTI/FreeAIPlayground/async_freeaiplayground.py +0 -181
- webscout/Provider/TTI/FreeAIPlayground/sync_freeaiplayground.py +0 -180
- webscout/Provider/TTI/ImgSys/__init__.py +0 -23
- webscout/Provider/TTI/ImgSys/async_imgsys.py +0 -202
- webscout/Provider/TTI/ImgSys/sync_imgsys.py +0 -195
- webscout/Provider/TTI/MagicStudio/__init__.py +0 -2
- webscout/Provider/TTI/MagicStudio/async_magicstudio.py +0 -111
- webscout/Provider/TTI/MagicStudio/sync_magicstudio.py +0 -109
- webscout/Provider/TTI/Nexra/__init__.py +0 -22
- webscout/Provider/TTI/Nexra/async_nexra.py +0 -286
- webscout/Provider/TTI/Nexra/sync_nexra.py +0 -258
- webscout/Provider/TTI/PollinationsAI/__init__.py +0 -23
- webscout/Provider/TTI/PollinationsAI/async_pollinations.py +0 -311
- webscout/Provider/TTI/PollinationsAI/sync_pollinations.py +0 -265
- webscout/Provider/TTI/aiarta/__init__.py +0 -2
- webscout/Provider/TTI/aiarta/async_aiarta.py +0 -482
- webscout/Provider/TTI/aiarta/sync_aiarta.py +0 -440
- webscout/Provider/TTI/artbit/__init__.py +0 -22
- webscout/Provider/TTI/artbit/async_artbit.py +0 -155
- webscout/Provider/TTI/artbit/sync_artbit.py +0 -148
- webscout/Provider/TTI/fastflux/__init__.py +0 -22
- webscout/Provider/TTI/fastflux/async_fastflux.py +0 -261
- webscout/Provider/TTI/fastflux/sync_fastflux.py +0 -252
- webscout/Provider/TTI/huggingface/__init__.py +0 -22
- webscout/Provider/TTI/huggingface/async_huggingface.py +0 -199
- webscout/Provider/TTI/huggingface/sync_huggingface.py +0 -195
- webscout/Provider/TTI/piclumen/__init__.py +0 -23
- webscout/Provider/TTI/piclumen/async_piclumen.py +0 -268
- webscout/Provider/TTI/piclumen/sync_piclumen.py +0 -233
- webscout/Provider/TTI/pixelmuse/__init__.py +0 -4
- webscout/Provider/TTI/pixelmuse/async_pixelmuse.py +0 -249
- webscout/Provider/TTI/pixelmuse/sync_pixelmuse.py +0 -182
- webscout/Provider/TTI/talkai/__init__.py +0 -4
- webscout/Provider/TTI/talkai/async_talkai.py +0 -229
- webscout/Provider/TTI/talkai/sync_talkai.py +0 -207
- webscout/Provider/TTS/gesserit.py +0 -127
- webscout/Provider/TeachAnything.py +0 -187
- webscout/Provider/Venice.py +0 -219
- webscout/Provider/VercelAI.py +0 -234
- webscout/Provider/WebSim.py +0 -228
- webscout/Provider/Writecream.py +0 -211
- webscout/Provider/WritingMate.py +0 -197
- webscout/Provider/aimathgpt.py +0 -189
- webscout/Provider/askmyai.py +0 -158
- webscout/Provider/asksteve.py +0 -203
- webscout/Provider/bagoodex.py +0 -145
- webscout/Provider/chatglm.py +0 -205
- webscout/Provider/copilot.py +0 -428
- webscout/Provider/freeaichat.py +0 -271
- webscout/Provider/gaurish.py +0 -244
- webscout/Provider/geminiprorealtime.py +0 -160
- webscout/Provider/granite.py +0 -187
- webscout/Provider/hermes.py +0 -219
- webscout/Provider/koala.py +0 -268
- webscout/Provider/labyrinth.py +0 -340
- webscout/Provider/lepton.py +0 -194
- webscout/Provider/llamatutor.py +0 -192
- webscout/Provider/multichat.py +0 -325
- webscout/Provider/promptrefine.py +0 -193
- webscout/Provider/scira_chat.py +0 -277
- webscout/Provider/scnet.py +0 -187
- webscout/Provider/talkai.py +0 -194
- webscout/Provider/tutorai.py +0 -252
- webscout/Provider/typegpt.py +0 -232
- webscout/Provider/uncovr.py +0 -312
- webscout/Provider/yep.py +0 -376
- webscout/litprinter/__init__.py +0 -59
- webscout/scout/core.py +0 -881
- webscout/tempid.py +0 -128
- webscout/webscout_search.py +0 -1346
- webscout/webscout_search_async.py +0 -877
- webscout/yep_search.py +0 -297
- webscout-8.2.2.dist-info/METADATA +0 -734
- webscout-8.2.2.dist-info/RECORD +0 -309
- webscout-8.2.2.dist-info/entry_points.txt +0 -5
- webscout-8.2.2.dist-info/top_level.txt +0 -3
- webstoken/__init__.py +0 -30
- webstoken/classifier.py +0 -189
- webstoken/keywords.py +0 -216
- webstoken/language.py +0 -128
- webstoken/ner.py +0 -164
- webstoken/normalizer.py +0 -35
- webstoken/processor.py +0 -77
- webstoken/sentiment.py +0 -206
- webstoken/stemmer.py +0 -73
- webstoken/tagger.py +0 -60
- webstoken/tokenizer.py +0 -158
- {webscout-8.2.2.dist-info → webscout-2026.1.19.dist-info/licenses}/LICENSE.md +0 -0
|
@@ -1,141 +1,143 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Async utilities for temporary email generation
|
|
3
|
-
"""
|
|
4
|
-
import asyncio
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class AsyncTempMailHelper:
|
|
13
|
-
"""
|
|
14
|
-
Async helper class for TempMail.io API
|
|
15
|
-
Provides simplified methods for async usage of TempMail.io
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
def __init__(self):
|
|
19
|
-
self.api = None
|
|
20
|
-
self.email = None
|
|
21
|
-
self.token = None
|
|
22
|
-
|
|
23
|
-
async def create(self, alias: Optional[str] = None, domain: Optional[str] = None) -> Tuple[str, str]:
|
|
24
|
-
"""
|
|
25
|
-
Create a new temporary email
|
|
26
|
-
|
|
27
|
-
Args:
|
|
28
|
-
alias: Optional alias for the email
|
|
29
|
-
domain: Optional domain for the email
|
|
30
|
-
|
|
31
|
-
Returns:
|
|
32
|
-
Tuple containing the email address and token
|
|
33
|
-
"""
|
|
34
|
-
self.api = TempMailAPI()
|
|
35
|
-
await self.api.initialize()
|
|
36
|
-
|
|
37
|
-
try:
|
|
38
|
-
|
|
39
|
-
self.email
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
return []
|
|
77
|
-
|
|
78
|
-
async def delete(self) -> bool:
|
|
79
|
-
"""
|
|
80
|
-
Delete the current temporary email
|
|
81
|
-
|
|
82
|
-
Returns:
|
|
83
|
-
True if deletion was successful, False otherwise
|
|
84
|
-
"""
|
|
85
|
-
if not self.api or not self.email or not self.token:
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
1
|
+
"""
|
|
2
|
+
Async utilities for temporary email generation
|
|
3
|
+
"""
|
|
4
|
+
import asyncio
|
|
5
|
+
from typing import Dict, List, Optional, Tuple
|
|
6
|
+
|
|
7
|
+
from litprinter import ic
|
|
8
|
+
|
|
9
|
+
from .temp_mail_io import TempMailIOAsync as TempMailAPI
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class AsyncTempMailHelper:
|
|
13
|
+
"""
|
|
14
|
+
Async helper class for TempMail.io API
|
|
15
|
+
Provides simplified methods for async usage of TempMail.io
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def __init__(self):
|
|
19
|
+
self.api = None
|
|
20
|
+
self.email = None
|
|
21
|
+
self.token = None
|
|
22
|
+
|
|
23
|
+
async def create(self, alias: Optional[str] = None, domain: Optional[str] = None) -> Tuple[str, str]:
|
|
24
|
+
"""
|
|
25
|
+
Create a new temporary email
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
alias: Optional alias for the email
|
|
29
|
+
domain: Optional domain for the email
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
Tuple containing the email address and token
|
|
33
|
+
"""
|
|
34
|
+
self.api = TempMailAPI()
|
|
35
|
+
await self.api.initialize()
|
|
36
|
+
|
|
37
|
+
try:
|
|
38
|
+
self.email, self.token = await self.api.create_email(alias, domain)
|
|
39
|
+
return self.email, self.token
|
|
40
|
+
except Exception as e:
|
|
41
|
+
ic.configureOutput(prefix='ERROR| ')
|
|
42
|
+
ic(f"Error creating email: {e}")
|
|
43
|
+
await self.close()
|
|
44
|
+
raise
|
|
45
|
+
|
|
46
|
+
async def get_messages(self) -> List[Dict]:
|
|
47
|
+
"""
|
|
48
|
+
Get messages for the current email
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
List of message dictionaries
|
|
52
|
+
"""
|
|
53
|
+
if not self.api or not self.email:
|
|
54
|
+
raise ValueError("No email created yet")
|
|
55
|
+
|
|
56
|
+
try:
|
|
57
|
+
messages = await self.api.get_messages()
|
|
58
|
+
if not messages:
|
|
59
|
+
return []
|
|
60
|
+
|
|
61
|
+
return [
|
|
62
|
+
{
|
|
63
|
+
"id": msg.get("id") or msg.get("msg_id"),
|
|
64
|
+
"from": msg.get("from") or msg.get("email_from"),
|
|
65
|
+
"to": msg.get("to") or msg.get("email_to"),
|
|
66
|
+
"subject": msg.get("subject"),
|
|
67
|
+
"created_at": msg.get("created_at") or msg.get("createdAt"),
|
|
68
|
+
"body": msg.get("body_text") or msg.get("body_html") or msg.get("body"),
|
|
69
|
+
"has_attachments": bool(msg.get("attachments") or msg.get("has_attachments") or msg.get("hasAttachments"))
|
|
70
|
+
}
|
|
71
|
+
for msg in messages
|
|
72
|
+
]
|
|
73
|
+
except Exception as e:
|
|
74
|
+
ic.configureOutput(prefix='ERROR| ')
|
|
75
|
+
ic(f"Error getting messages: {e}")
|
|
76
|
+
return []
|
|
77
|
+
|
|
78
|
+
async def delete(self) -> bool:
|
|
79
|
+
"""
|
|
80
|
+
Delete the current temporary email
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
True if deletion was successful, False otherwise
|
|
84
|
+
"""
|
|
85
|
+
if not self.api or not self.email or not self.token:
|
|
86
|
+
ic.configureOutput(prefix='WARNING| ')
|
|
87
|
+
ic("No email to delete")
|
|
88
|
+
return False
|
|
89
|
+
|
|
90
|
+
try:
|
|
91
|
+
result = await self.api.delete_email()
|
|
92
|
+
return result
|
|
93
|
+
except Exception as e:
|
|
94
|
+
ic.configureOutput(prefix='ERROR| ')
|
|
95
|
+
ic(f"Error deleting email: {e}")
|
|
96
|
+
return False
|
|
97
|
+
finally:
|
|
98
|
+
await self.close()
|
|
99
|
+
|
|
100
|
+
async def close(self) -> None:
|
|
101
|
+
"""Close the API connection"""
|
|
102
|
+
if self.api:
|
|
103
|
+
await self.api.close()
|
|
104
|
+
self.api = None
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
async def get_temp_email(alias: Optional[str] = None, domain: Optional[str] = None) -> Tuple[str, AsyncTempMailHelper]:
|
|
108
|
+
"""
|
|
109
|
+
Get a temporary email address asynchronously
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
alias: Optional alias for the email
|
|
113
|
+
domain: Optional domain for the email
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
Tuple containing the email address and the TempMail helper instance
|
|
117
|
+
"""
|
|
118
|
+
helper = AsyncTempMailHelper()
|
|
119
|
+
email, _ = await helper.create(alias, domain)
|
|
120
|
+
return email, helper
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
async def wait_for_message(helper: AsyncTempMailHelper, timeout: int = 60, check_interval: int = 5) -> Optional[Dict]:
|
|
124
|
+
"""
|
|
125
|
+
Wait for a message to arrive in the inbox
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
helper: The TempMail helper instance
|
|
129
|
+
timeout: Maximum time to wait in seconds
|
|
130
|
+
check_interval: Time between checks in seconds
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
The first message if one arrives, None otherwise
|
|
134
|
+
"""
|
|
135
|
+
start_time = asyncio.get_event_loop().time()
|
|
136
|
+
|
|
137
|
+
while asyncio.get_event_loop().time() - start_time < timeout:
|
|
138
|
+
messages = await helper.get_messages()
|
|
139
|
+
if messages:
|
|
140
|
+
return messages[0]
|
|
141
|
+
await asyncio.sleep(check_interval)
|
|
142
|
+
|
|
143
|
+
return None
|
webscout/Extra/tempmail/base.py
CHANGED
|
@@ -1,161 +1,172 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Temporary Email Generation Base Module
|
|
3
|
-
Abstract base classes for tempmail providers
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import string
|
|
8
|
-
import
|
|
9
|
-
from typing import Dict, List,
|
|
10
|
-
|
|
11
|
-
# Constants for email generation
|
|
12
|
-
EMAIL_LENGTH = 16
|
|
13
|
-
PASSWORD_LENGTH = 10
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class TempMailProvider(ABC):
|
|
17
|
-
"""
|
|
18
|
-
Abstract base class for synchronous temporary email providers
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
"""
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
1
|
+
"""
|
|
2
|
+
Temporary Email Generation Base Module
|
|
3
|
+
Abstract base classes for tempmail providers
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import random
|
|
7
|
+
import string
|
|
8
|
+
from abc import ABC, abstractmethod
|
|
9
|
+
from typing import Dict, List, Optional, Tuple, Union
|
|
10
|
+
|
|
11
|
+
# Constants for email generation
|
|
12
|
+
EMAIL_LENGTH = 16
|
|
13
|
+
PASSWORD_LENGTH = 10
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class TempMailProvider(ABC):
|
|
17
|
+
"""
|
|
18
|
+
Abstract base class for synchronous temporary email providers
|
|
19
|
+
"""
|
|
20
|
+
email: Optional[str] = None
|
|
21
|
+
account_id: Optional[str] = None
|
|
22
|
+
|
|
23
|
+
@abstractmethod
|
|
24
|
+
def create_account(self) -> bool:
|
|
25
|
+
"""Create a new temporary email account"""
|
|
26
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
27
|
+
|
|
28
|
+
@abstractmethod
|
|
29
|
+
def get_messages(self) -> List[Dict]:
|
|
30
|
+
"""Get all messages in the inbox"""
|
|
31
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
32
|
+
|
|
33
|
+
@abstractmethod
|
|
34
|
+
def check_new_messages(self) -> List[Dict]:
|
|
35
|
+
"""Check for new messages and return only the new ones"""
|
|
36
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
37
|
+
|
|
38
|
+
@abstractmethod
|
|
39
|
+
def delete_account(self) -> bool:
|
|
40
|
+
"""Delete the current temporary email account"""
|
|
41
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
42
|
+
|
|
43
|
+
@abstractmethod
|
|
44
|
+
def get_account_info(self) -> Dict:
|
|
45
|
+
"""Get current account information"""
|
|
46
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
47
|
+
|
|
48
|
+
def get_token(self) -> str:
|
|
49
|
+
"""Get authentication token (optional for some providers)"""
|
|
50
|
+
return ""
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class AsyncTempMailProvider(ABC):
|
|
54
|
+
"""
|
|
55
|
+
Abstract base class for asynchronous temporary email providers
|
|
56
|
+
"""
|
|
57
|
+
email: Optional[str] = None
|
|
58
|
+
account_id: Optional[str] = None
|
|
59
|
+
|
|
60
|
+
@abstractmethod
|
|
61
|
+
async def initialize(self):
|
|
62
|
+
"""Initialize the provider session"""
|
|
63
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
64
|
+
|
|
65
|
+
@abstractmethod
|
|
66
|
+
async def close(self) -> None:
|
|
67
|
+
"""Close the provider session"""
|
|
68
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
69
|
+
|
|
70
|
+
@abstractmethod
|
|
71
|
+
async def create_email(self, alias: Optional[str] = None, domain: Optional[str] = None) -> Tuple[str, str]:
|
|
72
|
+
"""Create a new temporary email address"""
|
|
73
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
74
|
+
|
|
75
|
+
@abstractmethod
|
|
76
|
+
async def get_messages(self) -> List[Dict]:
|
|
77
|
+
"""Get messages for a temporary email"""
|
|
78
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
79
|
+
|
|
80
|
+
@abstractmethod
|
|
81
|
+
async def delete_email(self) -> bool:
|
|
82
|
+
"""Delete a temporary email"""
|
|
83
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
# Utility functions
|
|
87
|
+
def generate_random_string(length: int, include_digits: bool = True) -> str:
|
|
88
|
+
"""
|
|
89
|
+
Generate a random string of specified length
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
length: Length of the string to generate
|
|
93
|
+
include_digits: Whether to include digits in the string
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
Random string of specified length
|
|
97
|
+
"""
|
|
98
|
+
chars = string.ascii_lowercase
|
|
99
|
+
if include_digits:
|
|
100
|
+
chars += string.digits
|
|
101
|
+
return ''.join(random.sample(chars, length))
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
# Factory function for getting a temporary email provider
|
|
105
|
+
def get_provider(provider_name: str = "mailtm", async_provider: bool = False) -> Union[TempMailProvider, AsyncTempMailProvider]:
|
|
106
|
+
"""
|
|
107
|
+
Get a temporary email provider instance
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
provider_name: Name of the provider to use ("mailtm", "tempmailio", or "emailnator")
|
|
111
|
+
async_provider: Whether to return an async provider
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
A temporary email provider instance
|
|
115
|
+
"""
|
|
116
|
+
if async_provider:
|
|
117
|
+
if provider_name.lower() == "tempmailio":
|
|
118
|
+
from .temp_mail_io import TempMailIOAsync
|
|
119
|
+
return TempMailIOAsync()
|
|
120
|
+
elif provider_name.lower() == "emailnator":
|
|
121
|
+
raise NotImplementedError("Emailnator async provider not implemented.")
|
|
122
|
+
else:
|
|
123
|
+
from .mail_tm import MailTMAsync
|
|
124
|
+
return MailTMAsync()
|
|
125
|
+
else:
|
|
126
|
+
if provider_name.lower() == "tempmailio":
|
|
127
|
+
from .temp_mail_io import TempMailIO
|
|
128
|
+
return TempMailIO()
|
|
129
|
+
elif provider_name.lower() == "emailnator":
|
|
130
|
+
from .emailnator import EmailnatorProvider
|
|
131
|
+
return EmailnatorProvider()
|
|
132
|
+
else:
|
|
133
|
+
from .mail_tm import MailTM
|
|
134
|
+
return MailTM()
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
# Simplified helpers for common operations
|
|
138
|
+
def get_random_email(provider_name: str = "mailtm") -> Tuple[str, TempMailProvider]:
|
|
139
|
+
"""
|
|
140
|
+
Get a random temporary email address
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
provider_name: Name of the provider to use
|
|
144
|
+
|
|
145
|
+
Returns:
|
|
146
|
+
Tuple containing the email address and the provider instance
|
|
147
|
+
"""
|
|
148
|
+
provider = get_provider(provider_name)
|
|
149
|
+
|
|
150
|
+
if isinstance(provider, AsyncTempMailProvider):
|
|
151
|
+
raise TypeError("get_random_email only supports synchronous providers")
|
|
152
|
+
|
|
153
|
+
# For providers that require explicit initialization
|
|
154
|
+
if getattr(provider, '_initialized', True) is False:
|
|
155
|
+
try:
|
|
156
|
+
# If there's an initialization method that needs to be called
|
|
157
|
+
if hasattr(provider, 'initialize'):
|
|
158
|
+
provider.initialize() # type: ignore
|
|
159
|
+
except Exception as e:
|
|
160
|
+
raise RuntimeError(f"Failed to initialize provider: {e}")
|
|
161
|
+
|
|
162
|
+
# Create the account (auto-generates a random email)
|
|
163
|
+
success = provider.create_account()
|
|
164
|
+
if not success:
|
|
165
|
+
raise RuntimeError(f"Failed to create account with provider {provider_name}")
|
|
166
|
+
|
|
167
|
+
return getattr(provider, 'email', ""), provider
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def get_disposable_email() -> Tuple[str, TempMailProvider]:
|
|
171
|
+
"""Alias for get_random_email"""
|
|
172
|
+
return get_random_email()
|