webscout 6.4__tar.gz → 6.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of webscout might be problematic. Click here for more details.

Files changed (193) hide show
  1. {webscout-6.4/webscout.egg-info → webscout-6.5}/PKG-INFO +12 -68
  2. {webscout-6.4 → webscout-6.5}/README.md +10 -61
  3. {webscout-6.4 → webscout-6.5}/setup.py +1 -7
  4. {webscout-6.4 → webscout-6.5}/webscout/AIutel.py +7 -54
  5. {webscout-6.4 → webscout-6.5}/webscout/DWEBS.py +48 -26
  6. {webscout-6.4/webscout → webscout-6.5/webscout/Extra/YTToolkit}/YTdownloader.py +990 -1103
  7. webscout-6.5/webscout/Extra/YTToolkit/__init__.py +3 -0
  8. {webscout-6.4/webscout → webscout-6.5/webscout/Extra/YTToolkit}/transcriber.py +1 -1
  9. webscout-6.5/webscout/Extra/YTToolkit/ytapi/__init__.py +6 -0
  10. webscout-6.5/webscout/Extra/YTToolkit/ytapi/channel.py +307 -0
  11. webscout-6.5/webscout/Extra/YTToolkit/ytapi/errors.py +13 -0
  12. webscout-6.5/webscout/Extra/YTToolkit/ytapi/extras.py +45 -0
  13. webscout-6.5/webscout/Extra/YTToolkit/ytapi/https.py +88 -0
  14. webscout-6.5/webscout/Extra/YTToolkit/ytapi/patterns.py +61 -0
  15. webscout-6.5/webscout/Extra/YTToolkit/ytapi/playlist.py +59 -0
  16. webscout-6.5/webscout/Extra/YTToolkit/ytapi/pool.py +8 -0
  17. webscout-6.5/webscout/Extra/YTToolkit/ytapi/query.py +37 -0
  18. webscout-6.5/webscout/Extra/YTToolkit/ytapi/stream.py +60 -0
  19. webscout-6.5/webscout/Extra/YTToolkit/ytapi/utils.py +62 -0
  20. webscout-6.5/webscout/Extra/YTToolkit/ytapi/video.py +102 -0
  21. {webscout-6.4 → webscout-6.5}/webscout/Extra/__init__.py +2 -1
  22. {webscout-6.4 → webscout-6.5}/webscout/Extra/autocoder/rawdog.py +679 -680
  23. {webscout-6.4 → webscout-6.5}/webscout/Extra/gguf.py +441 -441
  24. webscout-6.5/webscout/Extra/markdownlite/__init__.py +862 -0
  25. {webscout-6.4 → webscout-6.5}/webscout/Extra/weather_ascii.py +2 -2
  26. webscout-6.5/webscout/Provider/PI.py +293 -0
  27. {webscout-6.4 → webscout-6.5}/webscout/Provider/Perplexity.py +6 -14
  28. {webscout-6.4 → webscout-6.5}/webscout/Provider/Reka.py +0 -1
  29. webscout-6.5/webscout/Provider/TTS/__init__.py +7 -0
  30. webscout-6.5/webscout/Provider/TTS/deepgram.py +183 -0
  31. webscout-6.5/webscout/Provider/TTS/elevenlabs.py +137 -0
  32. webscout-6.5/webscout/Provider/TTS/gesserit.py +151 -0
  33. webscout-6.5/webscout/Provider/TTS/murfai.py +139 -0
  34. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTS/parler.py +134 -107
  35. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTS/streamElements.py +360 -275
  36. webscout-6.5/webscout/Provider/TTS/utils.py +280 -0
  37. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTS/voicepod.py +116 -116
  38. {webscout-6.4 → webscout-6.5}/webscout/Provider/__init__.py +146 -146
  39. {webscout-6.4 → webscout-6.5}/webscout/Provider/meta.py +794 -779
  40. {webscout-6.4 → webscout-6.5}/webscout/Provider/typegpt.py +1 -2
  41. {webscout-6.4 → webscout-6.5}/webscout/__init__.py +24 -28
  42. {webscout-6.4 → webscout-6.5}/webscout/litprinter/__init__.py +831 -830
  43. {webscout-6.4 → webscout-6.5}/webscout/optimizers.py +269 -269
  44. {webscout-6.4 → webscout-6.5}/webscout/prompt_manager.py +279 -279
  45. webscout-6.5/webscout/scout/__init__.py +11 -0
  46. webscout-6.5/webscout/scout/core.py +884 -0
  47. webscout-6.5/webscout/scout/element.py +459 -0
  48. webscout-6.5/webscout/scout/parsers/__init__.py +69 -0
  49. webscout-6.5/webscout/scout/parsers/html5lib_parser.py +172 -0
  50. webscout-6.5/webscout/scout/parsers/html_parser.py +236 -0
  51. webscout-6.5/webscout/scout/parsers/lxml_parser.py +178 -0
  52. webscout-6.5/webscout/scout/utils.py +38 -0
  53. {webscout-6.4 → webscout-6.5}/webscout/update_checker.py +125 -125
  54. {webscout-6.4 → webscout-6.5}/webscout/version.py +1 -1
  55. webscout-6.5/webscout/zeroart/__init__.py +55 -0
  56. webscout-6.5/webscout/zeroart/base.py +61 -0
  57. webscout-6.5/webscout/zeroart/effects.py +99 -0
  58. webscout-6.5/webscout/zeroart/fonts.py +816 -0
  59. webscout-6.5/webscout/zerodir/__init__.py +225 -0
  60. {webscout-6.4 → webscout-6.5/webscout.egg-info}/PKG-INFO +12 -68
  61. {webscout-6.4 → webscout-6.5}/webscout.egg-info/SOURCES.txt +35 -10
  62. {webscout-6.4 → webscout-6.5}/webscout.egg-info/requires.txt +1 -6
  63. webscout-6.4/webscout/Agents/Onlinesearcher.py +0 -182
  64. webscout-6.4/webscout/Agents/__init__.py +0 -2
  65. webscout-6.4/webscout/Agents/functioncall.py +0 -248
  66. webscout-6.4/webscout/Bing_search.py +0 -251
  67. webscout-6.4/webscout/Provider/PI.py +0 -222
  68. webscout-6.4/webscout/Provider/TTS/__init__.py +0 -3
  69. webscout-6.4/webscout/gpt4free.py +0 -666
  70. webscout-6.4/webscout/requestsHTMLfix.py +0 -775
  71. webscout-6.4/webscout/webai.py +0 -2590
  72. {webscout-6.4 → webscout-6.5}/LICENSE.md +0 -0
  73. {webscout-6.4 → webscout-6.5}/setup.cfg +0 -0
  74. {webscout-6.4 → webscout-6.5}/webscout/AIauto.py +0 -0
  75. {webscout-6.4 → webscout-6.5}/webscout/AIbase.py +0 -0
  76. {webscout-6.4 → webscout-6.5}/webscout/Bard.py +0 -0
  77. {webscout-6.4 → webscout-6.5}/webscout/Extra/autocoder/__init__.py +0 -0
  78. {webscout-6.4 → webscout-6.5}/webscout/Extra/autocoder/autocoder_utiles.py +0 -0
  79. {webscout-6.4 → webscout-6.5}/webscout/Extra/autollama.py +0 -0
  80. {webscout-6.4 → webscout-6.5}/webscout/Extra/weather.py +0 -0
  81. {webscout-6.4 → webscout-6.5}/webscout/LLM.py +0 -0
  82. {webscout-6.4 → webscout-6.5}/webscout/Litlogger/__init__.py +0 -0
  83. {webscout-6.4 → webscout-6.5}/webscout/Local/__init__.py +0 -0
  84. {webscout-6.4 → webscout-6.5}/webscout/Local/_version.py +0 -0
  85. {webscout-6.4 → webscout-6.5}/webscout/Local/formats.py +0 -0
  86. {webscout-6.4 → webscout-6.5}/webscout/Local/model.py +0 -0
  87. {webscout-6.4 → webscout-6.5}/webscout/Local/samplers.py +0 -0
  88. {webscout-6.4 → webscout-6.5}/webscout/Local/thread.py +0 -0
  89. {webscout-6.4 → webscout-6.5}/webscout/Local/ui.py +0 -0
  90. {webscout-6.4 → webscout-6.5}/webscout/Local/utils.py +0 -0
  91. {webscout-6.4 → webscout-6.5}/webscout/Provider/AI21.py +0 -0
  92. {webscout-6.4 → webscout-6.5}/webscout/Provider/Amigo.py +0 -0
  93. {webscout-6.4 → webscout-6.5}/webscout/Provider/Andi.py +0 -0
  94. {webscout-6.4 → webscout-6.5}/webscout/Provider/Bing.py +0 -0
  95. {webscout-6.4 → webscout-6.5}/webscout/Provider/Blackboxai.py +0 -0
  96. {webscout-6.4 → webscout-6.5}/webscout/Provider/ChatGPTES.py +0 -0
  97. {webscout-6.4 → webscout-6.5}/webscout/Provider/Chatify.py +0 -0
  98. {webscout-6.4 → webscout-6.5}/webscout/Provider/Cloudflare.py +0 -0
  99. {webscout-6.4 → webscout-6.5}/webscout/Provider/Cohere.py +0 -0
  100. {webscout-6.4 → webscout-6.5}/webscout/Provider/DARKAI.py +0 -0
  101. {webscout-6.4 → webscout-6.5}/webscout/Provider/Deepinfra.py +0 -0
  102. {webscout-6.4 → webscout-6.5}/webscout/Provider/Deepseek.py +0 -0
  103. {webscout-6.4 → webscout-6.5}/webscout/Provider/DiscordRocks.py +0 -0
  104. {webscout-6.4 → webscout-6.5}/webscout/Provider/EDITEE.py +0 -0
  105. {webscout-6.4 → webscout-6.5}/webscout/Provider/Farfalle.py +0 -0
  106. {webscout-6.4 → webscout-6.5}/webscout/Provider/Free2GPT.py +0 -0
  107. {webscout-6.4 → webscout-6.5}/webscout/Provider/GPTWeb.py +0 -0
  108. {webscout-6.4 → webscout-6.5}/webscout/Provider/Gemini.py +0 -0
  109. {webscout-6.4 → webscout-6.5}/webscout/Provider/Groq.py +0 -0
  110. {webscout-6.4 → webscout-6.5}/webscout/Provider/Koboldai.py +0 -0
  111. {webscout-6.4 → webscout-6.5}/webscout/Provider/Llama.py +0 -0
  112. {webscout-6.4 → webscout-6.5}/webscout/Provider/Llama3.py +0 -0
  113. {webscout-6.4 → webscout-6.5}/webscout/Provider/Marcus.py +0 -0
  114. {webscout-6.4 → webscout-6.5}/webscout/Provider/NinjaChat.py +0 -0
  115. {webscout-6.4 → webscout-6.5}/webscout/Provider/OLLAMA.py +0 -0
  116. {webscout-6.4 → webscout-6.5}/webscout/Provider/Openai.py +0 -0
  117. {webscout-6.4 → webscout-6.5}/webscout/Provider/Phind.py +0 -0
  118. {webscout-6.4 → webscout-6.5}/webscout/Provider/PizzaGPT.py +0 -0
  119. {webscout-6.4 → webscout-6.5}/webscout/Provider/RUBIKSAI.py +0 -0
  120. {webscout-6.4 → webscout-6.5}/webscout/Provider/RoboCoders.py +0 -0
  121. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/AiForce/__init__.py +0 -0
  122. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/AiForce/async_aiforce.py +0 -0
  123. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/AiForce/sync_aiforce.py +0 -0
  124. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/Nexra/__init__.py +0 -0
  125. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/Nexra/async_nexra.py +0 -0
  126. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/Nexra/sync_nexra.py +0 -0
  127. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/PollinationsAI/__init__.py +0 -0
  128. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/PollinationsAI/async_pollinations.py +0 -0
  129. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/PollinationsAI/sync_pollinations.py +0 -0
  130. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/__init__.py +0 -0
  131. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/artbit/__init__.py +0 -0
  132. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/artbit/async_artbit.py +0 -0
  133. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/artbit/sync_artbit.py +0 -0
  134. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/blackbox/__init__.py +0 -0
  135. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/blackbox/async_blackbox.py +0 -0
  136. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/blackbox/sync_blackbox.py +0 -0
  137. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/deepinfra/__init__.py +0 -0
  138. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/deepinfra/async_deepinfra.py +0 -0
  139. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/deepinfra/sync_deepinfra.py +0 -0
  140. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/huggingface/__init__.py +0 -0
  141. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/huggingface/async_huggingface.py +0 -0
  142. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/huggingface/sync_huggingface.py +0 -0
  143. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/imgninza/__init__.py +0 -0
  144. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/imgninza/async_ninza.py +0 -0
  145. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/imgninza/sync_ninza.py +0 -0
  146. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/talkai/__init__.py +0 -0
  147. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/talkai/async_talkai.py +0 -0
  148. {webscout-6.4 → webscout-6.5}/webscout/Provider/TTI/talkai/sync_talkai.py +0 -0
  149. {webscout-6.4 → webscout-6.5}/webscout/Provider/TeachAnything.py +0 -0
  150. {webscout-6.4 → webscout-6.5}/webscout/Provider/Youchat.py +0 -0
  151. {webscout-6.4 → webscout-6.5}/webscout/Provider/ai4chat.py +0 -0
  152. {webscout-6.4 → webscout-6.5}/webscout/Provider/aimathgpt.py +0 -0
  153. {webscout-6.4 → webscout-6.5}/webscout/Provider/askmyai.py +0 -0
  154. {webscout-6.4 → webscout-6.5}/webscout/Provider/bagoodex.py +0 -0
  155. {webscout-6.4 → webscout-6.5}/webscout/Provider/cerebras.py +0 -0
  156. {webscout-6.4 → webscout-6.5}/webscout/Provider/cleeai.py +0 -0
  157. {webscout-6.4 → webscout-6.5}/webscout/Provider/elmo.py +0 -0
  158. {webscout-6.4 → webscout-6.5}/webscout/Provider/felo_search.py +0 -0
  159. {webscout-6.4 → webscout-6.5}/webscout/Provider/gaurish.py +0 -0
  160. {webscout-6.4 → webscout-6.5}/webscout/Provider/geminiapi.py +0 -0
  161. {webscout-6.4 → webscout-6.5}/webscout/Provider/geminiprorealtime.py +0 -0
  162. {webscout-6.4 → webscout-6.5}/webscout/Provider/genspark.py +0 -0
  163. {webscout-6.4 → webscout-6.5}/webscout/Provider/julius.py +0 -0
  164. {webscout-6.4 → webscout-6.5}/webscout/Provider/koala.py +0 -0
  165. {webscout-6.4 → webscout-6.5}/webscout/Provider/learnfastai.py +0 -0
  166. {webscout-6.4 → webscout-6.5}/webscout/Provider/lepton.py +0 -0
  167. {webscout-6.4 → webscout-6.5}/webscout/Provider/llama3mitril.py +0 -0
  168. {webscout-6.4 → webscout-6.5}/webscout/Provider/llamatutor.py +0 -0
  169. {webscout-6.4 → webscout-6.5}/webscout/Provider/llmchat.py +0 -0
  170. {webscout-6.4 → webscout-6.5}/webscout/Provider/mhystical.py +0 -0
  171. {webscout-6.4 → webscout-6.5}/webscout/Provider/perplexitylabs.py +0 -0
  172. {webscout-6.4 → webscout-6.5}/webscout/Provider/prefind.py +0 -0
  173. {webscout-6.4 → webscout-6.5}/webscout/Provider/promptrefine.py +0 -0
  174. {webscout-6.4 → webscout-6.5}/webscout/Provider/talkai.py +0 -0
  175. {webscout-6.4 → webscout-6.5}/webscout/Provider/turboseek.py +0 -0
  176. {webscout-6.4 → webscout-6.5}/webscout/Provider/tutorai.py +0 -0
  177. {webscout-6.4 → webscout-6.5}/webscout/Provider/twitterclone.py +0 -0
  178. {webscout-6.4 → webscout-6.5}/webscout/Provider/upstage.py +0 -0
  179. {webscout-6.4 → webscout-6.5}/webscout/Provider/x0gpt.py +0 -0
  180. {webscout-6.4 → webscout-6.5}/webscout/Provider/yep.py +0 -0
  181. {webscout-6.4 → webscout-6.5}/webscout/__main__.py +0 -0
  182. {webscout-6.4 → webscout-6.5}/webscout/cli.py +0 -0
  183. {webscout-6.4 → webscout-6.5}/webscout/conversation.py +0 -0
  184. {webscout-6.4 → webscout-6.5}/webscout/exceptions.py +0 -0
  185. {webscout-6.4 → webscout-6.5}/webscout/litagent/__init__.py +0 -0
  186. {webscout-6.4 → webscout-6.5}/webscout/swiftcli/__init__.py +0 -0
  187. {webscout-6.4 → webscout-6.5}/webscout/tempid.py +0 -0
  188. {webscout-6.4 → webscout-6.5}/webscout/utils.py +0 -0
  189. {webscout-6.4 → webscout-6.5}/webscout/webscout_search.py +0 -0
  190. {webscout-6.4 → webscout-6.5}/webscout/webscout_search_async.py +0 -0
  191. {webscout-6.4 → webscout-6.5}/webscout.egg-info/dependency_links.txt +0 -0
  192. {webscout-6.4 → webscout-6.5}/webscout.egg-info/entry_points.txt +0 -0
  193. {webscout-6.4 → webscout-6.5}/webscout.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: webscout
