hogumathi_app.py 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. import os
  2. import sys
  3. from importlib.util import find_spec
  4. from configparser import ConfigParser
  5. from flask import Flask, g, redirect, url_for, render_template, jsonify
  6. from flask_cors import CORS
  7. from dotenv import load_dotenv
  8. load_dotenv()
  9. sys.path.append('.data/extensions')
  10. if find_spec('twitter_v2_facade'):
  11. # FIXME get_brand needs a refactor
  12. from twitter_v2_facade import twitter_app as twitter_v2
  13. import oauth2_login
  14. twitter_enabled = True
  15. else:
  16. print('twitter module not found.')
  17. twitter_enabled = False
  18. if find_spec('twitter_v2_live_facade'):
  19. from twitter_v2_live_facade import twitter_app as twitter_v2_live
  20. import oauth2_login
  21. from item_collections import item_collections_bp
  22. from brands import brands_bp, get_brand
  23. twitter_live_enabled = True
  24. else:
  25. print('twitter live module not found.')
  26. twitter_live_enabled = False
  27. if find_spec('twitter_archive_facade'):
  28. from twitter_archive_facade import twitter_app as twitter_archive
  29. archive_enabled = True
  30. else:
  31. print('twitter archive module not found.')
  32. archive_enabled = False
  33. if find_spec('mastodon_facade'):
  34. from mastodon_facade import twitter_app as mastodon
  35. mastodon_enabled = True
  36. else:
  37. print('mastodon module not found.')
  38. mastodon_enabled = False
  39. if find_spec('feeds_facade'):
  40. from feeds_facade import twitter_app as feeds
  41. feeds_enabled = True
  42. else:
  43. print('feeds module not found.')
  44. feeds_enabled = False
  45. if find_spec('youtube_facade'):
  46. from youtube_facade import youtube_app as youtube
  47. youtube_enabled = True
  48. else:
  49. print('youtube module not found.')
  50. youtube_enabled = False
  51. if find_spec('email_facade'):
  52. from email_facade import messages_facade as messages
  53. messages_enabled = True
  54. else:
  55. print('messages module not found.')
  56. messages_enabled = False
  57. if find_spec('videojs'):
  58. from videojs import videojs_bp
  59. videojs_enabled = True
  60. else:
  61. print('videojs module not found.')
  62. videojs_enabled = False
  63. if find_spec('visjs'):
  64. from visjs import visjs_bp
  65. visjs_enabled = True
  66. else:
  67. print('messages module not found.')
  68. visjs_enabled = False
  69. #messages_enabled = False
  70. #twitter_live_enabled = True
  71. add_account_enabled = True
  72. if __name__ == '__main__':
  73. glitch_enabled = os.environ.get('PROJECT_DOMAIN') and True
  74. t = os.environ.get('BEARER_TOKEN')
  75. PORT = int(os.environ.get('PORT', 5000))
  76. HOST = os.environ.get('HOST', '127.0.0.1')
  77. archive_enabled = os.environ.get('ARCHIVE_TWEETS_PATH') and True
  78. notes_app_url = os.environ.get('NOTES_APP_URL')
  79. bedrss_app_url = os.environ.get('NOTES_APP_URL')
  80. plots_app_url = os.environ.get('PLOTS_APP_URL')
  81. videos_app_url = os.environ.get('VIDEOS_APP_URL')
  82. messages_app_url = os.environ.get('MESSAGES_APP_URL')
  83. if not os.path.exists('.data'):
  84. os.mkdir('.data')
  85. if not os.path.exists('.data/cache'):
  86. os.mkdir('.data/cache')
  87. api = Flask(__name__, static_url_path='')
  88. # HACK - environ from .env isn't set yet when the import happens. We should call an init function somewhere.
  89. oauth2_login.app_access_token = os.environ.get("BEARER_TOKEN")
  90. oauth2_login.app_consumer_key = os.environ.get("TWITTER_CONSUMER_KEY")
  91. oauth2_login.app_secret_key = os.environ.get("TWITTER_CONSUMER_SECRET")
  92. @api.before_request
  93. def add_config ():
  94. g.twitter_enabled = twitter_enabled
  95. g.archive_enabled = archive_enabled
  96. g.mastodon_enabled = mastodon_enabled
  97. g.feeds_enabled = feeds_enabled
  98. g.youtube_enabled = youtube_enabled
  99. g.messages_enabled = messages_enabled
  100. g.twitter_live_enabled = twitter_live_enabled
  101. g.add_account_enabled = add_account_enabled
  102. g.glitch_enabled = glitch_enabled
  103. g.videojs_enabled = videojs_enabled
  104. g.visjs_enabled = visjs_enabled
  105. if glitch_enabled:
  106. g.app_url = 'https://{}.glitch.me'.format( os.environ.get('PROJECT_DOMAIN') )
  107. else:
  108. g.app_url = 'http://{}:{}'.format('localhost', PORT)
  109. if notes_app_url:
  110. g.notes_app_url = notes_app_url
  111. if bedrss_app_url:
  112. g.bedrss_app_url = bedrss_app_url
  113. if plots_app_url:
  114. g.plots_app_url = plots_app_url
  115. if videos_app_url:
  116. g.videos_app_url = videos_app_url
  117. if messages_app_url:
  118. g.messages_app_url = messages_app_url
  119. @api.context_processor
  120. def inject_config ():
  121. config = {}
  122. config['twitter_enabled'] = twitter_enabled
  123. config['archive_enabled'] = archive_enabled
  124. config['mastodon_enabled'] = mastodon_enabled
  125. config['feeds_enabled'] = feeds_enabled
  126. config['youtube_enabled'] = youtube_enabled
  127. config['messages_enabled'] = messages_enabled
  128. config['twitter_live_enabled'] = twitter_live_enabled
  129. config['add_account_enabled'] = add_account_enabled
  130. config['glitch_enabled'] = glitch_enabled
  131. config['videojs_enabled'] = videojs_enabled
  132. config['visjs_enabled'] = visjs_enabled
  133. if notes_app_url:
  134. config['notes_app_url'] = notes_app_url
  135. if bedrss_app_url:
  136. config['bedrss_app_url'] = bedrss_app_url
  137. if plots_app_url:
  138. config['plots_app_url'] = plots_app_url
  139. if videos_app_url:
  140. config['videos_app_url'] = videos_app_url
  141. if messages_app_url:
  142. config['messages_app_url'] = messages_app_url
  143. return config
  144. @api.context_processor
  145. def add_nav_items_to_template_context ():
  146. nav_items = []
  147. route_nav = g.get('route_nav')
  148. if route_nav:
  149. nav_items += route_nav
  150. module_nav = g.get('module_nav')
  151. if module_nav:
  152. nav_items += module_nav
  153. #nav_items.sort(key = lambda ni: ni['order'])
  154. return dict(
  155. nav_items = nav_items
  156. )
  157. api.secret_key = os.environ.get('FLASK_SECRET')
  158. api.config['TEMPLATES_AUTO_RELOAD'] = True
  159. if videojs_enabled:
  160. api.register_blueprint(videojs_bp, url_prefix='/lib/videojs')
  161. if visjs_enabled:
  162. api.register_blueprint(visjs_bp, url_prefix='/lib/visjs')
  163. api.register_blueprint(twitter_v2, url_prefix='/twitter')
  164. if archive_enabled:
  165. api.register_blueprint(twitter_archive, url_prefix='/twitter-archive')
  166. if mastodon_enabled:
  167. api.register_blueprint(mastodon, url_prefix='/mastodon')
  168. if feeds_enabled:
  169. if not os.path.exists('.data/cache/feeds'):
  170. os.mkdir('.data/cache/feeds')
  171. api.register_blueprint(feeds, url_prefix='/feeds')
  172. if youtube_enabled:
  173. api.register_blueprint(youtube, url_prefix='/youtube')
  174. if messages_enabled:
  175. api.register_blueprint(messages, url_prefix='/messages')
  176. if twitter_live_enabled:
  177. api.register_blueprint(twitter_v2_live, url_prefix='/twitter-live')
  178. api.register_blueprint(item_collections_bp, url_prefix='/collections')
  179. api.register_blueprint(brands_bp, url_prefix='/')
  180. #CORS(api)
  181. @api.get('/login.html')
  182. def get_login_html ():
  183. opengraph_info = dict(
  184. type = 'webpage', # threads might be article
  185. url = g.app_url,
  186. title = 'Hogumathi',
  187. description = 'An app for Twitter, Mastodon, YouTube, etc; Open Source.'
  188. )
  189. return render_template('login.html', opengraph_info=opengraph_info)
  190. @api.get('/')
  191. def index ():
  192. return redirect(url_for('.get_login_html'))
  193. api.run(port=PORT, host=HOST)