IO4IT 4.0.2__tar.gz → 4.0.3__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.
Files changed (96) hide show
  1. {io4it-4.0.2 → io4it-4.0.3}/PKG-INFO +1 -1
  2. {io4it-4.0.2 → io4it-4.0.3}/io4it.egg-info/PKG-INFO +1 -1
  3. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWWebSearch.py +86 -20
  4. {io4it-4.0.2 → io4it-4.0.3}/setup.py +1 -1
  5. {io4it-4.0.2 → io4it-4.0.3}/io4it.egg-info/SOURCES.txt +0 -0
  6. {io4it-4.0.2 → io4it-4.0.3}/io4it.egg-info/dependency_links.txt +0 -0
  7. {io4it-4.0.2 → io4it-4.0.3}/io4it.egg-info/entry_points.txt +0 -0
  8. {io4it-4.0.2 → io4it-4.0.3}/io4it.egg-info/namespace_packages.txt +0 -0
  9. {io4it-4.0.2 → io4it-4.0.3}/io4it.egg-info/requires.txt +0 -0
  10. {io4it-4.0.2 → io4it-4.0.3}/io4it.egg-info/top_level.txt +0 -0
  11. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/__init__.py +0 -0
  12. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/ocr_function/__init__.py +0 -0
  13. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/ocr_function/word_converter.py +0 -0
  14. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/toolViews/designer/key_manager_ui.ui +0 -0
  15. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/toolViews/designer/link_workflow_manager_ui.ui +0 -0
  16. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/toolViews/key_manager_ui.py +0 -0
  17. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/toolViews/linkHTLMWorkflow_manager_ui.py +0 -0
  18. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/utils/__init__.py +0 -0
  19. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/utils/keys_manager.py +0 -0
  20. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/utils/mail.py +0 -0
  21. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/utils/pool_exec_utils.py +0 -0
  22. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/utils/secret_manager.py +0 -0
  23. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/utils/utils_md.py +0 -0
  24. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWChatGpt.py +0 -0
  25. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWDeep_Search.py +0 -0
  26. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWDoclingToMarkdown.py +0 -0
  27. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWExportMarkdown.py +0 -0
  28. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWExtractTablesDocxToXlsx.py +0 -0
  29. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWInboxMailMonitoring.py +0 -0
  30. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWJsonToDataTable.py +0 -0
  31. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWMD2HTML.py +0 -0
  32. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWMarkdownLoader.py +0 -0
  33. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWMarkdownizer.py +0 -0
  34. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWOfficeNormalizer.py +0 -0
  35. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWParserHTML.py +0 -0
  36. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWPdfType.py +0 -0
  37. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWProcessPoolExecutor.py +0 -0
  38. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWS3Uploader.py +0 -0
  39. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWS3downloader.py +0 -0
  40. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWS3list.py +0 -0
  41. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWmailLoader.py +0 -0
  42. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWmailSender.py +0 -0
  43. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWwordpdf2docx.py +0 -0
  44. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/__init__.py +0 -0
  45. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/__init__.py +0 -0
  46. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/nogui.ui +0 -0
  47. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/ow_extract_tables_docx_to_xlsx.ui +0 -0
  48. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/ow_file_ext_selector.ui +0 -0
  49. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/ow_json_to_data_table.ui +0 -0
  50. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owchatgpt.ui +0 -0
  51. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owdeepsearch.ui +0 -0
  52. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owdoclingasr.ui +0 -0
  53. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owdoclingtomarkdown.ui +0 -0
  54. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owexportmarkdown.ui +0 -0
  55. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owinboxmailmonitoring.ui +0 -0
  56. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owmailloader.ui +0 -0
  57. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owmailsender.ui +0 -0
  58. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owmarkdownizer.ui +0 -0
  59. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owmarkdownloader.ui +0 -0
  60. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owmd2html.ui +0 -0
  61. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owofficenormalizer.ui +0 -0
  62. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owparserhtml.ui +0 -0
  63. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owpdftype.ui +0 -0
  64. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owprocesspoolexecutor.ui +0 -0
  65. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owspeechtotext.ui +0 -0
  66. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owvisualizationer.ui +0 -0
  67. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owwebsearch.ui +0 -0
  68. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/wordpdf2docx.ui +0 -0
  69. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/__init__.py +0 -0
  70. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/chatgpt.png +0 -0
  71. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/check_pdf.png +0 -0
  72. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/deepsearch.svg +0 -0
  73. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/dep_md_old.png +0 -0
  74. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/download.png +0 -0
  75. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/export_md.png +0 -0
  76. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/extract_table.png +0 -0
  77. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/file_extensor.png +0 -0
  78. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/html.png +0 -0
  79. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/json-file.png +0 -0
  80. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/list_aws.png +0 -0
  81. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/load_md.png +0 -0
  82. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/mail_loader.png +0 -0
  83. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/mail_writer.png +0 -0
  84. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/md.png +0 -0
  85. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/monitor-email.svg +0 -0
  86. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/office_normalizer.png +0 -0
  87. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/owmd2html.svg +0 -0
  88. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/process_pool_executor.png +0 -0
  89. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/speech_to_text.png +0 -0
  90. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/upload.png +0 -0
  91. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/visualizationer.png +0 -0
  92. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/websearch.png +0 -0
  93. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/wordpdf2docx.png +0 -0
  94. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons_dev/__init__.py +0 -0
  95. {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/__init__.py +0 -0
  96. {io4it-4.0.2 → io4it-4.0.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: io4it
3
- Version: 4.0.2
3
+ Version: 4.0.3
4
4
  Home-page:
5
5
  Author:
6
6
  Author-email:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: io4it
3
- Version: 4.0.2
3
+ Version: 4.0.3
4
4
  Home-page:
5
5
  Author:
6
6
  Author-email:
@@ -9,6 +9,11 @@ from bs4 import BeautifulSoup
9
9
  from urllib.parse import quote, urlparse, urljoin, parse_qs
10
10
  import unicodedata
11
11
  import re
12
+ import time
13
+ import webbrowser
14
+ import requests
15
+ from bs4 import BeautifulSoup
16
+ from urllib.parse import quote, urlparse, parse_qs, urljoin
12
17
 
13
18
  if "site-packages/Orange/widgets" in os.path.dirname(os.path.abspath(__file__)).replace("\\", "/"):
14
19
  from Orange.widgets.orangecontrib.AAIT.utils import thread_management, base_widget
@@ -81,39 +86,100 @@ class WebSearch(base_widget.BaseListWidget):
81
86
  mots_cles = [m for m in mots if m not in stopwords and len(m) > 2]
82
87
  return mots_cles or mots
83
88
 
84
- def recherche_duckduckgo(self, query, max_results=10):
89
+ def recherche_duckduckgo(self, query, max_results=10, timeout=10, wait_timeout=120, poll_interval=2):
90
+
91
+ def is_duckduckgo_challenge(html):
92
+ if not html:
93
+ return False
94
+ h = html.lower()
95
+ markers = [
96
+ "anomaly-modal",
97
+ "bots use duckduckgo too",
98
+ "please complete the following challenge",
99
+ "select all squares containing",
100
+ "challenge-form",
101
+ "anomaly.js",
102
+ ]
103
+ return any(m in h for m in markers)
104
+
105
+ def parse_results(html, max_results):
106
+ soup = BeautifulSoup(html, "html.parser")
107
+ resultats = []
108
+
109
+ for a in soup.select("a.result__a")[:max_results]:
110
+ titre = a.get_text(strip=True)
111
+ lien = a.get("href", "")
112
+
113
+ # Gestion des liens de redirection DuckDuckGo
114
+ parsed = urlparse(lien)
115
+ if parsed.netloc and "duckduckgo.com" in parsed.netloc and parsed.path.startswith("/l/"):
116
+ qs = parse_qs(parsed.query)
117
+ if "uddg" in qs and qs["uddg"]:
118
+ lien = qs["uddg"][0]
119
+
120
+ # Lien relatif -> absolu
121
+ if lien.startswith("/"):
122
+ lien = urljoin("https://duckduckgo.com", lien)
123
+
124
+ resultats.append((titre, lien))
125
+
126
+ return resultats
127
+
85
128
  q = quote(query)
86
129
  url = f"https://duckduckgo.com/html/?q={q}"
130
+ browser_url = f"https://duckduckgo.com/?q={q}"
87
131
  headers = {"User-Agent": "Mozilla/5.0"}
88
132
 
89
- try:
90
- r = requests.get(url, headers=headers, timeout=10)
133
+ def do_request():
134
+ r = requests.get(url, headers=headers, timeout=timeout)
91
135
  r.raise_for_status()
136
+ return r.text
137
+
138
+ # 1) Tentative normale
139
+ try:
140
+ html = do_request()
92
141
  except requests.RequestException as e:
93
- print(f"[ERREUR] Problème lors de la requête DuckDuckGo : {e}")
142
+ print(f"[ERREUR] Problème lors de la requête DuckDuckGo (peut etre captcha?): {e}")
94
143
  return []
95
144
 
96
- soup = BeautifulSoup(r.text, "html.parser")
97
- resultats = []
145
+ # 2) Pas de challenge => comportement normal immédiat
146
+ if not is_duckduckgo_challenge(html):
147
+ return parse_results(html, max_results)
148
+
149
+ # 3) Challenge détecté => ouverture navigateur + attente automatique
150
+ print("[INFO] Challenge DuckDuckGo détecté.")
151
+ print("[INFO] Ouverture du navigateur pour résolution manuelle...")
152
+ try:
153
+ webbrowser.open(browser_url)
154
+ except Exception as e:
155
+ print(f"[ERREUR] Impossible d'ouvrir le navigateur : {e}")
156
+ return []
98
157
 
99
- for a in soup.select("a.result__a")[:max_results]:
100
- titre = a.get_text(strip=True)
101
- lien = a.get("href", "")
158
+ print("[INFO] En attente automatique de disparition du challenge...")
102
159
 
103
- # Gestion des liens de redirection DuckDuckGo
104
- parsed = urlparse(lien)
105
- if parsed.netloc and "duckduckgo.com" in parsed.netloc and parsed.path.startswith("/l/"):
106
- qs = parse_qs(parsed.query)
107
- if "uddg" in qs:
108
- lien = qs["uddg"][0]
160
+ start = time.time()
161
+ last_error = None
109
162
 
110
- # Lien relatif -> absolu
111
- if lien.startswith("/"):
112
- lien = urljoin("https://duckduckgo.com", lien)
163
+ while time.time() - start < wait_timeout:
164
+ time.sleep(poll_interval)
113
165
 
114
- resultats.append((titre, lien))
166
+ try:
167
+ html = do_request()
168
+ last_error = None
169
+ except requests.RequestException as e:
170
+ last_error = e
171
+ continue
172
+
173
+ if not is_duckduckgo_challenge(html):
174
+ print("[INFO] Challenge disparu, parsing des résultats.")
175
+ return parse_results(html, max_results)
176
+
177
+ if last_error is not None:
178
+ print(f"[ERREUR] Timeout après challenge. Dernière erreur : {last_error}")
179
+ else:
180
+ print("[ERREUR] Timeout : le challenge est toujours présent.")
115
181
 
116
- return resultats
182
+ return []
117
183
 
118
184
  def extraire_domaines(self, resultats_search):
119
185
  domaines = set()
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  # Configuration
4
4
  NAME = "io4it"
5
- VERSION = "4.0.2"
5
+ VERSION = "4.0.3"
6
6
 
7
7
  INSTALL_REQUIRES = [
8
8
  "torchvision",
File without changes
File without changes
File without changes
File without changes