# 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 image search. You can do that by uploading an image or searching by URL. You can also simply drag and drop your images to start your search. TinEye constantly crawls the web and adds images to its index. Today, the TinEye index is over 50.2 billion images `[tineye.com] `_. .. hint:: This SearXNG engine only supports *'searching by URL'* and it does not use the official API `[api.tineye.com] `_. """ from urllib.parse import urlencode from datetime import datetime about = { "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 = True safesearch = False base_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 params def 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