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,62 +1,82 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import
|
|
4
|
-
from
|
|
5
|
-
from
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
1
|
+
import json
|
|
2
|
+
import time
|
|
3
|
+
from typing import Any
|
|
4
|
+
from urllib.error import HTTPError
|
|
5
|
+
from urllib.request import Request, urlopen
|
|
6
|
+
|
|
7
|
+
try:
|
|
8
|
+
from webscout.litagent.agent import LitAgent
|
|
9
|
+
_USER_AGENT_GENERATOR = LitAgent()
|
|
10
|
+
except ImportError:
|
|
11
|
+
_USER_AGENT_GENERATOR = None
|
|
12
|
+
|
|
13
|
+
class GitError(Exception):
|
|
14
|
+
"""Base exception for GitHub API errors"""
|
|
15
|
+
pass
|
|
16
|
+
|
|
17
|
+
class RateLimitError(GitError):
|
|
18
|
+
"""Raised when hitting GitHub API rate limits"""
|
|
19
|
+
pass
|
|
20
|
+
|
|
21
|
+
class NotFoundError(GitError):
|
|
22
|
+
"""Raised when resource is not found"""
|
|
23
|
+
pass
|
|
24
|
+
|
|
25
|
+
class RequestError(GitError):
|
|
26
|
+
"""Raised for general request errors"""
|
|
27
|
+
pass
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def request(url: str, retry_attempts: int = 3) -> Any:
|
|
31
|
+
"""
|
|
32
|
+
Send a request to GitHub API with retry mechanism
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
url: GitHub API endpoint URL
|
|
36
|
+
retry_attempts: Number of retry attempts
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
Parsed JSON response
|
|
40
|
+
|
|
41
|
+
Raises:
|
|
42
|
+
NotFoundError: If resource not found
|
|
43
|
+
RateLimitError: If rate limited
|
|
44
|
+
RequestError: For other request errors
|
|
45
|
+
"""
|
|
46
|
+
headers = {
|
|
47
|
+
"User-Agent": _USER_AGENT_GENERATOR.random() if _USER_AGENT_GENERATOR else "webscout-gitapi/1.0",
|
|
48
|
+
"Accept": "application/vnd.github+json"
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
for attempt in range(retry_attempts):
|
|
52
|
+
try:
|
|
53
|
+
req = Request(url, headers=headers)
|
|
54
|
+
response = urlopen(req, timeout=30)
|
|
55
|
+
data = response.read().decode('utf-8')
|
|
56
|
+
try:
|
|
57
|
+
return json.loads(data)
|
|
58
|
+
except json.JSONDecodeError as json_err:
|
|
59
|
+
raise RequestError(f"Invalid JSON response from {url}: {str(json_err)}")
|
|
60
|
+
|
|
61
|
+
except HTTPError as e:
|
|
62
|
+
if e.code == 404:
|
|
63
|
+
raise NotFoundError(f"Resource not found: {url}")
|
|
64
|
+
if e.code == 429:
|
|
65
|
+
if attempt < retry_attempts - 1:
|
|
66
|
+
# Wait before retrying on rate limit
|
|
67
|
+
time.sleep(2 ** attempt) # Exponential backoff
|
|
68
|
+
continue
|
|
69
|
+
raise RateLimitError(f"Rate limited after {retry_attempts} attempts")
|
|
70
|
+
if e.code == 403:
|
|
71
|
+
raise RequestError("Forbidden: Check your authentication token")
|
|
72
|
+
if attempt == retry_attempts - 1:
|
|
73
|
+
raise RequestError(f"HTTP Error {e.code}: {e.reason}")
|
|
74
|
+
# Wait before retrying on other HTTP errors
|
|
75
|
+
time.sleep(1)
|
|
76
|
+
|
|
77
|
+
except Exception as e:
|
|
78
|
+
if attempt == retry_attempts - 1:
|
|
79
|
+
raise RequestError(f"Request failed: {str(e)}")
|
|
80
|
+
time.sleep(1)
|
|
81
|
+
|
|
82
|
+
raise RequestError(f"Request to {url} failed after {retry_attempts} attempts")
|
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<a href="https://github.com/pyscout/Webscout">
|
|
3
|
+
<img src="https://img.shields.io/badge/YTToolkit-YouTube%20Toolkit-red?style=for-the-badge&logo=youtube&logoColor=white" alt="YTToolkit Logo">
|
|
4
|
+
</a>
|
|
5
|
+
<h1>YTToolkit</h1>
|
|
6
|
+
<p><strong>Comprehensive YouTube Toolkit for Downloading, Transcription, and Data Extraction</strong></p>
|
|
7
|
+
|
|
8
|
+
<!-- Badges -->
|
|
9
|
+
<p>
|
|
10
|
+
<a href="https://pypi.org/project/webscout/"><img src="https://img.shields.io/pypi/v/webscout.svg?style=flat-square&logo=pypi&label=PyPI" alt="PyPI Version"></a>
|
|
11
|
+
<a href="#"><img src="https://img.shields.io/badge/No%20API%20Key-Required-success?style=flat-square" alt="No API Key Required"></a>
|
|
12
|
+
<a href="#"><img src="https://img.shields.io/badge/Python-3.7%2B-blue?style=flat-square&logo=python" alt="Python Version"></a>
|
|
13
|
+
</p>
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
> [!NOTE]
|
|
17
|
+
> YTToolkit provides a complete suite of YouTube tools including video downloading, transcript extraction, and comprehensive data retrieval - all without requiring an official API key.
|
|
18
|
+
|
|
19
|
+
## ✨ Features
|
|
20
|
+
|
|
21
|
+
### Video Management
|
|
22
|
+
|
|
23
|
+
* **Advanced Video Downloading**
|
|
24
|
+
* Multiple format support (MP4, MP3)
|
|
25
|
+
* Customizable quality selection (up to 4K)
|
|
26
|
+
* Progress tracking and auto-save functionality
|
|
27
|
+
* Batch downloading with search capabilities
|
|
28
|
+
|
|
29
|
+
* **Transcript Extraction** (InnerTube API)
|
|
30
|
+
* Multi-language transcript support
|
|
31
|
+
* Automatic and manual transcript fetching
|
|
32
|
+
* Real-time translation capabilities
|
|
33
|
+
* Flexible parsing options
|
|
34
|
+
* Reliable InnerTube API-based fetching
|
|
35
|
+
|
|
36
|
+
### Data Extraction (ytapi)
|
|
37
|
+
|
|
38
|
+
* **Channel Information**
|
|
39
|
+
* Comprehensive channel metadata
|
|
40
|
+
* Subscriber count, views, and engagement metrics
|
|
41
|
+
* Avatar and banner image URLs
|
|
42
|
+
* Social media links and about information
|
|
43
|
+
|
|
44
|
+
* **Video Intelligence**
|
|
45
|
+
* Detailed video metadata retrieval
|
|
46
|
+
* Thumbnail extraction in multiple resolutions
|
|
47
|
+
* Live stream and shorts detection
|
|
48
|
+
* Related videos and chapters extraction
|
|
49
|
+
* Embed code generation
|
|
50
|
+
|
|
51
|
+
* **Search & Discovery**
|
|
52
|
+
* Advanced search capabilities (videos, channels, playlists)
|
|
53
|
+
* Trending videos across categories
|
|
54
|
+
* Shorts and live stream search
|
|
55
|
+
* Playlist content extraction
|
|
56
|
+
* No official API dependency
|
|
57
|
+
|
|
58
|
+
* **Captions & Transcripts**
|
|
59
|
+
* Available language detection
|
|
60
|
+
* Timed transcript retrieval
|
|
61
|
+
* Transcript search functionality
|
|
62
|
+
* Plain text transcript extraction
|
|
63
|
+
|
|
64
|
+
## 🚀 Installation
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
pip install -U webscout
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## 💻 Quick Start Guide
|
|
71
|
+
|
|
72
|
+
### Video Downloading
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
from webscout import Handler
|
|
76
|
+
|
|
77
|
+
# Basic video download
|
|
78
|
+
downloader = Handler('https://youtube.com/watch?v=dQw4w9WgXcQ')
|
|
79
|
+
downloader.save()
|
|
80
|
+
|
|
81
|
+
# Advanced download with custom settings
|
|
82
|
+
downloader = Handler(
|
|
83
|
+
query='python tutorial', # Search query
|
|
84
|
+
format='mp4', # Format (mp4, mp3)
|
|
85
|
+
quality='720p', # Quality (144p to 4K)
|
|
86
|
+
limit=5 # Number of videos to download
|
|
87
|
+
)
|
|
88
|
+
downloader.auto_save(dir='./downloads')
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Transcript Extraction
|
|
92
|
+
|
|
93
|
+
```python
|
|
94
|
+
from webscout import YTTranscriber
|
|
95
|
+
|
|
96
|
+
# Get video transcript (uses InnerTube API for reliability)
|
|
97
|
+
transcript = YTTranscriber.get_transcript('https://youtube.com/watch?v=dQw4w9WgXcQ')
|
|
98
|
+
|
|
99
|
+
# Each entry has: text, start time, duration
|
|
100
|
+
for entry in transcript[:5]:
|
|
101
|
+
print(f"[{entry['start']:.1f}s] {entry['text']}")
|
|
102
|
+
|
|
103
|
+
# Get transcript in a specific language
|
|
104
|
+
spanish_transcript = YTTranscriber.get_transcript(
|
|
105
|
+
'dQw4w9WgXcQ', # Video ID or URL
|
|
106
|
+
languages='es' # Language code
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
# Get any available transcript (when language doesn't matter)
|
|
110
|
+
any_transcript = YTTranscriber.get_transcript(
|
|
111
|
+
'dQw4w9WgXcQ',
|
|
112
|
+
languages=None # Get first available
|
|
113
|
+
)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Channel Information
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
from webscout import Channel
|
|
120
|
+
|
|
121
|
+
# Create a channel instance
|
|
122
|
+
channel = Channel('@PewDiePie') # Handle, ID, or URL
|
|
123
|
+
|
|
124
|
+
# Access channel metadata
|
|
125
|
+
print(f"Channel: {channel.name}")
|
|
126
|
+
print(f"Subscribers: {channel.subscribers}")
|
|
127
|
+
print(f"Total Views: {channel.views}")
|
|
128
|
+
print(f"Country: {channel.country}")
|
|
129
|
+
|
|
130
|
+
# Get media URLs
|
|
131
|
+
print(f"Avatar: {channel.avatar}")
|
|
132
|
+
print(f"Banner: {channel.banner}")
|
|
133
|
+
|
|
134
|
+
# Get recent uploads
|
|
135
|
+
recent_videos = channel.uploads(10) # 10 most recent videos
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Video Metadata
|
|
139
|
+
|
|
140
|
+
```python
|
|
141
|
+
from webscout import Video
|
|
142
|
+
|
|
143
|
+
# Get video information
|
|
144
|
+
video = Video('https://www.youtube.com/watch?v=dQw4w9WgXcQ')
|
|
145
|
+
metadata = video.metadata
|
|
146
|
+
|
|
147
|
+
print(f"Title: {metadata['title']}")
|
|
148
|
+
print(f"Views: {metadata['views']}")
|
|
149
|
+
print(f"Duration: {metadata['duration']} seconds")
|
|
150
|
+
print(f"Upload Date: {metadata['upload_date']}")
|
|
151
|
+
|
|
152
|
+
# New properties
|
|
153
|
+
print(f"Is Live: {video.is_live}")
|
|
154
|
+
print(f"Is Short: {video.is_short}")
|
|
155
|
+
print(f"Hashtags: {video.hashtags}")
|
|
156
|
+
|
|
157
|
+
# Get related videos
|
|
158
|
+
related = video.get_related_videos(5)
|
|
159
|
+
|
|
160
|
+
# Get video chapters
|
|
161
|
+
chapters = video.get_chapters()
|
|
162
|
+
|
|
163
|
+
# Get thumbnails
|
|
164
|
+
thumbnails = video.thumbnail_urls
|
|
165
|
+
print(f"Default thumbnail: {thumbnails['default']}")
|
|
166
|
+
print(f"High quality: {thumbnails['high']}")
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Search & Trending
|
|
170
|
+
|
|
171
|
+
```python
|
|
172
|
+
from webscout import Search, Extras
|
|
173
|
+
|
|
174
|
+
# Search for videos
|
|
175
|
+
video_results = Search.videos("Python tutorial", limit=5)
|
|
176
|
+
|
|
177
|
+
# Search for channels
|
|
178
|
+
channel_results = Search.channels("coding", limit=3)
|
|
179
|
+
|
|
180
|
+
# Search for shorts
|
|
181
|
+
shorts = Search.shorts("funny cats", limit=5)
|
|
182
|
+
|
|
183
|
+
# Search for live streams
|
|
184
|
+
live = Search.live_streams("gaming", limit=5)
|
|
185
|
+
|
|
186
|
+
# Get trending videos
|
|
187
|
+
trending = Extras.trending_videos(limit=10)
|
|
188
|
+
|
|
189
|
+
# Get category-specific videos
|
|
190
|
+
music_videos = Extras.music_videos(limit=5)
|
|
191
|
+
gaming_videos = Extras.gaming_videos(limit=5)
|
|
192
|
+
shorts_videos = Extras.shorts_videos(limit=5)
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Captions API
|
|
196
|
+
|
|
197
|
+
```python
|
|
198
|
+
from webscout.Extra.YTToolkit.ytapi import Captions
|
|
199
|
+
|
|
200
|
+
# Get available caption languages
|
|
201
|
+
languages = Captions.get_available_languages('dQw4w9WgXcQ')
|
|
202
|
+
for lang in languages:
|
|
203
|
+
print(f"{lang['code']}: {lang['name']} (auto: {lang['is_auto']})")
|
|
204
|
+
|
|
205
|
+
# Get timed transcript
|
|
206
|
+
transcript = Captions.get_timed_transcript('dQw4w9WgXcQ', language='en')
|
|
207
|
+
for entry in transcript[:3]:
|
|
208
|
+
print(f"[{entry['start']:.1f}s] {entry['text']}")
|
|
209
|
+
|
|
210
|
+
# Get plain text transcript
|
|
211
|
+
text = Captions.get_transcript('dQw4w9WgXcQ')
|
|
212
|
+
print(text[:200])
|
|
213
|
+
|
|
214
|
+
# Search within transcript
|
|
215
|
+
results = Captions.search_transcript('dQw4w9WgXcQ', 'never gonna')
|
|
216
|
+
for r in results:
|
|
217
|
+
print(f"{r['start']:.1f}s: {r['text']}")
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## 📓 Detailed Documentation
|
|
221
|
+
|
|
222
|
+
<details>
|
|
223
|
+
<summary><strong>Video Downloader (Handler)</strong></summary>
|
|
224
|
+
|
|
225
|
+
The `Handler` class provides powerful video downloading capabilities:
|
|
226
|
+
|
|
227
|
+
```python
|
|
228
|
+
from webscout import Handler
|
|
229
|
+
|
|
230
|
+
# Initialize with video URL or search query
|
|
231
|
+
downloader = Handler('https://youtube.com/watch?v=dQw4w9WgXcQ')
|
|
232
|
+
|
|
233
|
+
# Basic download with default settings
|
|
234
|
+
downloader.save() # Saves to current directory
|
|
235
|
+
|
|
236
|
+
# Download with custom settings
|
|
237
|
+
downloader.save(
|
|
238
|
+
filename='custom_name', # Custom filename
|
|
239
|
+
format='mp3', # Format (mp4, mp3)
|
|
240
|
+
quality='highest', # Quality setting
|
|
241
|
+
output_path='./videos' # Output directory
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
# Batch download from search
|
|
245
|
+
batch_downloader = Handler(
|
|
246
|
+
query='python tutorials',
|
|
247
|
+
limit=5, # Number of videos
|
|
248
|
+
format='mp4',
|
|
249
|
+
quality='720p'
|
|
250
|
+
)
|
|
251
|
+
batch_downloader.auto_save()
|
|
252
|
+
|
|
253
|
+
# Get download progress
|
|
254
|
+
progress = downloader.progress
|
|
255
|
+
print(f"Download progress: {progress}%")
|
|
256
|
+
|
|
257
|
+
# Get download history
|
|
258
|
+
history = downloader.history
|
|
259
|
+
print(f"Downloaded files: {history}")
|
|
260
|
+
```
|
|
261
|
+
</details>
|
|
262
|
+
|
|
263
|
+
<details>
|
|
264
|
+
<summary><strong>Transcript Retriever (YTTranscriber)</strong></summary>
|
|
265
|
+
|
|
266
|
+
The `YTTranscriber` class extracts video transcripts using YouTube's InnerTube API:
|
|
267
|
+
|
|
268
|
+
```python
|
|
269
|
+
from webscout import YTTranscriber
|
|
270
|
+
|
|
271
|
+
# Get transcript with timestamps
|
|
272
|
+
transcript = YTTranscriber.get_transcript('dQw4w9WgXcQ')
|
|
273
|
+
for entry in transcript:
|
|
274
|
+
print(f"[{entry['start']:.2f}s] {entry['text']}")
|
|
275
|
+
|
|
276
|
+
# Get transcript in specific language
|
|
277
|
+
spanish = YTTranscriber.get_transcript('dQw4w9WgXcQ', languages='es')
|
|
278
|
+
|
|
279
|
+
# Get any available transcript
|
|
280
|
+
any_lang = YTTranscriber.get_transcript('dQw4w9WgXcQ', languages=None)
|
|
281
|
+
|
|
282
|
+
# Use with proxies
|
|
283
|
+
transcript = YTTranscriber.get_transcript(
|
|
284
|
+
'dQw4w9WgXcQ',
|
|
285
|
+
proxies={'http': 'http://proxy:8080'}
|
|
286
|
+
)
|
|
287
|
+
```
|
|
288
|
+
</details>
|
|
289
|
+
|
|
290
|
+
<details>
|
|
291
|
+
<summary><strong>Channel Class</strong></summary>
|
|
292
|
+
|
|
293
|
+
The `Channel` class provides comprehensive access to YouTube channel data:
|
|
294
|
+
|
|
295
|
+
```python
|
|
296
|
+
from webscout import Channel
|
|
297
|
+
|
|
298
|
+
# Initialize with channel handle, ID, or URL
|
|
299
|
+
channel = Channel('@PewDiePie')
|
|
300
|
+
|
|
301
|
+
# Basic information
|
|
302
|
+
print(f"Name: {channel.name}")
|
|
303
|
+
print(f"ID: {channel.id}")
|
|
304
|
+
print(f"Subscribers: {channel.subscribers}")
|
|
305
|
+
print(f"Total Views: {channel.views}")
|
|
306
|
+
print(f"Country: {channel.country}")
|
|
307
|
+
|
|
308
|
+
# Media URLs
|
|
309
|
+
print(f"Avatar: {channel.avatar}")
|
|
310
|
+
print(f"Banner: {channel.banner}")
|
|
311
|
+
print(f"URL: {channel.url}")
|
|
312
|
+
|
|
313
|
+
# Content
|
|
314
|
+
print(f"Description: {channel.description}")
|
|
315
|
+
print(f"Social Links: {channel.socials}")
|
|
316
|
+
|
|
317
|
+
# Live status
|
|
318
|
+
if channel.live:
|
|
319
|
+
print(f"Currently streaming: {channel.streaming_now}")
|
|
320
|
+
|
|
321
|
+
# Get videos
|
|
322
|
+
recent_uploads = channel.uploads(20) # Get 20 most recent videos
|
|
323
|
+
```
|
|
324
|
+
</details>
|
|
325
|
+
|
|
326
|
+
<details>
|
|
327
|
+
<summary><strong>Video Class</strong></summary>
|
|
328
|
+
|
|
329
|
+
The `Video` class extracts detailed information about YouTube videos:
|
|
330
|
+
|
|
331
|
+
```python
|
|
332
|
+
from webscout import Video
|
|
333
|
+
|
|
334
|
+
# Initialize with video ID or URL
|
|
335
|
+
video = Video('https://www.youtube.com/watch?v=dQw4w9WgXcQ')
|
|
336
|
+
|
|
337
|
+
# Get comprehensive metadata
|
|
338
|
+
metadata = video.metadata
|
|
339
|
+
print(f"Title: {metadata['title']}")
|
|
340
|
+
print(f"Views: {metadata['views']}")
|
|
341
|
+
print(f"Duration: {metadata['duration']} seconds")
|
|
342
|
+
print(f"Upload Date: {metadata['upload_date']}")
|
|
343
|
+
|
|
344
|
+
# New properties
|
|
345
|
+
print(f"Is Live: {video.is_live}")
|
|
346
|
+
print(f"Is Short: {video.is_short}")
|
|
347
|
+
print(f"Hashtags: {video.hashtags}")
|
|
348
|
+
|
|
349
|
+
# Get related videos
|
|
350
|
+
related = video.get_related_videos(5)
|
|
351
|
+
|
|
352
|
+
# Get chapters (if available)
|
|
353
|
+
chapters = video.get_chapters()
|
|
354
|
+
if chapters:
|
|
355
|
+
for ch in chapters:
|
|
356
|
+
print(f"{ch['start_time']}: {ch['title']}")
|
|
357
|
+
|
|
358
|
+
# Stream comments (from initial page load)
|
|
359
|
+
for comment in video.stream_comments(limit=10):
|
|
360
|
+
print(f"{comment['author']}: {comment['text']}")
|
|
361
|
+
|
|
362
|
+
# Get thumbnails in different resolutions
|
|
363
|
+
thumbnails = video.thumbnail_urls
|
|
364
|
+
print(f"Default thumbnail: {thumbnails['default']}")
|
|
365
|
+
print(f"High quality thumbnail: {thumbnails['high']}")
|
|
366
|
+
print(f"Maximum resolution thumbnail: {thumbnails['maxres']}")
|
|
367
|
+
|
|
368
|
+
# Get embed code and URL
|
|
369
|
+
print(f"Embed HTML: {video.embed_html}")
|
|
370
|
+
print(f"Embed URL: {video.embed_url}")
|
|
371
|
+
```
|
|
372
|
+
</details>
|
|
373
|
+
|
|
374
|
+
<details>
|
|
375
|
+
<summary><strong>Search & Extras Classes</strong></summary>
|
|
376
|
+
|
|
377
|
+
The `Search` and `Extras` classes provide discovery capabilities:
|
|
378
|
+
|
|
379
|
+
```python
|
|
380
|
+
from webscout import Search, Extras
|
|
381
|
+
|
|
382
|
+
# Search for videos with advanced options
|
|
383
|
+
video_results = Search.videos("Python tutorial", limit=5)
|
|
384
|
+
|
|
385
|
+
# Search for channels
|
|
386
|
+
channel_results = Search.channels("coding", limit=3)
|
|
387
|
+
|
|
388
|
+
# Search for playlists
|
|
389
|
+
playlist_results = Search.playlists("music mix", limit=3)
|
|
390
|
+
|
|
391
|
+
# New search methods
|
|
392
|
+
shorts = Search.shorts("funny", limit=5)
|
|
393
|
+
live = Search.live_streams("gaming", limit=5)
|
|
394
|
+
long_videos = Search.videos_by_duration("tutorial", duration="long")
|
|
395
|
+
recent = Search.videos_by_upload_date("news", upload_date="today")
|
|
396
|
+
|
|
397
|
+
# Get trending videos by region
|
|
398
|
+
trending = Extras.trending_videos(limit=10, region="US")
|
|
399
|
+
|
|
400
|
+
# Get category-specific videos
|
|
401
|
+
music = Extras.music_videos(limit=5)
|
|
402
|
+
gaming = Extras.gaming_videos(limit=5)
|
|
403
|
+
shorts = Extras.shorts_videos(limit=5)
|
|
404
|
+
movies = Extras.movies(limit=5)
|
|
405
|
+
podcasts = Extras.podcasts(limit=5)
|
|
406
|
+
```
|
|
407
|
+
</details>
|
|
408
|
+
|
|
409
|
+
## 📚 Module Structure
|
|
410
|
+
|
|
411
|
+
| Module | File | Description |
|
|
412
|
+
|--------|------|-------------|
|
|
413
|
+
| **Video Downloader** | [`YTdownloader.py`](YTdownloader.py) | YouTube video downloading with format and quality options |
|
|
414
|
+
| **Transcript Retriever** | [`transcriber.py`](transcriber.py) | InnerTube API-based transcript extraction |
|
|
415
|
+
| **Channel Data** | [`ytapi/channel.py`](ytapi/channel.py) | Channel metadata and interaction |
|
|
416
|
+
| **Video Information** | [`ytapi/video.py`](ytapi/video.py) | Video information extraction |
|
|
417
|
+
| **Search** | [`ytapi/query.py`](ytapi/query.py) | Advanced search capabilities |
|
|
418
|
+
| **Trending** | [`ytapi/extras.py`](ytapi/extras.py) | Trending and category-based video retrieval |
|
|
419
|
+
| **Playlists** | [`ytapi/playlist.py`](ytapi/playlist.py) | Playlist metadata extraction |
|
|
420
|
+
| **Captions** | [`ytapi/captions.py`](ytapi/captions.py) | Caption/transcript extraction wrapper |
|
|
421
|
+
| **Suggestions** | [`ytapi/suggestions.py`](ytapi/suggestions.py) | Search autocomplete and trending searches |
|
|
422
|
+
| **Shorts** | [`ytapi/shorts.py`](ytapi/shorts.py) | YouTube Shorts functionality |
|
|
423
|
+
| **Hashtags** | [`ytapi/hashtag.py`](ytapi/hashtag.py) | Hashtag-related video discovery |
|
|
424
|
+
|
|
425
|
+
## ⚠️ Disclaimer
|
|
426
|
+
|
|
427
|
+
> [!WARNING]
|
|
428
|
+
> This toolkit is designed for educational and research purposes only. Please use responsibly and in accordance with YouTube's terms of service. The developers are not responsible for any misuse of this software.
|
|
429
|
+
|
|
430
|
+
> [!IMPORTANT]
|
|
431
|
+
> Web scraping is inherently fragile. YouTube may change their website structure or API at any time, which could break functionality. If you encounter issues, please report them on GitHub.
|
|
432
|
+
|
|
433
|
+
## 🤝 Contributing
|
|
434
|
+
|
|
435
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
436
|
+
|
|
437
|
+
<div align="center">
|
|
438
|
+
<p>
|
|
439
|
+
<a href="https://t.me/PyscoutAI"><img alt="Telegram Group" src="https://img.shields.io/badge/Telegram%20Group-2CA5E0?style=for-the-badge&logo=telegram&logoColor=white"></a>
|
|
440
|
+
<a href="https://youtube.com/@OEvortex"><img alt="YouTube" src="https://img.shields.io/badge/YouTube-FF0000?style=for-the-badge&logo=youtube&logoColor=white"></a>
|
|
441
|
+
<a href="https://buymeacoffee.com/oevortex"><img alt="Buy Me A Coffee" src="https://img.shields.io/badge/Buy%20Me%20A%20Coffee-FFDD00?style=for-the-badge&logo=buymeacoffee&logoColor=black"></a>
|
|
442
|
+
</p>
|
|
443
|
+
</div>
|