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 } }