mirror of
				https://github.com/searxng/searxng.git
				synced 2025-11-03 19:17:07 -05:00 
			
		
		
		
	[feat] engine: brave - support for videos
This commit is contained in:
		
							parent
							
								
									73364e158e
								
							
						
					
					
						commit
						cae06f2781
					
				@ -4,10 +4,8 @@
 | 
				
			|||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from urllib.parse import urlencode
 | 
					from urllib.parse import urlencode
 | 
				
			||||||
from lxml import html
 | 
					import chompjs
 | 
				
			||||||
from searx.utils import extract_text, eval_xpath, eval_xpath_list
 | 
					import json
 | 
				
			||||||
import chompjs, json
 | 
					 | 
				
			||||||
import re
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
about = {
 | 
					about = {
 | 
				
			||||||
    "website": 'https://search.brave.com/',
 | 
					    "website": 'https://search.brave.com/',
 | 
				
			||||||
@ -19,7 +17,8 @@ about = {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
base_url = "https://search.brave.com/"
 | 
					base_url = "https://search.brave.com/"
 | 
				
			||||||
paging = False
 | 
					paging = False
 | 
				
			||||||
categories = ['images', 'videos', 'news'] # images, videos, news
 | 
					categories = ['images', 'videos', 'news']  # images, videos, news
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def request(query, params):
 | 
					def request(query, params):
 | 
				
			||||||
    args = {
 | 
					    args = {
 | 
				
			||||||
@ -28,38 +27,61 @@ def request(query, params):
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    params["url"] = f"{base_url}{categories[0]}?{urlencode(args)}"
 | 
					    params["url"] = f"{base_url}{categories[0]}?{urlencode(args)}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_image_results(text):
 | 
					
 | 
				
			||||||
 | 
					def get_video_results(json_data):
 | 
				
			||||||
    results = []
 | 
					    results = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    datastr = ""
 | 
					    for result in json_data:
 | 
				
			||||||
    for line in text.split("\n"):
 | 
					 | 
				
			||||||
        if "const data = " in line:
 | 
					 | 
				
			||||||
            datastr = line.replace("const data = ", "").strip()[:-1]
 | 
					 | 
				
			||||||
            break
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    json_data = chompjs.parse_js_object(datastr)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for result in json_data[1]["data"]["body"]["response"]["results"]:
 | 
					 | 
				
			||||||
        results.append(
 | 
					        results.append(
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                'template': 'images.html',
 | 
					                'template': 'videos.html',
 | 
				
			||||||
                'url': result['url'],
 | 
					                'url': result['url'],
 | 
				
			||||||
                'thumbnail_src': result['thumbnail']['src'],
 | 
					                'thumbnail_src': result['thumbnail']['src'],
 | 
				
			||||||
                'img_src': result['properties']['url'],
 | 
					                'img_src': result['properties']['url'],
 | 
				
			||||||
                'content': result['description'],
 | 
					                'content': result['description'],
 | 
				
			||||||
                'title': result['title'],
 | 
					                'title': result['title'],
 | 
				
			||||||
                'source': result['source'],
 | 
					                'source': result['source'],
 | 
				
			||||||
                'img_format': result['properties']['format'],
 | 
					                'duration': result['video']['duration'],
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return results
 | 
					    return results
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def response(resp):
 | 
					 | 
				
			||||||
    dom = html.fromstring(resp.text)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    match categories[0]:
 | 
					def response(resp):
 | 
				
			||||||
        case 'images':
 | 
					    results = []
 | 
				
			||||||
            return get_image_results(resp.text)
 | 
					
 | 
				
			||||||
        case _:
 | 
					    datastr = ""
 | 
				
			||||||
            return []
 | 
					    for line in resp.text.split("\n"):
 | 
				
			||||||
 | 
					        if "const data = " in line:
 | 
				
			||||||
 | 
					            datastr = line.replace("const data = ", "").strip()[:-1]
 | 
				
			||||||
 | 
					            break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    json_data = chompjs.parse_js_object(datastr)
 | 
				
			||||||
 | 
					    json_results = json_data[1]["data"]["body"]["response"]["results"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    with open("outfile.json", "w") as f:
 | 
				
			||||||
 | 
					        json.dump(json_data, f)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for result in json_results:
 | 
				
			||||||
 | 
					        item = {
 | 
				
			||||||
 | 
					            'url': result['url'],
 | 
				
			||||||
 | 
					            'title': result['title'],
 | 
				
			||||||
 | 
					            'content': result['description'],
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if result['thumbnail'] != "null":
 | 
				
			||||||
 | 
					            item['thumbnail'] = result['thumbnail']['src']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        match categories[0]:
 | 
				
			||||||
 | 
					            case 'images':
 | 
				
			||||||
 | 
					                item['template'] = 'images.html'
 | 
				
			||||||
 | 
					                item['img_format'] = result['properties']['format']
 | 
				
			||||||
 | 
					                item['source'] = result['source']
 | 
				
			||||||
 | 
					                item['img_src'] = result['properties']['url']
 | 
				
			||||||
 | 
					            case 'videos':
 | 
				
			||||||
 | 
					                item['template'] = 'videos.html'
 | 
				
			||||||
 | 
					                item['length'] = result['video']['duration']
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        results.append(item)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return results
 | 
				
			||||||
 | 
				
			|||||||
@ -1849,6 +1849,12 @@ engines:
 | 
				
			|||||||
    categories: images
 | 
					    categories: images
 | 
				
			||||||
    disabled: false
 | 
					    disabled: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - name: brave.videos
 | 
				
			||||||
 | 
					    shortcut: bravevid
 | 
				
			||||||
 | 
					    engine: brave
 | 
				
			||||||
 | 
					    categories: videos
 | 
				
			||||||
 | 
					    disabled: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name: petalsearch
 | 
					  - name: petalsearch
 | 
				
			||||||
    shortcut: pts
 | 
					    shortcut: pts
 | 
				
			||||||
    engine: xpath
 | 
					    engine: xpath
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user