12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- from urllib.parse import urlencode
- import json
- import re
- from datetime import datetime
- # config
- categories = ['general', 'images', 'music', 'videos']
- paging = True
- time_range_support = True
- # url
- base_url = 'https://api.ipfs-search.com/v1/'
- search_string = 'search?{query} first-seen:{time_range} metadata.Content-Type:({mime_type})&page={page} '
- mime_types_map = {
- 'general': "*",
- 'images': 'image*',
- 'music': 'audio*',
- 'videos': 'video*'
- }
- time_range_map = {'day': '[ now-24h\/h TO *]',
- 'week': '[ now\/h-7d TO *]',
- 'month': '[ now\/d-30d TO *]',
- 'year': '[ now\/d-1y TO *]'}
- ipfs_url = 'https://gateway.ipfs.io/ipfs/{hash}'
- def request(query, params):
- mime_type = mime_types_map.get(params['category'], '*')
- time_range = time_range_map.get(params['time_range'], '*')
- search_path = search_string.format(
- query=urlencode({'q': query}),
- time_range=time_range,
- page=params['pageno'],
- mime_type=mime_type)
- params['url'] = base_url + search_path
- return params
- def clean_html(text):
- if not text:
- return ""
- return str(re.sub(re.compile('<.*?>'), '', text))
- def create_base_result(record):
- url = ipfs_url.format(hash=record.get('hash'))
- title = clean_html(record.get('title'))
- published_date = datetime.strptime(record.get('first-seen'), '%Y-%m-%dT%H:%M:%SZ')
- return {'url': url,
- 'title': title,
- 'publishedDate': published_date}
- def create_text_result(record):
- result = create_base_result(record)
- description = clean_html(record.get('description'))
- result['description'] = description
- return result
- def create_image_result(record):
- result = create_base_result(record)
- result['img_src'] = result['url']
- result['template'] = 'images.html'
- return result
- def create_video_result(record):
- result = create_base_result(record)
- result['thumbnail'] = ''
- result['template'] = 'videos.html'
- return result
- def response(resp):
- api_results = json.loads(resp.text)
- results = []
- for result in api_results.get('hits', []):
- mime_type = result.get('mimetype', 'text/plain')
- if mime_type.startswith('image'):
- results.append(create_image_result(result))
- elif mime_type.startswith('video'):
- results.append(create_video_result(result))
- else:
- results.append(create_text_result(result))
- return results
|