| 
									
										
										
										
											2017-08-05 21:48:07 +02:00
										 |  |  | """
 | 
					
						
							|  |  |  |  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 lxml import html | 
					
						
							|  |  |  | from searx.url_utils import urlencode | 
					
						
							| 
									
										
										
										
											2018-03-01 05:30:48 +01:00
										 |  |  | from searx.utils import match_language | 
					
						
							| 
									
										
										
										
											2017-08-05 21:48:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-01 08:01:36 +01:00
										 |  |  | from searx.engines.bing import _fetch_supported_languages, supported_languages_url, language_aliases | 
					
						
							| 
									
										
										
										
											2017-08-05 21:48:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | categories = ['videos'] | 
					
						
							|  |  |  | paging = True | 
					
						
							|  |  |  | safesearch = True | 
					
						
							|  |  |  | time_range_support = True | 
					
						
							| 
									
										
										
										
											2019-07-27 17:49:30 +02:00
										 |  |  | number_of_results = 28 | 
					
						
							| 
									
										
										
										
											2017-10-10 23:49:49 +02:00
										 |  |  | language_support = True | 
					
						
							| 
									
										
										
										
											2017-08-05 21:48:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-27 17:49:30 +02:00
										 |  |  | base_url = 'https://www.bing.com/' | 
					
						
							|  |  |  | search_string = 'videos/search'\ | 
					
						
							|  |  |  |     '?{query}'\ | 
					
						
							|  |  |  |     '&count={count}'\ | 
					
						
							|  |  |  |     '&first={first}'\ | 
					
						
							|  |  |  |     '&scope=video'\ | 
					
						
							|  |  |  |     '&FORM=QBLH' | 
					
						
							| 
									
										
										
										
											2017-08-05 21:48:07 +02:00
										 |  |  | time_range_string = '&qft=+filterui:videoage-lt{interval}' | 
					
						
							|  |  |  | time_range_dict = {'day': '1440', | 
					
						
							|  |  |  |                    'week': '10080', | 
					
						
							|  |  |  |                    'month': '43200', | 
					
						
							|  |  |  |                    'year': '525600'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # safesearch definitions | 
					
						
							|  |  |  | safesearch_types = {2: 'STRICT', | 
					
						
							|  |  |  |                     1: 'DEMOTE', | 
					
						
							|  |  |  |                     0: 'OFF'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # do search-request | 
					
						
							|  |  |  | def request(query, params): | 
					
						
							| 
									
										
										
										
											2019-07-27 17:49:30 +02:00
										 |  |  |     offset = ((params['pageno'] - 1) * number_of_results) + 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     search_path = search_string.format( | 
					
						
							|  |  |  |         query=urlencode({'q': query}), | 
					
						
							|  |  |  |         count=number_of_results, | 
					
						
							|  |  |  |         first=offset) | 
					
						
							| 
									
										
										
										
											2017-08-05 21:48:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # safesearch cookie | 
					
						
							|  |  |  |     params['cookies']['SRCHHPGUSR'] = \ | 
					
						
							|  |  |  |         'ADLT=' + safesearch_types.get(params['safesearch'], 'DEMOTE') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # language cookie | 
					
						
							| 
									
										
										
										
											2018-11-26 06:32:48 +01:00
										 |  |  |     language = match_language(params['language'], supported_languages, language_aliases).lower() | 
					
						
							| 
									
										
										
										
											2018-03-01 05:30:48 +01:00
										 |  |  |     params['cookies']['_EDGE_S'] = 'mkt=' + language + '&F=1' | 
					
						
							| 
									
										
										
										
											2017-08-05 21:48:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # query and paging | 
					
						
							| 
									
										
										
										
											2019-07-27 17:49:30 +02:00
										 |  |  |     params['url'] = base_url + search_path | 
					
						
							| 
									
										
										
										
											2017-08-05 21:48:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # time range | 
					
						
							|  |  |  |     if params['time_range'] in time_range_dict: | 
					
						
							|  |  |  |         params['url'] += time_range_string.format(interval=time_range_dict[params['time_range']]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-01 17:28:59 +01:00
										 |  |  |     # bing videos did not like "older" versions < 70.0.1 when selectin other | 
					
						
							|  |  |  |     # languages then 'en' .. very strange ?!?! | 
					
						
							|  |  |  |     params['headers']['User-Agent'] = 'Mozilla/5.0 (X11; Linux x86_64; rv:73.0.1) Gecko/20100101 Firefox/73.0.1' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-05 21:48:07 +02:00
										 |  |  |     return params | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # get response from search-request | 
					
						
							|  |  |  | def response(resp): | 
					
						
							|  |  |  |     results = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dom = html.fromstring(resp.text) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for result in dom.xpath('//div[@class="dg_u"]'): | 
					
						
							| 
									
										
										
										
											2019-07-27 17:49:30 +02:00
										 |  |  |         try: | 
					
						
							|  |  |  |             metadata = loads(result.xpath('.//div[@class="vrhdata"]/@vrhm')[0]) | 
					
						
							|  |  |  |             info = ' - '.join(result.xpath('.//div[@class="mc_vtvc_meta_block"]//span/text()')).strip() | 
					
						
							|  |  |  |             content = '{0} - {1}'.format(metadata['du'], info) | 
					
						
							|  |  |  |             thumbnail = '{0}th?id={1}'.format(base_url, metadata['thid']) | 
					
						
							|  |  |  |             results.append({'url': metadata['murl'], | 
					
						
							|  |  |  |                             'thumbnail': thumbnail, | 
					
						
							|  |  |  |                             'title': metadata.get('vt', ''), | 
					
						
							|  |  |  |                             'content': content, | 
					
						
							|  |  |  |                             'template': 'videos.html'}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         except: | 
					
						
							|  |  |  |             continue | 
					
						
							| 
									
										
										
										
											2017-08-05 21:48:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return results |