mirror of
				https://github.com/searxng/searxng.git
				synced 2025-11-04 03:27:06 -05:00 
			
		
		
		
	[enh] engines: add about variable
move meta information from comment to the about variable so the preferences, the documentation can show these information
This commit is contained in:
		
							parent
							
								
									5a511f0d62
								
							
						
					
					
						commit
						a4dcfa025c
					
				@ -1,7 +1,21 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					 1337x
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import quote, urljoin
 | 
					from urllib.parse import quote, urljoin
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from searx.utils import extract_text, get_torrent_size, eval_xpath, eval_xpath_list, eval_xpath_getindex
 | 
					from searx.utils import extract_text, get_torrent_size, eval_xpath, eval_xpath_list, eval_xpath_getindex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://1337x.to/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q28134166',
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
url = 'https://1337x.to/'
 | 
					url = 'https://1337x.to/'
 | 
				
			||||||
search_url = url + 'search/{search_term}/{pageno}/'
 | 
					search_url = url + 'search/{search_term}/{pageno}/'
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,22 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Acgsou (Japanese Animation/Music/Comics Bittorrent tracker)
 | 
					 Acgsou (Japanese Animation/Music/Comics Bittorrent tracker)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website      https://www.acgsou.com/
 | 
					 | 
				
			||||||
 @provide-api  no
 | 
					 | 
				
			||||||
 @using-api    no
 | 
					 | 
				
			||||||
 @results      HTML
 | 
					 | 
				
			||||||
 @stable       no (HTML can change)
 | 
					 | 
				
			||||||
 @parse        url, title, content, seed, leech, torrentfile
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from searx.utils import extract_text, get_torrent_size, eval_xpath_list, eval_xpath_getindex
 | 
					from searx.utils import extract_text, get_torrent_size, eval_xpath_list, eval_xpath_getindex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.acgsou.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": None,
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['files', 'images', 'videos', 'music']
 | 
					categories = ['files', 'images', 'videos', 'music']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,19 +1,22 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Ahmia (Onions)
 | 
					 Ahmia (Onions)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website      http://msydqstlz2kzerdg.onion
 | 
					 | 
				
			||||||
 @provides-api no
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api    no
 | 
					 | 
				
			||||||
 @results      HTML
 | 
					 | 
				
			||||||
 @stable       no
 | 
					 | 
				
			||||||
 @parse        url, title, content
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import urlencode, urlparse, parse_qs
 | 
					from urllib.parse import urlencode, urlparse, parse_qs
 | 
				
			||||||
from lxml.html import fromstring
 | 
					from lxml.html import fromstring
 | 
				
			||||||
from searx.engines.xpath import extract_url, extract_text, eval_xpath_list, eval_xpath
 | 
					from searx.engines.xpath import extract_url, extract_text, eval_xpath_list, eval_xpath
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'http://msydqstlz2kzerdg.onion',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q18693938',
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine config
 | 
					# engine config
 | 
				
			||||||
categories = ['onions']
 | 
					categories = ['onions']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,21 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 APK Mirror
 | 
					 APK Mirror
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://www.apkmirror.com
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no
 | 
					 | 
				
			||||||
 @results     HTML
 | 
					 | 
				
			||||||
 @stable      no (HTML can change)
 | 
					 | 
				
			||||||
 @parse       url, title, thumbnail_src
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from searx.utils import extract_text, eval_xpath_list, eval_xpath_getindex
 | 
					from searx.utils import extract_text, eval_xpath_list, eval_xpath_getindex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.apkmirror.com',
 | 
				
			||||||
 | 
					    "wikidata_id": None,
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['it']
 | 
					categories = ['it']
 | 
				
			||||||
 | 
				
			|||||||
@ -1,20 +1,24 @@
 | 
				
			|||||||
