| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 | # SPDX-License-Identifier: AGPL-3.0-or-later# lint: pylint"""This engine implements *Tineye - reverse image search*Using TinEye, you can search by image or perform what we call a reverse imagesearch.  You can do that by uploading an image or searching by URL. You can alsosimply drag and drop your images to start your search.  TinEye constantly crawlsthe web and adds images to its index.  Today, the TinEye index is over 50.2billion images `[tineye.com] <https://tineye.com/how>`_... hint::   This SearXNG engine only supports *'searching by URL'* and it does not use   the official API `[api.tineye.com] <https://api.tineye.com/python/docs/>`_."""from urllib.parse import urlencodefrom datetime import datetimeabout = {    "website": 'https://tineye.com',    "wikidata_id": 'Q2382535',    "official_api_documentation": 'https://api.tineye.com/python/docs/',    "use_official_api": False,    "require_api_key": False,    "results": 'JSON',}engine_type = 'online_url_search'categories = ['general']paging = Truesafesearch = Falsebase_url = 'https://tineye.com'search_string = '/result_json/?page={page}&{query}'def request(query, params):    if params['search_urls']['data:image']:        query = params['search_urls']['data:image']    elif params['search_urls']['http']:        query = params['search_urls']['http']    query = urlencode({'url': query})    # see https://github.com/TinEye/pytineye/blob/main/pytineye/api.py    params['url'] = base_url + search_string.format(query=query, page=params['pageno'])    params['headers'].update(        {            'Connection': 'keep-alive',            'Accept-Encoding': 'gzip, defalte, br',            'Host': 'tineye.com',            'DNT': '1',            'TE': 'trailers',        }    )    return paramsdef response(resp):    results = []    # Define wanted results    json_data = resp.json()    number_of_results = json_data['num_matches']    for i in json_data['matches']:        image_format = i['format']        width = i['width']        height = i['height']        thumbnail_src = i['image_url']        backlink = i['domains'][0]['backlinks'][0]        url = backlink['backlink']        source = backlink['url']        title = backlink['image_name']        img_src = backlink['url']        # Get and convert published date        api_date = backlink['crawl_date'][:-3]        publishedDate = datetime.fromisoformat(api_date)        # Append results        results.append(            {                'template': 'images.html',                'url': url,                'thumbnail_src': thumbnail_src,                'source': source,                'title': title,                'img_src': img_src,                'format': image_format,                'widht': width,                'height': height,                'publishedDate': publishedDate,            }        )    # Append number of results    results.append({'number_of_results': number_of_results})    return results
 |