3
- Version: 6.4
3
+ Version: 6.5
4
4
  Summary: Search for anything using Google, DuckDuckGo, phind.com, Contains AI models, can transcribe yt videos, temporary email and phone number generation, has TTS support, webai (terminal gpt and open interpreter) and offline LLMs and more
5
5
  Author: OEvortex
6
6
  Author-email: helpingai5@gmail.com
@@ -28,10 +28,7 @@ Requires-Dist: mistune
28
28
  Requires-Dist: tenacity
29
29
  Requires-Dist: curl_cffi
30
30
  Requires-Dist: nest-asyncio
31
- Requires-Dist: g4f>=0.2.2.3
32
- Requires-Dist: g4f[webdriver]
33
31
  Requires-Dist: rich
34
- Requires-Dist: beautifulsoup4
35
32
  Requires-Dist: markdownify
36
33
  Requires-Dist: requests
37
34
  Requires-Dist: google-generativeai
@@ -39,12 +36,10 @@ Requires-Dist: lxml>=5.2.2
39
36
  Requires-Dist: termcolor
40
37
  Requires-Dist: orjson
41
38
  Requires-Dist: PyYAML
42
- Requires-Dist: appdirs
43
39
  Requires-Dist: tls_client
44
40
  Requires-Dist: clipman
