utils.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. from datetime import datetime, timedelta
  2. from kddit.settings import HEADERS, TIMESHIFT, YDL_OPTS
  3. from kddit.settings import SUBREDDIT_OPTIONS, SAFE_SUBS, USER_OPTIONS
  4. import timeago
  5. import re
  6. import requests
  7. import youtube_dl
  8. from glom import glom as g
  9. from glom import Coalesce
  10. from bs4 import BeautifulSoup
  11. from html import unescape
  12. from bottle import request, abort
  13. ydl = youtube_dl.YoutubeDL(YDL_OPTS)
  14. def get_query():
  15. return dict(request.query)
  16. def human_format(num):
  17. num = float('{:.3g}'.format(num))
  18. magnitude = 0
  19. while abs(num) >= 1000:
  20. magnitude += 1
  21. num /= 1000.0
  22. return '{}{}'.format('{:f}'.format(num).rstrip('0').rstrip('.'), ['', 'K', 'M', 'B', 'T'][magnitude])
  23. def get_time(timestamp):
  24. date = datetime.fromtimestamp(
  25. timestamp) - timedelta(hours=TIMESHIFT)
  26. now = datetime.now()
  27. return timeago.format(date, now)
  28. def get_thumbnail(url):
  29. try:
  30. with ydl:
  31. info = ydl.extract_info(url, download=False)
  32. return info["thumbnail"]
  33. except:
  34. return ""
  35. def replace_tag(bs_tag, html_tag):
  36. html_tag = html_tag[0] if isinstance(html_tag, tuple) else html_tag
  37. soup = BeautifulSoup(html_tag.render(), "html.parser")
  38. bs_tag.replace_with(soup)
  39. def get_metadata(data, name):
  40. output = g(data, Coalesce(f"media_metadata.{name}.s.u", f"media_metadata.{name}.s.gif"), default=None)
  41. return unescape(output) if output else None
  42. external_preview_re = re.compile("https://external-preview.redd.it/")
  43. preview_re = re.compile("https://preview.redd.it/")
  44. processing_re = re.compile("Processing img (.*)...")
  45. video_re = re.compile("https://reddit.com/link/.*/video/(.*)/player")
  46. def req(url, params=None):
  47. return requests.get(url, params=params, headers=HEADERS)
  48. def success(r):
  49. return r.status_code == 200
  50. def builder(*args):
  51. obj = ()
  52. args = list(args)
  53. last = args.pop()
  54. args.reverse()
  55. for arg in args:
  56. if obj:
  57. obj = (arg(obj),)
  58. else:
  59. obj = (arg(last),)
  60. return obj
  61. def tuplefy(func):
  62. def inner(*args, **kwargs):
  63. result = func(*args, **kwargs)
  64. return (result,)
  65. return inner
  66. def get_subreddit_url():
  67. sub = request.url_args.get("subreddit")
  68. return f"/r/{sub}" if sub else ""
  69. def get_subreddit():
  70. sub = request.url_args.get("subreddit")
  71. return f"r/{sub}" if sub else ""
  72. def get_option():
  73. option = request.url_args.get("option")
  74. return option
  75. def verify_subreddit_option():
  76. option = get_option()
  77. if option and option not in SUBREDDIT_OPTIONS:
  78. return abort(404)
  79. def verify_user_option():
  80. option = get_option()
  81. if option and option not in USER_OPTIONS:
  82. return abort(404)
  83. def nsfw_mode(subreddit):
  84. return not subreddit or subreddit in SAFE_SUBS