|
|
@@ -3,6 +3,8 @@ from bookworm import s3, constants
|
|
|
import pg_simple
|
|
|
import json
|
|
|
import redis
|
|
|
+import os
|
|
|
+import re
|
|
|
|
|
|
s3client = s3.client()
|
|
|
app = Flask(__name__)
|
|
|
@@ -20,11 +22,15 @@ def status_books():
|
|
|
print(ret)
|
|
|
return json.dumps(ret)
|
|
|
|
|
|
+def clean_book_name(book):
|
|
|
+ cbr = re.compile(r'epub|azw3|mobi|\(v[0-9.]+\)')
|
|
|
+ return cbr.sub('', book).rstrip('() .-')
|
|
|
+
|
|
|
@app.route('/')
|
|
|
def index():
|
|
|
objects = s3client.list_objects_v2(Bucket=constants.PROCESSED_FILE_BUCKET)['Contents']
|
|
|
objects = sorted(objects, key=lambda x: x['LastModified'], reverse=True)
|
|
|
- books = [obj['Key'] for obj in objects]
|
|
|
+ books = [(obj['Key'], clean_book_name(obj['Key'])) for obj in objects]
|
|
|
return render_template('kindle-index.j2', books=books)
|
|
|
|
|
|
@app.route('/book/<path:book>')
|
|
|
@@ -32,8 +38,18 @@ def serve_books(book):
|
|
|
obj = s3client.get_object(Bucket=constants.PROCESSED_FILE_BUCKET, Key=book)
|
|
|
data = obj['Body'].read()
|
|
|
response = make_response(data)
|
|
|
- response.headers.set('Content-Disposition', 'attachment', filename=book)
|
|
|
+ response.headers.set('Content-Disposition', f'attachment; filename="{book}"')
|
|
|
response.headers.set('Content-Length', len(data))
|
|
|
+
|
|
|
+ _, ext = os.path.splitext(book)
|
|
|
+ if ext == '.mobi':
|
|
|
+ content_type = 'application/x-mobipocket-ebook'
|
|
|
+ elif ext == '.azw3':
|
|
|
+ content_type = 'application/x-mobi8-ebook'
|
|
|
+ else:
|
|
|
+ content_type = 'text/plain'
|
|
|
+
|
|
|
+ response.headers.set('Content-Type', content_type)
|
|
|
return response
|
|
|
|
|
|
@app.route('/book/search', methods=['GET'])
|
|
|
@@ -50,7 +66,6 @@ def search_books():
|
|
|
@app.route('/book/fetch', methods=['POST'])
|
|
|
def fetch_books():
|
|
|
fetch = request.json
|
|
|
- print(fetch)
|
|
|
r.rpush(constants.REDIS_BOOK_COMMANDS, json.dumps({'bot': fetch['bot'], 'book': fetch['book']}))
|
|
|
return ''
|
|
|
|