45
41
  Requires-Dist: playsound
46
42
  Requires-Dist: ollama
47
- Requires-Dist: pyfiglet
48
43
  Requires-Dist: pillow
49
44
  Requires-Dist: bson
50
45
  Requires-Dist: cloudscraper
@@ -53,10 +48,10 @@ Requires-Dist: openai
53
48
  Requires-Dist: prompt-toolkit
54
49
  Requires-Dist: primp
55
50
  Requires-Dist: pyreqwest_impersonate
56
- Requires-Dist: lxml_html_clean
57
51
  Requires-Dist: gradio_client
58
52
  Requires-Dist: psutil
59
53
  Requires-Dist: yaspin
54
+ Requires-Dist: websocket
60
55
  Provides-Extra: dev
61
56
  Requires-Dist: ruff>=0.1.6; extra == "dev"
62
57
  Requires-Dist: pytest>=7.4.2; extra == "dev"
@@ -103,12 +98,11 @@ Requires-Dist: unicorn; extra == "local"
103
98
  </div>
104
99
 
105
100
  ## 🚀 Features
106
- * **Comprehensive Search:** Leverage Google, DuckDuckGo, and Phind.com for diverse search results.
101
+ * **Comprehensive Search:** Leverage Google, DuckDuckGo for diverse search results.
107
102
  * **AI Powerhouse:** Access and interact with various AI models, including OpenAI, Cohere, and more.