# -*- coding: utf-8 -*-
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Arch Linux Wiki
 | 
					 Arch Linux Wiki
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 @website      https://wiki.archlinux.org
 | 
					 API: Mediawiki provides API, but Arch Wiki blocks access to it
 | 
				
			||||||
 @provide-api  no (Mediawiki provides API, but Arch Wiki blocks access to it
 | 
					 | 
				
			||||||
 @using-api    no
 | 
					 | 
				
			||||||
 @results      HTML
 | 
					 | 
				
			||||||
 @stable       no (HTML can change)
 | 
					 | 
				
			||||||
 @parse        url, title
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import urlencode, urljoin
 | 
					from urllib.parse import urlencode, urljoin
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from searx.utils import extract_text, eval_xpath_list, eval_xpath_getindex
 | 
					from searx.utils import extract_text, eval_xpath_list, eval_xpath_getindex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://wiki.archlinux.org/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q101445877',
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['it']
 | 
					categories = ['it']
 | 
				
			||||||
language_support = True
 | 
					language_support = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,20 +1,21 @@
 | 
				
			|||||||
#!/usr/bin/env python
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 ArXiV (Scientific preprints)
 | 
					 ArXiV (Scientific preprints)
 | 
				
			||||||
 @website     https://arxiv.org
 | 
					 | 
				
			||||||
 @provide-api yes (export.arxiv.org/api/query)
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     XML-RSS
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, title, publishedDate, content
 | 
					 | 
				
			||||||
 More info on api: https://arxiv.org/help/api/user-manual
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from datetime import datetime
 | 
					from datetime import datetime
 | 
				
			||||||
from searx.utils import eval_xpath_list, eval_xpath_getindex
 | 
					from searx.utils import eval_xpath_list, eval_xpath_getindex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://arxiv.org',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q118398',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://arxiv.org/help/api',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'XML-RSS',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
categories = ['science']
 | 
					categories = ['science']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,16 +1,6 @@
 | 
				
			|||||||
#!/usr/bin/env python
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 BASE (Scholar publications)
 | 
					 BASE (Scholar publications)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://base-search.net
 | 
					 | 
				
			||||||
 @provide-api yes with authorization (https://api.base-search.net/)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     XML
 | 
					 | 
				
			||||||
 @stable      ?
 | 
					 | 
				
			||||||
 @parse       url, title, publishedDate, content
 | 
					 | 
				
			||||||
 More info on api: http://base-search.net/about/download/base_interface.pdf
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
@ -19,6 +9,15 @@ from datetime import datetime
 | 
				
			|||||||
import re
 | 
					import re
 | 
				
			||||||
from searx.utils import searx_useragent
 | 
					from searx.utils import searx_useragent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://base-search.net',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q448335',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://api.base-search.net/',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'XML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
categories = ['science']
 | 
					categories = ['science']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,16 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Bing (Web)
 | 
					 Bing (Web)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://www.bing.com
 | 
					 | 
				
			||||||
 @provide-api yes (http://datamarket.azure.com/dataset/bing/search),
 | 
					 | 
				
			||||||
              max. 5000 query/month
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no (because of query limit)
 | 
					 | 
				
			||||||
 @results     HTML (using search portal)
 | 
					 | 
				
			||||||
 @stable      no (HTML can change)
 | 
					 | 
				
			||||||
 @parse       url, title, content
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @todo        publishedDate
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import re
 | 
					import re
 | 
				
			||||||
@ -21,6 +11,16 @@ from searx.utils import eval_xpath, extract_text, match_language
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
logger = logger.getChild('bing engine')
 | 
					logger = logger.getChild('bing engine')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.bing.com',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q182496',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://www.microsoft.com/en-us/bing/apis/bing-web-search-api',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['general']
 | 
					categories = ['general']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,15 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Bing (Images)
 | 
					 Bing (Images)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://www.bing.com/images
 | 
					 | 
				
			||||||
 @provide-api yes (http://datamarket.azure.com/dataset/bing/search),
 | 
					 | 
				
			||||||
              max. 5000 query/month
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no (because of query limit)
 | 
					 | 
				
			||||||
 @results     HTML (using search portal)
 | 
					 | 
				
			||||||
 @stable      no (HTML can change)
 | 
					 | 
				
			||||||
 @parse       url, title, img_src
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
@ -20,6 +11,16 @@ from searx.utils import match_language
 | 
				
			|||||||
from searx.engines.bing import language_aliases
 | 
					from searx.engines.bing import language_aliases
 | 
				
			||||||
from searx.engines.bing import _fetch_supported_languages, supported_languages_url  # NOQA # pylint: disable=unused-import
 | 
					from searx.engines.bing import _fetch_supported_languages, supported_languages_url  # NOQA # pylint: disable=unused-import
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.bing.com/images',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q182496',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://www.microsoft.com/en-us/bing/apis/bing-image-search-api',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['images']
 | 
					categories = ['images']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,14 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Bing (News)
 | 
					 Bing (News)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://www.bing.com/news
 | 
					 | 
				
			||||||
 @provide-api yes (http://datamarket.azure.com/dataset/bing/search),
 | 
					 | 
				
			||||||
              max. 5000 query/month
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no (because of query limit)
 | 
					 | 
				
			||||||
 @results     RSS (using search portal)
 | 
					 | 
				
			||||||
 @stable      yes (except perhaps for the images)
 | 
					 | 
				
			||||||
 @parse       url, title, content, publishedDate, thumbnail
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from datetime import datetime
 | 
					from datetime import datetime
 | 
				
			||||||
@ -20,6 +12,16 @@ from searx.utils import match_language, eval_xpath_getindex
 | 
				
			|||||||
from searx.engines.bing import language_aliases
 | 
					from searx.engines.bing import language_aliases
 | 
				
			||||||
from searx.engines.bing import _fetch_supported_languages, supported_languages_url  # NOQA # pylint: disable=unused-import
 | 
					from searx.engines.bing import _fetch_supported_languages, supported_languages_url  # NOQA # pylint: disable=unused-import
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.bing.com/news',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q2878637',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://www.microsoft.com/en-us/bing/apis/bing-news-search-api',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'RSS',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['news']
 | 
					categories = ['news']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,13 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Bing (Videos)
 | 
					 Bing (Videos)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://www.bing.com/videos
 | 
					 | 
				
			||||||
 @provide-api yes (http://datamarket.azure.com/dataset/bing/search)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no
 | 
					 | 
				
			||||||
 @results     HTML
 | 
					 | 
				
			||||||
 @stable      no
 | 
					 | 
				
			||||||
 @parse       url, title, content, thumbnail
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
@ -18,6 +11,16 @@ from searx.utils import match_language
 | 
				
			|||||||
from searx.engines.bing import language_aliases
 | 
					from searx.engines.bing import language_aliases
 | 
				
			||||||
from searx.engines.bing import _fetch_supported_languages, supported_languages_url  # NOQA # pylint: disable=unused-import
 | 
					from searx.engines.bing import _fetch_supported_languages, supported_languages_url  # NOQA # pylint: disable=unused-import
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.bing.com/videos',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q4914152',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://www.microsoft.com/en-us/bing/apis/bing-video-search-api',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
categories = ['videos']
 | 
					categories = ['videos']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
safesearch = True
 | 
					safesearch = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,19 +1,25 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 BTDigg (Videos, Music, Files)
 | 
					 BTDigg (Videos, Music, Files)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://btdig.com
 | 
					 | 
				
			||||||
 @provide-api yes (on demand)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no
 | 
					 | 
				
			||||||
 @results     HTML (using search portal)
 | 
					 | 
				
			||||||
 @stable      no (HTML can change)
 | 
					 | 
				
			||||||
 @parse       url, title, content, seed, leech, magnetlink
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from urllib.parse import quote, urljoin
 | 
					from urllib.parse import quote, urljoin
 | 
				
			||||||
from searx.utils import extract_text, get_torrent_size
 | 
					from searx.utils import extract_text, get_torrent_size
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://btdig.com',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q4836698',
 | 
				
			||||||
 | 
					    "official_api_documentation": {
 | 
				
			||||||
 | 
					        'url': 'https://btdig.com/contacts',
 | 
				
			||||||
 | 
					        'comment': 'on demand'
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['videos', 'music', 'files']
 | 
					categories = ['videos', 'music', 'files']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,7 @@
 | 
				
			|||||||
'''
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
searx is free software: you can redistribute it and/or modify
 | 
					"""
 | 
				
			||||||
it under the terms of the GNU Affero General Public License as published by
 | 
					 Command (offline)
 | 
				
			||||||
the Free Software Foundation, either version 3 of the License, or
 | 
					"""
 | 
				
			||||||
(at your option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
searx is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
GNU Affero General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
You should have received a copy of the GNU Affero General Public License
 | 
					 | 
				
			||||||
along with searx. If not, see < http://www.gnu.org/licenses/ >.
 | 
					 | 
				
			||||||
'''
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import re
 | 
					import re
 | 
				
			||||||
from os.path import expanduser, isabs, realpath, commonprefix
 | 
					from os.path import expanduser, isabs, realpath, commonprefix
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,19 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					 currency convert (DuckDuckGo)
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import json
 | 
					import json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://duckduckgo.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q12805',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://duckduckgo.com/api',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSONP',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
engine_type = 'online_currency'
 | 
					engine_type = 'online_currency'
 | 
				
			||||||
categories = []
 | 
					categories = []
 | 
				
			||||||
 | 
				
			|||||||
@ -1,15 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Dailymotion (Videos)
 | 
					 Dailymotion (Videos)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://www.dailymotion.com
 | 
					 | 
				
			||||||
 @provide-api yes (http://www.dailymotion.com/developer)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     JSON
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, title, thumbnail, publishedDate, embedded
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @todo        set content-parameter with correct data
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
@ -17,6 +8,16 @@ from datetime import datetime
 | 
				
			|||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
from searx.utils import match_language, html_to_text
 | 
					from searx.utils import match_language, html_to_text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.dailymotion.com',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q769222',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://www.dailymotion.com/developer',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['videos']
 | 
					categories = ['videos']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,21 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Deezer (Music)
 | 
					 Deezer (Music)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://deezer.com
 | 
					 | 
				
			||||||
 @provide-api yes (http://developers.deezer.com/api/)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     JSON
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, title, content, embedded
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://deezer.com',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q602243',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://developers.deezer.com/',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['music']
 | 
					categories = ['music']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,21 +1,22 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Deviantart (Images)
 | 
					 Deviantart (Images)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://www.deviantart.com/
 | 
					 | 
				
			||||||
 @provide-api yes (https://www.deviantart.com/developers/) (RSS)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no (TODO, rewrite to api)
 | 
					 | 
				
			||||||
 @results     HTML
 | 
					 | 
				
			||||||
 @stable      no (HTML can change)
 | 
					 | 
				
			||||||
 @parse       url, title, img_src
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @todo        rewrite to api
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
# pylint: disable=missing-function-docstring
 | 
					# pylint: disable=missing-function-docstring
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.deviantart.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q46523',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://www.deviantart.com/developers/',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['images']
 | 
					categories = ['images']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,21 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Dictzone
 | 
					 Dictzone
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://dictzone.com/
 | 
					 | 
				
			||||||
 @provide-api no
 | 
					 | 
				
			||||||
 @using-api   no
 | 
					 | 
				
			||||||
 @results     HTML (using search portal)
 | 
					 | 
				
			||||||
 @stable      no (HTML can change)
 | 
					 | 
				
			||||||
 @parse       url, title, content
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import urljoin
 | 
					from urllib.parse import urljoin
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from searx.utils import eval_xpath
 | 
					from searx.utils import eval_xpath
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://dictzone.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": None,
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
engine_type = 'online_dictionnary'
 | 
					engine_type = 'online_dictionnary'
 | 
				
			||||||
categories = ['general']
 | 
					categories = ['general']
 | 
				
			||||||
 | 
				
			|||||||
@ -1,19 +1,21 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 DigBT (Videos, Music, Files)
 | 
					 DigBT (Videos, Music, Files)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://digbt.org
 | 
					 | 
				
			||||||
 @provide-api no
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no
 | 
					 | 
				
			||||||
 @results     HTML (using search portal)
 | 
					 | 
				
			||||||
 @stable      no (HTML can change)
 | 
					 | 
				
			||||||
 @parse       url, title, content, magnetlink
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import urljoin
 | 
					from urllib.parse import urljoin
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from searx.utils import extract_text, get_torrent_size
 | 
					from searx.utils import extract_text, get_torrent_size
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://digbt.org',
 | 
				
			||||||
 | 
					    "wikidata_id": None,
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
categories = ['videos', 'music', 'files']
 | 
					categories = ['videos', 'music', 'files']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,13 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Digg (News, Social media)
 | 
					 Digg (News, Social media)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://digg.com
 | 
					 | 
				
			||||||
 @provide-api no
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no
 | 
					 | 
				
			||||||
 @results     HTML (using search portal)
 | 
					 | 
				
			||||||
 @stable      no (HTML can change)
 | 
					 | 
				
			||||||
 @parse       url, title, content, publishedDate, thumbnail
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
# pylint: disable=missing-function-docstring
 | 
					# pylint: disable=missing-function-docstring
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -17,6 +10,16 @@ from datetime import datetime
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://digg.com',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q270478',
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['news', 'social media']
 | 
					categories = ['news', 'social media']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,22 @@
 | 
				
			|||||||
# Doku Wiki
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
#
 | 
					"""
 | 
				
			||||||
# @website     https://www.dokuwiki.org/
 | 
					 Doku Wiki
 | 
				
			||||||
# @provide-api yes
 | 
					"""
 | 
				
			||||||
#              (https://www.dokuwiki.org/devel:xmlrpc)
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# @using-api   no
 | 
					 | 
				
			||||||
# @results     HTML
 | 
					 | 
				
			||||||
# @stable      yes
 | 
					 | 
				
			||||||
# @parse       (general)    url, title, content
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
from lxml.html import fromstring
 | 
					from lxml.html import fromstring
 | 
				
			||||||
from searx.utils import extract_text, eval_xpath
 | 
					from searx.utils import extract_text, eval_xpath
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.dokuwiki.org/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q851864',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://www.dokuwiki.org/devel:xmlrpc',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['general']  # TODO , 'images', 'music', 'videos', 'files'
 | 
					categories = ['general']  # TODO , 'images', 'music', 'videos', 'files'
 | 
				
			||||||
paging = False
 | 
					paging = False
 | 
				
			||||||
 | 
				
			|||||||
@ -1,22 +1,22 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 DuckDuckGo (Web)
 | 
					 DuckDuckGo (Web)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://duckduckgo.com/
 | 
					 | 
				
			||||||
 @provide-api yes (https://duckduckgo.com/api),
 | 
					 | 
				
			||||||
              but not all results from search-site
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no
 | 
					 | 
				
			||||||
 @results     HTML (using search portal)
 | 
					 | 
				
			||||||
 @stable      no (HTML can change)
 | 
					 | 
				
			||||||
 @parse       url, title, content
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @todo        rewrite to api
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from lxml.html import fromstring
 | 
					from lxml.html import fromstring
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from searx.utils import extract_text, match_language, eval_xpath
 | 
					from searx.utils import extract_text, match_language, eval_xpath
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://duckduckgo.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q12805',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://duckduckgo.com/api',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['general']
 | 
					categories = ['general']
 | 
				
			||||||
paging = False
 | 
					paging = False
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
DuckDuckGo (definitions)
 | 
					 DuckDuckGo (Instant Answer API)
 | 
				
			||||||
 | 
					 | 
				
			||||||
- `Instant Answer API`_
 | 
					 | 
				
			||||||
- `DuckDuckGo query`_
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.. _Instant Answer API: https://duckduckgo.com/api
 | 
					 | 
				
			||||||
.. _DuckDuckGo query: https://api.duckduckgo.com/?q=DuckDuckGo&format=json&pretty=1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import json
 | 
					import json
 | 
				
			||||||
@ -22,6 +16,16 @@ from searx.external_urls import get_external_url, get_earth_coordinates_url, are
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
logger = logger.getChild('duckduckgo_definitions')
 | 
					logger = logger.getChild('duckduckgo_definitions')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://duckduckgo.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q12805',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://duckduckgo.com/api',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
URL = 'https://api.duckduckgo.com/'\
 | 
					URL = 'https://api.duckduckgo.com/'\
 | 
				
			||||||
    + '?{query}&format=json&pretty=0&no_redirect=1&d=1'
 | 
					    + '?{query}&format=json&pretty=0&no_redirect=1&d=1'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,16 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 DuckDuckGo (Images)
 | 
					 DuckDuckGo (Images)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://duckduckgo.com/
 | 
					 | 
				
			||||||
 @provide-api yes (https://duckduckgo.com/api),
 | 
					 | 
				
			||||||
              but images are not supported
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no
 | 
					 | 
				
			||||||
 @results     JSON (site requires js to get images)
 | 
					 | 
				
			||||||
 @stable      no (JSON can change)
 | 
					 | 
				
			||||||
 @parse       url, title, img_src
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @todo        avoid extra request
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
@ -20,6 +10,19 @@ from searx.engines.duckduckgo import get_region_code
 | 
				
			|||||||
from searx.engines.duckduckgo import _fetch_supported_languages, supported_languages_url  # NOQA # pylint: disable=unused-import
 | 
					from searx.engines.duckduckgo import _fetch_supported_languages, supported_languages_url  # NOQA # pylint: disable=unused-import
 | 
				
			||||||
from searx.poolrequests import get
 | 
					from searx.poolrequests import get
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://duckduckgo.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q12805',
 | 
				
			||||||
 | 
					    "official_api_documentation": {
 | 
				
			||||||
 | 
					        'url': 'https://duckduckgo.com/api',
 | 
				
			||||||
 | 
					        'comment': 'but images are not supported',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON (site requires js to get images)',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['images']
 | 
					categories = ['images']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,11 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Duden
 | 
					 Duden
 | 
				
			||||||
 @website     https://www.duden.de
 | 
					 | 
				
			||||||
 @provide-api no
 | 
					 | 
				
			||||||
 @using-api   no
 | 
					 | 
				
			||||||
 @results     HTML (using search portal)
 | 
					 | 
				
			||||||
 @stable      no (HTML can change)
 | 
					 | 
				
			||||||
 @parse       url, title, content
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import re
 | 
					import re
 | 
				
			||||||
@ -13,6 +8,16 @@ from urllib.parse import quote, urljoin
 | 
				
			|||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from searx.utils import extract_text, eval_xpath, eval_xpath_list, eval_xpath_getindex
 | 
					from searx.utils import extract_text, eval_xpath, eval_xpath_list, eval_xpath_getindex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.duden.de',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q73624591',
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
categories = ['general']
 | 
					categories = ['general']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
language_support = False
 | 
					language_support = False
 | 
				
			||||||
 | 
				
			|||||||
@ -1,11 +1,19 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Dummy Offline
 | 
					 Dummy Offline
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @results     one result
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "wikidata_id": None,
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def search(query, request_params):
 | 
					def search(query, request_params):
 | 
				
			||||||
    return [{
 | 
					    return [{
 | 
				
			||||||
        'result': 'this is what you get',
 | 
					        'result': 'this is what you get',
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,18 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Dummy
 | 
					 Dummy
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @results     empty array
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": None,
 | 
				
			||||||
 | 
					    "wikidata_id": None,
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'empty array',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# do search-request
 | 
					# do search-request
 | 
				
			||||||
def request(query, params):
 | 
					def request(query, params):
 | 
				
			||||||
 | 
				
			|||||||
@ -1,17 +1,22 @@
 | 
				
			|||||||
#  Ebay (Videos, Music, Files)
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
#
 | 
					"""
 | 
				
			||||||
# @website     https://www.ebay.com
 | 
					 Ebay (Videos, Music, Files)
 | 
				
			||||||
# @provide-api no (nothing found)
 | 
					"""
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# @using-api   no
 | 
					 | 
				
			||||||
# @results     HTML (using search portal)
 | 
					 | 
				
			||||||
# @stable      yes (HTML can change)
 | 
					 | 
				
			||||||
# @parse       url, title, content, price, shipping, source
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from searx.engines.xpath import extract_text
 | 
					from searx.engines.xpath import extract_text
 | 
				
			||||||
from urllib.parse import quote
 | 
					from urllib.parse import quote
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.ebay.com',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q58024',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://developer.ebay.com/',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
categories = ['shopping']
 | 
					categories = ['shopping']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,3 +1,8 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					 Elasticsearch
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads, dumps
 | 
					from json import loads, dumps
 | 
				
			||||||
from requests.auth import HTTPBasicAuth
 | 
					from requests.auth import HTTPBasicAuth
 | 
				
			||||||
from searx.exceptions import SearxEngineAPIException
 | 
					from searx.exceptions import SearxEngineAPIException
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,22 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 eTools (Web)
 | 
					 eTools (Web)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website      https://www.etools.ch
 | 
					 | 
				
			||||||
 @provide-api  no
 | 
					 | 
				
			||||||
 @using-api    no
 | 
					 | 
				
			||||||
 @results      HTML
 | 
					 | 
				
			||||||
 @stable       no (HTML can change)
 | 
					 | 
				
			||||||
 @parse        url, title, content
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from urllib.parse import quote
 | 
					from urllib.parse import quote
 | 
				
			||||||
from searx.utils import extract_text, eval_xpath
 | 
					from searx.utils import extract_text, eval_xpath
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.etools.ch',
 | 
				
			||||||
 | 
					    "wikidata_id": None,
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
categories = ['general']
 | 
					categories = ['general']
 | 
				
			||||||
paging = False
 | 
					paging = False
 | 
				
			||||||
language_support = False
 | 
					language_support = False
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,22 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 F-Droid (a repository of FOSS applications for Android)
 | 
					 F-Droid (a repository of FOSS applications for Android)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website      https://f-droid.org/
 | 
					 | 
				
			||||||
 @provide-api  no
 | 
					 | 
				
			||||||
 @using-api    no
 | 
					 | 
				
			||||||
 @results      HTML
 | 
					 | 
				
			||||||
 @stable       no (HTML can change)
 | 
					 | 
				
			||||||
 @parse        url, title, content
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from searx.utils import extract_text
 | 
					from searx.utils import extract_text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://f-droid.org/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q1386210',
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['files']
 | 
					categories = ['files']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,21 +1,23 @@
 | 
				
			|||||||
#!/usr/bin/env python
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Flickr (Images)
 | 
					 Flickr (Images)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 @website     https://www.flickr.com
 | 
					 | 
				
			||||||
 @provide-api yes (https://secure.flickr.com/services/api/flickr.photos.search.html)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     JSON
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, title, thumbnail, img_src
 | 
					 | 
				
			||||||
 More info on api-key : https://www.flickr.com/services/apps/create/
 | 
					 More info on api-key : https://www.flickr.com/services/apps/create/
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.flickr.com',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q103204',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://secure.flickr.com/services/api/flickr.photos.search.html',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": True,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
categories = ['images']
 | 
					categories = ['images']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
nb_per_page = 15
 | 
					nb_per_page = 15
 | 
				
			||||||
 | 
				
			|||||||
@ -1,15 +1,6 @@
 | 
				
			|||||||
#!/usr/bin/env python
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Flickr (Images)
 | 
					 Flickr (Images)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://www.flickr.com
 | 
					 | 
				
			||||||
 @provide-api yes (https://secure.flickr.com/services/api/flickr.photos.search.html)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no
 | 
					 | 
				
			||||||
 @results     HTML
 | 
					 | 
				
			||||||
 @stable      no
 | 
					 | 
				
			||||||
 @parse       url, title, thumbnail, img_src
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
@ -21,6 +12,16 @@ from searx.utils import ecma_unescape, html_to_text
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
logger = logger.getChild('flickr-noapi')
 | 
					logger = logger.getChild('flickr-noapi')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.flickr.com',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q103204',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://secure.flickr.com/services/api/flickr.photos.search.html',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
categories = ['images']
 | 
					categories = ['images']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
url = 'https://www.flickr.com/'
 | 
					url = 'https://www.flickr.com/'
 | 
				
			||||||
 | 
				
			|||||||
@ -1,13 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 FramaLibre (It)
 | 
					 FramaLibre (It)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://framalibre.org/
 | 
					 | 
				
			||||||
 @provide-api no
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no
 | 
					 | 
				
			||||||
 @results     HTML
 | 
					 | 
				
			||||||
 @stable      no (HTML can change)
 | 
					 | 
				
			||||||
 @parse       url, title, content, thumbnail, img_src
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from html import escape
 | 
					from html import escape
 | 
				
			||||||
@ -15,6 +8,16 @@ from urllib.parse import urljoin, urlencode
 | 
				
			|||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from searx.utils import extract_text
 | 
					from searx.utils import extract_text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://framalibre.org/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q30213882',
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['it']
 | 
					categories = ['it']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,17 +1,24 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
Frinkiac (Images)
 | 
					 Frinkiac (Images)
 | 
				
			||||||
 | 
					 | 
				
			||||||
@website     https://www.frinkiac.com
 | 
					 | 
				
			||||||
@provide-api no
 | 
					 | 
				
			||||||
@using-api   no
 | 
					 | 
				
			||||||
@results     JSON
 | 
					 | 
				
			||||||
@stable      no
 | 
					 | 
				
			||||||
@parse       url, title, img_src
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://frinkiac.com',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q24882614',
 | 
				
			||||||
 | 
					    "official_api_documentation": {
 | 
				
			||||||
 | 
					        'url': None,
 | 
				
			||||||
 | 
					        'comment': 'see https://github.com/MitchellAW/CompuGlobal'
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
categories = ['images']
 | 
					categories = ['images']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BASE = 'https://frinkiac.com/'
 | 
					BASE = 'https://frinkiac.com/'
 | 
				
			||||||
 | 
				
			|||||||
@ -1,19 +1,22 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
Genius
 | 
					 Genius
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://www.genius.com/
 | 
					 | 
				
			||||||
 @provide-api yes (https://docs.genius.com/)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     JSON
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, title, content, thumbnail, publishedDate
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
from datetime import datetime
 | 
					from datetime import datetime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://genius.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q3419343',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://docs.genius.com/',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['music']
 | 
					categories = ['music']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,20 +1,22 @@
 | 
				
			|||||||
# -*- coding: utf-8 -*-
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Gentoo Wiki
 | 
					 Gentoo Wiki
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website      https://wiki.gentoo.org
 | 
					 | 
				
			||||||
 @provide-api  yes
 | 
					 | 
				
			||||||
 @using-api    no
 | 
					 | 
				
			||||||
 @results      HTML
 | 
					 | 
				
			||||||
 @stable       no (HTML can change)
 | 
					 | 
				
			||||||
 @parse        url, title
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import urlencode, urljoin
 | 
					from urllib.parse import urlencode, urljoin
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from searx.utils import extract_text
 | 
					from searx.utils import extract_text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://wiki.gentoo.org/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q1050637',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://wiki.gentoo.org/api.php',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['it']
 | 
					categories = ['it']
 | 
				
			||||||
language_support = True
 | 
					language_support = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,14 +1,6 @@
 | 
				
			|||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Gigablast (Web)
 | 
					 Gigablast (Web)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://gigablast.com
 | 
					 | 
				
			||||||
 @provide-api yes (https://gigablast.com/api.html)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     XML
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, title, content
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
# pylint: disable=missing-function-docstring, invalid-name
 | 
					# pylint: disable=missing-function-docstring, invalid-name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -18,6 +10,16 @@ from urllib.parse import urlencode
 | 
				
			|||||||
# from searx import logger
 | 
					# from searx import logger
 | 
				
			||||||
from searx.poolrequests import get
 | 
					from searx.poolrequests import get
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.gigablast.com',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q3105449',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://gigablast.com/api.html',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['general']
 | 
					categories = ['general']
 | 
				
			||||||
# gigablast's pagination is totally damaged, don't use it
 | 
					# gigablast's pagination is totally damaged, don't use it
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,21 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Github (It)
 | 
					 Github (IT)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://github.com/
 | 
					 | 
				
			||||||
 @provide-api yes (https://developer.github.com/v3/)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     JSON
 | 
					 | 
				
			||||||
 @stable      yes (using api)
 | 
					 | 
				
			||||||
 @parse       url, title, content
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://github.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q364',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://developer.github.com/v3/',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['it']
 | 
					categories = ['it']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,19 +1,11 @@
 | 
				
			|||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""Google (Web)
 | 
					"""Google (Web)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:website:     https://www.google.com
 | 
					 For detailed description of the *REST-full* API see: `Query Parameter
 | 
				
			||||||
:provide-api: yes (https://developers.google.com/custom-search/)
 | 
					 Definitions`_.
 | 
				
			||||||
:using-api:   not the offical, since it needs registration to another service
 | 
					 | 
				
			||||||
:results:     HTML
 | 
					 | 
				
			||||||
:stable:      no
 | 
					 | 
				
			||||||
:parse:       url, title, content, number_of_results, answer, suggestion, correction
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
For detailed description of the *REST-full* API see: `Query Parameter
 | 
					 .. _Query Parameter Definitions:
 | 
				
			||||||
Definitions`_.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.. _Query Parameter Definitions:
 | 
					 | 
				
			||||||
 https://developers.google.com/custom-search/docs/xml_results#WebSearch_Query_Parameter_Definitions
 | 
					 https://developers.google.com/custom-search/docs/xml_results#WebSearch_Query_Parameter_Definitions
 | 
				
			||||||
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# pylint: disable=invalid-name, missing-function-docstring
 | 
					# pylint: disable=invalid-name, missing-function-docstring
 | 
				
			||||||
@ -27,6 +19,16 @@ from searx.exceptions import SearxEngineCaptchaException
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
logger = logger.getChild('google engine')
 | 
					logger = logger.getChild('google engine')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.google.com',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q9366',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://developers.google.com/custom-search/',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['general']
 | 
					categories = ['general']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,14 +1,6 @@
 | 
				
			|||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""Google (Images)
 | 
					"""Google (Images)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:website:     https://images.google.com (redirected to subdomain www.)
 | 
					 | 
				
			||||||
:provide-api: yes (https://developers.google.com/custom-search/)
 | 
					 | 
				
			||||||
:using-api:   not the offical, since it needs registration to another service
 | 
					 | 
				
			||||||
:results:     HTML
 | 
					 | 
				
			||||||
:stable:      no
 | 
					 | 
				
			||||||
:template:    images.html
 | 
					 | 
				
			||||||
:parse:       url, title, content, source, thumbnail_src, img_src
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
For detailed description of the *REST-full* API see: `Query Parameter
 | 
					For detailed description of the *REST-full* API see: `Query Parameter
 | 
				
			||||||
Definitions`_.
 | 
					Definitions`_.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -18,10 +10,6 @@ Definitions`_.
 | 
				
			|||||||
   ``data:` scheme).::
 | 
					   ``data:` scheme).::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
     Header set Content-Security-Policy "img-src 'self' data: ;"
 | 
					     Header set Content-Security-Policy "img-src 'self' data: ;"
 | 
				
			||||||
 | 
					 | 
				
			||||||
.. _Query Parameter Definitions:
 | 
					 | 
				
			||||||
   https://developers.google.com/custom-search/docs/xml_results#WebSearch_Query_Parameter_Definitions
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import urlencode, urlparse, unquote
 | 
					from urllib.parse import urlencode, urlparse, unquote
 | 
				
			||||||
@ -39,6 +27,16 @@ from searx.engines.google import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
logger = logger.getChild('google images')
 | 
					logger = logger.getChild('google images')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://images.google.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q521550',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://developers.google.com/custom-search/docs/xml_results#WebSearch_Query_Parameter_Definitions',  # NOQA
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
categories = ['images']
 | 
					categories = ['images']
 | 
				
			||||||
 | 
				
			|||||||
@ -1,13 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Google (News)
 | 
					 Google (News)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://news.google.com
 | 
					 | 
				
			||||||
 @provide-api no
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no
 | 
					 | 
				
			||||||
 @results     HTML
 | 
					 | 
				
			||||||
 @stable      no
 | 
					 | 
				
			||||||
 @parse       url, title, content, publishedDate
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
@ -15,6 +8,16 @@ from lxml import html
 | 
				
			|||||||
from searx.utils import match_language
 | 
					from searx.utils import match_language
 | 
				
			||||||
from searx.engines.google import _fetch_supported_languages, supported_languages_url  # NOQA # pylint: disable=unused-import
 | 
					from searx.engines.google import _fetch_supported_languages, supported_languages_url  # NOQA # pylint: disable=unused-import
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://news.google.com',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q12020',
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# search-url
 | 
					# search-url
 | 
				
			||||||
categories = ['news']
 | 
					categories = ['news']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,13 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Google (Videos)
 | 
					 Google (Videos)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://www.google.com
 | 
					 | 
				
			||||||
 @provide-api yes (https://developers.google.com/custom-search/)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no
 | 
					 | 
				
			||||||
 @results     HTML
 | 
					 | 
				
			||||||
 @stable      no
 | 
					 | 
				
			||||||
 @parse       url, title, content, thumbnail
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from datetime import date, timedelta
 | 
					from datetime import date, timedelta
 | 
				
			||||||
@ -16,6 +9,16 @@ from lxml import html
 | 
				
			|||||||
from searx.utils import extract_text, eval_xpath, eval_xpath_list, eval_xpath_getindex
 | 
					from searx.utils import extract_text, eval_xpath, eval_xpath_list, eval_xpath_getindex
 | 
				
			||||||
import re
 | 
					import re
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.google.com',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q219885',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://developers.google.com/custom-search/',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['videos']
 | 
					categories = ['videos']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,15 +1,7 @@
 | 
				
			|||||||
#  INA (Videos)
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
#
 | 
					"""
 | 
				
			||||||
# @website     https://www.ina.fr/
 | 
					 INA (Videos)
 | 
				
			||||||
# @provide-api no
 | 
					"""
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# @using-api   no
 | 
					 | 
				
			||||||
# @results     HTML (using search portal)
 | 
					 | 
				
			||||||
# @stable      no (HTML can change)
 | 
					 | 
				
			||||||
# @parse       url, title, content, publishedDate, thumbnail
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# @todo        set content-parameter with correct data
 | 
					 | 
				
			||||||
# @todo        embedded (needs some md5 from video page)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from html import unescape
 | 
					from html import unescape
 | 
				
			||||||
@ -18,6 +10,15 @@ from lxml import html
 | 
				
			|||||||
from dateutil import parser
 | 
					from dateutil import parser
 | 
				
			||||||
from searx.utils import extract_text
 | 
					from searx.utils import extract_text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.ina.fr/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q1665109',
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['videos']
 | 
					categories = ['videos']
 | 
				
			||||||
 | 
				
			|||||||
@ -1,17 +1,22 @@
 | 
				
			|||||||
# Invidious (Videos)
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
#
 | 
					"""
 | 
				
			||||||
# @website     https://invidio.us/
 | 
					 Invidious (Videos)
 | 
				
			||||||
# @provide-api yes (https://github.com/omarroth/invidious/wiki/API)
 | 
					"""
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# @using-api   yes
 | 
					 | 
				
			||||||
# @results     JSON
 | 
					 | 
				
			||||||
# @stable      yes
 | 
					 | 
				
			||||||
# @parse       url, title, content, publishedDate, thumbnail, embedded, author, length
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import quote_plus
 | 
					from urllib.parse import quote_plus
 | 
				
			||||||
from dateutil import parser
 | 
					from dateutil import parser
 | 
				
			||||||
import time
 | 
					import time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://instances.invidio.us/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q79343316',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://github.com/omarroth/invidious/wiki/API',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ["videos", "music"]
 | 
					categories = ["videos", "music"]
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,3 +1,5 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections.abc import Iterable
 | 
					from collections.abc import Iterable
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
 | 
				
			|||||||
@ -1,13 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Kickass Torrent (Videos, Music, Files)
 | 
					 Kickass Torrent (Videos, Music, Files)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://kickass.so
 | 
					 | 
				
			||||||
 @provide-api no (nothing found)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no
 | 
					 | 
				
			||||||
 @results     HTML (using search portal)
 | 
					 | 
				
			||||||
 @stable      yes (HTML can change)
 | 
					 | 
				
			||||||
 @parse       url, title, content, seed, leech, magnetlink
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
@ -15,6 +8,16 @@ from operator import itemgetter
 | 
				
			|||||||
from urllib.parse import quote, urljoin
 | 
					from urllib.parse import quote, urljoin
 | 
				
			||||||
from searx.utils import extract_text, get_torrent_size, convert_str_to_int
 | 
					from searx.utils import extract_text, get_torrent_size, convert_str_to_int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://kickass.so',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q17062285',
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['videos', 'music', 'files']
 | 
					categories = ['videos', 'music', 'files']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,21 +1,22 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 general mediawiki-engine (Web)
 | 
					 General mediawiki-engine (Web)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     websites built on mediawiki (https://www.mediawiki.org)
 | 
					 | 
				
			||||||
 @provide-api yes (http://www.mediawiki.org/wiki/API:Search)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     JSON
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, title
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @todo        content
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from string import Formatter
 | 
					from string import Formatter
 | 
				
			||||||
from urllib.parse import urlencode, quote
 | 
					from urllib.parse import urlencode, quote
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": None,
 | 
				
			||||||
 | 
					    "wikidata_id": None,
 | 
				
			||||||
 | 
					    "official_api_documentation": 'http://www.mediawiki.org/wiki/API:Search',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['general']
 | 
					categories = ['general']
 | 
				
			||||||
language_support = True
 | 
					language_support = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
Microsoft Academic (Science)
 | 
					 Microsoft Academic (Science)
 | 
				
			||||||
 | 
					 | 
				
			||||||
@website     https://academic.microsoft.com
 | 
					 | 
				
			||||||
@provide-api yes
 | 
					 | 
				
			||||||
@using-api   no
 | 
					 | 
				
			||||||
@results     JSON
 | 
					 | 
				
			||||||
@stable      no
 | 
					 | 
				
			||||||
@parse       url, title, content
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from datetime import datetime
 | 
					from datetime import datetime
 | 
				
			||||||
@ -15,6 +9,16 @@ from uuid import uuid4
 | 
				
			|||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
from searx.utils import html_to_text
 | 
					from searx.utils import html_to_text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://academic.microsoft.com',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q28136779',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'http://ma-graph.org/',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
categories = ['images']
 | 
					categories = ['images']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
result_url = 'https://academic.microsoft.com/api/search/GetEntityResults?{query}'
 | 
					result_url = 'https://academic.microsoft.com/api/search/GetEntityResults?{query}'
 | 
				
			||||||
 | 
				
			|||||||
@ -1,19 +1,22 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Mixcloud (Music)
 | 
					 Mixcloud (Music)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://http://www.mixcloud.com/
 | 
					 | 
				
			||||||
 @provide-api yes (http://www.mixcloud.com/developers/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     JSON
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, title, content, embedded, publishedDate
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from dateutil import parser
 | 
					from dateutil import parser
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.mixcloud.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q6883832',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'http://www.mixcloud.com/developers/',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['music']
 | 
					categories = ['music']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,19 +1,22 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 not Evil (Onions)
 | 
					 not Evil (Onions)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     http://hss3uro2hsxfogfq.onion
 | 
					 | 
				
			||||||
 @provide-api yes (http://hss3uro2hsxfogfq.onion/api.htm)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no
 | 
					 | 
				
			||||||
 @results     HTML
 | 
					 | 
				
			||||||
 @stable      no
 | 
					 | 
				
			||||||
 @parse       url, title, content
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from searx.engines.xpath import extract_text
 | 
					from searx.engines.xpath import extract_text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'http://hss3uro2hsxfogfq.onion',
 | 
				
			||||||
 | 
					    "wikidata_id": None,
 | 
				
			||||||
 | 
					    "official_api_documentation": 'http://hss3uro2hsxfogfq.onion/api.htm',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['onions']
 | 
					categories = ['onions']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,22 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Nyaa.si (Anime Bittorrent tracker)
 | 
					 Nyaa.si (Anime Bittorrent tracker)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website      https://nyaa.si/
 | 
					 | 
				
			||||||
 @provide-api  no
 | 
					 | 
				
			||||||
 @using-api    no
 | 
					 | 
				
			||||||
 @results      HTML
 | 
					 | 
				
			||||||
 @stable       no (HTML can change)
 | 
					 | 
				
			||||||
 @parse        url, title, content, seed, leech, torrentfile
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
from searx.utils import extract_text, get_torrent_size, int_or_zero
 | 
					from searx.utils import extract_text, get_torrent_size, int_or_zero
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://nyaa.si/',
 | 
				
			||||||
 | 
					    "wikidata_id": None,
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['files', 'images', 'videos', 'music']
 | 
					categories = ['files', 'images', 'videos', 'music']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,22 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
Open Semantic Search
 | 
					 Open Semantic Search
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website    https://www.opensemanticsearch.org/
 | 
					 | 
				
			||||||
 @provide-api yes (https://www.opensemanticsearch.org/dev)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api  yes
 | 
					 | 
				
			||||||
 @results    JSON
 | 
					 | 
				
			||||||
 @stable     yes
 | 
					 | 
				
			||||||
 @parse      url, title, content, publishedDate
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from dateutil import parser
 | 
					from dateutil import parser
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from urllib.parse import quote
 | 
					from urllib.parse import quote
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.opensemanticsearch.org/',
 | 
				
			||||||
 | 
					    "wikidata_id": None,
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://www.opensemanticsearch.org/dev',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
base_url = 'http://localhost:8983/solr/opensemanticsearch/'
 | 
					base_url = 'http://localhost:8983/solr/opensemanticsearch/'
 | 
				
			||||||
search_string = 'query?q={query}'
 | 
					search_string = 'query?q={query}'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,19 +1,22 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 OpenStreetMap (Map)
 | 
					 OpenStreetMap (Map)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://openstreetmap.org/
 | 
					 | 
				
			||||||
 @provide-api yes (http://wiki.openstreetmap.org/wiki/Nominatim)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     JSON
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, title
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import re
 | 
					import re
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from flask_babel import gettext
 | 
					from flask_babel import gettext
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.openstreetmap.org/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q936',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'http://wiki.openstreetmap.org/wiki/Nominatim',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['map']
 | 
					categories = ['map']
 | 
				
			||||||
paging = False
 | 
					paging = False
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,21 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 PDBe (Protein Data Bank in Europe)
 | 
					 PDBe (Protein Data Bank in Europe)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website       https://www.ebi.ac.uk/pdbe
 | 
					 | 
				
			||||||
 @provide-api   yes (https://www.ebi.ac.uk/pdbe/api/doc/search.html),
 | 
					 | 
				
			||||||
                unlimited
 | 
					 | 
				
			||||||
 @using-api     yes
 | 
					 | 
				
			||||||
 @results       python dictionary (from json)
 | 
					 | 
				
			||||||
 @stable        yes
 | 
					 | 
				
			||||||
 @parse         url, title, content, img_src
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from flask_babel import gettext
 | 
					from flask_babel import gettext
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.ebi.ac.uk/pdbe',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q55823905',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://www.ebi.ac.uk/pdbe/api/doc/search.html',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
categories = ['science']
 | 
					categories = ['science']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
hide_obsolete = False
 | 
					hide_obsolete = False
 | 
				
			||||||
 | 
				
			|||||||
@ -1,15 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 peertube (Videos)
 | 
					 peertube (Videos)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://www.peertube.live
 | 
					 | 
				
			||||||
 @provide-api yes (https://docs.joinpeertube.org/api-rest-reference.html)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     JSON
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, title, thumbnail, publishedDate, embedded
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @todo        implement time range support
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
@ -17,6 +8,16 @@ from datetime import datetime
 | 
				
			|||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
from searx.utils import html_to_text
 | 
					from searx.utils import html_to_text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://joinpeertube.org',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q50938515',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://docs.joinpeertube.org/api-rest-reference.html',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ["videos"]
 | 
					categories = ["videos"]
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,19 +1,22 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Photon (Map)
 | 
					 Photon (Map)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://photon.komoot.de
 | 
					 | 
				
			||||||
 @provide-api yes (https://photon.komoot.de/)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     JSON
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, title
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
from searx.utils import searx_useragent
 | 
					from searx.utils import searx_useragent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://photon.komoot.de',
 | 
				
			||||||
 | 
					    "wikidata_id": None,
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://photon.komoot.de/',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['map']
 | 
					categories = ['map']
 | 
				
			||||||
paging = False
 | 
					paging = False
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +1,7 @@
 | 
				
			|||||||
#  Piratebay (Videos, Music, Files)
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
#
 | 
					"""
 | 
				
			||||||
# @website     https://thepiratebay.org
 | 
					 Piratebay (Videos, Music, Files)
 | 
				
			||||||
# @provide-api yes (https://apibay.org/)
 | 
					"""
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# @using-api   yes
 | 
					 | 
				
			||||||
# @results     JSON
 | 
					 | 
				
			||||||
# @stable      no (the API is not documented nor versioned)
 | 
					 | 
				
			||||||
# @parse       url, title, seed, leech, magnetlink, filesize, publishedDate
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from datetime import datetime
 | 
					from datetime import datetime
 | 
				
			||||||
@ -15,6 +10,16 @@ from operator import itemgetter
 | 
				
			|||||||
from urllib.parse import quote
 | 
					from urllib.parse import quote
 | 
				
			||||||
from searx.utils import get_torrent_size
 | 
					from searx.utils import get_torrent_size
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://thepiratebay.org',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q22663',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://apibay.org/',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ["videos", "music", "files"]
 | 
					categories = ["videos", "music", "files"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,14 +1,6 @@
 | 
				
			|||||||
#!/usr/bin/env python
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 PubMed (Scholar publications)
 | 
					 PubMed (Scholar publications)
 | 
				
			||||||
 @website     https://www.ncbi.nlm.nih.gov/pubmed/
 | 
					 | 
				
			||||||
 @provide-api yes (https://www.ncbi.nlm.nih.gov/home/develop/api/)
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     XML
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, title, publishedDate, content
 | 
					 | 
				
			||||||
 More info on api: https://www.ncbi.nlm.nih.gov/books/NBK25501/
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from flask_babel import gettext
 | 
					from flask_babel import gettext
 | 
				
			||||||
@ -17,6 +9,18 @@ from datetime import datetime
 | 
				
			|||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
from searx.poolrequests import get
 | 
					from searx.poolrequests import get
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.ncbi.nlm.nih.gov/pubmed/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q1540899',
 | 
				
			||||||
 | 
					    "official_api_documentation": {
 | 
				
			||||||
 | 
					        'url': 'https://www.ncbi.nlm.nih.gov/home/develop/api/',
 | 
				
			||||||
 | 
					        'comment': 'More info on api: https://www.ncbi.nlm.nih.gov/books/NBK25501/'
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'XML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
categories = ['science']
 | 
					categories = ['science']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,13 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Qwant (Web, Images, News, Social)
 | 
					 Qwant (Web, Images, News, Social)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://qwant.com/
 | 
					 | 
				
			||||||
 @provide-api not officially (https://api.qwant.com/api/search/)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     JSON
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, title, content
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from datetime import datetime
 | 
					from datetime import datetime
 | 
				
			||||||
@ -17,6 +10,15 @@ from searx.utils import html_to_text, match_language
 | 
				
			|||||||
from searx.exceptions import SearxEngineAPIException, SearxEngineCaptchaException
 | 
					from searx.exceptions import SearxEngineAPIException, SearxEngineCaptchaException
 | 
				
			||||||
from searx.raise_for_httperror import raise_for_httperror
 | 
					from searx.raise_for_httperror import raise_for_httperror
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.qwant.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q14657870',
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = []
 | 
					categories = []
 | 
				
			||||||
 | 
				
			|||||||
@ -1,17 +1,22 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Recoll (local search engine)
 | 
					 Recoll (local search engine)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     JSON
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, content, size, abstract, author, mtype, subtype, time, \
 | 
					 | 
				
			||||||
              filename, label, type, embedded
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from datetime import date, timedelta
 | 
					from datetime import date, timedelta
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from urllib.parse import urlencode, quote
 | 
					from urllib.parse import urlencode, quote
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": None,
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q15735774',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://www.lesbonscomptes.com/recoll/',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
time_range_support = True
 | 
					time_range_support = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,19 +1,22 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Reddit
 | 
					 Reddit
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website      https://www.reddit.com/
 | 
					 | 
				
			||||||
 @provide-api  yes (https://www.reddit.com/dev/api)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api    yes
 | 
					 | 
				
			||||||
 @results      JSON
 | 
					 | 
				
			||||||
 @stable       yes
 | 
					 | 
				
			||||||
 @parse        url, title, content, thumbnail, publishedDate
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import json
 | 
					import json
 | 
				
			||||||
from datetime import datetime
 | 
					from datetime import datetime
 | 
				
			||||||
from urllib.parse import urlencode, urljoin, urlparse
 | 
					from urllib.parse import urlencode, urljoin, urlparse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.reddit.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q1136',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://www.reddit.com/dev/api',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['general', 'images', 'news', 'social media']
 | 
					categories = ['general', 'images', 'news', 'social media']
 | 
				
			||||||
page_size = 25
 | 
					page_size = 25
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,21 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 ScanR Structures (Science)
 | 
					 ScanR Structures (Science)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://scanr.enseignementsup-recherche.gouv.fr
 | 
					 | 
				
			||||||
 @provide-api yes (https://scanr.enseignementsup-recherche.gouv.fr/api/swagger-ui.html)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     JSON
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, title, content, img_src
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads, dumps
 | 
					from json import loads, dumps
 | 
				
			||||||
from searx.utils import html_to_text
 | 
					from searx.utils import html_to_text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://scanr.enseignementsup-recherche.gouv.fr',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q44105684',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://scanr.enseignementsup-recherche.gouv.fr/opendata',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['science']
 | 
					categories = ['science']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,20 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Searchcode (It)
 | 
					 Searchcode (IT)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://searchcode.com/
 | 
					 | 
				
			||||||
 @provide-api yes (https://searchcode.com/api/)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     JSON
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, title, content
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://searchcode.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": None,
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://searchcode.com/api/',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['it']
 | 
					categories = ['it']
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,20 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Searx (all)
 | 
					 Searx (all)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://github.com/searx/searx
 | 
					 | 
				
			||||||
 @provide-api yes (https://searx.github.io/searx/dev/search_api.html)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     JSON
 | 
					 | 
				
			||||||
 @stable      yes (using api)
 | 
					 | 
				
			||||||
 @parse       url, title, content
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from searx.engines import categories as searx_categories
 | 
					from searx.engines import categories as searx_categories
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://github.com/searx/searx',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q17639196',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://searx.github.io/searx/dev/search_api.html',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
categories = searx_categories.keys()
 | 
					categories = searx_categories.keys()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,17 +1,23 @@
 | 
				
			|||||||
# SepiaSearch (Videos)
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
#
 | 
					"""
 | 
				
			||||||
# @website     https://sepiasearch.org
 | 
					 SepiaSearch (Videos)
 | 
				
			||||||
# @provide-api https://framagit.org/framasoft/peertube/search-index/-/tree/master/server/controllers/api
 | 
					"""
 | 
				
			||||||
# @using-api   yes
 | 
					 | 
				
			||||||
# @results     JSON
 | 
					 | 
				
			||||||
# @stable      yes
 | 
					 | 
				
			||||||
# @parse       url, title, content, publishedDate, thumbnail
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from dateutil import parser, relativedelta
 | 
					from dateutil import parser, relativedelta
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
from datetime import datetime
 | 
					from datetime import datetime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://sepiasearch.org',
 | 
				
			||||||
 | 
					    "wikidata_id": None,
 | 
				
			||||||
 | 
					    "official_api_documentation": "https://framagit.org/framasoft/peertube/search-index/-/tree/master/server/controllers/api",  # NOQA
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
categories = ['videos']
 | 
					categories = ['videos']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
language_support = True
 | 
					language_support = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,13 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Soundcloud (Music)
 | 
					 Soundcloud (Music)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://soundcloud.com
 | 
					 | 
				
			||||||
 @provide-api yes (https://developers.soundcloud.com/)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     JSON
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, title, content, publishedDate, embedded
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import re
 | 
					import re
 | 
				
			||||||
@ -18,6 +11,15 @@ from urllib.parse import quote_plus, urlencode
 | 
				
			|||||||
from searx import logger
 | 
					from searx import logger
 | 
				
			||||||
from searx.poolrequests import get as http_get
 | 
					from searx.poolrequests import get as http_get
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://soundcloud.com',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q568769',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://developers.soundcloud.com/',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['music']
 | 
					categories = ['music']
 | 
				
			||||||
 | 
				
			|||||||
@ -1,13 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Spotify (Music)
 | 
					 Spotify (Music)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://spotify.com
 | 
					 | 
				
			||||||
 @provide-api yes (https://developer.spotify.com/web-api/search-item/)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     JSON
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, title, content, embedded
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
@ -15,6 +8,16 @@ from urllib.parse import urlencode
 | 
				
			|||||||
import requests
 | 
					import requests
 | 
				
			||||||
import base64
 | 
					import base64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.spotify.com',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q689141',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://developer.spotify.com/web-api/search-item/',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['music']
 | 
					categories = ['music']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,13 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Stackoverflow (It)
 | 
					 Stackoverflow (IT)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://stackoverflow.com/
 | 
					 | 
				
			||||||
 @provide-api not clear (https://api.stackexchange.com/docs/advanced-search)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no
 | 
					 | 
				
			||||||
 @results     HTML
 | 
					 | 
				
			||||||
 @stable      no (HTML can change)
 | 
					 | 
				
			||||||
 @parse       url, title, content
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import urlencode, urljoin, urlparse
 | 
					from urllib.parse import urlencode, urljoin, urlparse
 | 
				
			||||||
@ -15,6 +8,16 @@ from lxml import html
 | 
				
			|||||||
from searx.utils import extract_text
 | 
					from searx.utils import extract_text
 | 
				
			||||||
from searx.exceptions import SearxEngineCaptchaException
 | 
					from searx.exceptions import SearxEngineCaptchaException
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://stackoverflow.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q549037',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://api.stackexchange.com/docs',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['it']
 | 
					categories = ['it']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,14 +1,7 @@
 | 
				
			|||||||
#  Startpage (Web)
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
#
 | 
					"""
 | 
				
			||||||
# @website     https://startpage.com
 | 
					 Startpage (Web)
 | 
				
			||||||
# @provide-api no (nothing found)
 | 
					"""
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# @using-api   no
 | 
					 | 
				
			||||||
# @results     HTML
 | 
					 | 
				
			||||||
# @stable      no (HTML can change)
 | 
					 | 
				
			||||||
# @parse       url, title, content
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# @todo        paging
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from dateutil import parser
 | 
					from dateutil import parser
 | 
				
			||||||
@ -19,6 +12,16 @@ from babel import Locale
 | 
				
			|||||||
from babel.localedata import locale_identifiers
 | 
					from babel.localedata import locale_identifiers
 | 
				
			||||||
from searx.utils import extract_text, eval_xpath, match_language
 | 
					from searx.utils import extract_text, eval_xpath, match_language
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://startpage.com',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q2333295',
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['general']
 | 
					categories = ['general']
 | 
				
			||||||
# there is a mechanism to block "bot" search
 | 
					# there is a mechanism to block "bot" search
 | 
				
			||||||
 | 
				
			|||||||
@ -1,13 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Tokyo Toshokan (A BitTorrent Library for Japanese Media)
 | 
					 Tokyo Toshokan (A BitTorrent Library for Japanese Media)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website      https://www.tokyotosho.info/
 | 
					 | 
				
			||||||
 @provide-api  no
 | 
					 | 
				
			||||||
 @using-api    no
 | 
					 | 
				
			||||||
 @results      HTML
 | 
					 | 
				
			||||||
 @stable       no (HTML can change)
 | 
					 | 
				
			||||||
 @parse        url, title, publishedDate, seed, leech,
 | 
					 | 
				
			||||||
               filesize, magnetlink, content
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import re
 | 
					import re
 | 
				
			||||||
@ -16,6 +9,16 @@ from lxml import html
 | 
				
			|||||||
from datetime import datetime
 | 
					from datetime import datetime
 | 
				
			||||||
from searx.utils import extract_text, get_torrent_size, int_or_zero
 | 
					from searx.utils import extract_text, get_torrent_size, int_or_zero
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.tokyotosho.info/',
 | 
				
			||||||
 | 
					    "wikidata_id": None,
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['files', 'videos', 'music']
 | 
					categories = ['files', 'videos', 'music']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,14 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Torrentz2.is (BitTorrent meta-search engine)
 | 
					 Torrentz2.is (BitTorrent meta-search engine)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website      https://torrentz2.is/
 | 
					 | 
				
			||||||
 @provide-api  no
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api    no
 | 
					 | 
				
			||||||
 @results      HTML
 | 
					 | 
				
			||||||
 @stable       no (HTML can change, although unlikely,
 | 
					 | 
				
			||||||
                   see https://torrentz.is/torrentz.btsearch)
 | 
					 | 
				
			||||||
 @parse        url, title, publishedDate, seed, leech, filesize, magnetlink
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import re
 | 
					import re
 | 
				
			||||||
@ -17,6 +9,16 @@ from lxml import html
 | 
				
			|||||||
from datetime import datetime
 | 
					from datetime import datetime
 | 
				
			||||||
from searx.utils import extract_text, get_torrent_size
 | 
					from searx.utils import extract_text, get_torrent_size
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://torrentz2.is/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q1156687',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://torrentz.is/torrentz.btsearch',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['files', 'videos', 'music']
 | 
					categories = ['files', 'videos', 'music']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,14 +1,18 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 MyMemory Translated
 | 
					 MyMemory Translated
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://mymemory.translated.net/
 | 
					 | 
				
			||||||
 @provide-api yes (https://mymemory.translated.net/doc/spec.php)
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     JSON
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, title, content
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://mymemory.translated.net/',
 | 
				
			||||||
 | 
					    "wikidata_id": None,
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://mymemory.translated.net/doc/spec.php',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
engine_type = 'online_dictionnary'
 | 
					engine_type = 'online_dictionnary'
 | 
				
			||||||
categories = ['general']
 | 
					categories = ['general']
 | 
				
			||||||
url = 'https://api.mymemory.translated.net/get?q={query}&langpair={from_lang}|{to_lang}{key}'
 | 
					url = 'https://api.mymemory.translated.net/get?q={query}&langpair={from_lang}|{to_lang}{key}'
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,21 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Unsplash
 | 
					 Unsplash
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://unsplash.com
 | 
					 | 
				
			||||||
 @provide-api yes (https://unsplash.com/developers)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no
 | 
					 | 
				
			||||||
 @results     JSON (using search portal's infiniscroll API)
 | 
					 | 
				
			||||||
 @stable      no (JSON format could change any time)
 | 
					 | 
				
			||||||
 @parse       url, title, img_src, thumbnail_src
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import urlencode, urlparse, urlunparse, parse_qsl
 | 
					from urllib.parse import urlencode, urlparse, urlunparse, parse_qsl
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://unsplash.com',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q28233552',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://unsplash.com/developers',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
url = 'https://unsplash.com/'
 | 
					url = 'https://unsplash.com/'
 | 
				
			||||||
search_url = url + 'napi/search/photos?'
 | 
					search_url = url + 'napi/search/photos?'
 | 
				
			||||||
categories = ['images']
 | 
					categories = ['images']
 | 
				
			||||||
 | 
				
			|||||||
@ -1,21 +1,22 @@
 | 
				
			|||||||
#  Vimeo (Videos)
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
#
 | 
					"""
 | 
				
			||||||
# @website     https://vimeo.com/
 | 
					 Wikipedia (Web
 | 
				
			||||||
# @provide-api yes (http://developer.vimeo.com/api),
 | 
					"""
 | 
				
			||||||
#              they have a maximum count of queries/hour
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# @using-api   no (TODO, rewrite to api)
 | 
					 | 
				
			||||||
# @results     HTML (using search portal)
 | 
					 | 
				
			||||||
# @stable      no (HTML can change)
 | 
					 | 
				
			||||||
# @parse       url, title, publishedDate,  thumbnail, embedded
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# @todo        rewrite to api
 | 
					 | 
				
			||||||
# @todo        set content-parameter with correct data
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from dateutil import parser
 | 
					from dateutil import parser
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://vimeo.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q156376',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'http://developer.vimeo.com/api',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['videos']
 | 
					categories = ['videos']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,14 +1,6 @@
 | 
				
			|||||||
# -*- coding: utf-8 -*-
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Wikidata
 | 
					 Wikidata
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://wikidata.org
 | 
					 | 
				
			||||||
 @provide-api yes (https://query.wikidata.org/)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     JSON
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, infobox
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -27,6 +19,16 @@ from searx.engines.wikipedia import _fetch_supported_languages, supported_langua
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
logger = logger.getChild('wikidata')
 | 
					logger = logger.getChild('wikidata')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://wikidata.org/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q2013',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://query.wikidata.org/',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# SPARQL
 | 
					# SPARQL
 | 
				
			||||||
SPARQL_ENDPOINT_URL = 'https://query.wikidata.org/sparql'
 | 
					SPARQL_ENDPOINT_URL = 'https://query.wikidata.org/sparql'
 | 
				
			||||||
SPARQL_EXPLAIN_URL = 'https://query.wikidata.org/bigdata/namespace/wdq/sparql?explain'
 | 
					SPARQL_EXPLAIN_URL = 'https://query.wikidata.org/bigdata/namespace/wdq/sparql?explain'
 | 
				
			||||||
 | 
				
			|||||||
@ -1,13 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Wikipedia (Web)
 | 
					 Wikipedia (Web)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://en.wikipedia.org/api/rest_v1/
 | 
					 | 
				
			||||||
 @provide-api yes
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   yes
 | 
					 | 
				
			||||||
 @results     JSON
 | 
					 | 
				
			||||||
 @stable      yes
 | 
					 | 
				
			||||||
 @parse       url, infobox
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import quote
 | 
					from urllib.parse import quote
 | 
				
			||||||
@ -16,6 +9,16 @@ from lxml.html import fromstring
 | 
				
			|||||||
from searx.utils import match_language, searx_useragent
 | 
					from searx.utils import match_language, searx_useragent
 | 
				
			||||||
from searx.raise_for_httperror import raise_for_httperror
 | 
					from searx.raise_for_httperror import raise_for_httperror
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.wikipedia.org/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q52',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://en.wikipedia.org/api/',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# search-url
 | 
					# search-url
 | 
				
			||||||
search_url = 'https://{language}.wikipedia.org/api/rest_v1/page/summary/{title}'
 | 
					search_url = 'https://{language}.wikipedia.org/api/rest_v1/page/summary/{title}'
 | 
				
			||||||
supported_languages_url = 'https://meta.wikimedia.org/wiki/List_of_Wikipedias'
 | 
					supported_languages_url = 'https://meta.wikimedia.org/wiki/List_of_Wikipedias'
 | 
				
			||||||
 | 
				
			|||||||
@ -1,16 +1,21 @@
 | 
				
			|||||||
# Wolfram Alpha (Science)
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
#
 | 
					"""
 | 
				
			||||||
# @website     https://www.wolframalpha.com
 | 
					 Wolfram|Alpha (Science)
 | 
				
			||||||
# @provide-api yes (https://api.wolframalpha.com/v2/)
 | 
					"""
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# @using-api   yes
 | 
					 | 
				
			||||||
# @results     XML
 | 
					 | 
				
			||||||
# @stable      yes
 | 
					 | 
				
			||||||
# @parse       url, infobox
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from lxml import etree
 | 
					from lxml import etree
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.wolframalpha.com',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q207006',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://products.wolframalpha.com/api/',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'XML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# search-url
 | 
					# search-url
 | 
				
			||||||
search_url = 'https://api.wolframalpha.com/v2/query?appid={api_key}&{query}'
 | 
					search_url = 'https://api.wolframalpha.com/v2/query?appid={api_key}&{query}'
 | 
				
			||||||
site_url = 'https://www.wolframalpha.com/input/?{query}'
 | 
					site_url = 'https://www.wolframalpha.com/input/?{query}'
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +1,7 @@
 | 
				
			|||||||
# Wolfram|Alpha (Science)
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
#
 | 
					"""
 | 
				
			||||||
# @website     https://www.wolframalpha.com/
 | 
					 Wolfram|Alpha (Science)
 | 
				
			||||||
# @provide-api yes (https://api.wolframalpha.com/v2/)
 | 
					"""
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# @using-api   no
 | 
					 | 
				
			||||||
# @results     JSON
 | 
					 | 
				
			||||||
# @stable      no
 | 
					 | 
				
			||||||
# @parse       url, infobox
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from time import time
 | 
					from time import time
 | 
				
			||||||
@ -14,6 +9,16 @@ from urllib.parse import urlencode
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from searx.poolrequests import get as http_get
 | 
					from searx.poolrequests import get as http_get
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.wolframalpha.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q207006',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://products.wolframalpha.com/api/',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# search-url
 | 
					# search-url
 | 
				
			||||||
url = 'https://www.wolframalpha.com/'
 | 
					url = 'https://www.wolframalpha.com/'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,19 +1,22 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 1x (Images)
 | 
					 1x (Images)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     http://1x.com/
 | 
					 | 
				
			||||||
 @provide-api no
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no
 | 
					 | 
				
			||||||
 @results     HTML
 | 
					 | 
				
			||||||
 @stable      no (HTML can change)
 | 
					 | 
				
			||||||
 @parse       url, title, thumbnail
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from lxml import html, etree
 | 
					from lxml import html, etree
 | 
				
			||||||
from urllib.parse import urlencode, urljoin
 | 
					from urllib.parse import urlencode, urljoin
 | 
				
			||||||
from searx.utils import extract_text, eval_xpath_list, eval_xpath_getindex
 | 
					from searx.utils import extract_text, eval_xpath_list, eval_xpath_getindex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://1x.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": None,
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['images']
 | 
					categories = ['images']
 | 
				
			||||||
paging = False
 | 
					paging = False
 | 
				
			||||||
 | 
				
			|||||||
@ -1,3 +1,5 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
from searx.utils import extract_text, extract_url, eval_xpath, eval_xpath_list
 | 
					from searx.utils import extract_text, extract_url, eval_xpath, eval_xpath_list
 | 
				
			||||||
 | 
				
			|||||||
@ -1,16 +1,7 @@
 | 
				
			|||||||
# Yacy (Web, Images, Videos, Music, Files)
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
#
 | 
					"""
 | 
				
			||||||
# @website     http://yacy.net
 | 
					 Yacy (Web, Images, Videos, Music, Files)
 | 
				
			||||||
# @provide-api yes
 | 
					"""
 | 
				
			||||||
#              (http://www.yacy-websuche.de/wiki/index.php/Dev:APIyacysearch)
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# @using-api   yes
 | 
					 | 
				
			||||||
# @results     JSON
 | 
					 | 
				
			||||||
# @stable      yes
 | 
					 | 
				
			||||||
# @parse       (general)    url, title, content, publishedDate
 | 
					 | 
				
			||||||
# @parse       (images)     url, title, img_src
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# @todo        parse video, audio and file results
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from dateutil import parser
 | 
					from dateutil import parser
 | 
				
			||||||
@ -20,6 +11,16 @@ from requests.auth import HTTPDigestAuth
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from searx.utils import html_to_text
 | 
					from searx.utils import html_to_text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://yacy.net/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q1759675',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://wiki.yacy.net/index.php/Dev:API',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['general', 'images']  # TODO , 'music', 'videos', 'files'
 | 
					categories = ['general', 'images']  # TODO , 'music', 'videos', 'files'
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,20 +1,22 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Yahoo (Web)
 | 
					 Yahoo (Web)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://search.yahoo.com/web
 | 
					 | 
				
			||||||
 @provide-api yes (https://developer.yahoo.com/boss/search/),
 | 
					 | 
				
			||||||
              $0.80/1000 queries
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 @using-api   no (because pricing)
 | 
					 | 
				
			||||||
 @results     HTML (using search portal)
 | 
					 | 
				
			||||||
 @stable      no (HTML can change)
 | 
					 | 
				
			||||||
 @parse       url, title, content, suggestion
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import unquote, urlencode
 | 
					from urllib.parse import unquote, urlencode
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from searx.utils import extract_text, extract_url, match_language, eval_xpath
 | 
					from searx.utils import extract_text, extract_url, match_language, eval_xpath
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://search.yahoo.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": None,
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://developer.yahoo.com/api/',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['general']
 | 
					categories = ['general']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,13 +1,7 @@
 | 
				
			|||||||
# Yahoo (News)
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
#
 | 
					"""
 | 
				
			||||||
# @website     https://news.yahoo.com
 | 
					 Yahoo (News)
 | 
				
			||||||
# @provide-api yes (https://developer.yahoo.com/boss/search/)
 | 
					"""
 | 
				
			||||||
#              $0.80/1000 queries
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# @using-api   no (because pricing)
 | 
					 | 
				
			||||||
# @results     HTML (using search portal)
 | 
					 | 
				
			||||||
# @stable      no (HTML can change)
 | 
					 | 
				
			||||||
# @parse       url, title, content, publishedDate
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import re
 | 
					import re
 | 
				
			||||||
from datetime import datetime, timedelta
 | 
					from datetime import datetime, timedelta
 | 
				
			||||||
@ -18,6 +12,16 @@ from searx.engines.yahoo import _fetch_supported_languages, supported_languages_
 | 
				
			|||||||
from dateutil import parser
 | 
					from dateutil import parser
 | 
				
			||||||
from searx.utils import extract_text, extract_url, match_language
 | 
					from searx.utils import extract_text, extract_url, match_language
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://news.yahoo.com',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q3044717',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://developer.yahoo.com/api/',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['news']
 | 
					categories = ['news']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +1,6 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 Yahoo (Web)
 | 
					 Yahoo (Web)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 @website     https://yandex.ru/
 | 
					 | 
				
			||||||
 @provide-api ?
 | 
					 | 
				
			||||||
 @using-api   no
 | 
					 | 
				
			||||||
 @results     HTML (using search portal)
 | 
					 | 
				
			||||||
 @stable      no (HTML can change)
 | 
					 | 
				
			||||||
 @parse       url, title, content
 | 
					 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import urlencode, urlparse
 | 
					from urllib.parse import urlencode, urlparse
 | 
				
			||||||
@ -16,6 +10,16 @@ from searx.exceptions import SearxEngineCaptchaException
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
logger = logger.getChild('yandex engine')
 | 
					logger = logger.getChild('yandex engine')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://yandex.ru/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q5281',
 | 
				
			||||||
 | 
					    "official_api_documentation": "?",
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['general']
 | 
					categories = ['general']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +1,7 @@
 | 
				
			|||||||
#  Yggtorrent (Videos, Music, Files)
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
#
 | 
					"""
 | 
				
			||||||
# @website     https://www2.yggtorrent.si
 | 
					 Yggtorrent (Videos, Music, Files)
 | 
				
			||||||
# @provide-api no (nothing found)
 | 
					"""
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# @using-api   no
 | 
					 | 
				
			||||||
# @results     HTML (using search portal)
 | 
					 | 
				
			||||||
# @stable      no (HTML can change)
 | 
					 | 
				
			||||||
# @parse       url, title, seed, leech, publishedDate, filesize
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from operator import itemgetter
 | 
					from operator import itemgetter
 | 
				
			||||||
@ -15,6 +10,16 @@ from urllib.parse import quote
 | 
				
			|||||||
from searx.utils import extract_text, get_torrent_size
 | 
					from searx.utils import extract_text, get_torrent_size
 | 
				
			||||||
from searx.poolrequests import get as http_get
 | 
					from searx.poolrequests import get as http_get
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www2.yggtorrent.si',
 | 
				
			||||||
 | 
					    "wikidata_id": None,
 | 
				
			||||||
 | 
					    "official_api_documentation": None,
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['videos', 'music', 'files']
 | 
					categories = ['videos', 'music', 'files']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,23 @@
 | 
				
			|||||||
# Youtube (Videos)
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
#
 | 
					"""
 | 
				
			||||||
# @website     https://www.youtube.com/
 | 
					 Youtube (Videos)
 | 
				
			||||||
# @provide-api yes (https://developers.google.com/apis-explorer/#p/youtube/v3/youtube.search.list)
 | 
					"""
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# @using-api   yes
 | 
					 | 
				
			||||||
# @results     JSON
 | 
					 | 
				
			||||||
# @stable      yes
 | 
					 | 
				
			||||||
# @parse       url, title, content, publishedDate, thumbnail, embedded
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from dateutil import parser
 | 
					from dateutil import parser
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
from searx.exceptions import SearxEngineAPIException
 | 
					from searx.exceptions import SearxEngineAPIException
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.youtube.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q866',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://developers.google.com/youtube/v3/docs/search/list?apix=true',
 | 
				
			||||||
 | 
					    "use_official_api": True,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'JSON',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['videos', 'music']
 | 
					categories = ['videos', 'music']
 | 
				
			||||||
paging = False
 | 
					paging = False
 | 
				
			||||||
 | 
				
			|||||||
@ -1,17 +1,22 @@
 | 
				
			|||||||
# Youtube (Videos)
 | 
					# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
#
 | 
					"""
 | 
				
			||||||
# @website     https://www.youtube.com/
 | 
					 Youtube (Videos)
 | 
				
			||||||
# @provide-api yes (https://developers.google.com/apis-explorer/#p/youtube/v3/youtube.search.list)
 | 
					"""
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# @using-api   no
 | 
					 | 
				
			||||||
# @results     HTML
 | 
					 | 
				
			||||||
# @stable      no
 | 
					 | 
				
			||||||
# @parse       url, title, content, publishedDate, thumbnail, embedded
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from functools import reduce
 | 
					from functools import reduce
 | 
				
			||||||
from json import loads
 | 
					from json import loads
 | 
				
			||||||
from urllib.parse import quote_plus
 | 
					from urllib.parse import quote_plus
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# about
 | 
				
			||||||
 | 
					about = {
 | 
				
			||||||
 | 
					    "website": 'https://www.youtube.com/',
 | 
				
			||||||
 | 
					    "wikidata_id": 'Q866',
 | 
				
			||||||
 | 
					    "official_api_documentation": 'https://developers.google.com/youtube/v3/docs/search/list?apix=true',
 | 
				
			||||||
 | 
					    "use_official_api": False,
 | 
				
			||||||
 | 
					    "require_api_key": False,
 | 
				
			||||||
 | 
					    "results": 'HTML',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['videos', 'music']
 | 
					categories = ['videos', 'music']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
				
			|||||||
@ -157,6 +157,13 @@ engines:
 | 
				
			|||||||
    timeout : 7.0
 | 
					    timeout : 7.0
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
    shortcut : ai
 | 
					    shortcut : ai
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://archive.is/
 | 
				
			||||||
 | 
					      wikidata_id: Q13515725
 | 
				
			||||||
 | 
					      official_api_documentation: http://mementoweb.org/depot/native/archiveis/
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : arxiv
 | 
					  - name : arxiv
 | 
				
			||||||
    engine : arxiv
 | 
					    engine : arxiv
 | 
				
			||||||
@ -201,6 +208,13 @@ engines:
 | 
				
			|||||||
    timeout : 4.0
 | 
					    timeout : 4.0
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
    shortcut : bb
 | 
					    shortcut : bb
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://bitbucket.org/
 | 
				
			||||||
 | 
					      wikidata_id: Q2493781
 | 
				
			||||||
 | 
					      official_api_documentation: https://developer.atlassian.com/bitbucket
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : btdigg
 | 
					  - name : btdigg
 | 
				
			||||||
    engine : btdigg
 | 
					    engine : btdigg
 | 
				
			||||||
@ -216,6 +230,13 @@ engines:
 | 
				
			|||||||
    categories : videos
 | 
					    categories : videos
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
    shortcut : c3tv
 | 
					    shortcut : c3tv
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://media.ccc.de/
 | 
				
			||||||
 | 
					      wikidata_id: Q80729951
 | 
				
			||||||
 | 
					      official_api_documentation: https://github.com/voc/voctoweb
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : crossref
 | 
					  - name : crossref
 | 
				
			||||||
    engine : json_engine
 | 
					    engine : json_engine
 | 
				
			||||||
@ -226,6 +247,13 @@ engines:
 | 
				
			|||||||
    content_query : fullCitation
 | 
					    content_query : fullCitation
 | 
				
			||||||
    categories : science
 | 
					    categories : science
 | 
				
			||||||
    shortcut : cr
 | 
					    shortcut : cr
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://www.crossref.org/
 | 
				
			||||||
 | 
					      wikidata_id: Q5188229
 | 
				
			||||||
 | 
					      official_api_documentation: https://github.com/CrossRef/rest-api-doc
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: JSON
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : currency
 | 
					  - name : currency
 | 
				
			||||||
    engine : currency_convert
 | 
					    engine : currency_convert
 | 
				
			||||||
@ -271,6 +299,13 @@ engines:
 | 
				
			|||||||
    categories : general
 | 
					    categories : general
 | 
				
			||||||
    shortcut : ew
 | 
					    shortcut : ew
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://www.erowid.org/
 | 
				
			||||||
 | 
					      wikidata_id: Q1430691
 | 
				
			||||||
 | 
					      official_api_documentation:
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#  - name : elasticsearch
 | 
					#  - name : elasticsearch
 | 
				
			||||||
#    shortcut : es
 | 
					#    shortcut : es
 | 
				
			||||||
@ -321,6 +356,13 @@ engines:
 | 
				
			|||||||
    first_page_num : 1
 | 
					    first_page_num : 1
 | 
				
			||||||
    shortcut : et
 | 
					    shortcut : et
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://www.etymonline.com/
 | 
				
			||||||
 | 
					      wikidata_id: Q1188617
 | 
				
			||||||
 | 
					      official_api_documentation:
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#  - name : ebay
 | 
					#  - name : ebay
 | 
				
			||||||
#    engine : ebay
 | 
					#    engine : ebay
 | 
				
			||||||
@ -360,6 +402,9 @@ engines:
 | 
				
			|||||||
    search_type : title
 | 
					    search_type : title
 | 
				
			||||||
    timeout : 5.0
 | 
					    timeout : 5.0
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://directory.fsf.org/
 | 
				
			||||||
 | 
					      wikidata_id: Q2470288
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : frinkiac
 | 
					  - name : frinkiac
 | 
				
			||||||
    engine : frinkiac
 | 
					    engine : frinkiac
 | 
				
			||||||
@ -394,6 +439,13 @@ engines:
 | 
				
			|||||||
    shortcut : gl
 | 
					    shortcut : gl
 | 
				
			||||||
    timeout : 10.0
 | 
					    timeout : 10.0
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://about.gitlab.com/
 | 
				
			||||||
 | 
					      wikidata_id: Q16639197
 | 
				
			||||||
 | 
					      official_api_documentation: https://docs.gitlab.com/ee/api/
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: JSON
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : github
 | 
					  - name : github
 | 
				
			||||||
    engine : github
 | 
					    engine : github
 | 
				
			||||||
@ -411,6 +463,13 @@ engines:
 | 
				
			|||||||
    categories : it
 | 
					    categories : it
 | 
				
			||||||
    shortcut : cb
 | 
					    shortcut : cb
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://codeberg.org/
 | 
				
			||||||
 | 
					      wikidata_id:
 | 
				
			||||||
 | 
					      official_api_documentation: https://try.gitea.io/api/swagger
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: JSON
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : google
 | 
					  - name : google
 | 
				
			||||||
    engine : google
 | 
					    engine : google
 | 
				
			||||||
@ -441,6 +500,13 @@ engines:
 | 
				
			|||||||
    first_page_num : 0
 | 
					    first_page_num : 0
 | 
				
			||||||
    categories : science
 | 
					    categories : science
 | 
				
			||||||
    shortcut : gos
 | 
					    shortcut : gos
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://scholar.google.com/
 | 
				
			||||||
 | 
					      wikidata_id: Q494817
 | 
				
			||||||
 | 
					      official_api_documentation:
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : google play apps
 | 
					  - name : google play apps
 | 
				
			||||||
    engine : xpath
 | 
					    engine : xpath
 | 
				
			||||||
@ -453,6 +519,13 @@ engines:
 | 
				
			|||||||
    categories : files
 | 
					    categories : files
 | 
				
			||||||
    shortcut : gpa
 | 
					    shortcut : gpa
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://play.google.com/
 | 
				
			||||||
 | 
					      wikidata_id: Q79576
 | 
				
			||||||
 | 
					      official_api_documentation:
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : google play movies
 | 
					  - name : google play movies
 | 
				
			||||||
    engine : xpath
 | 
					    engine : xpath
 | 
				
			||||||
@ -465,6 +538,13 @@ engines:
 | 
				
			|||||||
    categories : videos
 | 
					    categories : videos
 | 
				
			||||||
    shortcut : gpm
 | 
					    shortcut : gpm
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://play.google.com/
 | 
				
			||||||
 | 
					      wikidata_id: Q79576
 | 
				
			||||||
 | 
					      official_api_documentation:
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : google play music
 | 
					  - name : google play music
 | 
				
			||||||
    engine : xpath
 | 
					    engine : xpath
 | 
				
			||||||
@ -477,6 +557,13 @@ engines:
 | 
				
			|||||||
    categories : music
 | 
					    categories : music
 | 
				
			||||||
    shortcut : gps
 | 
					    shortcut : gps
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://play.google.com/
 | 
				
			||||||
 | 
					      wikidata_id: Q79576
 | 
				
			||||||
 | 
					      official_api_documentation:
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : geektimes
 | 
					  - name : geektimes
 | 
				
			||||||
    engine : xpath
 | 
					    engine : xpath
 | 
				
			||||||
@ -489,6 +576,13 @@ engines:
 | 
				
			|||||||
    timeout : 4.0
 | 
					    timeout : 4.0
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
    shortcut : gt
 | 
					    shortcut : gt
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://geektimes.ru/
 | 
				
			||||||
 | 
					      wikidata_id: Q50572423
 | 
				
			||||||
 | 
					      official_api_documentation:
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : habrahabr
 | 
					  - name : habrahabr
 | 
				
			||||||
    engine : xpath
 | 
					    engine : xpath
 | 
				
			||||||
@ -501,6 +595,13 @@ engines:
 | 
				
			|||||||
    timeout : 4.0
 | 
					    timeout : 4.0
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
    shortcut : habr
 | 
					    shortcut : habr
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://habr.com/
 | 
				
			||||||
 | 
					      wikidata_id: Q4494434
 | 
				
			||||||
 | 
					      official_api_documentation: https://habr.com/en/docs/help/api/
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : hoogle
 | 
					  - name : hoogle
 | 
				
			||||||
    engine : json_engine
 | 
					    engine : json_engine
 | 
				
			||||||
@ -513,6 +614,13 @@ engines:
 | 
				
			|||||||
    page_size : 20
 | 
					    page_size : 20
 | 
				
			||||||
    categories : it
 | 
					    categories : it
 | 
				
			||||||
    shortcut : ho
 | 
					    shortcut : ho
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://www.haskell.org/
 | 
				
			||||||
 | 
					      wikidata_id: Q34010
 | 
				
			||||||
 | 
					      official_api_documentation: https://hackage.haskell.org/api
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: JSON
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : ina
 | 
					  - name : ina
 | 
				
			||||||
    engine : ina
 | 
					    engine : ina
 | 
				
			||||||
@ -543,6 +651,13 @@ engines:
 | 
				
			|||||||
    timeout : 7.0
 | 
					    timeout : 7.0
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
    shortcut : lg
 | 
					    shortcut : lg
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: http://libgen.rs/
 | 
				
			||||||
 | 
					      wikidata_id: Q22017206
 | 
				
			||||||
 | 
					      official_api_documentation:
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : lobste.rs
 | 
					  - name : lobste.rs
 | 
				
			||||||
    engine : xpath
 | 
					    engine : xpath
 | 
				
			||||||
@ -555,6 +670,13 @@ engines:
 | 
				
			|||||||
    shortcut : lo
 | 
					    shortcut : lo
 | 
				
			||||||
    timeout : 3.0
 | 
					    timeout : 3.0
 | 
				
			||||||
    disabled: True
 | 
					    disabled: True
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://lobste.rs/
 | 
				
			||||||
 | 
					      wikidata_id: Q60762874
 | 
				
			||||||
 | 
					      official_api_documentation:
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : metager
 | 
					  - name : metager
 | 
				
			||||||
    engine : xpath
 | 
					    engine : xpath
 | 
				
			||||||
@ -566,6 +688,13 @@ engines:
 | 
				
			|||||||
    categories : general
 | 
					    categories : general
 | 
				
			||||||
    shortcut : mg
 | 
					    shortcut : mg
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://metager.org/
 | 
				
			||||||
 | 
					      wikidata_id: Q1924645
 | 
				
			||||||
 | 
					      official_api_documentation:
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : microsoft academic
 | 
					  - name : microsoft academic
 | 
				
			||||||
    engine : microsoft_academic
 | 
					    engine : microsoft_academic
 | 
				
			||||||
@ -589,6 +718,13 @@ engines:
 | 
				
			|||||||
    disabled: True
 | 
					    disabled: True
 | 
				
			||||||
    timeout: 5.0
 | 
					    timeout: 5.0
 | 
				
			||||||
    shortcut : npm
 | 
					    shortcut : npm
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://npms.io/
 | 
				
			||||||
 | 
					      wikidata_id: Q7067518
 | 
				
			||||||
 | 
					      official_api_documentation: https://api-docs.npms.io/
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: JSON
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Requires Tor
 | 
					# Requires Tor
 | 
				
			||||||
  - name : not evil
 | 
					  - name : not evil
 | 
				
			||||||
@ -617,6 +753,13 @@ engines:
 | 
				
			|||||||
    categories : science
 | 
					    categories : science
 | 
				
			||||||
    shortcut : oad
 | 
					    shortcut : oad
 | 
				
			||||||
    timeout: 5.0
 | 
					    timeout: 5.0
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://www.openaire.eu/
 | 
				
			||||||
 | 
					      wikidata_id: Q25106053
 | 
				
			||||||
 | 
					      official_api_documentation: https://api.openaire.eu/
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: JSON
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : openairepublications
 | 
					  - name : openairepublications
 | 
				
			||||||
    engine : json_engine
 | 
					    engine : json_engine
 | 
				
			||||||
@ -629,6 +772,13 @@ engines:
 | 
				
			|||||||
    categories : science
 | 
					    categories : science
 | 
				
			||||||
    shortcut : oap
 | 
					    shortcut : oap
 | 
				
			||||||
    timeout: 5.0
 | 
					    timeout: 5.0
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://www.openaire.eu/
 | 
				
			||||||
 | 
					      wikidata_id: Q25106053
 | 
				
			||||||
 | 
					      official_api_documentation: https://api.openaire.eu/
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: JSON
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#  - name : opensemanticsearch
 | 
					#  - name : opensemanticsearch
 | 
				
			||||||
#    engine : opensemantic
 | 
					#    engine : opensemantic
 | 
				
			||||||
@ -650,6 +800,13 @@ engines:
 | 
				
			|||||||
    timeout : 4.0
 | 
					    timeout : 4.0
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
    shortcut : or
 | 
					    shortcut : or
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://openrepos.net/
 | 
				
			||||||
 | 
					      wikidata_id:
 | 
				
			||||||
 | 
					      official_api_documentation:
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : pdbe
 | 
					  - name : pdbe
 | 
				
			||||||
    engine : pdbe
 | 
					    engine : pdbe
 | 
				
			||||||
@ -768,6 +925,13 @@ engines:
 | 
				
			|||||||
    content_xpath : .//div[@class="search-result-abstract"]
 | 
					    content_xpath : .//div[@class="search-result-abstract"]
 | 
				
			||||||
    shortcut : se
 | 
					    shortcut : se
 | 
				
			||||||
    categories : science
 | 
					    categories : science
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://www.semanticscholar.org/
 | 
				
			||||||
 | 
					      wikidata_id: Q22908627
 | 
				
			||||||
 | 
					      official_api_documentation: https://api.semanticscholar.org/
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Spotify needs API credentials
 | 
					# Spotify needs API credentials
 | 
				
			||||||
#  - name : spotify
 | 
					#  - name : spotify
 | 
				
			||||||
@ -876,6 +1040,9 @@ engines:
 | 
				
			|||||||
    number_of_results : 5
 | 
					    number_of_results : 5
 | 
				
			||||||
    search_type : text
 | 
					    search_type : text
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://www.wikibooks.org/
 | 
				
			||||||
 | 
					      wikidata_id: Q367
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : wikinews
 | 
					  - name : wikinews
 | 
				
			||||||
    engine : mediawiki
 | 
					    engine : mediawiki
 | 
				
			||||||
@ -885,6 +1052,9 @@ engines:
 | 
				
			|||||||
    number_of_results : 5
 | 
					    number_of_results : 5
 | 
				
			||||||
    search_type : text
 | 
					    search_type : text
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://www.wikinews.org/
 | 
				
			||||||
 | 
					      wikidata_id: Q964
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : wikiquote
 | 
					  - name : wikiquote
 | 
				
			||||||
    engine : mediawiki
 | 
					    engine : mediawiki
 | 
				
			||||||
@ -896,6 +1066,9 @@ engines:
 | 
				
			|||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
    additional_tests:
 | 
					    additional_tests:
 | 
				
			||||||
      rosebud: *test_rosebud
 | 
					      rosebud: *test_rosebud
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://www.wikiquote.org/
 | 
				
			||||||
 | 
					      wikidata_id: Q369
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : wikisource
 | 
					  - name : wikisource
 | 
				
			||||||
    engine : mediawiki
 | 
					    engine : mediawiki
 | 
				
			||||||
@ -905,6 +1078,9 @@ engines:
 | 
				
			|||||||
    number_of_results : 5
 | 
					    number_of_results : 5
 | 
				
			||||||
    search_type : text
 | 
					    search_type : text
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://www.wikisource.org/
 | 
				
			||||||
 | 
					      wikidata_id: Q263
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : wiktionary
 | 
					  - name : wiktionary
 | 
				
			||||||
    engine : mediawiki
 | 
					    engine : mediawiki
 | 
				
			||||||
@ -914,6 +1090,9 @@ engines:
 | 
				
			|||||||
    number_of_results : 5
 | 
					    number_of_results : 5
 | 
				
			||||||
    search_type : text
 | 
					    search_type : text
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://www.wiktionary.org/
 | 
				
			||||||
 | 
					      wikidata_id: Q151
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : wikiversity
 | 
					  - name : wikiversity
 | 
				
			||||||
    engine : mediawiki
 | 
					    engine : mediawiki
 | 
				
			||||||
@ -923,6 +1102,9 @@ engines:
 | 
				
			|||||||
    number_of_results : 5
 | 
					    number_of_results : 5
 | 
				
			||||||
    search_type : text
 | 
					    search_type : text
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://www.wikiversity.org/
 | 
				
			||||||
 | 
					      wikidata_id: Q370
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : wikivoyage
 | 
					  - name : wikivoyage
 | 
				
			||||||
    engine : mediawiki
 | 
					    engine : mediawiki
 | 
				
			||||||
@ -932,6 +1114,9 @@ engines:
 | 
				
			|||||||
    number_of_results : 5
 | 
					    number_of_results : 5
 | 
				
			||||||
    search_type : text
 | 
					    search_type : text
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://www.wikivoyage.org/
 | 
				
			||||||
 | 
					      wikidata_id: Q373
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : wolframalpha
 | 
					  - name : wolframalpha
 | 
				
			||||||
    shortcut : wa
 | 
					    shortcut : wa
 | 
				
			||||||
@ -979,6 +1164,13 @@ engines:
 | 
				
			|||||||
    first_page_num : 0
 | 
					    first_page_num : 0
 | 
				
			||||||
    page_size : 10
 | 
					    page_size : 10
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://www.seznam.cz/
 | 
				
			||||||
 | 
					      wikidata_id: Q3490485
 | 
				
			||||||
 | 
					      official_api_documentation: https://api.sklik.cz/
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : mojeek
 | 
					  - name : mojeek
 | 
				
			||||||
    shortcut: mjk
 | 
					    shortcut: mjk
 | 
				
			||||||
@ -993,6 +1185,13 @@ engines:
 | 
				
			|||||||
    first_page_num : 0
 | 
					    first_page_num : 0
 | 
				
			||||||
    page_size : 10
 | 
					    page_size : 10
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://www.mojeek.com/
 | 
				
			||||||
 | 
					      wikidata_id: Q60747299
 | 
				
			||||||
 | 
					      official_api_documentation: https://www.mojeek.com/services/api.html/
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : naver
 | 
					  - name : naver
 | 
				
			||||||
    shortcut: nvr
 | 
					    shortcut: nvr
 | 
				
			||||||
@ -1007,6 +1206,13 @@ engines:
 | 
				
			|||||||
    first_page_num : 1
 | 
					    first_page_num : 1
 | 
				
			||||||
    page_size : 10
 | 
					    page_size : 10
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://www.naver.com/
 | 
				
			||||||
 | 
					      wikidata_id: Q485639
 | 
				
			||||||
 | 
					      official_api_documentation: https://developers.naver.com/docs/nmt/examples/
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : rubygems
 | 
					  - name : rubygems
 | 
				
			||||||
    shortcut: rbg
 | 
					    shortcut: rbg
 | 
				
			||||||
@ -1021,6 +1227,13 @@ engines:
 | 
				
			|||||||
    first_page_num : 1
 | 
					    first_page_num : 1
 | 
				
			||||||
    categories: it
 | 
					    categories: it
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
 | 
					    about:
 | 
				
			||||||
 | 
					      website: https://rubygems.org/
 | 
				
			||||||
 | 
					      wikidata_id: Q1853420
 | 
				
			||||||
 | 
					      official_api_documentation: https://guides.rubygems.org/rubygems-org-api/
 | 
				
			||||||
 | 
					      use_official_api: false
 | 
				
			||||||
 | 
					      require_api_key: false
 | 
				
			||||||
 | 
					      results: HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : peertube
 | 
					  - name : peertube
 | 
				
			||||||
    engine: peertube
 | 
					    engine: peertube
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										206
									
								
								utils/fetch_engine_descriptions.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										206
									
								
								utils/fetch_engine_descriptions.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,206 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env python
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					import json
 | 
				
			||||||
 | 
					from urllib.parse import quote, urlparse
 | 
				
			||||||
 | 
					from os.path import realpath, dirname
 | 
				
			||||||
 | 
					import cld3
 | 
				
			||||||
 | 
					from lxml.html import fromstring
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# set path
 | 
				
			||||||
 | 
					sys.path.append(realpath(dirname(realpath(__file__)) + '/../'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from searx.engines.wikidata import send_wikidata_query
 | 
				
			||||||
 | 
					from searx.utils import extract_text
 | 
				
			||||||
 | 
					import searx
 | 
				
			||||||
 | 
					import searx.search
 | 
				
			||||||
 | 
					import searx.poolrequests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SPARQL_WIKIPEDIA_ARTICLE = """
 | 
				
			||||||
 | 
					SELECT DISTINCT ?item ?name
 | 
				
			||||||
 | 
					WHERE {
 | 
				
			||||||
 | 
					  VALUES ?item { %IDS% }
 | 
				
			||||||
 | 
					  ?article schema:about ?item ;
 | 
				
			||||||
 | 
					              schema:inLanguage ?lang ;
 | 
				
			||||||
 | 
					              schema:name ?name ;
 | 
				
			||||||
 | 
					              schema:isPartOf [ wikibase:wikiGroup "wikipedia" ] .
 | 
				
			||||||
 | 
					  FILTER(?lang in (%LANGUAGES_SPARQL%)) .
 | 
				
			||||||
 | 
					  FILTER (!CONTAINS(?name, ':')) .
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SPARQL_DESCRIPTION = """
 | 
				
			||||||
 | 
					SELECT DISTINCT ?item ?itemDescription
 | 
				
			||||||
 | 
					WHERE {
 | 
				
			||||||
 | 
					  VALUES ?item { %IDS% }
 | 
				
			||||||
 | 
					  ?item schema:description ?itemDescription .
 | 
				
			||||||
 | 
					  FILTER (lang(?itemDescription) in (%LANGUAGES_SPARQL%))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					ORDER BY ?itemLang
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LANGUAGES = searx.settings['locales'].keys()
 | 
				
			||||||
 | 
					LANGUAGES_SPARQL = ', '.join(set(map(lambda l: repr(l.split('_')[0]), LANGUAGES)))
 | 
				
			||||||
 | 
					IDS = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					descriptions = {}
 | 
				
			||||||
 | 
					wd_to_engine_name = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def normalize_description(description):
 | 
				
			||||||
 | 
					    for c in [chr(c) for c in range(0, 31)]:
 | 
				
			||||||
 | 
					        description = description.replace(c, ' ')
 | 
				
			||||||
 | 
					    description = ' '.join(description.strip().split())
 | 
				
			||||||
 | 
					    return description
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def update_description(engine_name, lang, description, source, replace=True):
 | 
				
			||||||
 | 
					    if replace or lang not in descriptions[engine_name]:
 | 
				
			||||||
 | 
					        descriptions[engine_name][lang] = [normalize_description(description), source]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_wikipedia_summary(language, pageid):
 | 
				
			||||||
 | 
					    search_url = 'https://{language}.wikipedia.org/api/rest_v1/page/summary/{title}'
 | 
				
			||||||
 | 
					    url = search_url.format(title=quote(pageid), language=language)
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        response = searx.poolrequests.get(url)
 | 
				
			||||||
 | 
					        response.raise_for_status()
 | 
				
			||||||
 | 
					        api_result = json.loads(response.text)
 | 
				
			||||||
 | 
					        return api_result.get('extract')
 | 
				
			||||||
 | 
					    except:
 | 
				
			||||||
 | 
					        return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def detect_language(text):
 | 
				
			||||||
 | 
					    r = cld3.get_language(str(text))  # pylint: disable=E1101
 | 
				
			||||||
 | 
					    if r is not None and r.probability >= 0.98 and r.is_reliable:
 | 
				
			||||||
 | 
					        return r.language
 | 
				
			||||||
 | 
					    return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_website_description(url, lang1, lang2=None):
 | 
				
			||||||
 | 
					    headers = {
 | 
				
			||||||
 | 
					        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0',
 | 
				
			||||||
 | 
					        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
 | 
				
			||||||
 | 
					        'DNT': '1',
 | 
				
			||||||
 | 
					        'Upgrade-Insecure-Requests': '1',
 | 
				
			||||||
 | 
					        'Sec-GPC': '1',
 | 
				
			||||||
 | 
					        'Cache-Control': 'max-age=0',
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if lang1 is not None:
 | 
				
			||||||
 | 
					        lang_list = [lang1]
 | 
				
			||||||
 | 
					        if lang2 is not None:
 | 
				
			||||||
 | 
					            lang_list.append(lang2)
 | 
				
			||||||
 | 
					        headers['Accept-Language'] = f'{",".join(lang_list)};q=0.8'
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        response = searx.poolrequests.get(url, headers=headers, timeout=10)
 | 
				
			||||||
 | 
					        response.raise_for_status()
 | 
				
			||||||
 | 
					    except Exception:
 | 
				
			||||||
 | 
					        return (None, None)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        html = fromstring(response.text)
 | 
				
			||||||
 | 
					    except ValueError:
 | 
				
			||||||
 | 
					        html = fromstring(response.content)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    description = extract_text(html.xpath('/html/head/meta[@name="description"]/@content'))
 | 
				
			||||||
 | 
					    if not description:
 | 
				
			||||||
 | 
					        description = extract_text(html.xpath('/html/head/meta[@property="og:description"]/@content'))
 | 
				
			||||||
 | 
					    if not description:
 | 
				
			||||||
 | 
					        description = extract_text(html.xpath('/html/head/title'))
 | 
				
			||||||
 | 
					    lang = extract_text(html.xpath('/html/@lang'))
 | 
				
			||||||
 | 
					    if lang is None and len(lang1) > 0:
 | 
				
			||||||
 | 
					        lang = lang1
 | 
				
			||||||
 | 
					    lang = detect_language(description) or lang or 'en'
 | 
				
			||||||
 | 
					    lang = lang.split('_')[0]
 | 
				
			||||||
 | 
					    lang = lang.split('-')[0]
 | 
				
			||||||
 | 
					    return (lang, description)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def initialize():
 | 
				
			||||||
 | 
					    global descriptions, wd_to_engine_name, IDS
 | 
				
			||||||
 | 
					    searx.search.initialize()
 | 
				
			||||||
 | 
					    for engine_name, engine in searx.engines.engines.items():
 | 
				
			||||||
 | 
					        descriptions[engine_name] = {}
 | 
				
			||||||
 | 
					        wikidata_id = getattr(engine, "about", {}).get('wikidata_id')
 | 
				
			||||||
 | 
					        if wikidata_id is not None:
 | 
				
			||||||
 | 
					            wd_to_engine_name.setdefault(wikidata_id, set()).add(engine_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IDS = ' '.join(list(map(lambda wd_id: 'wd:' + wd_id, wd_to_engine_name.keys())))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def fetch_wikidata_descriptions():
 | 
				
			||||||
 | 
					    global IDS
 | 
				
			||||||
 | 
					    result = send_wikidata_query(SPARQL_DESCRIPTION
 | 
				
			||||||
 | 
					                                 .replace('%IDS%', IDS)
 | 
				
			||||||
 | 
					                                 .replace('%LANGUAGES_SPARQL%', LANGUAGES_SPARQL))
 | 
				
			||||||
 | 
					    if result is not None:
 | 
				
			||||||
 | 
					        for binding in result['results']['bindings']:
 | 
				
			||||||
 | 
					            wikidata_id = binding['item']['value'].replace('http://www.wikidata.org/entity/', '')
 | 
				
			||||||
 | 
					            lang = binding['itemDescription']['xml:lang']
 | 
				
			||||||
 | 
					            description = binding['itemDescription']['value']
 | 
				
			||||||
 | 
					            if ' ' in description:  # skip unique word description (like "website")
 | 
				
			||||||
 | 
					                for engine_name in wd_to_engine_name[wikidata_id]:
 | 
				
			||||||
 | 
					                    update_description(engine_name, lang, description, 'wikidata')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def fetch_wikipedia_descriptions():
 | 
				
			||||||
 | 
					    global IDS
 | 
				
			||||||
 | 
					    result = send_wikidata_query(SPARQL_WIKIPEDIA_ARTICLE
 | 
				
			||||||
 | 
					                                 .replace('%IDS%', IDS)
 | 
				
			||||||
 | 
					                                 .replace('%LANGUAGES_SPARQL%', LANGUAGES_SPARQL))
 | 
				
			||||||
 | 
					    if result is not None:
 | 
				
			||||||
 | 
					        for binding in result['results']['bindings']:
 | 
				
			||||||
 | 
					            wikidata_id = binding['item']['value'].replace('http://www.wikidata.org/entity/', '')
 | 
				
			||||||
 | 
					            lang = binding['name']['xml:lang']
 | 
				
			||||||
 | 
					            pageid = binding['name']['value']
 | 
				
			||||||
 | 
					            description = get_wikipedia_summary(lang, pageid)
 | 
				
			||||||
 | 
					            if description is not None and ' ' in description:
 | 
				
			||||||
 | 
					                for engine_name in wd_to_engine_name[wikidata_id]:
 | 
				
			||||||
 | 
					                    update_description(engine_name, lang, description, 'wikipedia')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def normalize_url(url):
 | 
				
			||||||
 | 
					    url = url.replace('{language}', 'en')
 | 
				
			||||||
 | 
					    url = urlparse(url)._replace(path='/', params='', query='', fragment='').geturl()
 | 
				
			||||||
 | 
					    url = url.replace('https://api.', 'https://')
 | 
				
			||||||
 | 
					    return url
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def fetch_website_description(engine_name, website):
 | 
				
			||||||
 | 
					    default_lang, default_description = get_website_description(website, None, None)
 | 
				
			||||||
 | 
					    if default_lang is None or default_description is None:
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    if default_lang not in descriptions[engine_name]:
 | 
				
			||||||
 | 
					        descriptions[engine_name][default_lang] = [normalize_description(default_description), website]
 | 
				
			||||||
 | 
					    for request_lang in ('en-US', 'es-US', 'fr-FR', 'zh', 'ja', 'ru', 'ar', 'ko'):
 | 
				
			||||||
 | 
					        if request_lang.split('-')[0] not in descriptions[engine_name]:
 | 
				
			||||||
 | 
					            lang, desc = get_website_description(website, request_lang, request_lang.split('-')[0])
 | 
				
			||||||
 | 
					            if desc is not None and desc != default_description:
 | 
				
			||||||
 | 
					                update_description(engine_name, lang, desc, website, replace=False)
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def fetch_website_descriptions():
 | 
				
			||||||
 | 
					    for engine_name, engine in searx.engines.engines.items():
 | 
				
			||||||
 | 
					        website = getattr(engine, "about", {}).get('website')
 | 
				
			||||||
 | 
					        if website is None:
 | 
				
			||||||
 | 
					            website = normalize_url(getattr(engine, "search_url"))
 | 
				
			||||||
 | 
					        if website is None:
 | 
				
			||||||
 | 
					            website = normalize_url(getattr(engine, "base_url"))
 | 
				
			||||||
 | 
					        if website is not None:
 | 
				
			||||||
 | 
					            fetch_website_description(engine_name, website)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def main():
 | 
				
			||||||
 | 
					    initialize()
 | 
				
			||||||
 | 
					    fetch_wikidata_descriptions()
 | 
				
			||||||
 | 
					    fetch_wikipedia_descriptions()
 | 
				
			||||||
 | 
					    fetch_website_descriptions()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sys.stdout.write(json.dumps(descriptions, indent=1, separators=(',', ':'), ensure_ascii=False))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == "__main__":
 | 
				
			||||||
 | 
					    main()
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user