84 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			84 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								# SPDX-License-Identifier: AGPL-3.0-or-later
							 | 
						||
| 
								 | 
							
								"""`Alpine Linux binary packages`_.  `Alpine Linux`_ is a Linux-based operation
							 | 
						||
| 
								 | 
							
								system designed to be small, simple and secure.  Contrary to many other Linux
							 | 
						||
| 
								 | 
							
								distributions, it uses musl, BusyBox and OpenRC.  Alpine is mostly used on
							 | 
						||
| 
								 | 
							
								servers and for Docker images.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. _Alpine Linux binary packages: https://pkgs.alpinelinux.org
							 | 
						||
| 
								 | 
							
								.. _Alpine Linux: https://www.alpinelinux.org
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								"""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import re
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from urllib.parse import urlencode
							 | 
						||
| 
								 | 
							
								from lxml import html
							 | 
						||
| 
								 | 
							
								from dateutil import parser
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from searx.utils import eval_xpath, eval_xpath_list, extract_text
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								about = {
							 | 
						||
| 
								 | 
							
								    'website': 'https://www.alpinelinux.org',
							 | 
						||
| 
								 | 
							
								    'wikidata_id': 'Q4033826',
							 | 
						||
| 
								 | 
							
								    'use_official_api': False,
							 | 
						||
| 
								 | 
							
								    'official_api_documentation': None,
							 | 
						||
| 
								 | 
							
								    'require_api_key': False,
							 | 
						||
| 
								 | 
							
								    'results': 'HTML',
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								paging = True
							 | 
						||
| 
								 | 
							
								categories = ['packages', 'it']
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								base_url = "https://pkgs.alpinelinux.org"
							 | 
						||
| 
								 | 
							
								alpine_arch = 'x86_64'
							 | 
						||
| 
								 | 
							
								"""Kernel architecture: ``x86_64``, ``x86``, ``aarch64``, ``armhf``,
							 | 
						||
| 
								 | 
							
								``ppc64le``, ``s390x``, ``armv7`` or ``riscv64``"""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ARCH_RE = re.compile("x86_64|x86|aarch64|armhf|ppc64le|s390x|armv7|riscv64")
							 | 
						||
| 
								 | 
							
								"""Regular expression to match supported architectures in the query string."""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def request(query, params):
							 | 
						||
| 
								 | 
							
								    query_arch = ARCH_RE.search(query)
							 | 
						||
| 
								 | 
							
								    if query_arch:
							 | 
						||
| 
								 | 
							
								        query_arch = query_arch.group(0)
							 | 
						||
| 
								 | 
							
								        query = query.replace(query_arch, '').strip()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    args = {
							 | 
						||
| 
								 | 
							
								        # use wildcards to match more than just packages with the exact same
							 | 
						||
| 
								 | 
							
								        # name as the query
							 | 
						||
| 
								 | 
							
								        'name': f"*{query}*",
							 | 
						||
| 
								 | 
							
								        'page': params['pageno'],
							 | 
						||
| 
								 | 
							
								        'arch': query_arch or alpine_arch,
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    params['url'] = f"{base_url}/packages?{urlencode(args)}"
							 | 
						||
| 
								 | 
							
								    return params
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def response(resp):
							 | 
						||
| 
								 | 
							
								    results = []
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    doc = html.fromstring(resp.text)
							 | 
						||
| 
								 | 
							
								    for result in eval_xpath_list(doc, "//table/tbody/tr"):
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if len(result.xpath("./td")) < 9:
							 | 
						||
| 
								 | 
							
								            # skip non valid entries in the result table
							 | 
						||
| 
								 | 
							
								            # e.g the "No item found..." message
							 | 
						||
| 
								 | 
							
								            continue
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        results.append(
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                'template': 'packages.html',
							 | 
						||
| 
								 | 
							
								                'url': base_url + extract_text(eval_xpath(result, './td[contains(@class, "package")]/a/@href')),
							 | 
						||
| 
								 | 
							
								                'title': extract_text(eval_xpath(result, './td[contains(@class, "package")]')),
							 | 
						||
| 
								 | 
							
								                'package_name': extract_text(eval_xpath(result, './td[contains(@class, "package")]')),
							 | 
						||
| 
								 | 
							
								                'publishedDate': parser.parse(extract_text(eval_xpath(result, './td[contains(@class, "bdate")]'))),
							 | 
						||
| 
								 | 
							
								                'version': extract_text(eval_xpath(result, './td[contains(@class, "version")]')),
							 | 
						||
| 
								 | 
							
								                'homepage': extract_text(eval_xpath(result, './td[contains(@class, "url")]/a/@href')),
							 | 
						||
| 
								 | 
							
								                'maintainer': extract_text(eval_xpath(result, './td[contains(@class, "maintainer")]')),
							 | 
						||
| 
								 | 
							
								                'license_name': extract_text(eval_xpath(result, './td[contains(@class, "license")]')),
							 | 
						||
| 
								 | 
							
								                'tags': [extract_text(eval_xpath(result, './td[contains(@class, "repo")]'))],
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return results
							 |