web.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. from flask import Flask, render_template, make_response, request
  2. from bookworm import s3, constants
  3. import pg_simple
  4. import json
  5. import redis
  6. s3client = s3.client()
  7. app = Flask(__name__)
  8. pool = pg_simple.config_pool(dsn='dbname=david user=david')
  9. db = pg_simple.PgSimple(pool)
  10. r = redis.StrictRedis(host='localhost', port=6379, decode_responses=True)
  11. @app.route('/books/status', methods=['GET'])
  12. def status_books():
  13. keys = r.keys('book_*')
  14. ret = {}
  15. for key in keys:
  16. val = r.hgetall(key)
  17. ret[key] = val
  18. print(ret)
  19. return json.dumps(ret)
  20. @app.route('/')
  21. def index():
  22. objects = s3client.list_objects_v2(Bucket=constants.PROCESSED_FILE_BUCKET)['Contents']
  23. objects = sorted(objects, key=lambda x: x['LastModified'], reverse=True)
  24. books = [obj['Key'] for obj in objects]
  25. return render_template('kindle-index.j2', books=books)
  26. @app.route('/book/<path:book>')
  27. def serve_books(book):
  28. obj = s3client.get_object(Bucket=constants.PROCESSED_FILE_BUCKET, Key=book)
  29. data = obj['Body'].read()
  30. response = make_response(data)
  31. response.headers.set('Content-Disposition', 'attachment', filename=book)
  32. response.headers.set('Content-Length', len(data))
  33. return response
  34. @app.route('/book/search', methods=['GET'])
  35. def search_books():
  36. terms = request.args.get('terms').split()
  37. terms = [f'%{term}%' for term in terms]
  38. books = db.fetchall('books',
  39. fields=['bot', 'book'],
  40. where=('lower(book) like all(%s)', [terms]),
  41. limit=100)
  42. return json.dumps([b._asdict() for b in books])
  43. @app.route('/book/fetch', methods=['POST'])
  44. def fetch_books():
  45. fetch = request.json
  46. print(fetch)
  47. r.rpush(constants.REDIS_BOOK_COMMANDS, json.dumps({'bot': fetch['bot'], 'book': fetch['book']}))
  48. return ''
  49. def main():
  50. app.run(host='0.0.0.0', debug=True)
  51. if __name__ == '__main__':
  52. main()