utils.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. preview_re = re.compile("https://preview.redd.it/")
  43. processing_re = re.compile("Processing img (.*)...")
  44. def req(url, params=None):
  45. return requests.get(url, params=params, headers=HEADERS)
  46. def success(r):
  47. return r.status_code == 200
  48. def builder(*args):
  49. obj = ()
  50. args = list(args)
  51. last = args.pop()
  52. args.reverse()
  53. for arg in args:
  54. if obj:
  55. obj = (arg(obj),)
  56. else:
  57. obj = (arg(last),)
  58. return obj
  59. def tuplefy(func):
  60. def inner(*args, **kwargs):
  61. result = func(*args, **kwargs)
  62. return (result,)
  63. return inner
  64. def get_subreddit_url():
  65. sub = request.url_args.get("subreddit")
  66. return f"/r/{sub}" if sub else ""
  67. def get_subreddit():
  68. sub = request.url_args.get("subreddit")
  69. return f"r/{sub}" if sub else ""
  70. def get_option():
  71. option = request.url_args.get("option")
  72. return option
  73. def verify_subreddit_option():
  74. option = get_option()
  75. if option and option not in SUBREDDIT_OPTIONS:
  76. return abort(404)
  77. def verify_user_option():
  78. option = get_option()
  79. if option and option not in USER_OPTIONS:
  80. return abort(404)
  81. def nsfw_mode(subreddit):
  82. return not subreddit or subreddit in SAFE_SUBS