#!/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 import os def send_from_cwd(filename): return send_from_directory(os.getcwd(), filename) def send_file_with_etag(fp, etag, **kwargs): 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 def send_image(image): return send_file_with_etag(image['buffer'], image['etag'], mimetype=image['mimetype']) 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/') @app.route('/volume/') 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//cover') def get_series_cover(series_id): return send_from_cwd(db.get_series_cover(series_id)) @app.route('/api/series//cover/thumbnail') def get_series_cover_thumbnail(series_id): thumbnail = db.get_series_cover_thumbnail(series_id) return send_image(thumbnail) @app.route('/api/series/') def get_series_info(series_id): return jsonify(db.get_series_volumes(series_id)) @app.route('/api/volume//cover') def get_volume_cover(volume_id): return send_from_cwd(db.get_volume_cover(volume_id)) @app.route('/api/volume//cover/thumbnail') def get_volume_cover_thumbnail(volume_id): thumbnail = db.get_volume_cover_thumbnail(volume_id) return send_image(thumbnail) @app.route('/api/volume/') def get_volume_info(volume_id): return jsonify(db.get_volume_info(volume_id)) @app.route('/api/volume//page/') def get_volume_page(volume_id, page_number): page = db.get_volume_page(volume_id, page_number) return send_image(page) @app.route('/api/volume//page//original') def get_volume_page_original(volume_id, page_number): page = db.get_volume_page(volume_id, page_number, original=True) return send_image(page) if __name__ == '__main__': app.run(host='0.0.0.0')