| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 | # Youtube (Videos)## @website     https://www.youtube.com/# @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, embeddedfrom urllib import quote_plusfrom lxml import htmlfrom searx.engines.xpath import extract_textfrom searx.utils import list_get# engine dependent configcategories = ['videos', 'music']paging = Truelanguage_support = False# search-urlbase_url = 'https://www.youtube.com/results'search_url = base_url + '?search_query={query}&page={page}'embedded_url = '<iframe width="540" height="304" ' +\    'data-src="//www.youtube-nocookie.com/embed/{videoid}" ' +\    'frameborder="0" allowfullscreen></iframe>'base_youtube_url = 'https://www.youtube.com/watch?v='# specific xpath variablesresults_xpath = "//ol/li/div[contains(@class, 'yt-lockup yt-lockup-tile yt-lockup-video vve-check')]"url_xpath = './/h3/a/@href'title_xpath = './/div[@class="yt-lockup-content"]/h3/a'content_xpath = './/div[@class="yt-lockup-content"]/div[@class="yt-lockup-description yt-ui-ellipsis yt-ui-ellipsis-2"]'# returns extract_text on the first result selected by the xpath or Nonedef extract_text_from_dom(result, xpath):    r = result.xpath(xpath)    if len(r) > 0:        return extract_text(r[0])    return None# do search-requestdef request(query, params):    params['url'] = search_url.format(query=quote_plus(query),                                      page=params['pageno'])    return params# get response from search-requestdef response(resp):    results = []    dom = html.fromstring(resp.text)    # parse results    for result in dom.xpath(results_xpath):        videoid = list_get(result.xpath('@data-context-item-id'), 0)        if videoid is not None:            url = base_youtube_url + videoid            thumbnail = 'https://i.ytimg.com/vi/' + videoid + '/hqdefault.jpg'            title = extract_text_from_dom(result, title_xpath) or videoid            content = extract_text_from_dom(result, content_xpath)            embedded = embedded_url.format(videoid=videoid)            # append result            results.append({'url': url,                            'title': title,                            'content': content,                            'template': 'videos.html',                            'embedded': embedded,                            'thumbnail': thumbnail})    # return results    return results
 |