108
- * **YouTube Toolkit:** Transcribe YouTube videos effortlessly and download audio/video content.
103
+ * **[YouTube Toolkit](webscout/Extra/YTToolkit):** Advanced YouTube video and transcript management with multi-language support, versatile downloading, and intelligent data extraction
109
104
  * **Tempmail & Temp Number:** Generate temporary email addresses and phone numbers for enhanced privacy.
110
- * **Text-to-Speech (TTS):** Convert text into natural-sounding speech using various TTS providers.
111
- * **WebAI:** Experience the power of terminal-based GPT and an open interpreter for code execution and more.
105
+ * **[Text-to-Speech (TTS)](webscout/Provider/TTS/README.md):** Convert text into natural-sounding speech using multiple AI-powered providers like ElevenLabs, StreamElements, and Voicepods.
112
106
  * **Offline LLMs:** Utilize powerful language models offline with GGUF support.
113
107
  * **Extensive Provider Ecosystem:** Explore a vast collection of providers, including BasedGPT, DeepSeek, and many others.
114
108
  * **Local LLM Execution:** Run GGUF models locally with minimal configuration.
@@ -121,6 +115,7 @@ Requires-Dist: unicorn; extra == "local"
121
115
  * **[LitLogger](webscout/litlogger/Readme.md):** Simplifies logging with customizable formats and color schemes
