This repository has been archived on 2020-11-22. You can view files and clone it, but cannot push or open issues or pull requests.
mangareader/mangareader.py
Simon Bruder 9800befe37
All checks were successful
continuous-integration/drone/push Build is passing
backend: use webp for thumbnails and cache them
2019-07-19 16:10:34 +00:00

87 lines
2.4 KiB
Python
Executable file

#!/usr/bin/env python3
from backend import CalibreDB
from flask import Flask, jsonify, send_from_directory, send_file, render_template, request
from flask_cors import CORS
from werkzeug.routing import BaseConverter
from zlib import crc32
import os
def send_from_cwd(filename):
return send_from_directory(os.getcwd(), filename)
def send_file_with_etag(fp, etag=None, **kwargs):
if etag is None:
etag = str(crc32(fp.read()))
if request.if_none_match and etag in request.if_none_match:
return '', 304
response = send_file(fp, **kwargs)
response.set_etag(etag)
fp.seek(0)
return response
app = Flask(__name__, static_folder='frontend/dist/static', template_folder='frontend/dist')
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 604800 # 1 week
CORS(app)
db = CalibreDB()
# kind of redundant, but avoids returning 200 if page does not exist
@app.route('/')
@app.route('/series/<id>')
@app.route('/volume/<id>')
def serve_app(**kwargs):
return render_template('index.html')
@app.route('/api/series')
def get_series_list():
return jsonify(list(db.get_series_list()))
@app.route('/api/series/<int:series_id>/cover')
def get_series_cover(series_id):
return send_from_cwd(db.get_series_cover(series_id))
@app.route('/api/series/<int:series_id>/cover/thumbnail')
def get_series_cover_thumbnail(series_id):
thumbnail = db.get_series_cover_thumbnail(series_id)
return send_file_with_etag(thumbnail['data'], mimetype=thumbnail['mimetype'])
@app.route('/api/series/<int:series_id>')
def get_series_info(series_id):
return jsonify(db.get_series_volumes(series_id))
@app.route('/api/volume/<int:volume_id>/cover')
def get_volume_cover(volume_id):
return send_from_cwd(db.get_volume_cover(volume_id))
@app.route('/api/volume/<int:volume_id>/cover/thumbnail')
def get_volume_cover_thumbnail(volume_id):
thumbnail = db.get_volume_cover_thumbnail(volume_id)
return send_file_with_etag(thumbnail['data'], mimetype=thumbnail['mimetype'])
@app.route('/api/volume/<int:volume_id>')
def get_volume_info(volume_id):
return jsonify(db.get_volume_info(volume_id))
@app.route('/api/volume/<int:volume_id>/page/<int:page_number>')
def get_volume_page(volume_id, page_number):
page = db.get_volume_page(volume_id, page_number)
response = send_file_with_etag(page['data'], etag=page['etag'], mimetype=page['mimetype'])
return response
if __name__ == '__main__':
app.run(host='0.0.0.0')