OpenLibrary.org Client for Kotlin
To begin, import the library using jitpack.io.
You can include jitpack in your pom.xml by adding the following jitpack repository:
<repository>
<id>jitpack.io</id>
<url>https://www.jitpack.io</url>
</repository>Then add this openlibrary-kotlin dependency to your pom.xml project!
<dependency>
<groupId>com.github.official-wizard</groupId>
<artifactId>openlibrary-kotlin</artifactId>
<version>1.0.0</version>
</dependency>val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryClient = OpenLibraryClient(identifier).api
// access the api interface in `api`Some endpoints require you to be authenticated, e.g. the ones for creating lists. You can easily authenticate your client by doing the following.
// create client instance
val client = OpenLibraryClient(Identifier()).api
// send the authentication request
val authentication: NetworkResponse<Login.Response, Unit> =
client.authenticate(username = "<email>", password = "<password>")
// an error occurred
if (authentication !is NetworkResponse.Success) {
if (authentication is NetworkResponse.ServerError) {
// the credentials you provided are most likely invalid, refer to response code for further
// information
}
if (authentication is NetworkResponse.UnknownError) {
// an unknown error occurred while authenticating, handle [authentication] result
}
// ...
return
}
val authenticationResponse: Login.Response = authentication.body
if (authenticationResponse.authenticated) {
// we've authenticated our [client], this only needs to be done once per instance
}Query
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| query | String | The query you'd like to search for. | The Lord of The Rings | yes |
| sort | String | How you'd like to sort the query, by default it uses relevancy. | new | no |
| lang | String | The users language as a two letter (ISO 639-1) language code. | en | no |
| offset | Long | offset the list by the provided amount. | 50 | no |
| page | Long | The page you'd like to traverse to. | 0 | no |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchBooks.Response, SearchBooks.Response>
= api.searchBooksByQuery(query = "The Lord of the Rings")
if (search is NetworkResponse.Success) {
val searchResult: SearchBooks.Response = search.body
// handle [searchResult] as you wish
}
Title
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| title | String | The title you'd like to search for. | The Lord of The Rings | yes |
| sort | String | How you'd like to sort the query, by default it uses relevancy. | new | no |
| lang | String | The users language as a two letter (ISO 639-1) language code. | en | no |
| offset | Long | offset the list by the provided amount. | 50 | no |
| page | Long | The page you'd like to traverse to. | 0 | no |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchBooks.Response, SearchBooks.Response>
= api.searchBooksByTitle(title = "The Lord of the Rings")
if (search is NetworkResponse.Success) {
val searchResult: SearchBooks.Response = search.body
// handle [searchResult] as you wish
}
Author
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| author | String | The author you'd like to search for. | J K Rowling | yes |
| sort | String | How you'd like to sort the query, by default it uses relevancy. | new | no |
| lang | String | The users language as a two letter (ISO 639-1) language code. | en | no |
| offset | Long | offset the list by the provided amount. | 50 | no |
| page | Long | The page you'd like to traverse to. | 0 | no |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchBooks.Response, SearchBooks.Response>
= api.searchBooksByAuthor(author = "J K Rowling")
if (search is NetworkResponse.Success) {
val searchResult: SearchBooks.Response = search.body
// handle [searchResult] as you wish
}
Want To Read Books
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| username | String | The username you'd like to search for. | mokBot | yes |
| sort | String | How you'd like to sort the query, by default it uses relevancy. | new | no |
| lang | String | The users language as a two letter (ISO 639-1) language code. | en | no |
| offset | Long | offset the list by the provided amount. | 50 | no |
| page | Long | The page you'd like to traverse to. | 0 | no |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchMyBooks.Response, SearchMyBooks.Response>
= api.searchMyWantToReadBooks(username = "mokBot")
if (search is NetworkResponse.Success) {
val searchResult: SearchMyBooks.Response = search.body
// handle [searchResult] as you wish
}
Currently Reading Books
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| username | String | The username you'd like to search for. | mokBot | yes |
| sort | String | How you'd like to sort the query, by default it uses relevancy. | new | no |
| lang | String | The users language as a two letter (ISO 639-1) language code. | en | no |
| offset | Long | offset the list by the provided amount. | 50 | no |
| page | Long | The page you'd like to traverse to. | 0 | no |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchMyBooks.Response, SearchMyBooks.Response>
= api.searchMyCurrentlyReadingBooks(username = "mokBot")
if (search is NetworkResponse.Success) {
val searchResult: SearchMyBooks.Response = search.body
// handle [searchResult] as you wish
}
Already Read Books
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| username | String | The username you'd like to search for. | mokBot | yes |
| sort | String | How you'd like to sort the query, by default it uses relevancy. | new | no |
| lang | String | The users language as a two letter (ISO 639-1) language code. | en | no |
| offset | Long | offset the list by the provided amount. | 50 | no |
| page | Long | The page you'd like to traverse to. | 0 | no |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchMyBooks.Response, SearchMyBooks.Response>
= api.searchMyAlreadyReadBooks(username = "mokBot")
if (search is NetworkResponse.Success) {
val searchResult: SearchMyBooks.Response = search.body
// handle [searchResult] as you wish
}
Works
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| olid | String | the OLID to the works. | OL01W | yes |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchWorks.Response, ErrorResponse.Response>
= api.searchWorks(olid = "OL01W")
if (search is NetworkResponse.Success) {
val searchResult: SearchWorks.Response = search.body
// handle [searchResult] as you wish
}
Editions
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| olid | String | the OLID to the works. | OL01W | yes |
| offset | Long | offset the list by the provided amount. | 50 | no |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchWorksEditions.Response, ErrorResponse.Response>
= api.searchWorksEditions(olid = "OL01W")
if (search is NetworkResponse.Success) {
val searchResult: SearchWorksEditions.Response = search.body
// handle [searchResult] as you wish
}Bookshelves
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| olid | String | the OLID to the works. | OL01W | yes |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchWorksBookshelves.Response, ErrorResponse.Response>
= api.searchWorksBookshelves(olid = "OL01W")
if (search is NetworkResponse.Success) {
val searchResult: SearchWorksBookshelves.Response = search.body
// handle [searchResult] as you wish
}Ratings
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| olid | String | the OLID to the works. | OL01W | yes |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchWorksRatings.Response, ErrorResponse.Response>
= api.searchWorksRatings(olid = "OL01W")
if (search is NetworkResponse.Success) {
val searchResult: SearchWorksRatings.Response = search.body
// handle [searchResult] as you wish
}Isbn
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| isbn | String | the isbn to the works. | 0000 | yes |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchIsbn.Response, ErrorResponse.Response>
= api.searchWorksIsbn(isbn = "0000")
if (search is NetworkResponse.Success) {
val searchResult: SearchIsbn.Response = search.body
// handle [searchResult] as you wish
}Authors
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| query | String | author's query you'd like to serch for. | J K Rowling | yes |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchAuthors.Response, SearchAuthors.Response>
= api.searchAuthors(query = "<author query>")
if (search is NetworkResponse.Success) {
val searchResult: SearchAuthors.Response = search.body
// handle [searchResult] as you wish
}Subject
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| subject | String | The subject you'd like to search for. | Love | yes |
| details | Boolean | Include details about the subject. | True | no |
| publishedInRange | String | Date range for punishments. | 2008-2010 | no |
| limit | Int | Limit the amount of results to return | 50 | no |
| offset | Int | Offset the results to jump to. | 0 | no |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchSubjects.Response, SearchSubjects.Response>
= api.searchSubjects(subject = "love")
if (search is NetworkResponse.Success) {
val searchResult: SearchSubjects.Response = search.body
// handle [searchResult] as you wish
}Partner
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| partner | Partner | A supported partner to query with. | Partner.isbn | yes |
| partnerId | String | The partner ID to query with. | 01a0 | no |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchPartner.Response, SearchPartner.Response>
= api.searchPartner(partner = Partner.isbn, partnerId = "01s3")
if (search is NetworkResponse.Success) {
val searchResult: SearchPartner.Response = search.body
// handle [searchResult] as you wish
}Partners
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| requestList | String | List of partners and the IDs you'd like to query. | id:1;lccn:50006784|olid:OL6179000M;lccn:55011330 | yes |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchPartner.Response, SearchPartner.Response>
= api.searchPartners(requestList = "id:1;lccn:50006784|olid:OL6179000M;lccn:55011330")
if (search is NetworkResponse.Success) {
val searchResult: Map<String, SearchPartner.Response>
= search.body
// handle [searchResult] as you wish
}Recent
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| bot | Boolean | Ignore changes made by bots. | True | no |
| limit | Int | Limit the amount of results to return | 50 | no |
| offset | Int | Offset the results to jump to. | 0 | no |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<List<SearchChanges.Response>, ErrorResponse.Response>
= api.searchRecentChanges()
if (search is NetworkResponse.Success) {
val searchResult: List<SearchChanges.Response>
= search.body
// handle [searchResult] as you wish
}Type
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| query | SearchChangesQuery | Change type. | SearchChangesQuery(year = 2008) | yes |
| bot | Boolean | Ignore changes made by bots. | True | no |
| limit | Int | Limit the amount of results to return | 50 | no |
| offset | Int | Offset the results to jump to. | 0 | no |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<List<SearchChanges.Response>, ErrorResponse.Response>
= api.searchChanges(query = SearchChangesQuery(year = 2008))
if (search is NetworkResponse.Success) {
val searchResult: List<SearchChanges.Response>
= search.body
// handle [searchResult] as you wish
}User
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| username | String | Open Library Username | mekBot | yes |
| limit | Int | Limit the amount of results to return | 50 | no |
| offset | Int | Offset the results to jump to. | 0 | no |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchUsersList.Response, ErrorResponse.Response>
= api.searchUsersList(username = "mekBot")
if (search is NetworkResponse.Success) {
val searchResult: SearchUsersList.Response = search.body
// handle [searchResult] as you wish
}User (OLID)
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| username | String | Open Library Username | mekBot | yes |
| olid | String | The OLID to query. | OL1AW | yes |
| limit | Int | Limit the amount of results to return | 50 | no |
| offset | Int | Offset the results to jump to. | 0 | no |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchUserOlidList.Response, ErrorResponse.Response>
= api.searchUsersList(username = "mekBot", olid = "OL01L")
if (search is NetworkResponse.Success) {
val searchResult: SearchUserOlidList.Response = search.body
// handle [searchResult] as you wish
}Seeds
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| username | String | Open Library Username | mekBot | yes |
| olid | String | The OLID to query. | OL1AW | yes |
| limit | Int | Limit the amount of results to return | 50 | no |
| offset | Int | Offset the results to jump to. | 0 | no |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchUsersSeedList.Response, ErrorResponse.Response>
= api.searchUsersSeedList(username = "mekBot", olid = "OL01L")
if (search is NetworkResponse.Success) {
val searchResult: SearchUsersSeedList.Response = search.body
// handle [searchResult] as you wish
}Editions
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| username | String | Open Library Username | mekBot | yes |
| olid | String | The OLID to query. | OL1AW | yes |
| limit | Int | Limit the amount of results to return | 50 | no |
| offset | Int | Offset the results to jump to. | 0 | no |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchUsersEditionList.Response, ErrorResponse.Response>
= api.searchUsersEditionList(username = "mekBot", olid = "OL01L")
if (search is NetworkResponse.Success) {
val searchResult: SearchUsersEditionList.Response = search.body
// handle [searchResult] as you wish
}Subjects
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| username | String | Open Library Username | mekBot | yes |
| olid | String | The OLID to query. | OL1AW | yes |
| limit | Int | Limit the amount of results to return | 50 | no |
| offset | Int | Offset the results to jump to. | 0 | no |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchUsersSubjectsList.Response, ErrorResponse.Response>
= api.searchUsersSubjectsList(username = "mekBot", olid = "OL01L")
if (search is NetworkResponse.Success) {
val searchResult: SearchUsersSubjectsList.Response = search.body
// handle [searchResult] as you wish
}OLID Books
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| olid | String | The OLID to query. | OL1AW | yes |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchUsersList.Response, ErrorResponse.Response>
= api.searchOlidBooksList(olid = "OL01L")
if (search is NetworkResponse.Success) {
val searchResult: SearchUsersList.Response = search.body
// handle [searchResult] as you wish
}Works
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| olid | String | The OLID to query. | OL1AW | yes |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchUsersList.Response, ErrorResponse.Response>
= api.searchOlidWorksList(olid = "OL01L")
if (search is NetworkResponse.Success) {
val searchResult: SearchUsersList.Response = search.body
// handle [searchResult] as you wish
}Authors
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| olid | String | The OLID to query. | OL1AW | yes |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchUsersList.Response, ErrorResponse.Response>
= api.searchOlidAuthorsList(olid = "OL01L")
if (search is NetworkResponse.Success) {
val searchResult: SearchUsersList.Response = search.body
// handle [searchResult] as you wish
}Place (location)
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| location | String | The location to search for. | san_francisco | yes |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchUsersList.Response, ErrorResponse.Response>
= api.searchSubjectsPlaceList(location = "san_francisco")
if (search is NetworkResponse.Success) {
val searchResult: SearchUsersList.Response = search.body
// handle [searchResult] as you wish
}Query
| Name | Type | Description | Example | required |
|---|---|---|---|---|
| query | String | The query to search for. | book | yes |
Example
val identifier: Identifier = Identifier("<client user agent>")
val api: OpenLibraryInterface = OpenLibraryClient(identifier).api
val search: NetworkResponse<SearchUsersList.Response, ErrorResponse.Response>
= api.searchQueryList(query = "book")
if (search is NetworkResponse.Success) {
val searchResult: SearchUsersList.Response = search.body
// handle [searchResult] as you wish
}Create List
A call to
createListin this manner will will update a pre-existing list with the details provided!
NOTE You must have the client authenticated to do this!
Available Parameters
| Name | Type | Description | Example |
|---|---|---|---|
| username | String | The username authenticated for the session | username |
| olid | String | The OLID (Open Library ID) of the list | OL01L |
| createList | CreateList.Request | The request object with details to create list with. | N/A |
Example
// create client instance
val client = OpenLibraryClient(Identifier()).api
// send the authentication request
val authentication: NetworkResponse<Login.Response, Unit> =
client.authenticate(username = "<email>", password = "<password>")
// an error occurred
if (authentication !is NetworkResponse.Success) {
if (authentication is NetworkResponse.ServerError) {
// the credentials you provided are most likely invalid, refer to response code for further
// information
}
if (authentication is NetworkResponse.UnknownError) {
// an unknown error occurred while authenticating, handle [authentication] result
}
// ...
return
}
val authenticationResponse: Login.Response = authentication.body
if (authenticationResponse.authenticated) {
// we've authenticated our [client], this only needs to be done once per instance
// make sure we have a valid username to work with
val username = authenticationResponse.username
if (username != null) {
// send request to server
val createList = client.createList(
username = username,
createList = CreateList.Request(
"<new name>",
"<new description>"
)
)
if (createList !is NetworkResponse.Success) {
// handle errors
return
}
// handle our result
val result: CreateList.Response = createList.body
}
}