122
116
  * **[LitAgent](webscout/litagent/Readme.md):** Powerful and modern user agent generator that keeps your requests fresh and undetectable
123
117
  * **[Text-to-Image](webscout/Provider/TTI/README.md):** Generate high-quality images using a wide range of AI art providers
118
+ * **[MarkdownLite](webscout/Extra/markdownlite/README.md):** Powerful HTML to Markdown conversion library with advanced parsing and structured output
124
119
 
125
120
  ## ⚙️ Installation
126
121
  ```python
@@ -226,29 +221,7 @@ python -m webscout --help
226
221
 
227
222
  [Go To TOP](#webscout-️)
228
223
 
229
- ## ⬇️ YTdownloader
230
224
 
231
- ```python
232
- from os import rename, getcwd
233
- from webscout import YTdownloader
234
- def download_audio(video_id):
235
- youtube_link = video_id
236
- handler = YTdownloader.Handler(query=youtube_link)
237
- for third_query_data in handler.run(format='mp3', quality='128kbps', limit=1):
238
- audio_path = handler.save(third_query_data, dir=getcwd())
239
- rename(audio_path, "audio.mp3")
240
-
241
- def download_video(video_id):
242
- youtube_link = video_id
243
- handler = YTdownloader.Handler(query=youtube_link)
244
- for third_query_data in handler.run(format='mp4', quality='auto', limit=1):
245
- video_path = handler.save(third_query_data, dir=getcwd())
246
- rename(video_path, "video.mp4")
247
-
248
- if __name__ == "__main__":
249
- # download_audio("https://www.youtube.com/watch?v=c0tMvzB0OKw")
250
- download_video("https://www.youtube.com/watch?v=c0tMvzB0OKw")
251
- ```
252
225
 
253
226
  ## ☀️ Weather
254
227
 
@@ -304,20 +277,7 @@ if __name__ == "__main__":
304
277
  asyncio.run(main())
305
278
  ```
306
279
 
307
- ## 📝 Transcriber
308
280
 
309
- The `transcriber` function in Webscout is a handy tool that transcribes YouTube videos.
310
-
311
- **Example:**
312
-
313
- ```python
314
- from webscout import YTTranscriber
315
- yt = YTTranscriber()
316
- from rich import print
317
- video_url = input("Enter the YouTube video URL: ")
318
- transcript = yt.get_transcript(video_url, languages=None)
319
- print(transcript)
320
- ```
321
281
 
322
282
  ## 🔍 GoogleS (formerly DWEBS)
323
283
 
@@ -330,16 +290,6 @@ for result in results:
330
290
  print(result)
331
291
  ```
332
292
 
333
- ### BingS
334
-
335
- ```python
336
- from webscout import BingS
337
- from rich import print
338
- searcher = BingS()
339
- results = searcher.search("HelpingAI-9B", max_results=20, extract_webpage_text=True, max_extract_characters=1000)
340
- for result in results:
341
- print(result)
342
- ```
343
293
 
344
294
  ## 🦆 WEBS and AsyncWEBS
345
295
 
@@ -956,18 +906,12 @@ ai = BLACKBOXAI(
956
906
  model=None # You can specify a model if needed
957
907
  )
958
908
 
959
- # Start an infinite loop for continuous interaction
960
- while True:
961
- # Define a prompt to send to the AI
962
- prompt = input("Enter your prompt: ")
963
-
964
- # Check if the user wants to exit the loop
965
- if prompt.lower() == "exit":
966
- break
967
-
968
- # Use the 'chat' method to send the prompt and receive a response
969
- r = ai.chat(prompt)
970
- print(r)
909
+
910
+ # Define a prompt to send to the AI
911
+ prompt = "Tell me about india"
912
+ # Use the 'chat' method to send the prompt and receive a response
913
+ r = ai.chat(prompt)
914
+ print(r)
971
915
  ```
972
916
 
973
917
  ### ❓ `PERPLEXITY` - Search with PERPLEXITY
@@ -34,12 +34,11 @@
34
34
  </div>
35
35
 
36
36
  ## 🚀 Features
