Audiobookshelf support mostly working.

This commit is contained in:
Storm Dragon
2025-10-05 20:19:16 -04:00
parent 1d19ed377c
commit 4387a5cb56
14 changed files with 3979 additions and 67 deletions

View File

@@ -65,6 +65,10 @@ class OptionsMenu:
showText = self.config.get_show_text()
showTextLabel = "Show Text Display: On" if showText else "Show Text Display: Off"
# Add Audiobookshelf setup status
absConfigured = self.config.is_abs_configured()
absLabel = "Audiobookshelf: Configured" if absConfigured else "Audiobookshelf: Not Configured"
menuItems.extend([
{
'label': showTextLabel,
@@ -74,6 +78,10 @@ class OptionsMenu:
'label': "Speech Rate Settings",
'action': 'speech_rate'
},
{
'label': absLabel,
'action': 'audiobookshelf_setup'
},
{
'label': "Back",
'action': 'back'
@@ -124,6 +132,8 @@ class OptionsMenu:
return self._toggle_show_text()
elif action == 'speech_rate':
return self._speech_rate_info()
elif action == 'audiobookshelf_setup':
return self._audiobookshelf_setup()
elif action == 'back':
self.speechEngine.speak("Closing options menu")
return False
@@ -483,6 +493,96 @@ class OptionsMenu:
if menuItems and self.currentSelection < len(menuItems):
self.speechEngine.speak(menuItems[self.currentSelection]['label'])
def _audiobookshelf_setup(self):
"""Setup Audiobookshelf server connection"""
from src.ui import get_input
self.speechEngine.speak("Audiobookshelf setup starting.")
# Show current settings if configured
currentUrl = ""
currentUser = ""
if self.config.is_abs_configured():
currentUrl = self.config.get_abs_server_url()
currentUser = self.config.get_abs_username()
self.speechEngine.speak(f"Current server: {currentUrl}. Current username: {currentUser}. Leave fields blank to keep current values.")
# Get server URL
serverUrlPrompt = "Enter Audiobookshelf server URL. Example: https colon slash slash abs dot example dot com"
serverUrl = get_input(self.speechEngine, serverUrlPrompt, currentUrl)
if serverUrl is None:
self.speechEngine.speak("Setup cancelled.")
return True
serverUrl = serverUrl.strip()
if not serverUrl and self.config.is_abs_configured():
serverUrl = currentUrl
self.speechEngine.speak(f"Using current URL: {serverUrl}")
elif not serverUrl:
self.speechEngine.speak("Server URL required. Setup cancelled.")
return True
# Validate URL format
if not serverUrl.startswith(('http://', 'https://')):
self.speechEngine.speak("Invalid URL. Must start with http or https. Setup cancelled.")
return True
# Get username
usernamePrompt = "Enter Audiobookshelf username"
username = get_input(self.speechEngine, usernamePrompt, currentUser)
if username is None:
self.speechEngine.speak("Setup cancelled.")
return True
username = username.strip()
if not username and self.config.is_abs_configured():
username = currentUser
self.speechEngine.speak(f"Using current username: {username}")
elif not username:
self.speechEngine.speak("Username required. Setup cancelled.")
return True
# Get password
passwordPrompt = "Enter password for testing connection. Note: Password is NOT saved, only the authentication token."
password = get_input(self.speechEngine, passwordPrompt, "")
if password is None:
self.speechEngine.speak("Setup cancelled.")
return True
if not password:
self.speechEngine.speak("Password required. Setup cancelled.")
return True
# Test connection
self.speechEngine.speak("Testing connection. Please wait.")
# Import here to avoid circular dependency
from src.audiobookshelf_client import AudiobookshelfClient
# Create temporary client to test
testClient = AudiobookshelfClient(serverUrl, None)
if not testClient.login(username, password):
self.speechEngine.speak("Login failed. Check server URL, username, and password. Make sure the server is reachable and credentials are correct.")
return True
# Login successful - get token
authToken = testClient.authToken
# Save settings
self.config.set_abs_server_url(serverUrl)
self.config.set_abs_username(username)
self.config.set_abs_auth_token(authToken)
self.speechEngine.speak("Setup successful. Audiobookshelf configured. You can now press a to browse your Audiobookshelf library.")
return True
def exit_menu(self):
"""Exit the menu"""
self.inMenu = False