Для человека, который много читает, может быть важен сервис, с помощью которого он записывает какие-то идеи в процессе чтения книг. Достаточно давно я начал под эти цели использовать Goodreads. Он позволял создавать новые книги в их базе, если той книги, которую я читаю не было. Можно было вести какие-то заметки, оценивать книги.
К сожалению, год-полтора назад Goodreads прикрыл возможность самостоятельного ведения библиотеки. Сейчас это делается силами библиотекарей, которых надо просить создавать отсутствующие в базе книги. Ну и так как всё это делается на добровольных началах, то результат крайне непредсказуем. Использовать Goodreads стало неудобно.
После небольшого размышления, я пришёл к выводу, что большая часть функциональности Goodreads мне не нужна, а то что мне нужно можно реализовать в Obsidian с помощью двух плагинов – Book Search и Dataview. Первый позволяет наполнять библиотеку книгами с нужными нам метаданными. Второй позволяет делать любую аналитику и таблицы по библиотечным записям.
Создание самого трекера
Хорошее описание создания трекера описано тут и тут. В принципе достаточно почитать Readme по самому плагину — там тоже всё достаточно хорошо описано.
После установки и включения плагина необходимо будет определить стандартный книжный шаблон:
---
tag: 📚Book
title: "{{title}}"
author: [{{author}}]
publisher: {{publisher}}
publish: {{publishDate}}
total: {{totalPage}}
isbn: {{isbn10}} {{isbn13}}
cover: {{coverUrl}}
status: unread
created: {{DATE:YYYY-MM-DD HH:mm:ss}}
updated: {{DATE:YYYY-MM-DD HH:mm:ss}}
---
![cover|150]({{coverUrl}})
# {{title}}
Я для себя добавил ещё пару полей – rating (для выставления моих субъективных оценок по книге) и recommendations (с краткой информацией о том, каким образом книга попала мне в руки — кто-то порекомендовал, нашёл в каких-то списках и т.д.) Ну и имеет смысл подкорректировать поля с датами — точность до секунды нам не нужна, достаточно будет года-месяца-даты.
Сами книги добавляются в библиотеку с помощью команды Search Book, карточка книги будет заполняться метаданными согласно нашему шаблону.
Финальный штрих — построение таблиц с нужными нам данными. С моей точки зрения, их как минимум три: таблица с читаемыми в данный момент книгами, общая таблица с прочитанными книгами (возможно с сортировкой по дате прочтения) и список книг для чтения, с указанными комментариями о том, почему я захотел её прочитать. Делается это с помощью плагина Dataview. В мом случае запросы получились такими:
Книги в процессе чтения:
```dataview
TABLE WITHOUT ID
status as Status,
rows.file.link as Book
FROM "MyBooks"
WHERE !contains(file.path, "Templates") AND contains(status, "currently-reading")
GROUP BY status
SORT status
```
Прочтённые книги:
```dataview
TABLE WITHOUT ID
status as Status,
"![|60](" + cover + ")" as Cover,
link(file.link, title) as Title,
author[0] as Author,
join(list(publisher, publish)) as Publisher,
rating as "My Rating"
FROM "MyBooks"
WHERE !contains(file.path, "Templates") AND !contains(status, "to-read") AND !contains(status, "currently-reading")
SORT updated DESC
LIMIT 30
```
И книги для чтения:
```dataview
TABLE WITHOUT ID
status as Status,
link(file.link, title) as Title,
recommendations as "Why to read"
FROM "MyBooks"
WHERE !contains(file.path, "Templates") AND contains(status, "to-read")
SORT created DESC
```
Импорт данных из Goodreads
В созданную библиотеку, конечно, хотелось бы добавить те книги, которые уже имеются в Goodreads. Процесс экспорта описан тут. И прямая ссылка на утилиту для экспорта вот.
Данные выгружаются в обычном csv-файле, на базе которого вполне можно, используя любой подручный скриптовый язык, создать карточки книг по нашему шаблону. У меня получился примерно такой скрипт на powershell:
$books = Import-Csv -Path ~\Downloads\goodreads_library_export.csv
forEach ($book in $books)
{
$filename = $book.Title.Replace(":","").Replace('"','').Replace('?','').Replace('/','').Replace('*','').Replace('[','').Replace(']','') + " - " + $book.Author + ".md"
if ($book.'Date Read') { $dateRead = $book.'Date Read' | Get-Date -Format "yyyy-MM-dd" } else { $dateRead = $dateAdded }
"---" | Out-File -FilePath C:\Temp\$filename -Encoding utf8
"tag: #book" | Out-File -FilePath C:\Temp\$filename -Encoding utf8 -Append
'title: "' + $book.Title + '"' | Out-File -FilePath C:\Temp\$filename -Encoding utf8 -Append
"author: [" + $book.Author + ", " + $book.'Author l-f' + ", " + $book.'Additional Authors' + "]" | Out-File -FilePath C:\Temp\$filename -Encoding utf8 -Append
'publisher: "' + $book.Publisher + '"' | Out-File -FilePath C:\Temp\$filename -Encoding utf8 -Append
"publish: " + $book.'Year Published' | Out-File -FilePath C:\Temp\$filename -Encoding utf8 -Append
"total: " + $book.'Number of Pages' | Out-File -FilePath C:\Temp\$filename -Encoding utf8 -Append
"isbn: " + $book.ISBN.Replace('="','').Replace('"', '') + " " + $book.ISBN13.Replace('="','').Replace('"', '') | Out-File -FilePath C:\Temp\$filename -Encoding utf8 -Append
"cover: " | Out-File -FilePath C:\Temp\$filename -Encoding utf8 -Append
"status: " + $book.'Exclusive Shelf' | Out-File -FilePath C:\Temp\$filename -Encoding utf8 -Append
"created: " + $dateAdded | Out-File -FilePath C:\Temp\$filename -Encoding utf8 -Append
"updated: " + $dateRead | Out-File -FilePath C:\Temp\$filename -Encoding utf8 -Append
"rating: " + $book.'My Rating' | Out-File -FilePath C:\Temp\$filename -Encoding utf8 -Append
"recommendations: " | Out-File -FilePath C:\Temp\$filename -Encoding utf8 -Append
"---" | Out-File -FilePath C:\Temp\$filename -Encoding utf8 -Append
"" | Out-File -FilePath C:\Temp\$filename -Encoding utf8 -Append
"![cover|150]()" | Out-File -FilePath C:\Temp\$filename -Encoding utf8 -Append
"" | Out-File -FilePath C:\Temp\$filename -Encoding utf8 -Append
"# " + $book.Title | Out-File -FilePath C:\Temp\$filename -Encoding utf8 -Append
$book.'My Review' | Out-File -FilePath C:\Temp\$filename -Encoding utf8 -Append
}
К сожалению, Goodreads выгружает данные с непредсказуемыми дефектами, поэтому в дальнейшем библиотеку придётся в ручном режиме исправлять. Ну и в выгрузке не содержится никаких данных, связанных с обложкой – с этим придётся смириться и добавлять ссылки на обложку в ручном режиме.
Ну и немного картинок с итогами.