소스 검색

add content-type to the downloads to avoid the kindle from hanging

david 7 년 전
부모
커밋
9b5539c311
1개의 변경된 파일18개의 추가작업 그리고 3개의 파일을 삭제
  1. 18 3
      bookworm/web.py

+ 18 - 3
bookworm/web.py

@@ -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 ''