ryomo's picture
Implement system to chat with novel heroes
6a2d777
import json
from pathlib import Path
def get_book_list() -> str:
"""
Get list of available books.
Returns:
str: JSON string containing the list of book names.
"""
books_dir = Path("./books")
if not books_dir.exists():
return json.dumps("Error: Books directory not found.")
text_files = []
for file in books_dir.iterdir():
if file.is_file() and file.suffix.lower() == ".txt":
text_files.append(file.stem)
return json.dumps(sorted(text_files))
def get_book_content(book_name: str, max_length: int = 0) -> str:
"""
Get the content of a book.
Args:
book_name (str): The name of the book (without .txt extension).
max_length (int): The maximum length of the content to return. If 0, return the full content.
Returns:
str: The content of the book, or an error message if the book is not found.
"""
books_dir = Path("./books")
book_file = books_dir / f"{book_name}.txt"
if not book_file.exists():
return f"Error: Book '{book_name}' not found."
with open(book_file, "r", encoding="utf-8") as f:
lines = f.readlines()
content = _remove_header_footer(lines)
if not max_length:
return content
else:
return content[:max_length]
def _remove_header_footer(lines: list[str]) -> str:
"""
Remove the header and footer from the book content.
Args:
lines (list[str]): List of lines from the book content.
Returns:
str: The content without the header and footer.
"""
# Find start index
start_index = 0
for i, line in enumerate(lines):
if line.startswith("*** START OF THE PROJECT GUTENBERG EBOOK"):
start_index = i + 1
break
# Find end index
end_index = len(lines)
for i in range(len(lines) - 1, -1, -1):
if lines[i].startswith("*** END OF THE PROJECT GUTENBERG EBOOK"):
end_index = i
break
return '\n'.join(lines[start_index:end_index])
if __name__ == "__main__":
print("Available books:", get_book_list())
book_name = "Winnie_the_Pooh_by_A_A_Milne_9255"
book_content = get_book_content(book_name)
print(f"Start of '{book_name}':\n{book_content[:500]}...\n")
print(f"End of '{book_name}':\n{book_content[-500:]}\n")