В discord.py не слишеом сложные правила разбора строки с командой.
1. По умолчанию одно слово интерпретируется как один параметр.
async def command(ctx, a: str, b: str, c:str)
!command раз два три
a, b, c == "раз", "два", "три"
2. Если часть вводимой команды заключена в кавычки, то она интерпретируется как один параметр.
async def command(ctx, a: str, b: str)
!command "раз два" три
a, b == "раз два", "три"
3. Если
последний параметр отмечен как "все позиционные аргументы" (*args), то все последующие слова попадают в него как отдельные элементы.
async def command(ctx, a: str, *b: str)
!command раз два три
a, b == "раз", ("два", "три")
4. Если
последний параметр обозначен как "только ключевое слово" (..., *, param), то остаток строки подаётся в него как есть.
async def command(ctx, a: str, *, b: str)
!command раз два три
a, b == "раз", "два три"
Таким образом, у тебя есть два выхода.
а) помещай строку с названием книги в кавычки
б) поставь название книги последним параметром в своей команде
EDIT: ниже напомнили, что есть слэш-команды. Посмотри их!