| 
									
										
										
										
											2021-01-13 11:31:25 +01:00
										 |  |  | # SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							| 
									
										
										
										
											2021-04-26 20:18:20 +02:00
										 |  |  | # lint: pylint | 
					
						
							| 
									
										
										
										
											2021-03-09 08:34:57 +01:00
										 |  |  | """APKMirror
 | 
					
						
							| 
									
										
										
										
											2019-02-13 00:37:29 +01:00
										 |  |  | """
 | 
					
						
							| 
									
										
										
										
											2021-03-09 08:34:57 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | # pylint: disable=invalid-name, missing-function-docstring | 
					
						
							| 
									
										
										
										
											2019-02-13 00:37:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-06 17:42:46 +02:00
										 |  |  | from urllib.parse import urlencode | 
					
						
							| 
									
										
										
										
											2019-02-13 00:37:29 +01:00
										 |  |  | from lxml import html | 
					
						
							| 
									
										
										
										
											2020-08-06 17:42:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-09 08:34:57 +01:00
										 |  |  | from searx import logger | 
					
						
							|  |  |  | from searx.utils import ( | 
					
						
							|  |  |  |     eval_xpath_list, | 
					
						
							|  |  |  |     eval_xpath_getindex, | 
					
						
							|  |  |  |     extract_text, | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | logger = logger.getChild('APKMirror engine') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-13 11:31:25 +01:00
										 |  |  | about = { | 
					
						
							|  |  |  |     "website": 'https://www.apkmirror.com', | 
					
						
							|  |  |  |     "wikidata_id": None, | 
					
						
							|  |  |  |     "official_api_documentation": None, | 
					
						
							|  |  |  |     "use_official_api": False, | 
					
						
							|  |  |  |     "require_api_key": False, | 
					
						
							|  |  |  |     "results": 'HTML', | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-02-13 00:37:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | # engine dependent config | 
					
						
							| 
									
										
										
										
											2021-03-09 08:34:57 +01:00
										 |  |  | categories = ['files'] | 
					
						
							| 
									
										
										
										
											2019-02-13 00:37:29 +01:00
										 |  |  | paging = True | 
					
						
							|  |  |  | time_range_support = False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # search-url | 
					
						
							|  |  |  | base_url = 'https://www.apkmirror.com' | 
					
						
							|  |  |  | search_url = base_url + '/?post_type=app_release&searchtype=apk&page={pageno}&{query}' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def request(query, params): | 
					
						
							| 
									
										
										
										
											2021-03-09 08:34:57 +01:00
										 |  |  |     params['url'] = search_url.format( | 
					
						
							|  |  |  |         pageno = params['pageno'], | 
					
						
							|  |  |  |         query = urlencode({'s': query}), | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     logger.debug("query_url --> %s", params['url']) | 
					
						
							| 
									
										
										
										
											2019-02-13 00:37:29 +01:00
										 |  |  |     return params | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def response(resp): | 
					
						
							|  |  |  |     results = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dom = html.fromstring(resp.text) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # parse results | 
					
						
							| 
									
										
										
										
											2021-03-09 08:34:57 +01:00
										 |  |  |     for result in eval_xpath_list(dom, "//div[@id='content']//div[@class='listWidget']/div/div[@class='appRow']"): | 
					
						
							| 
									
										
										
										
											2019-02-13 00:37:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-26 15:49:33 +01:00
										 |  |  |         link = eval_xpath_getindex(result, './/h5/a', 0) | 
					
						
							| 
									
										
										
										
											2021-03-09 08:34:57 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-13 00:37:29 +01:00
										 |  |  |         url = base_url + link.attrib.get('href') + '#downloads' | 
					
						
							|  |  |  |         title = extract_text(link) | 
					
						
							| 
									
										
										
										
											2021-03-09 08:34:57 +01:00
										 |  |  |         img_src = base_url + eval_xpath_getindex(result, './/img/@src', 0) | 
					
						
							| 
									
										
										
										
											2019-02-13 00:37:29 +01:00
										 |  |  |         res = { | 
					
						
							|  |  |  |             'url': url, | 
					
						
							|  |  |  |             'title': title, | 
					
						
							| 
									
										
										
										
											2021-03-09 08:34:57 +01:00
										 |  |  |             'img_src': img_src | 
					
						
							| 
									
										
										
										
											2019-02-13 00:37:29 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         results.append(res) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return results |