ipfs_search.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. from urllib.parse import urlencode
  2. import json
  3. import re
  4. from datetime import datetime
  5. # config
  6. categories = ['general', 'images', 'music', 'videos']
  7. paging = True
  8. time_range_support = True
  9. # url
  10. base_url = 'https://api.ipfs-search.com/v1/'
  11. search_string = 'search?{query} first-seen:{time_range} metadata.Content-Type:({mime_type})&page={page} '
  12. mime_types_map = {
  13. 'general': "*",
  14. 'images': 'image*',
  15. 'music': 'audio*',
  16. 'videos': 'video*'
  17. }
  18. time_range_map = {'day': '[ now-24h\/h TO *]',
  19. 'week': '[ now\/h-7d TO *]',
  20. 'month': '[ now\/d-30d TO *]',
  21. 'year': '[ now\/d-1y TO *]'}
  22. ipfs_url = 'https://gateway.ipfs.io/ipfs/{hash}'
  23. def request(query, params):
  24. mime_type = mime_types_map.get(params['category'], '*')
  25. time_range = time_range_map.get(params['time_range'], '*')
  26. search_path = search_string.format(
  27. query=urlencode({'q': query}),
  28. time_range=time_range,
  29. page=params['pageno'],
  30. mime_type=mime_type)
  31. params['url'] = base_url + search_path
  32. return params
  33. def clean_html(text):
  34. if not text:
  35. return ""
  36. return str(re.sub(re.compile('<.*?>'), '', text))
  37. def create_base_result(record):
  38. url = ipfs_url.format(hash=record.get('hash'))
  39. title = clean_html(record.get('title'))
  40. published_date = datetime.strptime(record.get('first-seen'), '%Y-%m-%dT%H:%M:%SZ')
  41. return {'url': url,
  42. 'title': title,
  43. 'publishedDate': published_date}
  44. def create_text_result(record):
  45. result = create_base_result(record)
  46. description = clean_html(record.get('description'))
  47. result['description'] = description
  48. return result
  49. def create_image_result(record):
  50. result = create_base_result(record)
  51. result['img_src'] = result['url']
  52. result['template'] = 'images.html'
  53. return result
  54. def create_video_result(record):
  55. result = create_base_result(record)
  56. result['thumbnail'] = ''
  57. result['template'] = 'videos.html'
  58. return result
  59. def response(resp):
  60. api_results = json.loads(resp.text)
  61. results = []
  62. for result in api_results.get('hits', []):
  63. mime_type = result.get('mimetype', 'text/plain')
  64. if mime_type.startswith('image'):
  65. results.append(create_image_result(result))
  66. elif mime_type.startswith('video'):
  67. results.append(create_video_result(result))
  68. else:
  69. results.append(create_text_result(result))
  70. return results