37
- * **Comprehensive Search:** Leverage Google, DuckDuckGo, and Phind.com for diverse search results.
37
+ * **Comprehensive Search:** Leverage Google, DuckDuckGo for diverse search results.
38
38
  * **AI Powerhouse:** Access and interact with various AI models, including OpenAI, Cohere, and more.
39
- * **YouTube Toolkit:** Transcribe YouTube videos effortlessly and download audio/video content.
39
+ * **[YouTube Toolkit](webscout/Extra/YTToolkit):** Advanced YouTube video and transcript management with multi-language support, versatile downloading, and intelligent data extraction
40
40
  * **Tempmail & Temp Number:** Generate temporary email addresses and phone numbers for enhanced privacy.
41
- * **Text-to-Speech (TTS):** Convert text into natural-sounding speech using various TTS providers.
42
- * **WebAI:** Experience the power of terminal-based GPT and an open interpreter for code execution and more.
41
+ * **[Text-to-Speech (TTS)](webscout/Provider/TTS/README.md):** Convert text into natural-sounding speech using multiple AI-powered providers like ElevenLabs, StreamElements, and Voicepods.
43
42
  * **Offline LLMs:** Utilize powerful language models offline with GGUF support.
44
43
  * **Extensive Provider Ecosystem:** Explore a vast collection of providers, including BasedGPT, DeepSeek, and many others.
45
44
  * **Local LLM Execution:** Run GGUF models locally with minimal configuration.
@@ -52,6 +51,7 @@
52
51
  * **[LitLogger](webscout/litlogger/Readme.md):** Simplifies logging with customizable formats and color schemes
53
52
  * **[LitAgent](webscout/litagent/Readme.md):** Powerful and modern user agent generator that keeps your requests fresh and undetectable
54
53
  * **[Text-to-Image](webscout/Provider/TTI/README.md):** Generate high-quality images using a wide range of AI art providers
54
+ * **[MarkdownLite](webscout/Extra/markdownlite/README.md):** Powerful HTML to Markdown conversion library with advanced parsing and structured output
55
55
 
56
56
  ## ⚙️ Installation
57
57
  ```python
@@ -157,29 +157,7 @@ python -m webscout --help
157
157
 
158
158
  [Go To TOP](#webscout-️)
159
159
 
160
- ## ⬇️ YTdownloader
161
160
 
162
- ```python
163
- from os import rename, getcwd
164
- from webscout import YTdownloader
165
- def download_audio(video_id):
166
- youtube_link = video_id
167
- handler = YTdownloader.Handler(query=youtube_link)
168
- for third_query_data in handler.run(format='mp3', quality='128kbps', limit=1):
169
- audio_path = handler.save(third_query_data, dir=getcwd())
170
- rename(audio_path, "audio.mp3")
171
-
172
- def download_video(video_id):
173
- youtube_link = video_id
174
- handler = YTdownloader.Handler(query=youtube_link)
175
- for third_query_data in handler.run(format='mp4', quality='auto', limit=1):
176
- video_path = handler.save(third_query_data, dir=getcwd())
177
- rename(video_path, "video.mp4")
178
-
179
- if __name__ == "__main__":
180
- # download_audio("https://www.youtube.com/watch?v=c0tMvzB0OKw")
181
- download_video("https://www.youtube.com/watch?v=c0tMvzB0OKw")
182
- ```
183
161
 
184
162
  ## ☀️ Weather
185
163
 
@@ -235,20 +213,7 @@ if __name__ == "__main__":
235
213
  asyncio.run(main())
236
214
  ```
237
215
 
238
- ## 📝 Transcriber
239
216
 
240
- The `transcriber` function in Webscout is a handy tool that transcribes YouTube videos.
241
-
242
- **Example:**
243
-
244
- ```python
245
- from webscout import YTTranscriber
246
- yt = YTTranscriber()
247
- from rich import print
248
- video_url = input("Enter the YouTube video URL: ")
249
- transcript = yt.get_transcript(video_url, languages=None)
250
- print(transcript)
251
- ```
252
217
 
253
218
  ## 🔍 GoogleS (formerly DWEBS)
254
219
 
@@ -261,16 +226,6 @@ for result in results:
261
226
  print(result)
262
227
  ```
263
228
 
264
- ### BingS
265
-
266
- ```python
267
- from webscout import BingS
268
- from rich import print
269
- searcher = BingS()
270
- results = searcher.search("HelpingAI-9B", max_results=20, extract_webpage_text=True, max_extract_characters=1000)
271
- for result in results:
272
- print(result)
273
- ```
274
229
 
275
230
  ## 🦆 WEBS and AsyncWEBS
276
231
 
@@ -887,18 +842,12 @@ ai = BLACKBOXAI(
887
842
  model=None # You can specify a model if needed
888
843
  )
889
844
 
890
- # Start an infinite loop for continuous interaction
891
- while True:
892
- # Define a prompt to send to the AI
893
- prompt = input("Enter your prompt: ")
894
-
895
- # Check if the user wants to exit the loop
896
- if prompt.lower() == "exit":
897
- break
898
-
899
- # Use the 'chat' method to send the prompt and receive a response
900
- r = ai.chat(prompt)
901
- print(r)
845
+
846
+ # Define a prompt to send to the AI
847
+ prompt = "Tell me about india"
848
+ # Use the 'chat' method to send the prompt and receive a response
849
+ r = ai.chat(prompt)
850
+ print(r)
902
851
  ```
