web.py 1.9 KB

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