webscout 2025.10.13__py3-none-any.whl → 2025.10.15__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.

Potentially problematic release.


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

@@ -0,0 +1,103 @@
1
+ """Bing text search."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Dict, List
6
+ from urllib.parse import urlencode
7
+ from bs4 import BeautifulSoup
8
+ from time import sleep
9
+
10
+ from .base import BingBase
11
+
12
+
13
+ class BingTextSearch(BingBase):
14
+ def run(self, *args, **kwargs) -> List[Dict[str, str]]:
15
+ keywords = args[0] if args else kwargs.get("keywords")
16
+ region = args[1] if len(args) > 1 else kwargs.get("region", "us")
17
+ safesearch = args[2] if len(args) > 2 else kwargs.get("safesearch", "moderate")
18
+ max_results = args[3] if len(args) > 3 else kwargs.get("max_results", 10)
19
+ unique = kwargs.get("unique", True)
20
+
21
+ if not keywords:
22
+ raise ValueError("Keywords are mandatory")
23
+
24
+ safe_map = {
25
+ "on": "Strict",
26
+ "moderate": "Moderate",
27
+ "off": "Off"
28
+ }
29
+ safe = safe_map.get(safesearch.lower(), "Moderate")
30
+
31
+ fetched_results = []
32
+ fetched_links = set()
33
+
34
+ def fetch_page(url):
35
+ try:
36
+ response = self.session.get(url, timeout=self.timeout)
37
+ response.raise_for_status()
38
+ return response.text
39
+ except Exception as e:
40
+ raise Exception(f"Failed to fetch page: {str(e)}")
41
+
42
+ # Get first page URL
43
+ url = f'{self.base_url}/search?q={keywords}&search=&form=QBLH'
44
+ urls_to_fetch = [url]
45
+
46
+ while len(fetched_results) < max_results and urls_to_fetch:
47
+ current_url = urls_to_fetch.pop(0)
48
+ html = fetch_page(current_url)
49
+ soup = BeautifulSoup(html, 'html.parser')
50
+
51
+ links = soup.select('ol#b_results > li.b_algo')
52
+ for link in links:
53
+ if len(fetched_results) >= max_results:
54
+ break
55
+ title_tag = link.select_one('h2')
56
+ url_tag = link.select_one('h2 a')
57
+ text_tag = link.select_one('p')
58
+
59
+ if title_tag and url_tag and text_tag:
60
+ title = title_tag.get_text(strip=True)
61
+ href = url_tag.get('href', '')
62
+ body = text_tag.get_text(strip=True)
63
+
64
+ # Decode Bing URL if needed
65
+ if href.startswith('/ck/a?'):
66
+ # Simple unwrap, similar to bing.py
67
+ from urllib.parse import parse_qs, urlparse
68
+ try:
69
+ parsed = urlparse(href)
70
+ query_params = parse_qs(parsed.query)
71
+ if 'u' in query_params:
72
+ encoded_url = query_params['u'][0]
73
+ if encoded_url.startswith('a1'):
74
+ encoded_url = encoded_url[2:]
75
+ padding = len(encoded_url) % 4
76
+ if padding:
77
+ encoded_url += '=' * (4 - padding)
78
+ import base64
79
+ decoded = base64.urlsafe_b64decode(encoded_url).decode()
80
+ href = decoded
81
+ except:
82
+ pass
83
+
84
+ if unique and href in fetched_links:
85
+ continue
86
+ fetched_links.add(href)
87
+
88
+ fetched_results.append({
89
+ 'title': title,
90
+ 'href': href,
91
+ 'body': body
92
+ })
93
+
94
+ # Get next page
95
+ next_page_tag = soup.select_one('div#b_content nav[role="navigation"] a.sb_pagN')
96
+ if next_page_tag and next_page_tag.get('href'):
97
+ next_url = self.base_url + next_page_tag['href']
98
+ urls_to_fetch.append(next_url)
99
+
100
+ if self.sleep_interval:
101
+ sleep(self.sleep_interval)
102
+
103
+ return fetched_results[:max_results]
@@ -1,12 +1,25 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from decimal import Decimal
4
+ from math import sqrt
4
5
 
5
6
  from ....exceptions import WebscoutE
6
7
  from .base import DuckDuckGoBase
7
8
 
8
9
 
9
10
  class DuckDuckGoMaps(DuckDuckGoBase):
11
+ def _calculate_distance(self, lat_t: Decimal, lon_l: Decimal, lat_b: Decimal, lon_r: Decimal) -> float:
12
+ """Calculate the Euclidean distance between top-left and bottom-right corners of bounding box."""
13
+ # Convert to float for math operations
14
+ lat_t_f = float(lat_t)
15
+ lon_l_f = float(lon_l)
16
+ lat_b_f = float(lat_b)
17
+ lon_r_f = float(lon_r)
18
+
19
+ # Calculate Euclidean distance
20
+ distance = sqrt((lat_t_f - lat_b_f) ** 2 + (lon_r_f - lon_l_f) ** 2)
21
+ return distance
22
+
10
23
  def run(self, *args, **kwargs) -> list[dict[str, str]]:
11
24
  keywords = args[0] if args else kwargs.get("keywords")
12
25
  place = args[1] if len(args) > 1 else kwargs.get("place")
webscout/version.py CHANGED
@@ -1,2 +1,2 @@
1
- __version__ = "2025.10.13"
1
+ __version__ = "2025.10.15"
2
2
  __prog__ = "webscout"
webscout/version.py.bak CHANGED
@@ -1,2 +1,2 @@
1
- __version__ = "2025.10.11"
1
+ __version__ = ""
2
2
  __prog__ = "webscout"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: webscout
3
- Version: 2025.10.13
3
+ Version: 2025.10.15
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-email: OEvortex <helpingai5@gmail.com>
6
6
  License: HelpingAI
@@ -108,9 +108,6 @@ Dynamic: license-file
108
108
  - [⚙️ Installation](#️-installation)
109
109
  - [🖥️ Command Line Interface](#️-command-line-interface)
110
110
  - [🔄 OpenAI-Compatible API Server](docs/openai-api-server.md)
111
- - [🔍 Search Engines](#-search-engines)
112
- - [🦆 DuckDuckGo Search](#-duckduckgo-search-with-webs-and-asyncwebs)
113
- - [💻 WEBS API Reference](#-webs-api-reference)
114
111
  - [🤖 AI Models and Voices](#-ai-models-and-voices)
115
112
  - [💬 AI Chat Providers](#-ai-chat-providers)
116
113
  - [👨‍💻 Advanced AI Interfaces](#-advanced-ai-interfaces)
@@ -151,7 +148,7 @@ Dynamic: license-file
151
148
  <summary><b>Search & AI</b></summary>
152
149
  <p>
153
150
 
154
- - **Comprehensive Search:** Leverage Google, DuckDuckGo, and Yep for diverse search results
151
+ - **Comprehensive Search:** Access multiple search engines including DuckDuckGo, Yep, Bing, Brave, Yahoo, Yandex, Mojeek, and Wikipedia for diverse search results ([Search Documentation](docs/search.md))
155
152
  - **AI Powerhouse:** Access and interact with various AI models through three compatibility options:
156
153
  - **Native API:** Use Webscout's native interfaces for providers like OpenAI, Cohere, Gemini, and many more
157
154
  - **[OpenAI-Compatible Providers](webscout/Provider/OPENAI/README.md):** Seamlessly integrate with various AI providers using standardized OpenAI-compatible interfaces
@@ -325,32 +322,7 @@ python -m webscout-server
325
322
  <summary><b>🔍 Web Search Commands</b></summary>
326
323
  <p>
327
324
 
328
- | Command | Description | Example |
329
- | --------------------------------- | --------------------------- | ----------------------------------------- |
330
- | `webscout text -k "query"` | Perform a text search | `webscout text -k "python programming"` |
331
- | `webscout answers -k "query"` | Get instant answers | `webscout answers -k "what is AI"` |
332
- | `webscout images -k "query"` | Search for images | `webscout images -k "nature photography"` |
333
- | `webscout videos -k "query"` | Search for videos | `webscout videos -k "python tutorials"` |
334
- | `webscout news -k "query"` | Search for news articles | `webscout news -k "technology trends"` |
335
- | `webscout maps -k "query"` | Perform a maps search | `webscout maps -k "restaurants near me"` |
336
- | `webscout translate -k "text"` | Translate text | `webscout translate -k "hello world"` |
337
- | `webscout suggestions -k "query"` | Get search suggestions | `webscout suggestions -k "how to"` |
338
- | `webscout weather -l "location"` | Get weather information | `webscout weather -l "New York"` |
339
- | `webscout version` | Display the current version | `webscout version` |
340
-
341
- **Google Search Commands:**
342
- | Command | Description | Example |
343
- |---------|-------------|---------|
344
- | `webscout google_text -k "query"` | Google text search | `webscout google_text -k "machine learning"` |
345
- | `webscout google_news -k "query"` | Google news search | `webscout google_news -k "AI breakthrough"` |
346
- | `webscout google_suggestions -q "query"` | Google suggestions | `webscout google_suggestions -q "python"` |
347
-
348
- **Yep Search Commands:**
349
- | Command | Description | Example |
350
- |---------|-------------|---------|
351
- | `webscout yep_text -k "query"` | Yep text search | `webscout yep_text -k "web development"` |
352
- | `webscout yep_images -k "query"` | Yep image search | `webscout yep_images -k "landscapes"` |
353
- | `webscout yep_suggestions -q "query"` | Yep suggestions | `webscout yep_suggestions -q "javascript"` |
325
+ Webscout provides comprehensive CLI commands for all search engines. See the [Search Documentation](docs/search.md#command-line-interface) for detailed command reference.
354
326
 
355
327
  </p>
356
328
  </details>
@@ -399,254 +371,6 @@ For detailed information about the OpenAI-compatible API server, including setup
399
371
 
400
372
  <hr/>
401
373
 
402
- ## 🔍 Search Engines
403
-
404
- Webscout provides multiple search engine interfaces for diverse search capabilities.
405
-
406
- ### YepSearch - Yep.com Interface
407
-
408
- ```python
409
- from webscout import YepSearch
410
-
411
- # Initialize YepSearch
412
- yep = YepSearch(
413
- timeout=20, # Optional: Set custom timeout
414
- proxies=None, # Optional: Use proxies
415
- verify=True # Optional: SSL verification
416
- )
417
-
418
- # Text Search
419
- text_results = yep.text(
420
- keywords="artificial intelligence",
421
- region="all", # Optional: Region for results
422
- safesearch="moderate", # Optional: "on", "moderate", "off"
423
- max_results=10 # Optional: Limit number of results
424
- )
425
-
426
- # Image Search
427
- image_results = yep.images(
428
- keywords="nature photography",
429
- region="all",
430
- safesearch="moderate",
431
- max_results=10
432
- )
433
-
434
- # Get search suggestions
435
- suggestions = yep.suggestions("hist")
436
- ```
437
-
438
- ### GoogleSearch - Google Interface
439
-
440
- ```python
441
- from webscout import GoogleSearch
442
-
443
- # Initialize GoogleSearch
444
- google = GoogleSearch(
445
- timeout=10, # Optional: Set custom timeout
446
- proxies=None, # Optional: Use proxies
447
- verify=True # Optional: SSL verification
448
- )
449
-
450
- # Text Search
451
- text_results = google.text(
452
- keywords="artificial intelligence",
453
- region="us", # Optional: Region for results
454
- safesearch="moderate", # Optional: "on", "moderate", "off"
455
- max_results=10 # Optional: Limit number of results
456
- )
457
- for result in text_results:
458
- print(f"Title: {result.title}")
459
- print(f"URL: {result.url}")
460
- print(f"Description: {result.description}")
461
-
462
- # News Search
463
- news_results = google.news(
464
- keywords="technology trends",
465
- region="us",
466
- safesearch="moderate",
467
- max_results=5
468
- )
469
-
470
- # Get search suggestions
471
- suggestions = google.suggestions("how to")
472
-
473
- # Legacy usage is still supported
474
- from webscout import search
475
- results = search("Python programming", num_results=5)
476
- ```
477
-
478
- <hr/>
479
-
480
- ## 🦆 DuckDuckGo Search with WEBS
481
-
482
- Webscout provides powerful interfaces to DuckDuckGo's search capabilities through the `WEBS` and `AsyncWEBS` classes.
483
-
484
- <details open>
485
- <summary><b>Synchronous Usage with WEBS</b></summary>
486
- <p>
487
-
488
- ```python
489
- from webscout import WEBS
490
-
491
- # Use as a context manager for proper resource management
492
- with WEBS() as webs:
493
- # Simple text search
494
- results = webs.text("python programming", max_results=5)
495
- for result in results:
496
- print(f"Title: {result['title']}\nURL: {result['url']}")
497
- ```
498
-
499
- </p>
500
- </details>
501
-
502
- <details open>
503
- <summary><b>Asynchronous Usage with AsyncWEBS</b></summary>
504
- <p>
505
-
506
- ```python
507
- import asyncio
508
- from webscout import AsyncWEBS
509
-
510
- async def search_multiple_terms(search_terms):
511
- async with AsyncWEBS() as webs:
512
- # Create tasks for each search term
513
- tasks = [webs.text(term, max_results=5) for term in search_terms]
514
- # Run all searches concurrently
515
- results = await asyncio.gather(*tasks)
516
- return results
517
-
518
- async def main():
519
- terms = ["python", "javascript", "machine learning"]
520
- all_results = await search_multiple_terms(terms)
521
-
522
- # Process results
523
- for i, term_results in enumerate(all_results):
524
- print(f"Results for '{terms[i]}':\n")
525
- for result in term_results:
526
- print(f"- {result['title']}")
527
- print("\n")
528
-
529
- # Run the async function
530
- asyncio.run(main())
531
- ```
532
-
533
- </p>
534
- </details>
535
-
536
- > [!TIP]
537
- > Always use these classes with a context manager (`with` statement) to ensure proper resource management and cleanup.
538
-
539
- <hr/>
540
-
541
- ## 💻 WEBS API Reference
542
-
543
- The WEBS class provides comprehensive access to DuckDuckGo's search capabilities through a clean, intuitive API.
544
-
545
- ### Available Search Methods
546
-
547
- | Method | Description | Example |
548
- | --------------- | ------------------- | -------------------------------------------- |
549
- | `text()` | General web search | `webs.text('python programming')` |
550
- | `answers()` | Instant answers | `webs.answers('population of france')` |
551
- | `images()` | Image search | `webs.images('nature photography')` |
552
- | `videos()` | Video search | `webs.videos('documentary')` |
553
- | `news()` | News articles | `webs.news('technology')` |
554
- | `maps()` | Location search | `webs.maps('restaurants', place='new york')` |
555
- | `translate()` | Text translation | `webs.translate('hello', to='es')` |
556
- | `suggestions()` | Search suggestions | `webs.suggestions('how to')` |
557
- | `weather()` | Weather information | `webs.weather('london')` |
558
-
559
- <details>
560
- <summary><b>Example: Text Search</b></summary>
561
- <p>
562
-
563
- ```python
564
- from webscout import WEBS
565
-
566
- with WEBS() as webs:
567
- results = webs.text(
568
- 'artificial intelligence',
569
- region='wt-wt', # Optional: Region for results
570
- safesearch='off', # Optional: 'on', 'moderate', 'off'
571
- timelimit='y', # Optional: Time limit ('d'=day, 'w'=week, 'm'=month, 'y'=year)
572
- max_results=10 # Optional: Limit number of results
573
- )
574
-
575
- for result in results:
576
- print(f"Title: {result['title']}")
577
- print(f"URL: {result['url']}")
578
- print(f"Description: {result['body']}\n")
579
- ```
580
-
581
- </p>
582
- </details>
583
-
584
- <details>
585
- <summary><b>Example: News Search with Formatting</b></summary>
586
- <p>
587
-
588
- ```python
589
- from webscout.search import DuckDuckGoSearch
590
-
591
- def fetch_formatted_news(keywords, timelimit='d', max_results=20):
592
- """Fetch and format news articles"""
593
- with WEBS() as webs:
594
- # Get news results
595
- news_results = webs.news(
596
- keywords,
597
- region="wt-wt",
598
- safesearch="off",
599
- timelimit=timelimit, # 'd'=day, 'w'=week, 'm'=month
600
- max_results=max_results
601
- )
602
-
603
- # Format the results
604
- formatted_news = []
605
- for i, item in enumerate(news_results, 1):
606
- # Format the date
607
- date = datetime.datetime.fromisoformat(item['date']).strftime('%B %d, %Y')
608
-
609
- # Create formatted entry
610
- entry = f"{i}. {item['title']}\n"
611
- entry += f" Published: {date}\n"
612
- entry += f" {item['body']}\n"
613
- entry += f" URL: {item['url']}\n"
614
-
615
- formatted_news.append(entry)
616
-
617
- return formatted_news
618
-
619
- # Example usage
620
- news = fetch_formatted_news('artificial intelligence', timelimit='w', max_results=5)
621
- print('\n'.join(news))
622
- ```
623
-
624
- </p>
625
- </details>
626
-
627
- <details>
628
- <summary><b>Example: Weather Information</b></summary>
629
- <p>
630
-
631
- ```python
632
- from webscout import WEBS
633
-
634
- with WEBS() as webs:
635
- # Get weather for a location
636
- weather = webs.weather("New York")
637
-
638
- # Access weather data
639
- if weather:
640
- print(f"Location: {weather.get('location', 'Unknown')}")
641
- print(f"Temperature: {weather.get('temperature', 'N/A')}")
642
- print(f"Conditions: {weather.get('condition', 'N/A')}")
643
- ```
644
-
645
- </p>
646
- </details>
647
-
648
- <hr/>
649
-
650
374
  ## 🤖 AI Models and Voices
651
375
 
652
376
  Webscout provides easy access to a wide range of AI models and voice options.
@@ -781,7 +505,7 @@ for media in response.get("media", []):
781
505
  <p>
782
506
 
783
507
  ```python
784
- from webscout import GROQ, WEBS
508
+ from webscout import GROQ, DuckDuckGoSearch
785
509
  import json
786
510
 
787
511
  # Initialize GROQ client
@@ -799,7 +523,8 @@ def calculate(expression):
799
523
  def search(query):
800
524
  """Perform a web search"""
801
525
  try:
802
- results = WEBS().text(query, max_results=3)
526
+ ddg = DuckDuckGoSearch()
527
+ results = ddg.text(query, max_results=3)
803
528
  return json.dumps({"results": results})
804
529
  except Exception as e:
805
530
  return json.dumps({"error": str(e)})
@@ -2,11 +2,9 @@ webscout/AIauto.py,sha256=oVgK_iMgz2cmb2fYz88p0qq7TY4uXHyxyFd4UmCKw9g,10307
2
2
  webscout/AIbase.py,sha256=pmqdGdDepp5iBM47J8POqOqu7sL3LlzCThtfgT0V0Ho,14150
3
3
  webscout/AIutel.py,sha256=bIdaIPLs8lnXzboGP_ffQNitoYg2LL_B1krrMxYhzho,2054
4
4
  webscout/Bard.py,sha256=TWQ3paoCe5Tk2DXoxue0Jpfocx3S9l-_NaMtV7lkMQM,43785
5
- webscout/Bing_search.py,sha256=RwW7oNZ0ogszaFN-IUJZ5hu-RNaFdCE6yq22T_Et85s,15930
6
- webscout/DWEBS.py,sha256=QE9bwkkhfZ_y7MqyaV_biW9yrrSE-I2mqa82J2YXEUA,17888
7
- webscout/__init__.py,sha256=BaK1oxqVdl9mnZ2Ur_S_WBUAGOHTVCB20UPnULBaWXM,728
5
+ webscout/__init__.py,sha256=8BwXquDTrNOs_UVFUiSzvpcG8Mpp2x6b0jknLs830aA,740
8
6
  webscout/__main__.py,sha256=pBm2E3ZZiMcCH37b1YCz7qKdKdX_i_S5En6fZDeJKFw,103
9
- webscout/cli.py,sha256=aq1oOyds-H-_IxUSrxu6unBFqwDoDAIqjW6BNNuBLKM,19728
7
+ webscout/cli.py,sha256=8DPRSP1fB8pdIeC5Ed6FH7mewOhCTH78RPvo9xwtxSU,14463
10
8
  webscout/client.py,sha256=HHnOL9I14uEJHCpGcyjlpZwna_DEJehHD5sqmti7sd8,5588
11
9
  webscout/conversation.py,sha256=FZy8eviJVq16SIVjXr-lfOrPPqWV6AjjO_uF_DLOtJ0,16651
12
10
  webscout/exceptions.py,sha256=5Y15eEjQkZcAjL4Rh68uo776MrQzmTINwi1fKzOXkGU,12472
@@ -16,8 +14,8 @@ webscout/prompt_manager.py,sha256=ysKFgPhkV3uqrOCilqcS9rG8xhzdU_d2wx0grC9WCCc,98
16
14
  webscout/sanitize.py,sha256=pw2Dzn-Jw9mOD4mpALYAvAf-medA-9AqdzsOmdXQbl0,46577
17
15
  webscout/update_checker.py,sha256=bz0TzRxip9DOIVMFyNz9HsGj4RKB0xZgo57AUVSJINo,3708
18
16
  webscout/utils.py,sha256=o2hU3qaVPk25sog3e4cyVZO3l8xwaZpYRziZPotEzNo,3075
19
- webscout/version.py,sha256=AVf1H7P--o66tqWX1O4I1gV8rtA8N6jpl-AVu9uwdek,51
20
- webscout/version.py.bak,sha256=zbPogfg7wudFDmXrk1tLJ3-B3FD94GzYv2a94kitm5k,51
17
+ webscout/version.py,sha256=lFdrFaHswFMDr9VdMdSSpxeTuXjC5Z2DIrPJbWo9KtQ,51
18
+ webscout/version.py.bak,sha256=mAYbMZvjx0FZh0om6ye0R7i_CmftBy0GpvRsRL0zcxY,41
21
19
  webscout/Extra/Act.md,sha256=_C2VW_Dc-dc7eejpGYKAOZhImHKPiQ7NSwE3bkzr6fg,18952
22
20
  webscout/Extra/__init__.py,sha256=KvJRsRBRO-fZp2jSCl6KQnPppi93hriA6O_U1O1s31c,177
23
21
  webscout/Extra/gguf.md,sha256=McXGz5sTfzOO9X4mH8yIqu5K3CgjzyXKi4_HQtezdZ4,12435
@@ -244,7 +242,7 @@ webscout/auth/providers.py,sha256=gE0zKl8gwCD2P0e16y6YnbhmBM1qut0wKwAk5jmt8LI,11
244
242
  webscout/auth/rate_limiter.py,sha256=8l1CpUY5YkY8SPHvZxL2SejAkO93uNklwQeSbjRxU5A,9925
245
243
  webscout/auth/request_models.py,sha256=hgo0AZ5CknEWCmZ4KBMs8T0xjmtlecbk645yU622Ujs,5804
246
244
  webscout/auth/request_processing.py,sha256=UB2JykZ98Acxd67VtFsLGOT9UwwwPQ8OeXzc9fkOrp4,17232
247
- webscout/auth/routes.py,sha256=vow4T86229Y59vHLhsi5qRNGWQpFh1srZ37Ies637Yw,30188
245
+ webscout/auth/routes.py,sha256=1s-g3xK5og0MCQnVHiCzwy4hOxCZLR1pp_5cEy2QMGw,29167
248
246
  webscout/auth/schemas.py,sha256=fu3-V9F0n5AZ65A-fGGiBiuQcwk1Ec3urO7N30Nv90o,4577
249
247
  webscout/auth/server.py,sha256=-_KTByk7CMgsEeXPlCT4xuLYzC2ae1NiFCStGQr-ytc,13850
250
248
  webscout/auth/simple_logger.py,sha256=Tcj6HdfvUxQTF1SU-IPXlLjaLKSLeoFm9b0RN8_csT8,8264
@@ -268,26 +266,31 @@ webscout/scout/parsers/__init__.py,sha256=a0gysttcAnIxfY8UBbkNJdmMHEhfeI9VmfnQGZ
268
266
  webscout/scout/parsers/html5lib_parser.py,sha256=VRCQIDh7Z9XbS8-zSOsmRtR2Oyx_DEz85hjRvabBQ2Y,5627
269
267
  webscout/scout/parsers/html_parser.py,sha256=OxQcFYjK-cWduKAbcxqChfRvKgqNjPqfN1Uit_dkJwQ,6792
270
268
  webscout/scout/parsers/lxml_parser.py,sha256=fDaxFuBSlU9x5hH5nDj5BHd72r9XHZ24Z5lt6FYPt_8,6053
271
- webscout/search/__init__.py,sha256=YIHUd2oFUulK4x1TCrkgkAazuPOaYSjlUtVwoR8B3lI,1054
269
+ webscout/search/__init__.py,sha256=0XIql7nUSAOnpf0L---dM5GMPMTRhu1DeQO4jf_oGAQ,1007
272
270
  webscout/search/base.py,sha256=IFBHh0s-b3SXXDbi5cCzqwepnsoVVUTn2XfXX2iGUqE,6817
271
+ webscout/search/bing_main.py,sha256=NAhM1rgbDOo5QEWLdNulGJ-9CVaSmYn3JhM3Jj7AZ58,2008
273
272
  webscout/search/duckduckgo_main.py,sha256=LL3ROo9iJS7S791JTfmN3-0zxnKAoTYFjCKDDCiRjOU,3531
274
273
  webscout/search/http_client.py,sha256=mL5WaKrItu0hLzK-sTK99yKuAjw0iwBYs1w6911yWUU,5140
275
274
  webscout/search/results.py,sha256=HM8Cf6DW8ET2yqbb3piaTa07ciox4f917pvKZli2EgU,3301
276
275
  webscout/search/yep_main.py,sha256=SNh4Wu8cnMA21xeC13ZWK0ConY_dfAMcpnfedYdZRJE,1933
277
276
  webscout/search/engines/__init__.py,sha256=TzO5GqdlhquqOW9o-QFVuXdrnX99TEsJlcTNtuhA8VU,1615
278
- webscout/search/engines/bing.py,sha256=b3QYYfQ-iPO_ZCPjAqv5WsUlwekv77xUH4WdckGbTt4,2864
279
- webscout/search/engines/bing_news.py,sha256=P4LpegM-RcSM0j7MkqJnU73m7nye779nS9qZ6_LebDM,1619
280
277
  webscout/search/engines/brave.py,sha256=iO2KMFARt8QMZmbL2BHV5HZmAiFTFmOMAUkpr4ridcA,1337
281
278
  webscout/search/engines/mojeek.py,sha256=i86JB6n2lPaRMaYSqIj2EOo4KHnJICWJK-plRj-oudc,1097
282
279
  webscout/search/engines/wikipedia.py,sha256=tM4OI7UKFtRBcQqwgcm0y_uNqn8JVLKxVzTdixlZ7bU,1769
283
280
  webscout/search/engines/yahoo.py,sha256=69cxr7X9xpD2cUzI0TbD_ZsjSuUrcFfHiEvZDGnSztk,2018
284
281
  webscout/search/engines/yahoo_news.py,sha256=iiiy0Z8ZGruU8SvkW5bsM_BOpUFo6epWyFTG08ufSNs,1956
285
282
  webscout/search/engines/yandex.py,sha256=hjWn4I-ZYaKkLtX6816d2sxmBDM4O9zCHzjnf6byfio,1190
283
+ webscout/search/engines/bing/__init__.py,sha256=bhKvLliFzwEbHqjMISkC6L-VvBNyi0_PhgVaV-Jdw98,26
284
+ webscout/search/engines/bing/base.py,sha256=dRPtSmrPlmfPkfkYWyVrDGSM3btLP7fB48gNPCAo8JU,915
285
+ webscout/search/engines/bing/images.py,sha256=-kMQKeuu2VVZ6ykGKO4Y4VqcEaJA5jgXMgMl8hAqlvs,3323
286
+ webscout/search/engines/bing/news.py,sha256=w3Yl2wn4ipw-bPfL0gV0RCklRLL-YVZ5c1_7c-UxoS0,2852
287
+ webscout/search/engines/bing/suggestions.py,sha256=U7v0hjthChZ8D6JMNYw9nOa5NsCqo4GsUfFT3CQP4Uk,1042
288
+ webscout/search/engines/bing/text.py,sha256=xbcDs7J8xIHDCiZG6wkYRjEMaUM59Xoj7_a6IM1HqMQ,3952
286
289
  webscout/search/engines/duckduckgo/__init__.py,sha256=IWa20CNW1IIyi86cXjuyqhm8famhUFUPH7Aiuly0bU4,685
287
290
  webscout/search/engines/duckduckgo/answers.py,sha256=amdVAZujdeokzQm0XsQ0187hdNc44J14XCAVDzvSebM,2432
288
291
  webscout/search/engines/duckduckgo/base.py,sha256=1GzmQhWjHMPc_U57Cyd1YuM303CtrnH0UIy7yQx-MHg,6387
289
292
  webscout/search/engines/duckduckgo/images.py,sha256=6HOZpZt29zVaQJ8iLUgsfsymuml49U5fEJuh17lc5Ss,3883
290
- webscout/search/engines/duckduckgo/maps.py,sha256=YH8f3j2PsxO-fo9_Q_WEXeCzo2VofRxugNZLTg0xY4s,7229
293
+ webscout/search/engines/duckduckgo/maps.py,sha256=Ml_BnfTCRv6jFMSMvWNzH1kUSCkGYnowwmYeGYxH_qA,7786
291
294
  webscout/search/engines/duckduckgo/news.py,sha256=n65lWT05z-WxuZ5go2tiPEfhmyCDujEVE0eExdQk58s,2511
292
295
  webscout/search/engines/duckduckgo/suggestions.py,sha256=sYiQ_hAEzyRwxVm8Syp1P4AJOdJrCPFYnFhkyvndHH8,674
293
296
  webscout/search/engines/duckduckgo/text.py,sha256=yY39dnCN7_0WlFNqqYvHVqfUBd-4XzjBpNif3aWqKZc,8038
@@ -321,9 +324,9 @@ webscout/zeroart/__init__.py,sha256=Rg2jc6cfpmvKzmtIq3aNOKQH2I5d8GqLybtGNr1VQQY,
321
324
  webscout/zeroart/base.py,sha256=I-xhDEfArBb6q7hiF5oPoyXeu2hzL6orp7uWgS_YtG8,2299
322
325
  webscout/zeroart/effects.py,sha256=yxv6xRDxVU0FHhUdzamVv0eA_d8a8ckCDAitXQMhVZU,3245
323
326
  webscout/zeroart/fonts.py,sha256=FsuVQZL28Gi30NB5QPPjwUhC8sQt7vKJDMeu6km7N-I,37574
324
- webscout-2025.10.13.dist-info/licenses/LICENSE.md,sha256=hyfFlVn7pWcrvuvs-piB8k4J8DlXdOsYje9RyPxc6Ik,7543
325
- webscout-2025.10.13.dist-info/METADATA,sha256=vhN3hUOjzShQHWjP9NNYBbrYjDTDnhvj_LsKmTirmV4,32308
326
- webscout-2025.10.13.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
327
- webscout-2025.10.13.dist-info/entry_points.txt,sha256=WooZuMBei-kQl5qByoRMkc2cHsaDL1Jd2_tSYsNiUGg,116
328
- webscout-2025.10.13.dist-info/top_level.txt,sha256=nYIw7OKBQDr_Z33IzZUKidRD3zQEo8jOJYkMVMeN334,9
329
- webscout-2025.10.13.dist-info/RECORD,,
327
+ webscout-2025.10.15.dist-info/licenses/LICENSE.md,sha256=hyfFlVn7pWcrvuvs-piB8k4J8DlXdOsYje9RyPxc6Ik,7543
328
+ webscout-2025.10.15.dist-info/METADATA,sha256=FZnrkvKg2JWkjwo31hGs193LpJdgfRloBWH8uY6xXc0,23421
329
+ webscout-2025.10.15.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
330
+ webscout-2025.10.15.dist-info/entry_points.txt,sha256=WooZuMBei-kQl5qByoRMkc2cHsaDL1Jd2_tSYsNiUGg,116
331
+ webscout-2025.10.15.dist-info/top_level.txt,sha256=nYIw7OKBQDr_Z33IzZUKidRD3zQEo8jOJYkMVMeN334,9
332
+ webscout-2025.10.15.dist-info/RECORD,,