903
852
 
904
853
  ### ❓ `PERPLEXITY` - Search with PERPLEXITY
@@ -34,10 +34,7 @@ setup(
34
34
  "tenacity",
35
35
  "curl_cffi",
36
36
  "nest-asyncio",
37
- "g4f>=0.2.2.3",
38
- "g4f[webdriver]",
39
37
  "rich",
40
- "beautifulsoup4",
41
38
  "markdownify",
42
39
  "requests",
43
40
  "google-generativeai",
@@ -45,12 +42,10 @@ setup(
45
42
  "termcolor",
46
43
  "orjson",
47
44
  "PyYAML",
48
- "appdirs",
49
45
  "tls_client",
50
46
  "clipman",
51
47
  "playsound",
52
48
  "ollama",
53
- "pyfiglet",
54
49
  "pillow",
55
50
  "bson",
56
51
  "cloudscraper",
@@ -59,12 +54,11 @@ setup(
59
54
  "prompt-toolkit",
60
55
  "primp",
61
56
  "pyreqwest_impersonate",
62
- "lxml_html_clean",
63
57
  "gradio_client",
64
58
  "psutil",
65
59
  "yaspin",
60
+ "websocket"
66
61
  # "cerebras_cloud_sdk",
67
-
68
62
  ],
69
63
  entry_points={
70
64
  "console_scripts": [
@@ -5,14 +5,11 @@ import subprocess
5
5
  import logging
6
6
  import threading
7
7
  import time
8
- import appdirs
9
8
  import datetime
10
9
  import re
11
10
  import sys
12
- import click
13
11
  from rich.markdown import Markdown
14
12
  from rich.console import Console
15
- import g4f
16
13
  from typing import List, Tuple, Union
17
14
  from typing import NoReturn
18
15
  import requests
@@ -21,49 +18,9 @@ from playsound import playsound
21
18
  from time import sleep as wait
22
19
  import pathlib
23
20
  import urllib.parse
24
- appdir = appdirs.AppDirs("AIWEBS", "webscout")
25
-
26
- default_path = appdir.user_cache_dir
27
-
28
- if not os.path.exists(default_path):
29
- os.makedirs(default_path)
30
- webai = [
31
- "leo",
32
- "openai",
33
- "opengpt",
34
- "koboldai",
35
- "gemini",
36
- "phind",
37
- "blackboxai",
38
- "g4fauto",
39
- "perplexity",
40
- "groq",
41
- "reka",
42
- "cohere",
43
- "yepchat",
44
- "you",
45
- "xjai",
46
- "thinkany",
47
- "berlin4h",
48
- "chatgptuk",
49
- "auto",
50
- "poe",
51
- "basedgpt",
52
- "deepseek",
53
- "deepinfra",
54
- "vtlchat",
55
- "geminiflash",
56
- "geminipro",
57
- "ollama",
58
- "andi",
59
- "llama3"
60
- ]
61
-
62
- gpt4free_providers = [
63
- provider.__name__ for provider in g4f.Provider.__providers__ # if provider.working
64
- ]
65
-
66
- available_providers = webai + gpt4free_providers
21
+
22
+ default_path = os.path.join(os.path.expanduser("~"), ".cache", "AIWEBS", "webscout")
23
+
67
24
  def sanitize_stream(
68
25
  chunk: str, intro_value: str = "data:", to_json: bool = True
69
26
  ) -> str | dict:
@@ -109,14 +66,10 @@ def run_system_command(
109
66
  )
110
67
  return (True, result)
111
68
  except subprocess.CalledProcessError as e:
112
- # Handle error if the command returns a non-zero exit code
113
- if stdout_error:
114
- click.secho(f"Error Occurred: while running '{command}'", fg="yellow")
115
- click.secho(e.stderr, fg="red")
116
- if help is not None:
117
- click.secho(help, fg="cyan")
118
- sys.exit(e.returncode) if exit_on_error else None
119
- return (False, e)
69
+ if exit_on_error:
70
+ raise Exception(f"Command failed with exit code {e.returncode}") from e
71
+ else:
72
+ return (False, e)
120
73
 
121
74
 
122
75
  from .conversation import Conversation
@@ -1,8 +1,9 @@
1
- from bs4 import BeautifulSoup
2
1
  import requests
3
2
  from typing import Dict, List, Optional, Union, Any
4
3
  from concurrent.futures import ThreadPoolExecutor, as_completed
4
+ from webscout.scout import Scout
5
5
  from urllib.parse import quote, urljoin
6
+ from webscout.litagent import LitAgent
6
7
 
7
8
  import time
8
9
  import random
@@ -10,14 +11,13 @@ import json
10
11
  import os
11
12
  from datetime import datetime, timedelta
12
13
  from functools import lru_cache
13
- from .Litlogger import LitLogger, LogFormat, ColorScheme
14
- from tenacity import retry, stop_after_attempt, wait_exponential
14
+ from webscout.Litlogger import LitLogger, LogFormat, ColorScheme
15
15
 
16
16
  class GoogleS:
17
- """A Python interface for Google search with advanced features 🔥
17
+ """A Python interface for Google search with advanced features
18
18
 
19
19
  The GoogleS class provides a powerful interface to perform web searches, image searches,
20
- and advanced filtering on Google. Built with love by HAI to keep it 💯
20
+ and advanced filtering on Google. Built with love by HAI to keep it
21
21
 
22
22
  Basic Usage:
23
23
  >>> from webscout.DWEBS import GoogleS
@@ -122,7 +122,7 @@ class GoogleS:
122
122
  """
123
123
  self.proxy = proxy
124
124
  self.headers = headers if headers else {
125
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"
125
+ "User-Agent": LitAgent().random() # Use LitAgent to generate user agent
126
126
  }
127
127
  self.headers["Referer"] = "https://www.google.com/"
128
128
  self.client = requests.Session()
@@ -155,25 +155,46 @@ class GoogleS:
155
155
  time.sleep(self.rate_limit - time_since_last)
156
156
  self.last_request_time = time.time()
157
157
 
158
- @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
159
158
  def _get_url(self, method: str, url: str, params: Optional[Dict[str, str]] = None,
160
- data: Optional[Union[Dict[str, str], bytes]] = None) -> bytes:
159
+ data: Optional[Union[Dict[str, str], bytes]] = None, max_retries: int = 3) -> bytes:
161
160
  """
162
- Makes an HTTP request with retry logic and rate limiting.
161
+ Makes an HTTP request with manual retry logic and rate limiting.
162
+
163
+ Args:
164
+ method (str): HTTP method (GET, POST, etc.)
165
+ url (str): Target URL
166
+ params (Optional[Dict[str, str]]): Query parameters
167
+ data (Optional[Union[Dict[str, str], bytes]]): Request payload
168
+ max_retries (int): Maximum number of retry attempts
169
+
170
+ Returns:
171
+ bytes: Response content
163
172
  """
164
173
  self._respect_rate_limit()
165
- try:
166
- if self.use_litlogger:
167
- self.logger.debug(f"Making {method} request to {url}")
168
- resp = self.client.request(method, url, params=params, data=data, timeout=self.timeout)
169
- resp.raise_for_status()
170
- if self.use_litlogger:
171
- self.logger.success(f"Request successful: {resp.status_code}")
172
- return resp.content
173
- except requests.exceptions.RequestException as ex:
174
- if self.use_litlogger:
175
- self.logger.error(f"Request failed: {url} - {str(ex)}")
176
- raise
174
+
175
+ for attempt in range(max_retries):
176
+ try:
177
+ if self.use_litlogger:
178
+ self.logger.debug(f"Making {method} request to {url} (Attempt {attempt + 1})")
179
+
180
+ resp = self.client.request(method, url, params=params, data=data, timeout=self.timeout)
181
+ resp.raise_for_status()
182
+
183
+ if self.use_litlogger:
184
+ self.logger.success(f"Request successful: {resp.status_code}")
185
+
186
+ return resp.content
187
+
188
+ except requests.exceptions.RequestException as ex:
189
+ if self.use_litlogger:
190
+ self.logger.error(f"Request failed: {url} - {str(ex)}")
191
+
192
+ # Exponential backoff
193
+ if attempt < max_retries - 1:
194
+ wait_time = (2 ** attempt) + random.random()
195
+ time.sleep(wait_time)
196
+ else:
197
+ raise
177
198
 
178
199
  @lru_cache(maxsize=100)
179
200
  def _cache_key(self, query: str, **kwargs) -> str:
@@ -217,7 +238,7 @@ class GoogleS:
217
238
  type_filter: Optional[str] = None,
218
239
  **kwargs
219
240
  ) -> List[Dict[str, str]]:
220
- """Search for images on Google with style! 🖼️
241
+ """Search for images on Google with style!
221
242
 
222
243
  Args:
223
244
  query (str): What you're looking for fam
@@ -270,7 +291,7 @@ class GoogleS:
270
291
  params["tbs"] = f"itp:{type_filter}"
271
292
 
272
293
  content = self._get_url("GET", self.SEARCH_TYPES["image"], params=params)
273
- soup = BeautifulSoup(content, 'lxml')
294
+ soup = Scout(content) # Use Scout parser
274
295
 
275
296
  results = []
276
297
  for img in soup.find_all("img", class_="rg_i"):
@@ -365,7 +386,8 @@ class GoogleS:
365
386
  for future in as_completed(futures):
366
387
  try:
367
388
  resp_content = future.result()
368
- soup = BeautifulSoup(resp_content, 'lxml') # Use lxml parser
389
+ soup = Scout(resp_content) # Use Scout parser
390
+
369
391
  result_blocks = soup.find_all("div", class_="g")
370
392
 
371
393
  if not result_blocks:
@@ -429,9 +451,9 @@ class GoogleS:
429
451
 
430
452
  def _extract_text_from_webpage(self, html_content: bytes, max_characters: Optional[int] = None) -> str:
431
453
  """
432
- Extracts visible text from HTML content using lxml parser.
454
+ Extracts visible text from HTML content using Scout parser.
433
455
  """
434
- soup = BeautifulSoup(html_content, 'lxml') # Use lxml parser
456
+ soup = Scout(html_content) # Use Scout parser
435
457
  for tag in soup(["script", "style", "header", "footer", "nav"]):
436
458
  tag.extract()
437
459
  visible_text = soup.get_text(strip=True)