feat: Enhance Audiobookshelf integration with improved error handling and add Calibre OPDS test route

This commit is contained in:
JB
2025-11-28 18:12:33 -08:00
parent 963b020c0f
commit 94983c39bb
+38 -9
View File
@@ -23,6 +23,7 @@ from abogen.normalization_settings import (
from abogen.llm_client import list_models, LLMClientError
from abogen.kokoro_text_normalization import normalize_for_pipeline
from abogen.integrations.audiobookshelf import AudiobookshelfClient, AudiobookshelfConfig
from abogen.integrations.calibre_opds import CalibreOPDSClient
api_bp = Blueprint("api", __name__)
@@ -79,16 +80,20 @@ def api_speaker_preview() -> ResponseReturnValue:
@api_bp.post("/integrations/audiobookshelf/folders")
def api_abs_folders() -> ResponseReturnValue:
payload = request.get_json(force=True, silent=True) or {}
host = payload.get("host")
token = payload.get("token")
host = payload.get("base_url") or payload.get("host")
token = payload.get("api_token") or payload.get("token")
library_id = payload.get("library_id")
if not host or not token:
return jsonify({"error": "Host and token are required"}), 400
return jsonify({"error": "Base URL and API token are required"}), 400
if not library_id:
return jsonify({"error": "Library ID is required to list folders"}), 400
try:
config = AudiobookshelfConfig(base_url=host, api_token=token)
config = AudiobookshelfConfig(base_url=host, api_token=token, library_id=library_id)
client = AudiobookshelfClient(config)
folders = client.get_libraries()
folders = client.list_folders()
return jsonify({"folders": folders})
except Exception as e:
return jsonify({"error": str(e)}), 400
@@ -96,18 +101,42 @@ def api_abs_folders() -> ResponseReturnValue:
@api_bp.post("/integrations/audiobookshelf/test")
def api_abs_test() -> ResponseReturnValue:
payload = request.get_json(force=True, silent=True) or {}
host = payload.get("host")
token = payload.get("token")
host = payload.get("base_url") or payload.get("host")
token = payload.get("api_token") or payload.get("token")
if not host or not token:
return jsonify({"error": "Host and token are required"}), 400
return jsonify({"error": "Base URL and API token are required"}), 400
try:
config = AudiobookshelfConfig(base_url=host, api_token=token)
client = AudiobookshelfClient(config)
# Just getting libraries is a good enough test
client.get_libraries()
return jsonify({"success": True})
return jsonify({"success": True, "message": "Connection successful."})
except Exception as e:
return jsonify({"error": str(e)}), 400
@api_bp.post("/integrations/calibre-opds/test")
def api_calibre_opds_test() -> ResponseReturnValue:
payload = request.get_json(force=True, silent=True) or {}
base_url = payload.get("base_url")
username = payload.get("username")
password = payload.get("password")
verify_ssl = coerce_bool(payload.get("verify_ssl"), False)
if not base_url:
return jsonify({"error": "Base URL is required"}), 400
try:
client = CalibreOPDSClient(
base_url=base_url,
username=username,
password=password,
verify=verify_ssl,
timeout=10.0
)
client.fetch_feed()
return jsonify({"success": True, "message": "Connection successful."})
except Exception as e:
return jsonify({"error": str(e)}), 400