blend-search 0.1.0__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 (418) hide show
  1. blend_search-0.1.0/LICENSE +203 -0
  2. blend_search-0.1.0/PKG-INFO +279 -0
  3. blend_search-0.1.0/README.md +252 -0
  4. blend_search-0.1.0/README.rst +93 -0
  5. blend_search-0.1.0/pyproject.toml +36 -0
  6. blend_search-0.1.0/setup.cfg +4 -0
  7. blend_search-0.1.0/src/blend/__init__.py +1 -0
  8. blend_search-0.1.0/src/blend/api_keys.py +48 -0
  9. blend_search-0.1.0/src/blend/app.py +502 -0
  10. blend_search-0.1.0/src/blend/blend/__init__.py +9 -0
  11. blend_search-0.1.0/src/blend/blend/webapp.py +30 -0
  12. blend_search-0.1.0/src/blend/blend_core/__init__.py +146 -0
  13. blend_search-0.1.0/src/blend/blend_core/answerers/__init__.py +52 -0
  14. blend_search-0.1.0/src/blend/blend_core/answerers/_core.py +172 -0
  15. blend_search-0.1.0/src/blend/blend_core/answerers/random.py +83 -0
  16. blend_search-0.1.0/src/blend/blend_core/answerers/statistics.py +69 -0
  17. blend_search-0.1.0/src/blend/blend_core/autocomplete.py +387 -0
  18. blend_search-0.1.0/src/blend/blend_core/babel_extract.py +62 -0
  19. blend_search-0.1.0/src/blend/blend_core/blend_config.yml +2768 -0
  20. blend_search-0.1.0/src/blend/blend_core/blend_locales.py +125 -0
  21. blend_search-0.1.0/src/blend/blend_core/botdetection/__init__.py +29 -0
  22. blend_search-0.1.0/src/blend/blend_core/botdetection/_helpers.py +90 -0
  23. blend_search-0.1.0/src/blend/blend_core/botdetection/config.py +403 -0
  24. blend_search-0.1.0/src/blend/blend_core/botdetection/http_accept.py +41 -0
  25. blend_search-0.1.0/src/blend/blend_core/botdetection/http_accept_encoding.py +43 -0
  26. blend_search-0.1.0/src/blend/blend_core/botdetection/http_accept_language.py +38 -0
  27. blend_search-0.1.0/src/blend/blend_core/botdetection/http_connection.py +39 -0
  28. blend_search-0.1.0/src/blend/blend_core/botdetection/http_sec_fetch.py +111 -0
  29. blend_search-0.1.0/src/blend/blend_core/botdetection/http_user_agent.py +69 -0
  30. blend_search-0.1.0/src/blend/blend_core/botdetection/ip_limit.py +152 -0
  31. blend_search-0.1.0/src/blend/blend_core/botdetection/ip_lists.py +88 -0
  32. blend_search-0.1.0/src/blend/blend_core/botdetection/link_token.py +160 -0
  33. blend_search-0.1.0/src/blend/blend_core/botdetection/trusted_proxies.py +180 -0
  34. blend_search-0.1.0/src/blend/blend_core/botdetection/valkeydb.py +25 -0
  35. blend_search-0.1.0/src/blend/blend_core/brand.py +86 -0
  36. blend_search-0.1.0/src/blend/blend_core/cache.py +488 -0
  37. blend_search-0.1.0/src/blend/blend_core/compat.py +41 -0
  38. blend_search-0.1.0/src/blend/blend_core/data/__init__.py +133 -0
  39. blend_search-0.1.0/src/blend/blend_core/data/__main__.py +24 -0
  40. blend_search-0.1.0/src/blend/blend_core/data/ahmia_blacklist.txt +55515 -0
  41. blend_search-0.1.0/src/blend/blend_core/data/core.py +33 -0
  42. blend_search-0.1.0/src/blend/blend_core/data/currencies.json +16198 -0
  43. blend_search-0.1.0/src/blend/blend_core/data/currencies.py +68 -0
  44. blend_search-0.1.0/src/blend/blend_core/data/engine_descriptions.json +13022 -0
  45. blend_search-0.1.0/src/blend/blend_core/data/engine_traits.json +9129 -0
  46. blend_search-0.1.0/src/blend/blend_core/data/external_bangs.json +19076 -0
  47. blend_search-0.1.0/src/blend/blend_core/data/external_urls.json +156 -0
  48. blend_search-0.1.0/src/blend/blend_core/data/gsa_useragents.txt +2598 -0
  49. blend_search-0.1.0/src/blend/blend_core/data/lid.176.ftz +0 -0
  50. blend_search-0.1.0/src/blend/blend_core/data/locales.json +71 -0
  51. blend_search-0.1.0/src/blend/blend_core/data/osm_keys_tags.json +63227 -0
  52. blend_search-0.1.0/src/blend/blend_core/data/tracker_patterns.py +186 -0
  53. blend_search-0.1.0/src/blend/blend_core/data/useragents.json +11 -0
  54. blend_search-0.1.0/src/blend/blend_core/data/wikidata_units.json +9227 -0
  55. blend_search-0.1.0/src/blend/blend_core/enginelib/__init__.py +361 -0
  56. blend_search-0.1.0/src/blend/blend_core/enginelib/__main__.py +28 -0
  57. blend_search-0.1.0/src/blend/blend_core/enginelib/traits.py +268 -0
  58. blend_search-0.1.0/src/blend/blend_core/exceptions.py +124 -0
  59. blend_search-0.1.0/src/blend/blend_core/extended_types.py +91 -0
  60. blend_search-0.1.0/src/blend/blend_core/extensions/__init__.py +113 -0
  61. blend_search-0.1.0/src/blend/blend_core/extensions/_core.py +310 -0
  62. blend_search-0.1.0/src/blend/blend_core/extensions/ahmia_filter.py +56 -0
  63. blend_search-0.1.0/src/blend/blend_core/extensions/calculator.py +32 -0
  64. blend_search-0.1.0/src/blend/blend_core/extensions/hash_plugin.py +71 -0
  65. blend_search-0.1.0/src/blend/blend_core/extensions/hostnames.py +204 -0
  66. blend_search-0.1.0/src/blend/blend_core/extensions/infinite_scroll.py +32 -0
  67. blend_search-0.1.0/src/blend/blend_core/extensions/oa_doi_rewrite.py +93 -0
  68. blend_search-0.1.0/src/blend/blend_core/extensions/self_info.py +63 -0
  69. blend_search-0.1.0/src/blend/blend_core/extensions/time_zone.py +73 -0
  70. blend_search-0.1.0/src/blend/blend_core/extensions/tor_check.py +82 -0
  71. blend_search-0.1.0/src/blend/blend_core/extensions/tracker_url_remover.py +62 -0
  72. blend_search-0.1.0/src/blend/blend_core/extensions/unit_converter.py +154 -0
  73. blend_search-0.1.0/src/blend/blend_core/external_bang.py +113 -0
  74. blend_search-0.1.0/src/blend/blend_core/external_urls.py +97 -0
  75. blend_search-0.1.0/src/blend/blend_core/favicons/__init__.py +48 -0
  76. blend_search-0.1.0/src/blend/blend_core/favicons/__main__.py +16 -0
  77. blend_search-0.1.0/src/blend/blend_core/favicons/cache.py +500 -0
  78. blend_search-0.1.0/src/blend/blend_core/favicons/config.py +68 -0
  79. blend_search-0.1.0/src/blend/blend_core/favicons/proxy.py +241 -0
  80. blend_search-0.1.0/src/blend/blend_core/favicons/resolvers.py +103 -0
  81. blend_search-0.1.0/src/blend/blend_core/flaskfix.py +80 -0
  82. blend_search-0.1.0/src/blend/blend_core/infopage/__init__.py +199 -0
  83. blend_search-0.1.0/src/blend/blend_core/limiter.py +256 -0
  84. blend_search-0.1.0/src/blend/blend_core/locales.py +468 -0
  85. blend_search-0.1.0/src/blend/blend_core/markanm_engine.py +369 -0
  86. blend_search-0.1.0/src/blend/blend_core/markanm_features.py +188 -0
  87. blend_search-0.1.0/src/blend/blend_core/metrics/__init__.py +298 -0
  88. blend_search-0.1.0/src/blend/blend_core/metrics/error_recorder.py +204 -0
  89. blend_search-0.1.0/src/blend/blend_core/metrics/models.py +172 -0
  90. blend_search-0.1.0/src/blend/blend_core/network/__init__.py +280 -0
  91. blend_search-0.1.0/src/blend/blend_core/network/client.py +244 -0
  92. blend_search-0.1.0/src/blend/blend_core/network/network.py +452 -0
  93. blend_search-0.1.0/src/blend/blend_core/network/raise_for_httperror.py +83 -0
  94. blend_search-0.1.0/src/blend/blend_core/openmetrics.py +57 -0
  95. blend_search-0.1.0/src/blend/blend_core/pipeline/__init__.py +215 -0
  96. blend_search-0.1.0/src/blend/blend_core/pipeline/models.py +123 -0
  97. blend_search-0.1.0/src/blend/blend_core/pipeline/processors/__init__.py +99 -0
  98. blend_search-0.1.0/src/blend/blend_core/pipeline/processors/abstract.py +302 -0
  99. blend_search-0.1.0/src/blend/blend_core/pipeline/processors/offline.py +36 -0
  100. blend_search-0.1.0/src/blend/blend_core/pipeline/processors/online.py +287 -0
  101. blend_search-0.1.0/src/blend/blend_core/pipeline/processors/online_currency.py +120 -0
  102. blend_search-0.1.0/src/blend/blend_core/pipeline/processors/online_dictionary.py +106 -0
  103. blend_search-0.1.0/src/blend/blend_core/pipeline/processors/online_url_search.py +68 -0
  104. blend_search-0.1.0/src/blend/blend_core/preferences.py +614 -0
  105. blend_search-0.1.0/src/blend/blend_core/query.py +353 -0
  106. blend_search-0.1.0/src/blend/blend_core/result_types/__init__.py +88 -0
  107. blend_search-0.1.0/src/blend/blend_core/result_types/_base.py +576 -0
  108. blend_search-0.1.0/src/blend/blend_core/result_types/answer.py +241 -0
  109. blend_search-0.1.0/src/blend/blend_core/result_types/code.py +184 -0
  110. blend_search-0.1.0/src/blend/blend_core/result_types/file.py +98 -0
  111. blend_search-0.1.0/src/blend/blend_core/result_types/keyvalue.py +52 -0
  112. blend_search-0.1.0/src/blend/blend_core/result_types/paper.py +98 -0
  113. blend_search-0.1.0/src/blend/blend_core/results.py +386 -0
  114. blend_search-0.1.0/src/blend/blend_core/settings.yml +2769 -0
  115. blend_search-0.1.0/src/blend/blend_core/settings_defaults.py +277 -0
  116. blend_search-0.1.0/src/blend/blend_core/settings_loader.py +231 -0
  117. blend_search-0.1.0/src/blend/blend_core/sources/1337x.py +58 -0
  118. blend_search-0.1.0/src/blend/blend_core/sources/360search.py +114 -0
  119. blend_search-0.1.0/src/blend/blend_core/sources/360search_videos.py +69 -0
  120. blend_search-0.1.0/src/blend/blend_core/sources/9gag.py +80 -0
  121. blend_search-0.1.0/src/blend/blend_core/sources/__builtins__.pyi +45 -0
  122. blend_search-0.1.0/src/blend/blend_core/sources/__init__.py +288 -0
  123. blend_search-0.1.0/src/blend/blend_core/sources/acfun.py +113 -0
  124. blend_search-0.1.0/src/blend/blend_core/sources/adobe_stock.py +225 -0
  125. blend_search-0.1.0/src/blend/blend_core/sources/ahmia.py +126 -0
  126. blend_search-0.1.0/src/blend/blend_core/sources/alpinelinux.py +87 -0
  127. blend_search-0.1.0/src/blend/blend_core/sources/annas_archive.py +297 -0
  128. blend_search-0.1.0/src/blend/blend_core/sources/ansa.py +85 -0
  129. blend_search-0.1.0/src/blend/blend_core/sources/aol.py +212 -0
  130. blend_search-0.1.0/src/blend/blend_core/sources/apkmirror.py +64 -0
  131. blend_search-0.1.0/src/blend/blend_core/sources/apple_app_store.py +58 -0
  132. blend_search-0.1.0/src/blend/blend_core/sources/apple_maps.py +116 -0
  133. blend_search-0.1.0/src/blend/blend_core/sources/archlinux.py +155 -0
  134. blend_search-0.1.0/src/blend/blend_core/sources/artic.py +71 -0
  135. blend_search-0.1.0/src/blend/blend_core/sources/artstation.py +109 -0
  136. blend_search-0.1.0/src/blend/blend_core/sources/arxiv.py +133 -0
  137. blend_search-0.1.0/src/blend/blend_core/sources/ask.py +79 -0
  138. blend_search-0.1.0/src/blend/blend_core/sources/astrophysics_data_system.py +167 -0
  139. blend_search-0.1.0/src/blend/blend_core/sources/azure.py +194 -0
  140. blend_search-0.1.0/src/blend/blend_core/sources/baidu.py +190 -0
  141. blend_search-0.1.0/src/blend/blend_core/sources/bandcamp.py +85 -0
  142. blend_search-0.1.0/src/blend/blend_core/sources/base.py +120 -0
  143. blend_search-0.1.0/src/blend/blend_core/sources/bilibili.py +101 -0
  144. blend_search-0.1.0/src/blend/blend_core/sources/bing.py +227 -0
  145. blend_search-0.1.0/src/blend/blend_core/sources/bing_images.py +105 -0
  146. blend_search-0.1.0/src/blend/blend_core/sources/bing_news.py +153 -0
  147. blend_search-0.1.0/src/blend/blend_core/sources/bing_videos.py +100 -0
  148. blend_search-0.1.0/src/blend/blend_core/sources/bitchute.py +60 -0
  149. blend_search-0.1.0/src/blend/blend_core/sources/blend.py +10 -0
  150. blend_search-0.1.0/src/blend/blend_core/sources/blend_engine.py +63 -0
  151. blend_search-0.1.0/src/blend/blend_core/sources/blend_images.py +10 -0
  152. blend_search-0.1.0/src/blend/blend_core/sources/blend_news.py +10 -0
  153. blend_search-0.1.0/src/blend/blend_core/sources/blend_play.py +10 -0
  154. blend_search-0.1.0/src/blend/blend_core/sources/blend_scholar.py +10 -0
  155. blend_search-0.1.0/src/blend/blend_core/sources/blend_videos.py +10 -0
  156. blend_search-0.1.0/src/blend/blend_core/sources/boardreader.py +149 -0
  157. blend_search-0.1.0/src/blend/blend_core/sources/bpb.py +71 -0
  158. blend_search-0.1.0/src/blend/blend_core/sources/brave.py +498 -0
  159. blend_search-0.1.0/src/blend/blend_core/sources/braveapi.py +130 -0
  160. blend_search-0.1.0/src/blend/blend_core/sources/bt4g.py +122 -0
  161. blend_search-0.1.0/src/blend/blend_core/sources/btdigg.py +89 -0
  162. blend_search-0.1.0/src/blend/blend_core/sources/cachy_os.py +63 -0
  163. blend_search-0.1.0/src/blend/blend_core/sources/ccc_media.py +63 -0
  164. blend_search-0.1.0/src/blend/blend_core/sources/chefkoch.py +71 -0
  165. blend_search-0.1.0/src/blend/blend_core/sources/chinaso.py +233 -0
  166. blend_search-0.1.0/src/blend/blend_core/sources/cloudflareai.py +72 -0
  167. blend_search-0.1.0/src/blend/blend_core/sources/command.py +247 -0
  168. blend_search-0.1.0/src/blend/blend_core/sources/core.py +165 -0
  169. blend_search-0.1.0/src/blend/blend_core/sources/crates.py +74 -0
  170. blend_search-0.1.0/src/blend/blend_core/sources/crossref.py +101 -0
  171. blend_search-0.1.0/src/blend/blend_core/sources/currency_convert.py +62 -0
  172. blend_search-0.1.0/src/blend/blend_core/sources/dailymotion.py +249 -0
  173. blend_search-0.1.0/src/blend/blend_core/sources/deepl.py +56 -0
  174. blend_search-0.1.0/src/blend/blend_core/sources/deezer.py +65 -0
  175. blend_search-0.1.0/src/blend/blend_core/sources/demo_offline.py +120 -0
  176. blend_search-0.1.0/src/blend/blend_core/sources/demo_online.py +126 -0
  177. blend_search-0.1.0/src/blend/blend_core/sources/destatis.py +70 -0
  178. blend_search-0.1.0/src/blend/blend_core/sources/deviantart.py +89 -0
  179. blend_search-0.1.0/src/blend/blend_core/sources/devicons.py +67 -0
  180. blend_search-0.1.0/src/blend/blend_core/sources/dictzone.py +108 -0
  181. blend_search-0.1.0/src/blend/blend_core/sources/digbt.py +68 -0
  182. blend_search-0.1.0/src/blend/blend_core/sources/discourse.py +185 -0
  183. blend_search-0.1.0/src/blend/blend_core/sources/docker_hub.py +73 -0
  184. blend_search-0.1.0/src/blend/blend_core/sources/doku.py +91 -0
  185. blend_search-0.1.0/src/blend/blend_core/sources/duckduckgo.py +615 -0
  186. blend_search-0.1.0/src/blend/blend_core/sources/duckduckgo_definitions.py +271 -0
  187. blend_search-0.1.0/src/blend/blend_core/sources/duckduckgo_extra.py +202 -0
  188. blend_search-0.1.0/src/blend/blend_core/sources/duckduckgo_weather.py +129 -0
  189. blend_search-0.1.0/src/blend/blend_core/sources/duden.py +73 -0
  190. blend_search-0.1.0/src/blend/blend_core/sources/dummy-offline.py +25 -0
  191. blend_search-0.1.0/src/blend/blend_core/sources/dummy.py +26 -0
  192. blend_search-0.1.0/src/blend/blend_core/sources/ebay.py +81 -0
  193. blend_search-0.1.0/src/blend/blend_core/sources/elasticsearch.py +198 -0
  194. blend_search-0.1.0/src/blend/blend_core/sources/emojipedia.py +57 -0
  195. blend_search-0.1.0/src/blend/blend_core/sources/fdroid.py +58 -0
  196. blend_search-0.1.0/src/blend/blend_core/sources/findthatmeme.py +58 -0
  197. blend_search-0.1.0/src/blend/blend_core/sources/flickr.py +99 -0
  198. blend_search-0.1.0/src/blend/blend_core/sources/flickr_noapi.py +137 -0
  199. blend_search-0.1.0/src/blend/blend_core/sources/freesound.py +69 -0
  200. blend_search-0.1.0/src/blend/blend_core/sources/frinkiac.py +55 -0
  201. blend_search-0.1.0/src/blend/blend_core/sources/fyyd.py +52 -0
  202. blend_search-0.1.0/src/blend/blend_core/sources/geizhals.py +101 -0
  203. blend_search-0.1.0/src/blend/blend_core/sources/genius.py +104 -0
  204. blend_search-0.1.0/src/blend/blend_core/sources/gitea.py +120 -0
  205. blend_search-0.1.0/src/blend/blend_core/sources/github.py +69 -0
  206. blend_search-0.1.0/src/blend/blend_core/sources/github_code.py +253 -0
  207. blend_search-0.1.0/src/blend/blend_core/sources/gitlab.py +99 -0
  208. blend_search-0.1.0/src/blend/blend_core/sources/goodreads.py +60 -0
  209. blend_search-0.1.0/src/blend/blend_core/sources/google.py +526 -0
  210. blend_search-0.1.0/src/blend/blend_core/sources/google_images.py +130 -0
  211. blend_search-0.1.0/src/blend/blend_core/sources/google_news.py +303 -0
  212. blend_search-0.1.0/src/blend/blend_core/sources/google_play.py +116 -0
  213. blend_search-0.1.0/src/blend/blend_core/sources/google_scholar.py +249 -0
  214. blend_search-0.1.0/src/blend/blend_core/sources/google_videos.py +194 -0
  215. blend_search-0.1.0/src/blend/blend_core/sources/grokipedia.py +56 -0
  216. blend_search-0.1.0/src/blend/blend_core/sources/hackernews.py +99 -0
  217. blend_search-0.1.0/src/blend/blend_core/sources/hex.py +85 -0
  218. blend_search-0.1.0/src/blend/blend_core/sources/huggingface.py +120 -0
  219. blend_search-0.1.0/src/blend/blend_core/sources/il_post.py +75 -0
  220. blend_search-0.1.0/src/blend/blend_core/sources/imdb.py +101 -0
  221. blend_search-0.1.0/src/blend/blend_core/sources/imgur.py +68 -0
  222. blend_search-0.1.0/src/blend/blend_core/sources/ina.py +79 -0
  223. blend_search-0.1.0/src/blend/blend_core/sources/invidious.py +121 -0
  224. blend_search-0.1.0/src/blend/blend_core/sources/ipernity.py +80 -0
  225. blend_search-0.1.0/src/blend/blend_core/sources/iqiyi.py +84 -0
  226. blend_search-0.1.0/src/blend/blend_core/sources/jisho.py +141 -0
  227. blend_search-0.1.0/src/blend/blend_core/sources/json_engine.py +427 -0
  228. blend_search-0.1.0/src/blend/blend_core/sources/karmasearch.py +206 -0
  229. blend_search-0.1.0/src/blend/blend_core/sources/kickass.py +65 -0
  230. blend_search-0.1.0/src/blend/blend_core/sources/lemmy.py +200 -0
  231. blend_search-0.1.0/src/blend/blend_core/sources/lib_rs.py +59 -0
  232. blend_search-0.1.0/src/blend/blend_core/sources/libretranslate.py +63 -0
  233. blend_search-0.1.0/src/blend/blend_core/sources/lingva.py +78 -0
  234. blend_search-0.1.0/src/blend/blend_core/sources/loc.py +101 -0
  235. blend_search-0.1.0/src/blend/blend_core/sources/lucide.py +73 -0
  236. blend_search-0.1.0/src/blend/blend_core/sources/marginalia.py +126 -0
  237. blend_search-0.1.0/src/blend/blend_core/sources/mariadb_server.py +91 -0
  238. blend_search-0.1.0/src/blend/blend_core/sources/mastodon.py +83 -0
  239. blend_search-0.1.0/src/blend/blend_core/sources/material_icons.py +65 -0
  240. blend_search-0.1.0/src/blend/blend_core/sources/mediathekviewweb.py +77 -0
  241. blend_search-0.1.0/src/blend/blend_core/sources/mediawiki.py +174 -0
  242. blend_search-0.1.0/src/blend/blend_core/sources/meilisearch.py +93 -0
  243. blend_search-0.1.0/src/blend/blend_core/sources/metacpan.py +80 -0
  244. blend_search-0.1.0/src/blend/blend_core/sources/microsoft_learn.py +72 -0
  245. blend_search-0.1.0/src/blend/blend_core/sources/mixcloud.py +55 -0
  246. blend_search-0.1.0/src/blend/blend_core/sources/mojeek.py +186 -0
  247. blend_search-0.1.0/src/blend/blend_core/sources/mongodb.py +106 -0
  248. blend_search-0.1.0/src/blend/blend_core/sources/moviepilot.py +119 -0
  249. blend_search-0.1.0/src/blend/blend_core/sources/mozhi.py +65 -0
  250. blend_search-0.1.0/src/blend/blend_core/sources/mrs.py +74 -0
  251. blend_search-0.1.0/src/blend/blend_core/sources/mwmbl.py +54 -0
  252. blend_search-0.1.0/src/blend/blend_core/sources/mysql_server.py +97 -0
  253. blend_search-0.1.0/src/blend/blend_core/sources/naver.py +218 -0
  254. blend_search-0.1.0/src/blend/blend_core/sources/niconico.py +94 -0
  255. blend_search-0.1.0/src/blend/blend_core/sources/npm.py +68 -0
  256. blend_search-0.1.0/src/blend/blend_core/sources/nvd.py +72 -0
  257. blend_search-0.1.0/src/blend/blend_core/sources/nyaa.py +123 -0
  258. blend_search-0.1.0/src/blend/blend_core/sources/odysee.py +146 -0
  259. blend_search-0.1.0/src/blend/blend_core/sources/ollama.py +64 -0
  260. blend_search-0.1.0/src/blend/blend_core/sources/open_meteo.py +157 -0
  261. blend_search-0.1.0/src/blend/blend_core/sources/openalex.py +300 -0
  262. blend_search-0.1.0/src/blend/blend_core/sources/openclipart.py +51 -0
  263. blend_search-0.1.0/src/blend/blend_core/sources/openlibrary.py +113 -0
  264. blend_search-0.1.0/src/blend/blend_core/sources/opensemantic.py +48 -0
  265. blend_search-0.1.0/src/blend/blend_core/sources/openstreetmap.py +462 -0
  266. blend_search-0.1.0/src/blend/blend_core/sources/openverse.py +58 -0
  267. blend_search-0.1.0/src/blend/blend_core/sources/pdbe.py +126 -0
  268. blend_search-0.1.0/src/blend/blend_core/sources/peertube.py +185 -0
  269. blend_search-0.1.0/src/blend/blend_core/sources/pexels.py +116 -0
  270. blend_search-0.1.0/src/blend/blend_core/sources/photon.py +147 -0
  271. blend_search-0.1.0/src/blend/blend_core/sources/pinterest.py +77 -0
  272. blend_search-0.1.0/src/blend/blend_core/sources/piped.py +174 -0
  273. blend_search-0.1.0/src/blend/blend_core/sources/piratebay.py +98 -0
  274. blend_search-0.1.0/src/blend/blend_core/sources/pixabay.py +102 -0
  275. blend_search-0.1.0/src/blend/blend_core/sources/pixiv.py +79 -0
  276. blend_search-0.1.0/src/blend/blend_core/sources/pkg_go_dev.py +88 -0
  277. blend_search-0.1.0/src/blend/blend_core/sources/podcastindex.py +45 -0
  278. blend_search-0.1.0/src/blend/blend_core/sources/postgresql.py +102 -0
  279. blend_search-0.1.0/src/blend/blend_core/sources/presearch.py +309 -0
  280. blend_search-0.1.0/src/blend/blend_core/sources/public_domain_image_archive.py +150 -0
  281. blend_search-0.1.0/src/blend/blend_core/sources/pubmed.py +155 -0
  282. blend_search-0.1.0/src/blend/blend_core/sources/pypi.py +69 -0
  283. blend_search-0.1.0/src/blend/blend_core/sources/quark.py +384 -0
  284. blend_search-0.1.0/src/blend/blend_core/sources/qwant.py +367 -0
  285. blend_search-0.1.0/src/blend/blend_core/sources/radio_browser.py +243 -0
  286. blend_search-0.1.0/src/blend/blend_core/sources/recoll.py +160 -0
  287. blend_search-0.1.0/src/blend/blend_core/sources/reddit.py +78 -0
  288. blend_search-0.1.0/src/blend/blend_core/sources/repology.py +99 -0
  289. blend_search-0.1.0/src/blend/blend_core/sources/reuters.py +141 -0
  290. blend_search-0.1.0/src/blend/blend_core/sources/rottentomatoes.py +62 -0
  291. blend_search-0.1.0/src/blend/blend_core/sources/rumble.py +88 -0
  292. blend_search-0.1.0/src/blend/blend_core/sources/scanr_structures.py +90 -0
  293. blend_search-0.1.0/src/blend/blend_core/sources/selfhst.py +57 -0
  294. blend_search-0.1.0/src/blend/blend_core/sources/semantic_scholar.py +167 -0
  295. blend_search-0.1.0/src/blend/blend_core/sources/senscritique.py +154 -0
  296. blend_search-0.1.0/src/blend/blend_core/sources/sepiasearch.py +79 -0
  297. blend_search-0.1.0/src/blend/blend_core/sources/seznam.py +75 -0
  298. blend_search-0.1.0/src/blend/blend_core/sources/sogou.py +143 -0
  299. blend_search-0.1.0/src/blend/blend_core/sources/sogou_images.py +59 -0
  300. blend_search-0.1.0/src/blend/blend_core/sources/sogou_videos.py +85 -0
  301. blend_search-0.1.0/src/blend/blend_core/sources/sogou_wechat.py +80 -0
  302. blend_search-0.1.0/src/blend/blend_core/sources/solidtorrents.py +81 -0
  303. blend_search-0.1.0/src/blend/blend_core/sources/solr.py +97 -0
  304. blend_search-0.1.0/src/blend/blend_core/sources/soundcloud.py +161 -0
  305. blend_search-0.1.0/src/blend/blend_core/sources/sourcehut.py +94 -0
  306. blend_search-0.1.0/src/blend/blend_core/sources/spotify.py +79 -0
  307. blend_search-0.1.0/src/blend/blend_core/sources/springer.py +179 -0
  308. blend_search-0.1.0/src/blend/blend_core/sources/sqlite.py +123 -0
  309. blend_search-0.1.0/src/blend/blend_core/sources/stackexchange.py +74 -0
  310. blend_search-0.1.0/src/blend/blend_core/sources/startpage.py +537 -0
  311. blend_search-0.1.0/src/blend/blend_core/sources/steam.py +55 -0
  312. blend_search-0.1.0/src/blend/blend_core/sources/svgrepo.py +48 -0
  313. blend_search-0.1.0/src/blend/blend_core/sources/tagesschau.py +113 -0
  314. blend_search-0.1.0/src/blend/blend_core/sources/tineye.py +222 -0
  315. blend_search-0.1.0/src/blend/blend_core/sources/tokyotoshokan.py +98 -0
  316. blend_search-0.1.0/src/blend/blend_core/sources/tootfinder.py +62 -0
  317. blend_search-0.1.0/src/blend/blend_core/sources/torznab.py +241 -0
  318. blend_search-0.1.0/src/blend/blend_core/sources/translated.py +60 -0
  319. blend_search-0.1.0/src/blend/blend_core/sources/tubearchivist.py +190 -0
  320. blend_search-0.1.0/src/blend/blend_core/sources/unsplash.py +67 -0
  321. blend_search-0.1.0/src/blend/blend_core/sources/uxwing.py +55 -0
  322. blend_search-0.1.0/src/blend/blend_core/sources/valkey_server.py +103 -0
  323. blend_search-0.1.0/src/blend/blend_core/sources/vimeo.py +71 -0
  324. blend_search-0.1.0/src/blend/blend_core/sources/voidlinux.py +94 -0
  325. blend_search-0.1.0/src/blend/blend_core/sources/wallhaven.py +92 -0
  326. blend_search-0.1.0/src/blend/blend_core/sources/wikicommons.py +212 -0
  327. blend_search-0.1.0/src/blend/blend_core/sources/wikidata.py +828 -0
  328. blend_search-0.1.0/src/blend/blend_core/sources/wikipedia.py +332 -0
  329. blend_search-0.1.0/src/blend/blend_core/sources/wolframalpha_api.py +143 -0
  330. blend_search-0.1.0/src/blend/blend_core/sources/wolframalpha_noapi.py +136 -0
  331. blend_search-0.1.0/src/blend/blend_core/sources/wordnik.py +52 -0
  332. blend_search-0.1.0/src/blend/blend_core/sources/wttr.py +130 -0
  333. blend_search-0.1.0/src/blend/blend_core/sources/www1x.py +65 -0
  334. blend_search-0.1.0/src/blend/blend_core/sources/xpath.py +338 -0
  335. blend_search-0.1.0/src/blend/blend_core/sources/yacy.py +207 -0
  336. blend_search-0.1.0/src/blend/blend_core/sources/yahoo.py +260 -0
  337. blend_search-0.1.0/src/blend/blend_core/sources/yahoo_news.py +107 -0
  338. blend_search-0.1.0/src/blend/blend_core/sources/yandex.py +155 -0
  339. blend_search-0.1.0/src/blend/blend_core/sources/yandex_music.py +67 -0
  340. blend_search-0.1.0/src/blend/blend_core/sources/yep.py +86 -0
  341. blend_search-0.1.0/src/blend/blend_core/sources/youtube_api.py +96 -0
  342. blend_search-0.1.0/src/blend/blend_core/sources/youtube_noapi.py +89 -0
  343. blend_search-0.1.0/src/blend/blend_core/sources/zlibrary.py +255 -0
  344. blend_search-0.1.0/src/blend/blend_core/sqlitedb.py +472 -0
  345. blend_search-0.1.0/src/blend/blend_core/utils.py +815 -0
  346. blend_search-0.1.0/src/blend/blend_core/valkeydb.py +69 -0
  347. blend_search-0.1.0/src/blend/blend_core/valkeylib.py +244 -0
  348. blend_search-0.1.0/src/blend/blend_core/version.py +161 -0
  349. blend_search-0.1.0/src/blend/blend_core/weather.py +673 -0
  350. blend_search-0.1.0/src/blend/blend_core/webadapter.py +304 -0
  351. blend_search-0.1.0/src/blend/blend_core/webapp.py +13 -0
  352. blend_search-0.1.0/src/blend/blend_core/webutils.py +342 -0
  353. blend_search-0.1.0/src/blend/blend_core/wikidata_units.py +295 -0
  354. blend_search-0.1.0/src/blend/blend_engine/__init__.py +10 -0
  355. blend_search-0.1.0/src/blend/blend_engine/provider_manager.py +35 -0
  356. blend_search-0.1.0/src/blend/blend_engine/ranking.py +121 -0
  357. blend_search-0.1.0/src/blend/blend_engine/ranking_engine.py +143 -0
  358. blend_search-0.1.0/src/blend/blend_engine/request_handler.py +78 -0
  359. blend_search-0.1.0/src/blend/blend_engine/result_processor.py +114 -0
  360. blend_search-0.1.0/src/blend/blend_engine/search_router.py +135 -0
  361. blend_search-0.1.0/src/blend/blend_extras/__init__.py +6 -0
  362. blend_search-0.1.0/src/blend/blend_extras/update/__init__.py +6 -0
  363. blend_search-0.1.0/src/blend/blend_extras/update/update_ahmia_blacklist.py +37 -0
  364. blend_search-0.1.0/src/blend/blend_extras/update/update_currencies.py +159 -0
  365. blend_search-0.1.0/src/blend/blend_extras/update/update_engine_descriptions.py +377 -0
  366. blend_search-0.1.0/src/blend/blend_extras/update/update_engine_traits.py +210 -0
  367. blend_search-0.1.0/src/blend/blend_extras/update/update_external_bangs.py +147 -0
  368. blend_search-0.1.0/src/blend/blend_extras/update/update_firefox_version.py +84 -0
  369. blend_search-0.1.0/src/blend/blend_extras/update/update_gsa_useragents.py +45 -0
  370. blend_search-0.1.0/src/blend/blend_extras/update/update_locales.py +105 -0
  371. blend_search-0.1.0/src/blend/blend_extras/update/update_osm_keys_tags.py +218 -0
  372. blend_search-0.1.0/src/blend/blend_extras/update/update_pygments.py +77 -0
  373. blend_search-0.1.0/src/blend/blend_extras/update/update_wikidata_units.py +26 -0
  374. blend_search-0.1.0/src/blend/blendsearch/external_bang.py +113 -0
  375. blend_search-0.1.0/src/blend/check_routes.py +3 -0
  376. blend_search-0.1.0/src/blend/cli.py +99 -0
  377. blend_search-0.1.0/src/blend/modes/__init__.py +5 -0
  378. blend_search-0.1.0/src/blend/modes/deep.py +101 -0
  379. blend_search-0.1.0/src/blend/modes/fast.py +129 -0
  380. blend_search-0.1.0/src/blend/modes/ghost.py +75 -0
  381. blend_search-0.1.0/src/blend/navar.py +582 -0
  382. blend_search-0.1.0/src/blend/navar_identity.py +36 -0
  383. blend_search-0.1.0/src/blend/navar_knowledge.py +70 -0
  384. blend_search-0.1.0/src/blend/privacy/__init__.py +3 -0
  385. blend_search-0.1.0/src/blend/privacy/tor_manager.py +45 -0
  386. blend_search-0.1.0/src/blend/providers/base_provider.py +20 -0
  387. blend_search-0.1.0/src/blend/providers/bing_image_provider.py +89 -0
  388. blend_search-0.1.0/src/blend/providers/bing_provider.py +47 -0
  389. blend_search-0.1.0/src/blend/providers/brave_provider.py +8 -0
  390. blend_search-0.1.0/src/blend/providers/crawl_provider.py +9 -0
  391. blend_search-0.1.0/src/blend/providers/google_provider.py +59 -0
  392. blend_search-0.1.0/src/blend/providers/searxng_provider.py +45 -0
  393. blend_search-0.1.0/src/blend/providers/youtube_music_provider.py +135 -0
  394. blend_search-0.1.0/src/blend/scrapers/crawl4ai_wrapper.py +80 -0
  395. blend_search-0.1.0/src/blend/server.py +1637 -0
  396. blend_search-0.1.0/src/blend/setup.py +78 -0
  397. blend_search-0.1.0/src/blend/startup_checks.py +42 -0
  398. blend_search-0.1.0/src/blend/static/style.css +1353 -0
  399. blend_search-0.1.0/src/blend/templates/about.html +231 -0
  400. blend_search-0.1.0/src/blend/templates/admin.html +172 -0
  401. blend_search-0.1.0/src/blend/templates/blend-config.js +43 -0
  402. blend_search-0.1.0/src/blend/templates/index.html +428 -0
  403. blend_search-0.1.0/src/blend/templates/privacy.html +121 -0
  404. blend_search-0.1.0/src/blend/templates/results.html +2450 -0
  405. blend_search-0.1.0/src/blend/templates/settings.html +360 -0
  406. blend_search-0.1.0/src/blend/tools/validate_settings.py +75 -0
  407. blend_search-0.1.0/src/blend/utils/egress_proxy.py +53 -0
  408. blend_search-0.1.0/src/blend/utils/logger.py +14 -0
  409. blend_search-0.1.0/src/blend/utils/rate_limit.py +27 -0
  410. blend_search-0.1.0/src/blend/utils/retry.py +18 -0
  411. blend_search-0.1.0/src/blend/utils/security.py +103 -0
  412. blend_search-0.1.0/src/blend/ytdl_downloader.py +328 -0
  413. blend_search-0.1.0/src/blend_search.egg-info/PKG-INFO +279 -0
  414. blend_search-0.1.0/src/blend_search.egg-info/SOURCES.txt +416 -0
  415. blend_search-0.1.0/src/blend_search.egg-info/dependency_links.txt +1 -0
  416. blend_search-0.1.0/src/blend_search.egg-info/entry_points.txt +2 -0
  417. blend_search-0.1.0/src/blend_search.egg-info/requires.txt +16 -0
  418. blend_search-0.1.0/src/blend_search.egg-info/top_level.txt +1 -0
@@ -0,0 +1,203 @@
1
+ Copyright 2026 Raj Singh / Markanm Team
2
+
3
+ Apache License
4
+ Version 2.0, January 2004
5
+ http://www.apache.org/licenses/
6
+
7
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
8
+
9
+ 1. Definitions.
10
+
11
+ "License" shall mean the terms and conditions for use, reproduction,
12
+ and distribution as defined by Sections 1 through 9 of this document.
13
+
14
+ "Licensor" shall mean the copyright owner or entity authorized by
15
+ the copyright owner that is granting the License.
16
+
17
+ "Legal Entity" shall mean the union of the acting entity and all
18
+ other entities that control, are controlled by, or are under common
19
+ control with that entity. For the purposes of this definition,
20
+ "control" means (i) the power, direct or indirect, to cause the
21
+ direction or management of such entity, whether by contract or
22
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
23
+ outstanding shares, or (iii) beneficial ownership of such entity.
24
+
25
+ "You" (or "Your") shall mean an individual or Legal Entity
26
+ exercising permissions granted by this License.
27
+
28
+ "Source" form shall mean the preferred form for making modifications,
29
+ including but not limited to software source code, documentation
30
+ source, and configuration files.
31
+
32
+ "Object" form shall mean any form resulting from mechanical
33
+ transformation or translation of a Source form, including but
34
+ not limited to compiled object code, generated documentation,
35
+ and conversions to other media types.
36
+
37
+ "Work" shall mean the work of authorship, whether in Source or
38
+ Object form, made available under the License, as indicated by a
39
+ copyright notice that is included in or attached to the work
40
+ (an example is provided in the Appendix below).
41
+
42
+ "Derivative Works" shall mean any work, whether in Source or Object
43
+ form, that is based on (or derived from) the Work and for which the
44
+ editorial revisions, annotations, elaborations, or other modifications
45
+ represent, as a whole, an original work of authorship. For the purposes
46
+ of this License, Derivative Works shall not include works that remain
47
+ separable from, or merely link (or bind by name) to the interfaces of,
48
+ the Work and Derivative Works thereof.
49
+
50
+ "Contribution" shall mean any work of authorship, including
51
+ the original version of the Work and any modifications or additions
52
+ to that Work or Derivative Works thereof, that is intentionally
53
+ submitted to Licensor for inclusion in the Work by the copyright owner
54
+ or by an individual or Legal Entity authorized to submit on behalf of
55
+ the copyright owner. For the purposes of this definition, "submitted"
56
+ means any form of electronic, verbal, or written communication sent
57
+ to the Licensor or its representatives, including but not limited to
58
+ communication on electronic mailing lists, source code control systems,
59
+ and issue tracking systems that are managed by, or on behalf of, the
60
+ Licensor for the purpose of discussing and improving the Work, but
61
+ excluding communication that is conspicuously marked or otherwise
62
+ designated in writing by the copyright owner as "Not a Contribution."
63
+
64
+ "Contributor" shall mean Licensor and any individual or Legal Entity
65
+ on behalf of whom a Contribution has been received by Licensor and
66
+ subsequently incorporated within the Work.
67
+
68
+ 2. Grant of Copyright License. Subject to the terms and conditions of
69
+ this License, each Contributor hereby grants to You a perpetual,
70
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
71
+ copyright license to reproduce, prepare Derivative Works of,
72
+ publicly display, publicly perform, sublicense, and distribute the
73
+ Work and such Derivative Works in Source or Object form.
74
+
75
+ 3. Grant of Patent License. Subject to the terms and conditions of
76
+ this License, each Contributor hereby grants to You a perpetual,
77
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
78
+ (except as stated in this section) patent license to make, have made,
79
+ use, offer to sell, sell, import, and otherwise transfer the Work,
80
+ where such license applies only to those patent claims licensable
81
+ by such Contributor that are necessarily infringed by their
82
+ Contribution(s) alone or by combination of their Contribution(s)
83
+ with the Work to which such Contribution(s) was submitted. If You
84
+ institute patent litigation against any entity (including a
85
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
86
+ or a Contribution incorporated within the Work constitutes direct
87
+ or contributory patent infringement, then any patent licenses
88
+ granted to You under this License for that Work shall terminate
89
+ as of the date such litigation is filed.
90
+
91
+ 4. Redistribution. You may reproduce and distribute copies of the
92
+ Work or Derivative Works thereof in any medium, with or without
93
+ modifications, and in Source or Object form, provided that You
94
+ meet the following conditions:
95
+
96
+ (a) You must give any other recipients of the Work or
97
+ Derivative Works a copy of this License; and
98
+
99
+ (b) You must cause any modified files to carry prominent notices
100
+ stating that You changed the files; and
101
+
102
+ (c) You must retain, in the Source form of any Derivative Works
103
+ that You distribute, all copyright, patent, trademark, and
104
+ attribution notices from the Source form of the Work,
105
+ excluding those notices that do not pertain to any part of
106
+ the Derivative Works; and
107
+
108
+ (d) If the Work includes a "NOTICE" text file as part of its
109
+ distribution, then any Derivative Works that You distribute must
110
+ include a readable copy of the attribution notices contained
111
+ within such NOTICE file, excluding those notices that do not
112
+ pertain to any part of the Derivative Works, in at least one
113
+ of the following places: within a NOTICE text file distributed
114
+ as part of the Derivative Works; within the Source form or
115
+ documentation, if provided along with the Derivative Works; or,
116
+ within a display generated by the Derivative Works, if and
117
+ wherever such third-party notices normally appear. The contents
118
+ of the NOTICE file are for informational purposes only and
119
+ do not modify the License. You may add Your own attribution
120
+ notices within Derivative Works that You distribute, alongside
121
+ or as an addendum to the NOTICE text from the Work, provided
122
+ that such additional attribution notices cannot be construed
123
+ as modifying the License.
124
+
125
+ You may add Your own copyright statement to Your modifications and
126
+ may provide additional or different license terms and conditions
127
+ for use, reproduction, or distribution of Your modifications, or
128
+ for any such Derivative Works as a whole, provided Your use,
129
+ reproduction, and distribution of the Work otherwise complies with
130
+ the conditions stated in this License.
131
+
132
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
133
+ any Contribution intentionally submitted for inclusion in the Work
134
+ by You to the Licensor shall be under the terms and conditions of
135
+ this License, without any additional terms or conditions.
136
+ Notwithstanding the above, nothing herein shall supersede or modify
137
+ the terms of any separate license agreement you may have executed
138
+ with Licensor regarding such Contributions.
139
+
140
+ 6. Trademarks. This License does not grant permission to use the trade
141
+ names, trademarks, service marks, or product names of the Licensor,
142
+ except as required for reasonable and customary use in describing the
143
+ origin of the Work and reproducing the content of the NOTICE file.
144
+
145
+ 7. Disclaimer of Warranty. Unless required by applicable law or
146
+ agreed to in writing, Licensor provides the Work (and each
147
+ Contributor provides its Contributions) on an "AS IS" BASIS,
148
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
149
+ implied, including, without limitation, any warranties or conditions
150
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
151
+ PARTICULAR PURPOSE. You are solely responsible for determining the
152
+ appropriateness of using or redistributing the Work and assume any
153
+ risks associated with Your exercise of permissions under this License.
154
+
155
+ 8. Limitation of Liability. In no event and under no legal theory,
156
+ whether in tort (including negligence), contract, or otherwise,
157
+ unless required by applicable law (such as deliberate and grossly
158
+ negligent acts) or agreed to in writing, shall any Contributor be
159
+ liable to You for damages, including any direct, indirect, special,
160
+ incidental, or consequential damages of any character arising as a
161
+ result of this License or out of the use or inability to use the
162
+ Work (including but not limited to damages for loss of goodwill,
163
+ work stoppage, computer failure or malfunction, or any and all
164
+ other commercial damages or losses), even if such Contributor
165
+ has been advised of the possibility of such damages.
166
+
167
+ 9. Accepting Warranty or Additional Liability. While redistributing
168
+ the Work or Derivative Works thereof, You may choose to offer,
169
+ and charge a fee for, acceptance of support, warranty, indemnity,
170
+ or other liability obligations and/or rights consistent with this
171
+ License. However, in accepting such obligations, You may act only
172
+ on Your own behalf and on Your sole responsibility, not on behalf
173
+ of any other Contributor, and only if You agree to indemnify,
174
+ defend, and hold each Contributor harmless for any liability
175
+ incurred by, or claims asserted against, such Contributor by reason
176
+ of your accepting any such warranty or additional liability.
177
+
178
+ END OF TERMS AND CONDITIONS
179
+
180
+ APPENDIX: How to apply the Apache License to your work.
181
+
182
+ To apply the Apache License to your work, attach the following
183
+ boilerplate notice, with the fields enclosed by brackets "[]"
184
+ replaced with your own identifying information. (Don't include
185
+ the brackets!) The text should be enclosed in the appropriate
186
+ comment syntax for the file format. We also recommend that a
187
+ file or class name and description of purpose be included on the
188
+ same "printed page" as the copyright notice for easier
189
+ identification within third-party archives.
190
+
191
+ Copyright 2026 Raj Singh / Markanm Team
192
+
193
+ Licensed under the Apache License, Version 2.0 (the "License");
194
+ you may not use this file except in compliance with the License.
195
+ You may obtain a copy of the License at
196
+
197
+ http://www.apache.org/licenses/LICENSE-2.0
198
+
199
+ Unless required by applicable law or agreed to in writing, software
200
+ distributed under the License is distributed on an "AS IS" BASIS,
201
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
202
+ See the License for the specific language governing permissions and
203
+ limitations under the License.
@@ -0,0 +1,279 @@
1
+ Metadata-Version: 2.4
2
+ Name: blend-search
3
+ Version: 0.1.0
4
+ Summary: Blend — privacy-first multi-engine search, by MarkanM
5
+ Author: MarkanM
6
+ License: Apache-2.0
7
+ Requires-Python: >=3.10
8
+ Description-Content-Type: text/markdown
9
+ License-File: LICENSE
10
+ Requires-Dist: flask==3.1.3
11
+ Requires-Dist: flask-cors>=4.0
12
+ Requires-Dist: flask-babel==4.0.0
13
+ Requires-Dist: gunicorn>=22.0
14
+ Requires-Dist: crawl4ai
15
+ Requires-Dist: yt-dlp>=2024.12.13
16
+ Requires-Dist: openai
17
+ Requires-Dist: anthropic
18
+ Requires-Dist: google-genai
19
+ Requires-Dist: g4f
20
+ Requires-Dist: platformdirs
21
+ Requires-Dist: requests
22
+ Requires-Dist: beautifulsoup4
23
+ Requires-Dist: lxml
24
+ Requires-Dist: pyyaml
25
+ Requires-Dist: typer<0.13
26
+ Dynamic: license-file
27
+
28
+ # Blend Engine — by Markanm
29
+
30
+ ![License](https://img.shields.io/badge/License-AGPL--3.0--or--later%20%2B%20Apache--2.0-blue.svg)
31
+ ![Python](https://img.shields.io/badge/Python-3.10%2B-blue)
32
+ ![Status](https://img.shields.io/badge/Status-Public%20Release-green)
33
+
34
+ Blend Engine is a privacy-first, AI-assisted metasearch engine built by
35
+ Raj Singh / Markanm Team. The current codebase serves a custom dark-first web
36
+ interface, exposes Flask JSON endpoints, routes searches through configured
37
+ providers, and includes Navar, an assistant layer for guided answers, page
38
+ scanning, Google Dork generation, and search intent routing.
39
+
40
+ The project is designed for people who want a clean search experience without
41
+ ad profiling, invasive tracking, or committing private API configuration into
42
+ source control.
43
+
44
+ ## Acknowledgments
45
+ Blend Engine was originally inspired by and started as a fork of [SearxNG](https://github.com/searxng/searxng). We owe a great debt of gratitude to the SearxNG maintainers and community for their pioneering work in privacy-preserving metasearch. This repository now combines SearxNG-derived pieces with Markanm-authored frontend, assistant, provider-routing, media, and privacy-layer code; its roots in the open web search movement began with SearxNG.
46
+
47
+ ## What Blend Engine Does
48
+
49
+
50
+ Blend Engine provides a full search application, not just a backend library.
51
+ It includes:
52
+
53
+ - A Flask-based backend that serves browser pages and JSON APIs.
54
+ - A custom frontend for home, results, about, privacy, and settings pages.
55
+ - Implemented search paths for web/general results, images, videos/music, news,
56
+ and frontend map, file, and social tabs that call the same `/api/search`
57
+ endpoint with category parameters.
58
+ - Navar integration for conversational answers, URL/page scanning, Google Dork
59
+ generation, and multi-tab intent routing.
60
+ - Query routing and result ranking/boosting across the active provider layer.
61
+ - DuckDuckGo autocomplete with local fallback suggestions.
62
+ - YouTube media search plus optional stream/download helpers through `yt-dlp`.
63
+ - In-process search-response caching in the standalone Flask launcher; Valkey is
64
+ present as a dependency for lower-level compatibility modules, but this
65
+ launcher does not require an external Valkey/Redis service by default.
66
+ - Browser-local UI preferences, privacy headers, and environment-based runtime
67
+ configuration.
68
+
69
+ ## Core Features
70
+
71
+ ### Privacy-First Search
72
+
73
+ Blend is built around a no-profile search flow. The public configuration avoids
74
+ committing private secrets, local API keys, or personal credentials. Local
75
+ runtime settings belong in `.env`, `admin_config.json`, or local override files
76
+ that are ignored by Git.
77
+
78
+ ### Navar AI Assistant
79
+
80
+ Navar is the assistant layer inside Blend. In the current code it can:
81
+
82
+ - Build conversational answers from the query and the result context supplied by
83
+ the frontend/API call.
84
+ - Route user intent to web, images, videos, news, maps, social, all-search, or
85
+ AI chat modes.
86
+ - Scan URLs and summarize extracted page text.
87
+ - Generate Google Dork-style advanced queries.
88
+ - Answer Markanm and Blend-specific questions from the built-in knowledge base.
89
+
90
+ LLM-backed responses depend on the configured provider/API settings. Without a
91
+ working provider configuration, Navar falls back to deterministic routing, scan,
92
+ and knowledge-base responses where available.
93
+
94
+ ### Multi-Engine Search
95
+
96
+ The standalone search path in `backend/app.py` uses `SearchRouter` and
97
+ `ProviderManager` to select the active providers. In the current code, general
98
+ web search uses Google/Brave providers, image search uses the Bing image
99
+ provider, video and music search use the YouTube music provider, and news uses
100
+ a Google News RSS path in the Flask launcher.
101
+
102
+ The repository also contains SearxNG-derived `backend/blend_core/` modules and
103
+ configuration for compatibility, but the custom frontend primarily talks to the
104
+ standalone `/api/search` route.
105
+
106
+ ### Custom Frontend
107
+
108
+ The `frontend/` directory contains the public Blend UI. It is dark-first,
109
+ mobile-friendly, and focused on practical search workflows:
110
+
111
+ - Home page with shortcuts, categories, privacy widgets, and search entry.
112
+ - Results page with tabs for web, images, videos, news, maps, music, files,
113
+ social results, and AI chat. Some tabs are frontend workflows over the shared
114
+ search API rather than separate fully independent backend engines.
115
+ - Privacy, about, and settings pages.
116
+ - Frontend configuration in `frontend/templates/blend-config.js`.
117
+
118
+ ### Local-Friendly Backend
119
+
120
+ `backend/start_backend.sh` starts the app in embedded/offline-friendly mode so
121
+ local startup does not fail just because remote search engines or network probes
122
+ are unavailable.
123
+
124
+ ## Project Structure
125
+
126
+ ```text
127
+ .
128
+ ├── backend/
129
+ │ ├── app.py # Standalone Blend web/API launcher
130
+ │ ├── start_backend.sh # Local startup script
131
+ │ ├── navar.py # Navar assistant and intent routing
132
+ │ ├── navar_knowledge.py # Markanm/Blend knowledge responses
133
+ │ ├── ytdl_downloader.py # Optional media metadata helpers
134
+ │ ├── requirements.txt # Backend dependencies
135
+ │ ├── setup.py # Python package metadata
136
+ │ ├── blend/ # Compatibility webapp package
137
+ │ ├── blend_core/ # Search core, engines, settings, web app
138
+ │ │ ├── sources/ # Search source adapters
139
+ │ │ ├── extensions/ # Optional search/result extensions
140
+ │ │ ├── botdetection/ # Request/bot protection helpers
141
+ │ │ ├── pipeline/ # Result processing pipeline
142
+ │ │ ├── result_types/ # Structured result models
143
+ │ │ ├── data/ # Engine metadata and local datasets
144
+ │ │ └── views/ # Backend-rendered template assets
145
+ │ ├── blend_extras/ # Update and maintenance helpers
146
+ │ ├── blendsearch/ # External bang/search helpers
147
+ │ └── tools/ # Validation and maintenance scripts
148
+ ├── frontend/
149
+ │ ├── static/
150
+ │ │ └── style.css # Main public UI stylesheet
151
+ │ └── templates/
152
+ │ ├── index.html # Home page
153
+ │ ├── results.html # Search results and AI chat UI
154
+ │ ├── about.html
155
+ │ ├── privacy.html
156
+ │ ├── settings.html
157
+ │ └── blend-config.js
158
+ ├── .env.example # Public environment template
159
+ ├── admin_config.example.json # Public API config template
160
+ ├── LICENSE # License summary and component notices
161
+ ├── LICENSES/ # AGPL-3.0-or-later notice and Apache-2.0 text
162
+ ├── README.md # This file
163
+ └── README.rst # Package/readme compatibility file
164
+ ```
165
+
166
+ ## Requirements
167
+
168
+ - Python 3.10 or newer
169
+ - `pip`
170
+ - Optional: Valkey/Redis if you enable external caching
171
+ - Optional: `yt-dlp` features are installed through `backend/requirements.txt`
172
+
173
+ ## Local Development
174
+
175
+ From the project root:
176
+
177
+ ```bash
178
+ cp .env.example .env
179
+ cd backend
180
+ python -m venv venv
181
+ source venv/bin/activate
182
+ pip install -r requirements.txt
183
+ ./start_backend.sh
184
+ ```
185
+
186
+ The backend starts on:
187
+
188
+ ```text
189
+ http://127.0.0.1:8081
190
+ ```
191
+
192
+ You can also run the app directly from `backend/`:
193
+
194
+ ```bash
195
+ python app.py
196
+ ```
197
+
198
+ ## Configuration
199
+
200
+ Copy `.env.example` to `.env` and fill in local values:
201
+
202
+ ```env
203
+ NAVAR_API_KEY=your_api_key_here
204
+ YOUTUBEI_API_KEY=your_youtubei_key_here
205
+ BLEND_SECRET_KEY=change_this_to_a_random_string
206
+ BLEND_PORT=8081
207
+ BLEND_HOST=127.0.0.1
208
+ VALKEY_URL=redis://localhost:6379/0
209
+ ```
210
+
211
+ For API provider configuration, copy or reference
212
+ `admin_config.example.json` and keep the real `admin_config.json` local only.
213
+
214
+ Never commit:
215
+
216
+ - `.env`
217
+ - `admin_config.json`
218
+ - private keys
219
+ - local credentials
220
+ - local config overrides
221
+
222
+ These files are covered by `.gitignore`.
223
+
224
+ ## Useful Endpoints
225
+
226
+ When running locally:
227
+
228
+ ```text
229
+ GET / # Home page
230
+ GET /results.html?q=blend # Frontend results page
231
+ GET /api/search?q=blend # JSON search API
232
+ POST /api/ai # Navar AI endpoint
233
+ GET /autocompleter?q=blend # Autocomplete
234
+ GET /ping # Health check
235
+ ```
236
+
237
+ ## Public Release Security
238
+
239
+ This public release is intended to include only placeholder configuration for
240
+ API keys and secrets.
241
+
242
+ Before publishing changes, run a local secret scan against the working tree and
243
+ commit history. For example, use a tool such as `gitleaks`, `trufflehog`, or a
244
+ project-specific `grep`/`rg` pattern list stored outside the repository.
245
+
246
+ The public repository should not contain live API keys, private tokens, local
247
+ admin configuration, or secret-looking default values.
248
+
249
+ ## Development Notes
250
+
251
+ - Keep user-facing UI changes in `frontend/`.
252
+ - Keep search source behavior in `backend/blend_core/sources/`.
253
+ - Keep runtime-only secrets in `.env` or ignored local config files.
254
+ - Prefer environment variables for keys, hostnames, ports, and provider tokens.
255
+ - Do not commit generated caches, virtual environments, or local admin config.
256
+
257
+ ## License
258
+
259
+ Blend Engine preserves the licensing of its upstream roots and keeps Markanm's
260
+ original work freely reusable:
261
+
262
+ - **SearxNG-derived code, assets, data, and modifications to those parts** are
263
+ licensed under the **GNU Affero General Public License v3 or later
264
+ (AGPL-3.0-or-later)**. Blend Engine started as a SearxNG fork, so upstream
265
+ metasearch/runtime pieces and adapted SearxNG components keep that license.
266
+ See [`LICENSES/AGPL-3.0-or-later.txt`](LICENSES/AGPL-3.0-or-later.txt).
267
+ - **Original Markanm-created, separable additions** are licensed under the
268
+ **Apache License 2.0**. This covers the parts developed by Raj Singh /
269
+ Markanm Team where they are independent original work, including the custom
270
+ Blend GUI/frontend, public pages, Navar AI assistant and knowledge layer,
271
+ music downloader/media helpers, custom map-search behavior, provider
272
+ integrations, privacy modes such as Ghost Mode/Tor helpers, branding, and
273
+ project documentation. See [`LICENSES/Apache-2.0.txt`](LICENSES/Apache-2.0.txt).
274
+ - If a file has its own SPDX header or more specific license notice, that file's
275
+ specific notice controls for that file.
276
+
277
+ Copyright © 2026 Raj Singh / Markanm Team for original Markanm contributions.
278
+ SearxNG-derived portions retain their original upstream copyright and license
279
+ notices.