├── .gitignore ├── api ├── pageplace.family-v1-myself-put.request.json ├── pageplace.bosh-bosh-rest-inventory-count.response.json ├── pageplace.bosh-bosh-rest-sync-data.request-first.json ├── pageplace.family-v1-myself-put.response.json ├── pageplace.family-v1-myself.response-member.json ├── pageplace.family-v1-myself.response-nomember.json ├── doc-official.rst ├── pageplace.bosh-bosh-rest-v2-versioncheck.request.json ├── pageplace.family-v1-shares-post.request.json ├── pageplace.bosh-bosh-rest-content-delete.request.json ├── pageplace.bosh-bosh-rest-userid-xxx.response.json ├── pageplace.bosh-bosh-rest-cover.response.json ├── pageplace.bosh-bosh-rest-v2-registerhw.request.json ├── pageplace.bosh-bosh-rest-content-xxx-yyy.response-missingheader.json ├── pageplace.bosh-bosh-rest-reseller-countries.response-nohardwareid.json ├── pageplace.bosh-bosh-rest-reseller-selection.response-missingparam.json ├── pageplace.bosh-bosh-rest-reseller-selection.response-nohardwareid.json ├── pageplace.family-v1-family.response-members.json ├── pageplace.bosh-bosh-rest-cloud-downloadinfo.response.json ├── pageplace.bosh-bosh-rest-reseller-selection.response.json ├── pageplace.family-v1-family-post.response.json ├── google.clients3-generate_204.rst ├── pageplace.bosh-bosh-rest-upload.response.json ├── thalia-auth-oauth2-token-post.response.json ├── pageplace.bosh-bosh-rest-dictionary-list.rst ├── pageplace.bosh-bosh-rest-inventory-count.rst ├── pageplace.family-v1-myself-put.rst ├── pageplace.family-v1-shares-delete.rst ├── mytolino-tolino-status.rst ├── pageplace.bosh-bosh-rest-ping.rst ├── pageplace.family-v1-shares.response-2books.json ├── pageplace.family-v1-family.rst ├── usecase-login.rst ├── usecase-upload.rst ├── pageplace.family-v1-myself.rst ├── pageplace.bosh-bosh-rest-sync-data.request-note-add.json ├── pageplace.bosh-bosh-rest-sync-data.response-collection-remove.json ├── pageplace.bosh-bosh-rest-content-delete.rst ├── pageplace.bosh-bosh-rest-handshake-resellers.rst ├── pageplace.family-v1-shares.rst ├── pageplace.family-v1-shares-post.rst ├── pageplace.bosh-bosh-rest-sync-data.request-bookmark-set.json ├── pageplace.bosh-bosh-rest-v2-resellerconfig.response-ok-tolinovision1.json ├── pageplace.bosh-bosh-rest-sync-data.response-reading-position.json ├── pageplace.bosh-bosh-rest-sync-data.request-reading-position.json ├── pageplace.bosh-bosh-rest-time.rst ├── pageplace.family-v1-family-post.rst ├── pageplace.bosh-bosh-rest-sync-data.request-note-remove.json ├── pageplace.bosh-bosh-rest-sync-data.response-note-remove.json ├── pageplace.bosh-bosh-rest-sync-data.response-note-add.json ├── pageplace.bosh-bosh-rest-userid-xxx.rst ├── pageplace.bosh-bosh-rest-sync-data.request-highlight-add.json ├── pageplace.bosh-bosh-rest-reseller-selection-report-post.rst ├── pageplace.bosh-bosh-rest-sync-data.request-bookmark-remove.json ├── pageplace.bosh-bosh-rest-sync-data.response-bookmark-remove.json ├── pageplace.bosh-bosh-rest-sync-data.response-bookmark-set.json ├── domains.rst ├── pageplace.bosh-bosh-rest-time.response-headers.txt ├── pageplace.bosh-bosh-rest-recommendation-xyz.rst ├── identifiers.rst ├── pageplace.family-v1-family-members-xxx.rst ├── pageplace.family-v1-shares.response.json ├── pageplace.bosh-bosh-rest-sync-data.request-highlight-remove.json ├── pageplace.bosh-bosh-rest-sync-data.response-highlight-remove.json ├── pageplace.bosh-bosh-rest-sync-data.response-highlight-add.json ├── usecase-setup.rst ├── pageplace.bosh-bosh-rest-v2-versioncheck.rst ├── pageplace.bosh-bosh-rest-cover-xxx-yyy.rst ├── pageplace.bosh-bosh-rest-content-xxx-yyy.rst ├── pageplace.bosh-bosh-rest-v2-registerhw.rst ├── pageplace.bosh-bosh-rest-cloud-downloadinfo.rst ├── pageplace.bosh-bosh-rest-upload.rst ├── thalia-auth-oauth2-authorize.rst ├── pageplace.bosh-bosh-rest-cover.rst ├── usecase-sync.rst ├── pageplace.bosh-bosh-rest-v2-resellerconfig.rst ├── pageplace.bosh-bosh-rest-reseller-countries.rst ├── thalia-auth-oauth2-token-post.rst ├── javascript.rst ├── internal-urls.rst ├── pageplace.bosh-bosh-rest-reseller-selection.rst ├── pageplace.bosh-bosh-rest-v2-registerhw.response.json ├── pageplace.inventory-v2-inventory.rst ├── pageplace.bosh-bosh-rest-v2-versioncheck.response-noupdate.json ├── pageplace.bosh-bosh-rest-v2-versioncheck.response-update.json ├── headers.rst ├── pageplace.bosh-bosh-rest-sync-data.response-bookmarks-comments.json ├── pageplace.bosh-bosh-rest-handshake-resellers.response.json ├── pageplace.bosh-bosh-rest-reseller-countries.response.json ├── pageplace.bosh-bosh-rest-v2-resellerconfig.response-ok.json ├── pageplace.inventory-v2-inventory.response.json ├── pageplace.bosh-bosh-rest-dictionary-list.response.json ├── pageplace.bosh-bosh-rest-sync-data.rst ├── pageplace.bosh-bosh-rest-v2-resellerconfig.response-ok-tolinovision2.json └── pageplace.bosh-bosh-rest-recommendation-xyz.response.json ├── Makefile ├── styles.css └── README.rst /.gitignore: -------------------------------------------------------------------------------- 1 | *.htm 2 | *.html 3 | -------------------------------------------------------------------------------- /api/pageplace.family-v1-myself-put.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "nickname": "devnew" 3 | } 4 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-inventory-count.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "count": 3 3 | } 4 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-sync-data.request-first.json: -------------------------------------------------------------------------------- 1 | { 2 | "patches": [], 3 | "revision": null 4 | } 5 | -------------------------------------------------------------------------------- /api/pageplace.family-v1-myself-put.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "membershipId": 67675, 3 | "nickname": "devnew" 4 | } 5 | -------------------------------------------------------------------------------- /api/pageplace.family-v1-myself.response-member.json: -------------------------------------------------------------------------------- 1 | { 2 | "membershipId": 67675, 3 | "nickname": "dev" 4 | } 5 | -------------------------------------------------------------------------------- /api/pageplace.family-v1-myself.response-nomember.json: -------------------------------------------------------------------------------- 1 | { 2 | "membershipId": null, 3 | "nickname": null 4 | } 5 | -------------------------------------------------------------------------------- /api/doc-official.rst: -------------------------------------------------------------------------------- 1 | ====================== 2 | Official documentation 3 | ====================== 4 | 5 | https://bosh.pageplace.de/bosh/doc 6 | Needs HTTP basic auth username + password 7 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-v2-versioncheck.request.json: -------------------------------------------------------------------------------- 1 | {"initAppRequest":{"hardware_id":"665fc389ef4e47258c5db9fa7821bd19","hardware_name":"","client_type":"TOLINOVISION3_15.2.0","hardware_type":"tolino_vision_3"}} 2 | -------------------------------------------------------------------------------- /api/pageplace.family-v1-shares-post.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "shares": [ 3 | { 4 | "publicationId": "DT0400.9783641243609_A40398678", 5 | "receiver": "67674" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-content-delete.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "contentDeleteRequest": { 3 | "deleteAll": true, 4 | "content": [ 5 | { 6 | "deliverableId": "bosh_3_395490135492823841139311838" 7 | } 8 | ] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-userid-xxx.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "initAppResponse": { 3 | "config": null, 4 | "deviceKey": null, 5 | "update": 0, 6 | "updateVersion": null, 7 | "userId": "2086910932" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-cover.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "ResponseInfo": { 3 | "message": "Cover uploaded successfully.", 4 | "requestId": "41d3243f-6d7a-489a-8d98-b3f7f55cb794", 5 | "responseStatus": 317, 6 | "serviceName": "cover[POST]" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | build: 2 | #needs rst2html5-tools (via pip3) 3 | rst2html5\ 4 | --bootstrap-css\ 5 | --stylesheet-path=styles.css --embed-stylesheet\ 6 | --title="Tolino cloud API documentation"\ 7 | README.rst tolino-api-docs.htm 8 | sed -i "s/##UPDATE##/`date -Is`/" tolino-api-docs.htm 9 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-v2-registerhw.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "initAppRequest": { 3 | "hardware_id": "665fc389ef4e47258c5db9fa7821bd19", 4 | "hardware_name": "", 5 | "client_type": "TOLINOVISION3_14.1.0", 6 | "hardware_type": "tolino_vision_3" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-content-xxx-yyy.response-missingheader.json: -------------------------------------------------------------------------------- 1 | { 2 | "ResponseInfo": { 3 | "serviceName": "generic[*]", 4 | "responseStatus": -113, 5 | "message": "m_id-Header is missing.", 6 | "requestId": "0a761034-72f0-4693-a388-990592d08482" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-reseller-countries.response-nohardwareid.json: -------------------------------------------------------------------------------- 1 | { 2 | "ResponseInfo": { 3 | "serviceName": "reseller/countries[GET]", 4 | "responseStatus": -90, 5 | "message": "No hardware found for given id.", 6 | "requestId": "e5a64229-5e64-4d14-aac6-8925be6af48e" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-reseller-selection.response-missingparam.json: -------------------------------------------------------------------------------- 1 | { 2 | "ResponseInfo": { 3 | "serviceName": "", 4 | "responseStatus": -1, 5 | "message": "Required String parameter 'client_type' is not present", 6 | "requestId": "b2e2aaaf-32a0-4584-ba74-23c3a7301f08" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-reseller-selection.response-nohardwareid.json: -------------------------------------------------------------------------------- 1 | { 2 | "ResponseInfo": { 3 | "serviceName": "reseller/selection[GET]", 4 | "responseStatus": -90, 5 | "message": "No hardware found for given id.", 6 | "requestId": "baf7cd5d-93af-4000-a172-f7dfd6fd4493" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /api/pageplace.family-v1-family.response-members.json: -------------------------------------------------------------------------------- 1 | { 2 | "maxMembers": 6, 3 | "members": [ 4 | { 5 | "membershipId": 67674, 6 | "nickname": "oldtest" 7 | }, 8 | { 9 | "membershipId": 67675, 10 | "nickname": "dev" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-cloud-downloadinfo.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "DownloadInfo": { 3 | "cf1": null, 4 | "cf2": null, 5 | "contentUrl": "https://bosh.pageplace.de/bosh/rest/content/bf70563e-2d57-41a7-89d3-023f0c8cc650/MacBest+by+Pratchett+Terry.epub", 6 | "fileSize": 334528, 7 | "format": "application/epub+zip", 8 | "location": "bosh" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-reseller-selection.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "resellerSelectionResponse": { 3 | "resellerSelection": [ 4 | { 5 | "resellerId": 3, 6 | "resellerName": "Thalia.de", 7 | "logo": "https://download.pageplace.de/partnerlogo/ereader/212ppi/3_resellerselectionlogo_212ppi.png", 8 | "showPromotion": false, 9 | "descriptions": [] 10 | } 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /api/pageplace.family-v1-family-post.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "maxMembers": 6, 3 | "members": [ 4 | { 5 | "membershipId": 67675, 6 | "nickname": "devnew" 7 | }, 8 | { 9 | "membershipId": 90498, 10 | "nickname": "Ebookde" 11 | }, 12 | { 13 | "membershipId": 67674, 14 | "nickname": "oldtest" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /api/google.clients3-generate_204.rst: -------------------------------------------------------------------------------- 1 | =============================================== 2 | ``GET http://clients3.google.com/generate_204`` 3 | =============================================== 4 | 5 | Check if the internet is reachable. 6 | 7 | Request 8 | ======= 9 | Header 10 | ``User-Agent`` 11 | Example: ``Dalvik/1.6.0 (Linux; U; Android 4.4.2; tolino Build/KOT49H)`` 12 | 13 | 14 | Response 15 | ======== 16 | HTTP 204 No Content 17 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-upload.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "metadata": { 3 | "deliverableId": "bosh_3_395490135492823841139311838", 4 | "title": "MacBest", 5 | "subtitle": null, 6 | "author": "Terry Pratchett", 7 | "publisher": "Heyne", 8 | "isbn": null, 9 | "edition": null, 10 | "pages": 0, 11 | "issued": 0, 12 | "language": "de", 13 | "format": "application/epub+zip", 14 | "epubVersion": "2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /api/thalia-auth-oauth2-token-post.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "access_token": "eyJhbGciOiJSUzI1NiJ9.eyJhdWRpZW5jZSI6InRyZWFkZXJ2aXNpb24zIiwiZXhwaXJlcyI6IjE2MTIxMzgzOTczMzMiLCJ4X2J1Y2hkZS51c2VyX2lk...", 3 | "expires_in": 14399, 4 | "refresh_token": "ad351547-bcb3-43b2-9914-d88f0a3704c8", 5 | "scope": "FAMILY SCOPE_BOSH SCOPE_BUCHDE SCOPE_LOGIN", 6 | "token_type": "bearer", 7 | "x_buchde.mandant_id": "2004", 8 | "x_buchde.user_id": "39549013" 9 | } 10 | -------------------------------------------------------------------------------- /styles.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 3ex 15%; 3 | font-family: helvetica; 4 | color: #222; 5 | } 6 | 7 | header code, #contents code { 8 | font-size: inherit; 9 | border: none; 10 | background-color: transparent; 11 | color: inherit; 12 | } 13 | pre { 14 | max-height: 50ex; 15 | overflow-y: auto; 16 | } 17 | h1 { 18 | text-align: center; 19 | margin-bottom: 2ex; 20 | } 21 | h2 { 22 | margin-top: 3ex; 23 | padding-top: 1ex; 24 | border-top: 1px solid grey; 25 | } 26 | 27 | dd { 28 | margin-left: 3ex; 29 | } 30 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-dictionary-list.rst: -------------------------------------------------------------------------------- 1 | =========================================================== 2 | ``GET https://bosh.pageplace.de/bosh/rest/dictionary/list`` 3 | =========================================================== 4 | 5 | Fetch the list of downloadable dictionaries. 6 | 7 | Part of the `sync process`_. 8 | 9 | 10 | Request 11 | ======= 12 | Headers 13 | See `bosh v1 header set`_ 14 | 15 | No request body. 16 | 17 | 18 | Response 19 | ======== 20 | HTTP status code ``200 OK``. 21 | 22 | Example: 23 | 24 | .. include:: pageplace.bosh-bosh-rest-dictionary-list.response.json 25 | :code: 26 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-inventory-count.rst: -------------------------------------------------------------------------------- 1 | =========================================================== 2 | ``GET https://bosh.pageplace.de/bosh/rest/inventory/count`` 3 | =========================================================== 4 | Fetch the number of books/items in the cloud storage. 5 | 6 | Part of the `sync process`_. 7 | 8 | 9 | Request 10 | ======= 11 | 12 | Header 13 | See `bosh v1 header set`_ 14 | 15 | 16 | Response 17 | ======== 18 | HTTP status code: ``200 OK`` 19 | 20 | Number of books. 21 | 22 | Example: 23 | 24 | .. include:: pageplace.bosh-bosh-rest-inventory-count.response.json 25 | :code: 26 | -------------------------------------------------------------------------------- /api/pageplace.family-v1-myself-put.rst: -------------------------------------------------------------------------------- 1 | ============================================= 2 | ``PUT https://family.pageplace.de/v1/myself`` 3 | ============================================= 4 | 5 | Rename myself in the family. 6 | 7 | 8 | Request 9 | ======= 10 | Header 11 | See `family v1 header set`_. 12 | 13 | Body 14 | JSON-Encoded. Structure: 15 | 16 | ``nickname`` 17 | New own name 18 | 19 | 20 | .. include:: pageplace.family-v1-myself-put.request.json 21 | :code: 22 | 23 | Response 24 | ======== 25 | HTTP status code ``200 OK``. 26 | 27 | .. include:: pageplace.family-v1-myself-put.response.json 28 | :code: 29 | -------------------------------------------------------------------------------- /api/pageplace.family-v1-shares-delete.rst: -------------------------------------------------------------------------------- 1 | ================================================ 2 | ``DELETE https://family.pageplace.de/v1/shares`` 3 | ================================================ 4 | 5 | Un-share a book. 6 | 7 | 8 | Request 9 | ======= 10 | Header 11 | See `family v1 header set`_. 12 | GET parameters 13 | ``pubid`` 14 | Example: ``DT0400.9783641243609_A40398678`` 15 | ``receiver`` 16 | Example: ``67674`` 17 | ``sharer`` 18 | Example: ``67675`` 19 | 20 | No body. 21 | 22 | Response 23 | ======== 24 | HTTP status code ``200 OK``. 25 | 26 | No response body (thus status code should better be 204). 27 | -------------------------------------------------------------------------------- /api/mytolino-tolino-status.rst: -------------------------------------------------------------------------------- 1 | ================================================================= 2 | ``GET http://mytolino.com/tolino-status.html?responseStatus=204`` 3 | ================================================================= 4 | 5 | Check if the internet is reachable. 6 | 7 | Request 8 | ======= 9 | Header 10 | ``User-Agent`` 11 | Example: ``Dalvik/1.6.0 (Linux; U; Android 4.4.2; tolino Build/KOT49H)`` 12 | 13 | 14 | Response 15 | ======== 16 | At the time of writing, a ``301 Moved Permanently`` is returned (2021-04) 17 | with a location header to 18 | https://mytolino.com/tolino-status.php?responseStatus=204 . 19 | 20 | That URL returns a ``204 No Content`` response. 21 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-ping.rst: -------------------------------------------------------------------------------- 1 | =============================================== 2 | ``GET http://bosh.pageplace.de/bosh/rest/ping`` 3 | =============================================== 4 | 5 | Used to check if the ebook reader is online (internet reachable). 6 | 7 | Request 8 | ======= 9 | GET Parameters 10 | ``responseStatus=204`` 11 | Always there 12 | 13 | Headers 14 | ``User-Agent`` 15 | ``Dalvik/1.6.0 (Linux; U; Android 4.4.2; tolino Build/KOT49H)`` 16 | ``Host`` 17 | ``bosh.pageplace.de`` 18 | ``Connection`` 19 | ``Keep-Alive`` 20 | ``Accept-Encoding`` 21 | ``gzip`` 22 | 23 | 24 | Response 25 | ======== 26 | Status Code 27 | ``204 No Content`` 28 | -------------------------------------------------------------------------------- /api/pageplace.family-v1-shares.response-2books.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "type": "SHARED", 4 | "publicationId": "DT0400.9783739673417_A27522964", 5 | "sharer": { 6 | "membershipId": 67675, 7 | "nickname": "dev" 8 | }, 9 | "receivers": [ 10 | { 11 | "membershipId": 67674, 12 | "nickname": "oldtest" 13 | } 14 | ] 15 | }, 16 | { 17 | "type": "SHARED", 18 | "publicationId": "DT0400.9783641243609_A40398678", 19 | "sharer": { 20 | "membershipId": 67675, 21 | "nickname": "dev" 22 | }, 23 | "receivers": [ 24 | { 25 | "membershipId": 67674, 26 | "nickname": "oldtest" 27 | } 28 | ] 29 | } 30 | ] 31 | -------------------------------------------------------------------------------- /api/pageplace.family-v1-family.rst: -------------------------------------------------------------------------------- 1 | ============================================= 2 | ``GET https://family.pageplace.de/v1/family`` 3 | ============================================= 4 | 5 | Get the list of family members. 6 | 7 | Part of the `sync process`_. 8 | 9 | This is only called when the user has family member data 10 | (`GET https://family.pageplace.de/v1/myself`_). 11 | 12 | 13 | Request 14 | ======= 15 | Header 16 | See `family v1 header set`_. 17 | 18 | No request body. 19 | 20 | 21 | Response 22 | ======== 23 | HTTP status code ``200 OK``. 24 | 25 | 26 | Family members 27 | -------------- 28 | Example: 29 | 30 | .. include:: pageplace.family-v1-family.response-members.json 31 | :code: 32 | -------------------------------------------------------------------------------- /api/usecase-login.rst: -------------------------------------------------------------------------------- 1 | ============= 2 | Login process 3 | ============= 4 | 5 | The user-facing stuff happens in the web browser. 6 | 7 | 1. Fetch URL of login page: `GET https://thalia.de/auth/oauth2/authorize`_ 8 | 2. Show login page with username + password form 9 | 3. Redirect to internal e-book reader login with code. 10 | 11 | Example redirect: ``Location: epublishing://login?code=GK6jDC`` 12 | 4. Request OAuth access token: `POST https://thalia.de/auth/oauth2/token`_ 13 | 5. Check if the device has been registered already: `GET https://bosh.pageplace.de/bosh/rest/userid/xxx`_ 14 | 6. Register the device to the user: `POST https://bosh.pageplace.de/bosh/rest/v2/registerhw`_ 15 | 7. Run the `Sync process`_ 16 | -------------------------------------------------------------------------------- /api/usecase-upload.rst: -------------------------------------------------------------------------------- 1 | ============== 2 | Upload process 3 | ============== 4 | The user wants to upload a book on the reader to the cloud. 5 | 6 | 1. Upload the epub file: `POST https://bosh.pageplace.de/bosh/rest/upload`_ 7 | 2. Upload the cover image: `POST https://bosh.pageplace.de/bosh/rest/cover`_ 8 | 3. Fetch the number of books in the cloud: `GET https://bosh.pageplace.de/bosh/rest/inventory/count`_ 9 | 4. Fetch the current date/time: `GET https://bosh.pageplace.de/bosh/rest/time`_ 10 | 5. Fetch changes since last sync: `PATCH https://bosh.pageplace.de/bosh/rest/sync-data`_ 11 | 12 | Some time later: 13 | 14 | 6. Download the cover of the uploaded book: `GET https://bosh.pageplace.de/bosh/rest/cover/xxx/yyy`_ 15 | -------------------------------------------------------------------------------- /api/pageplace.family-v1-myself.rst: -------------------------------------------------------------------------------- 1 | ============================================= 2 | ``GET https://family.pageplace.de/v1/myself`` 3 | ============================================= 4 | 5 | Obtain the family member ID. 6 | 7 | Part of the `sync process`_. 8 | 9 | 10 | Request 11 | ======= 12 | Header 13 | See `family v1 header set`_. 14 | 15 | No request body. 16 | 17 | 18 | Response 19 | ======== 20 | HTTP status code ``200 OK``. 21 | 22 | 23 | No family membership 24 | -------------------- 25 | Example: 26 | 27 | .. include:: pageplace.family-v1-myself.response-nomember.json 28 | :code: 29 | 30 | 31 | Member information 32 | ------------------- 33 | Example: 34 | 35 | .. include:: pageplace.family-v1-myself.response-member.json 36 | :code: 37 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-sync-data.request-note-add.json: -------------------------------------------------------------------------------- 1 | { 2 | "revision": "mpUEbwYtp/eTagD0N86Ypvl4Mzbf6ddMxlIZRmiD007iIIVRjSkpSWU5SS/bYaVeN4irJYl9nIs8N1Z1O8k9r4yZPEN6LkrJ03n7hG73yWEkJBqK7dQr8rNheL8GgQGC", 3 | "patches": [ 4 | { 5 | "path": "/publications/DT0400.9783739673417_A27522964/comments", 6 | "value": { 7 | "revision": null, 8 | "text": "Bibliotheken", 9 | "endPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:864)", 10 | "note": "really?", 11 | "modified": 1612127863357, 12 | "startPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:852)", 13 | "transientId": "12" 14 | }, 15 | "op": "add" 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-sync-data.response-collection-remove.json: -------------------------------------------------------------------------------- 1 | { 2 | "patches": [ 3 | { 4 | "op": "remove", 5 | "path": "/publications/DT0400.9783739673417_A27522964/tags/606892107", 6 | "value": { 7 | "category": "collection", 8 | "modified": 1612300784084, 9 | "name": "Zweicoll", 10 | "revision": "IDuWzVIjHLLhWI8zhrdT+7lyuQkwWknldNeVL4voUd0ahg/2eGd/j93dXHBRukgiKYMF5Xi3SBEVyOj7dhFXHga9qE2T18SXsqCja+t4ASSoHNAQcfClmoj8zMhvPhuTk85ro39FJOV5kC9PNgMHaA==" 11 | } 12 | } 13 | ], 14 | "revision": "IDuWzVIjHLLhWI8zhrdT+7lyuQkwWknldNeVL4voUd01s16ycIpz+bNde974gSr8pRPtEhxfF7HQ8DwLiWqCR2ByQCJzLSgngatg3CZD0nuxKKzpU2OJe9V5kk6viW/9" 15 | } 16 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-content-delete.rst: -------------------------------------------------------------------------------- 1 | =========================================================== 2 | ``POST https://bosh.pageplace.de/bosh/rest/content/delete`` 3 | =========================================================== 4 | Delete a book from the cloud. 5 | 6 | 7 | Request 8 | ======= 9 | 10 | Headers 11 | See `bosh v1 header set`_ 12 | 13 | Request body 14 | ``contentDeleteRequest`` 15 | ``content`` 16 | Array of objects with a ``deliverableId`` property 17 | ``deleteAll`` 18 | ``true`` or ``false`` (Only ``true`` observed yet) 19 | 20 | 21 | Example: 22 | 23 | .. include:: pageplace.bosh-bosh-rest-content-delete.request.json 24 | :code: 25 | 26 | 27 | Response 28 | ======== 29 | HTTP status code: ``200 OK``. 30 | 31 | No content. 32 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-handshake-resellers.rst: -------------------------------------------------------------------------------- 1 | =============================================================== 2 | ``GET https://bosh.pageplace.de/bosh/rest/handshake/resellers`` 3 | =============================================================== 4 | 5 | Get a list of resellers (book shops) that can be selected when 6 | the Tolino reader is unlocked. 7 | 8 | It is also used when linking the Tolino to another account on 9 | a different book seller. (FIXME: verify) 10 | 11 | Part of the `sync process`_. 12 | 13 | 14 | Request 15 | ======= 16 | Header 17 | See `bosh v1 header set`_ 18 | 19 | 20 | Response 21 | ======== 22 | HTTP status code ``200 OK``. 23 | 24 | Example: 25 | 26 | .. include:: pageplace.bosh-bosh-rest-handshake-resellers.response.json 27 | :code: 28 | -------------------------------------------------------------------------------- /api/pageplace.family-v1-shares.rst: -------------------------------------------------------------------------------- 1 | ============================================= 2 | ``GET https://family.pageplace.de/v1/shares`` 3 | ============================================= 4 | 5 | Obtain the list of books shared in the family. 6 | 7 | FIXME: Only books that are shared from/to the current user? 8 | 9 | Part of the `sync process`_. 10 | 11 | This is only called when the user has family member data 12 | (`GET https://family.pageplace.de/v1/myself`_). 13 | 14 | 15 | Request 16 | ======= 17 | Header 18 | See `family v1 header set`_. 19 | 20 | No request body. 21 | 22 | 23 | Response 24 | ======== 25 | HTTP status code ``200 OK``. 26 | 27 | 28 | Family members 29 | -------------- 30 | Example: 31 | 32 | .. include:: pageplace.family-v1-shares.response.json 33 | :code: 34 | -------------------------------------------------------------------------------- /api/pageplace.family-v1-shares-post.rst: -------------------------------------------------------------------------------- 1 | ============================================== 2 | ``POST https://family.pageplace.de/v1/shares`` 3 | ============================================== 4 | 5 | Share a book with a family member 6 | 7 | 8 | Request 9 | ======= 10 | Header 11 | See `family v1 header set`_. 12 | 13 | Body 14 | JSON-Encoded. Structure: 15 | 16 | ``shares`` 17 | Array of books to share (each an object) 18 | 19 | ``publicationId`` 20 | Example: ``DT0400.9783641243609_A40398678`` 21 | ``receiver`` 22 | Example: ``67674`` 23 | 24 | 25 | .. include:: pageplace.family-v1-shares-post.request.json 26 | :code: 27 | 28 | Response 29 | ======== 30 | HTTP status code ``200 OK``. 31 | 32 | No response body (thus status code should better be 204). 33 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-sync-data.request-bookmark-set.json: -------------------------------------------------------------------------------- 1 | { 2 | "revision": "Ag8/+tS7R94xYEG0pdHJi/+ryrjap1XVfo6lsLcWpxoD/GW/SvezBcSBzktnf1qQGZegE9K5nwrYu2B2XeBAADCDQ9ilcFjDuwcPWJKk20SXwlB8aoC3YGRRj6+8azNv", 3 | "patches": [ 4 | { 5 | "value": { 6 | "position": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:114)", 7 | "revision": null, 8 | "modified": 1612127562802, 9 | "name": "um hochzukommen, so groß war er geworden. Bald kam die Zeit, dass er ein eigenes Nest gründen würde. Doch seine Interessen lagen woanders. Er wollte die Pyramiden erforschen, hinter ihre Geheimnisse s", 10 | "transientId": "3" 11 | }, 12 | "path": "/publications/DT0400.9783739673417_A27522964/dogears", 13 | "op": "add" 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-v2-resellerconfig.response-ok-tolinovision1.json: -------------------------------------------------------------------------------- 1 | { 2 | "reseller_id": 3, 3 | "client_type": "TOLINO_VISION_1", 4 | "lastModified": 1603111725000, 5 | "config": { 6 | "URL_HANDSHAKE": "https://www.pageplace.de/media/client/handshake/index.html", 7 | "STRING_BRAND_NAME": "Thalia.de", 8 | "FAMILY_SHARING_ACTIVE": "true", 9 | "IS_LCP_ACTIVATED": "false", 10 | "URL_BOOKSHELF": "https://bosh.pageplace.de/bosh/rest/", 11 | "ENABLE_DATA_RECOVERY": "true", 12 | "URL_DEVICE_MANAGEMENT": "https://www.pageplace.de/media/client/handshake/index.html", 13 | "ADVERTISING_REDIRECT_BASE": "redirect.mytolino.com", 14 | "LCP_ACTIVATED": "true", 15 | "SHOP_BASE": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-sync-data.response-reading-position.json: -------------------------------------------------------------------------------- 1 | { 2 | "revision": "re5zwHogt+YaBKoqI/FPaER+kwC+lp76xohw4+17pWOQ/NPM4AJQbeRddT3Tl2PFYhMbsJy1mYLWJXtvb3bvcgTJ1mcFy/qfb6QqypvFhZK8AloBfu3iGAc7idteGLzb", 3 | "patches": [ 4 | { 5 | "op": "replace", 6 | "path": "/publications/DT0400.9783739673417_A27522964/bookmark/606779074", 7 | "value": { 8 | "revision": "re5zwHogt+YaBKoqI/FPaER+kwC+lp76xohw4+17pWMpTJvUvgIModh4mMwgErEgAEsLMc19cJBs9VIeKIUZUZtKiHHD+M55cQ6+FwLBQkq3nd1fF9cO8QLcAoSFtwBa63M/JbWH85fh4BsuqEfX5g==", 9 | "modified": 1612116637854, 10 | "progress": 0.41666666, 11 | "position": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/8/1:0)", 12 | "currentPosition": "5", 13 | "lastPosition": "12" 14 | } 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-sync-data.request-reading-position.json: -------------------------------------------------------------------------------- 1 | { 2 | "revision": "Lmu7TngaxhKWHdv2FFktQNcGFPmnOshpANcqFEx7udp9diud9qWGmETRXuQsftz8POQVhe8wrcIy0g4ohwngk3/kdM5IeWkV+jmzPXxVKDs+5KTzHlGTFGz2QeVeXJue", 3 | "patches": [ 4 | { 5 | "value": { 6 | "lastPosition": "12", 7 | "progress": 0.4166666567325592, 8 | "position": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/8/1:0)", 9 | "revision": "Lmu7TngaxhKWHdv2FFktQNcGFPmnOshpANcqFEx7udpEDvQDdiq93W8ryZG4oSfm9D9sp2Aowkhu/1wg8qj4PglnxUFM96DOLgZMd9NVnTByM/ZG1vgkHHCrqwpA/7bO67OjTjo1TLKVL442Lx3sGw==", 10 | "currentPosition": "5", 11 | "modified": 1612116637854 12 | }, 13 | "path": "/publications/DT0400.9783739673417_A27522964/bookmark/606779074", 14 | "op": "replace" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-time.rst: -------------------------------------------------------------------------------- 1 | ================================================ 2 | ``GET https://bosh.pageplace.de/bosh/rest/time`` 3 | ================================================ 4 | Part of the `Sync process`_. 5 | 6 | Response is empty. 7 | 8 | FIXME: What is that used for? Fetching the current time? 9 | 10 | 11 | Request 12 | ======= 13 | No headers except ``Host: bosh.pageplace.de`` and ``Connection: Keep-Alive``. 14 | This is strange, because almost all requests have a couple of other 15 | default headers (``Accept``, ``Content-Type``) - so this must be deliberate. 16 | 17 | Response 18 | ======== 19 | HTTP status code: ``200 OK``. 20 | 21 | No content. 22 | Maybe the time is fetched from the ``Date`` header. 23 | 24 | Example: 25 | 26 | .. include:: pageplace.bosh-bosh-rest-time.response-headers.txt 27 | :code: 28 | -------------------------------------------------------------------------------- /api/pageplace.family-v1-family-post.rst: -------------------------------------------------------------------------------- 1 | ============================================== 2 | ``POST https://family.pageplace.de/v1/family`` 3 | ============================================== 4 | 5 | Add someone to a family. 6 | 7 | To add a family member, an OAuth token with scope ``family`` needs to be 8 | obtained. 9 | 10 | 11 | Request 12 | ======= 13 | Header 14 | See `family v1 header set`_. 15 | 16 | Body 17 | JSON encoded object. 18 | 19 | ``resellerId`` 20 | Example: ``81`` 21 | ``token`` 22 | Example: ``eyJhbGciOiJSUzUxMiJ9.eyJpc3MiOiJ3...hGCE8Yc6g`` 23 | 24 | 25 | Response 26 | ======== 27 | HTTP status code ``200 OK``. 28 | 29 | All family members are returned. 30 | 31 | Family with 3 members 32 | --------------------- 33 | Example: 34 | 35 | .. include:: pageplace.family-v1-family-post.response.json 36 | :code: 37 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-sync-data.request-note-remove.json: -------------------------------------------------------------------------------- 1 | { 2 | "revision": "U56mFMWtmzUafX7fZ5csYkOTAR0uWN7NcapDRKi+whDBSXuc4SUQl1X3PGUvSMVadbPpnCaITL9ES5XmJItpf5rm0tRbjqV1kSe6iXWdaKLwjT6o7TeGF3U2cbwSPWa9", 3 | "patches": [ 4 | { 5 | "path": "/publications/DT0400.9783739673417_A27522964/comments/606876958", 6 | "value": { 7 | "revision": "U56mFMWtmzUafX7fZ5csYkOTAR0uWN7NcapDRKi+whDQU/nHOmicjMaixgoF33Oc9NMXK2tldJW9Nix9Lv5LaVnTuHf7tMxcmKKHwwqX8CWts7Ebaba8fX6Ts5MlroFxuF45ERlNPKneIKrLZbuMuQ==", 8 | "text": "Bibliotheken", 9 | "endPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:864)", 10 | "note": "really?", 11 | "modified": 1612127893444, 12 | "startPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:852)" 13 | }, 14 | "op": "remove" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-sync-data.response-note-remove.json: -------------------------------------------------------------------------------- 1 | { 2 | "revision": "U56mFMWtmzUafX7fZ5csYhWlue/h+S4oouwYyFXwpjgOs/YSwYakpSm1LTq6XVVxh8V62/30ckl8lpwzXmUZBOujhb/tiVqNXdUxpziOw/rO/8CFfWkQ5BICMla72gc9", 3 | "patches": [ 4 | { 5 | "op": "remove", 6 | "path": "/publications/DT0400.9783739673417_A27522964/comments/606876958", 7 | "value": { 8 | "revision": "U56mFMWtmzUafX7fZ5csYhWlue/h+S4oouwYyFXwpjgyQfuwkmVsFDbhY7YqNV0euelu0VHF/tnDmzOk/GmUEkHQWOVBHcNh7pzh0s9s5SiJrK4BDKA/cl7Ojj5OAhCI5VatYCvpP4QQNqqUafK27Q==", 9 | "modified": 1612127893444, 10 | "note": "really?", 11 | "text": "Bibliotheken", 12 | "startPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:852)", 13 | "endPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:864)" 14 | } 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-sync-data.response-note-add.json: -------------------------------------------------------------------------------- 1 | { 2 | "revision": "U56mFMWtmzUafX7fZ5csYkOTAR0uWN7NcapDRKi+whDBSXuc4SUQl1X3PGUvSMVadbPpnCaITL9ES5XmJItpf5rm0tRbjqV1kSe6iXWdaKLwjT6o7TeGF3U2cbwSPWa9", 3 | "patches": [ 4 | { 5 | "op": "add", 6 | "path": "/publications/DT0400.9783739673417_A27522964/comments/606876958", 7 | "value": { 8 | "revision": "U56mFMWtmzUafX7fZ5csYkOTAR0uWN7NcapDRKi+whDQU/nHOmicjMaixgoF33Oc9NMXK2tldJW9Nix9Lv5LaVnTuHf7tMxcmKKHwwqX8CWts7Ebaba8fX6Ts5MlroFxuF45ERlNPKneIKrLZbuMuQ==", 9 | "modified": 1612127863357, 10 | "transientId": "12", 11 | "note": "really?", 12 | "text": "Bibliotheken", 13 | "startPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:852)", 14 | "endPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:864)" 15 | } 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-userid-xxx.rst: -------------------------------------------------------------------------------- 1 | ====================================================== 2 | ``GET https://bosh.pageplace.de/bosh/rest/userid/xxx`` 3 | ====================================================== 4 | Step 5 in the `Login process`_. 5 | 6 | FIXME: Check if the device has been registered already to a user. 7 | 8 | Example ``xxx`` value: ``665fc389ef4e47258c5db9fa7821bd19``. 9 | 10 | There is some explanation about the hardware id in 11 | `tolino-python: tolinocloud.py `_. 12 | 13 | 14 | Request 15 | ======= 16 | No body in the request, despite the ``Content-Type`` header. 17 | 18 | Header 19 | See `bosh v1 header set`_. 20 | 21 | 22 | Response 23 | ======== 24 | HTTP status code: ``200 OK`` 25 | 26 | Example: 27 | 28 | .. include:: pageplace.bosh-bosh-rest-userid-xxx.response.json 29 | :code: 30 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-sync-data.request-highlight-add.json: -------------------------------------------------------------------------------- 1 | { 2 | "revision": "vXVBokvmktlTYbt8GBkbdc+yMZgMJzQNMwBgm+4XVPUzyzLIOZTcxGsPmPWySpedk9yrsUonISPHw+Kwd539kJQX6x8933NH0Hhp9gOoSPfakpEel4/uiG+kHpq0GqrS", 3 | "patches": [ 4 | { 5 | "path": "/publications/DT0400.9783739673417_A27522964/comments", 6 | "value": { 7 | "revision": null, 8 | "text": "Dass sie Mysterien bürgen, die ihrer aller Leben von Grund auf veränderten. Er wollte studieren, doch gehörte er nur einem kleinen Farmerstamm an. Der bedeutungslos, weit außerhalb der großen Ansiedlungen, seine Au", 9 | "endPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:682)", 10 | "modified": 1612127738093, 11 | "startPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:463)", 12 | "transientId": "11" 13 | }, 14 | "op": "add" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-reseller-selection-report-post.rst: -------------------------------------------------------------------------------- 1 | ====================================================================== 2 | ``POST https://bosh.pageplace.de/bosh/rest/reseller/selection/report`` 3 | ====================================================================== 4 | 5 | Notify tolino which shop has been selected. 6 | 7 | This is probably used for tracking purposes since it is not required 8 | function-wise for the e-reader. 9 | 10 | 11 | Request 12 | ======= 13 | Header 14 | ``hardware_id`` 15 | Required. 16 | 17 | Example: ``665fc389ef4e47258c5db9fa7821bd19`` 18 | 19 | It is not validated; it just must be non-empty. 20 | ``client_type`` 21 | Example: ``TOLINO_VISION_3`` 22 | ``client_version`` 23 | Example: ``14.1.0`` 24 | 25 | GET parameters 26 | ``selectedShopId`` 27 | Book shop ID, e.g. ``3`` for Thalia. 28 | 29 | 30 | Response 31 | ======== 32 | HTTP ``200 OK`` without content. 33 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-sync-data.request-bookmark-remove.json: -------------------------------------------------------------------------------- 1 | { 2 | "revision": "vXVBokvmktlTYbt8GBkbdS1LtinZbt31qkl7c+VWPTUc/H7JQ89XcdH7Vyavf2z8Q4v5leJHCbuOXUAF0KLZkwz0WtYM5Z+0AWeOd0GVVw1Rkh56bz8Ac0Hmkxo/UPnW", 3 | "patches": [ 4 | { 5 | "value": { 6 | "position": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:114)", 7 | "revision": "vXVBokvmktlTYbt8GBkbdS1LtinZbt31qkl7c+VWPTUfsIea2eDXWJ5LfkTKgnbEIAtm25oVIvqtV5nh+yF8WfGiJxRRL4PTehaj8GE602P8qdr/xEd8NYp5U6t+61jTJwWFNH62T4CYaO/tyH0H3g==", 8 | "modified": 1612127588570, 9 | "name": "um hochzukommen, so groß war er geworden. Bald kam die Zeit, dass er ein eigenes Nest gründen würde. Doch seine Interessen lagen woanders. Er wollte die Pyramiden erforschen, hinter ihre Geheimnisse s" 10 | }, 11 | "path": "/publications/DT0400.9783739673417_A27522964/dogears/606874450", 12 | "op": "remove" 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-sync-data.response-bookmark-remove.json: -------------------------------------------------------------------------------- 1 | { 2 | "revision": "vXVBokvmktlTYbt8GBkbdc+yMZgMJzQNMwBgm+4XVPUzyzLIOZTcxGsPmPWySpedk9yrsUonISPHw+Kwd539kJQX6x8933NH0Hhp9gOoSPfakpEel4/uiG+kHpq0GqrS", 3 | "patches": [ 4 | { 5 | "op": "remove", 6 | "path": "/publications/DT0400.9783739673417_A27522964/dogears/606874450", 7 | "value": { 8 | "revision": "vXVBokvmktlTYbt8GBkbdc+yMZgMJzQNMwBgm+4XVPWdBAxDuBxbQJfnRXNZ4kSW2jY9yt5T2BQHYyn0oOefNmoJQlBJc++COD/meOP71PA/NsIvqt8YDoldSv5Q+CFpAs0HInj5rcupcKXBU4WURw==", 9 | "modified": 1612127588570, 10 | "position": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:114)", 11 | "name": "um hochzukommen, so groß war er geworden. Bald kam die Zeit, dass er ein eigenes Nest gründen würde. Doch seine Interessen lagen woanders. Er wollte die Pyramiden erforschen, hinter ihre Geheimnisse s" 12 | } 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-sync-data.response-bookmark-set.json: -------------------------------------------------------------------------------- 1 | { 2 | "revision": "vXVBokvmktlTYbt8GBkbdS1LtinZbt31qkl7c+VWPTUc/H7JQ89XcdH7Vyavf2z8Q4v5leJHCbuOXUAF0KLZkwz0WtYM5Z+0AWeOd0GVVw1Rkh56bz8Ac0Hmkxo/UPnW", 3 | "patches": [ 4 | { 5 | "op": "add", 6 | "path": "/publications/DT0400.9783739673417_A27522964/dogears/606874450", 7 | "value": { 8 | "revision": "vXVBokvmktlTYbt8GBkbdS1LtinZbt31qkl7c+VWPTUfsIea2eDXWJ5LfkTKgnbEIAtm25oVIvqtV5nh+yF8WfGiJxRRL4PTehaj8GE602P8qdr/xEd8NYp5U6t+61jTJwWFNH62T4CYaO/tyH0H3g==", 9 | "modified": 1612127562802, 10 | "transientId": "3", 11 | "position": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:114)", 12 | "name": "um hochzukommen, so groß war er geworden. Bald kam die Zeit, dass er ein eigenes Nest gründen würde. Doch seine Interessen lagen woanders. Er wollte die Pyramiden erforschen, hinter ihre Geheimnisse s" 13 | } 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /api/domains.rst: -------------------------------------------------------------------------------- 1 | ======= 2 | Domains 3 | ======= 4 | 5 | Domains that are used by the Tolino Vision 3 HD. 6 | 7 | 8 | Buch.de 9 | ======= 10 | ``auth.buch.de`` 11 | Had been used by Thalia.de for authentication, but now has been moved to directly access thalia.de. 12 | 13 | 14 | Google 15 | ====== 16 | ``clients3.google.com`` 17 | Check if the internet is reachable 18 | 19 | 20 | MyTolino.com 21 | ============ 22 | ``management.mytolino.com`` 23 | - List of resellers 24 | - eInk handshake (FIXME) 25 | 26 | 27 | Pageplace 28 | ========= 29 | ``bosh.pageplace.de`` 30 | "bosh" could be short name for "BOokSHelf" 31 | 32 | - ping 33 | - reseller configuration 34 | - current time 35 | - sync main data (books, reading status, notes) 36 | - ebook upload 37 | - ebook cover upload 38 | 39 | ``cdp.pageplace.de`` 40 | - Book images? 41 | - Book downloads 42 | 43 | ``family.pageplace.de`` 44 | Family sharing 45 | 46 | ``inventory.pageplace.de`` 47 | FIXME 48 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-time.response-headers.txt: -------------------------------------------------------------------------------- 1 | Server: nginx/1.6.2 2 | Date: Sun, 31 Jan 2021 20:13:19 GMT 3 | Content-Length: 0 4 | Connection: keep-alive 5 | Pragma: no-cache 6 | Expires: Thu, 01 Jan 1970 00:00:00 GMT 7 | Cache-Control: no-cache 8 | Cache-Control: no-store 9 | Timestamp: 1612123999282 10 | Access-Control-Allow-Origin: * 11 | Access-Control-Allow-Methods: POST,GET,PUT,DELETE,PATCH 12 | Access-Control-Allow-Headers: t_auth_token, hardware_id, Content-Type, If-Modified-Since, m_id, authorization, X-Audiobook-Enabled, client_type, reseller_id, hardware_type, 13 | client_version, os_version, language_code 14 | Access-Control-Max-Age: 1728000 15 | Access-Control-Expose-Headers: response_timestamp,Date,Timestamp 16 | Vary: User-Agent 17 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-recommendation-xyz.rst: -------------------------------------------------------------------------------- 1 | ============================================================== 2 | ``GET https://bosh.pageplace.de/bosh/rest/recommendation/xyz`` 3 | ============================================================== 4 | 5 | Get advertisements for the main reader screen. 6 | 7 | FIXME: Why the ``xyz`` in the URL? 8 | 9 | Part of the `sync process`_. 10 | 11 | 12 | Request 13 | ======= 14 | Header 15 | See `bosh v1 header set`_ 16 | GET parameters 17 | ``count`` 18 | Number of recommendations to return 19 | 20 | Example: ``12`` 21 | ``fullShopUrl`` 22 | ``true`` 23 | 24 | 25 | Response 26 | ======== 27 | HTTP status code ``200 OK``. 28 | 29 | 30 | Response body definition 31 | ------------------------ 32 | 33 | ``publicationType`` 34 | Can be empty or one of: ``EBOOK``, ``EMAGAZINE``, ``EPAPER`` or ``EDATA``. 35 | Not used. 36 | 37 | 38 | Example 39 | ------- 40 | 41 | .. include:: pageplace.bosh-bosh-rest-recommendation-xyz.response.json 42 | :code: 43 | -------------------------------------------------------------------------------- /api/identifiers.rst: -------------------------------------------------------------------------------- 1 | =========== 2 | Identifiers 3 | =========== 4 | 5 | Publication ID 6 | ============== 7 | A book has an identifier, for example ``DT0400.9783641267575_A39529579``. 8 | 9 | The API uses ``publicationId`` and ``pubid`` as names. 10 | 11 | It consists of several parts: 12 | 13 | - Prefix ``DT`` 14 | - four-letter order ID ``0400`` 15 | - ISBN-13 ``9783641267575`` 16 | - unknown suffix ``A39529579`` 17 | 18 | 19 | Excerpt from `Analyse verbreiteter Anwendungen zum Lesen von elektronischen Büchern `_: 20 | 21 | Der Aufbau des Wertes der Variable ``path`` erläutern wir anhand eines Beispiels: 22 | 23 | ``/publications/DT./bookmark/`` 24 | 25 | Hierbei handelt es sich bei BESTELLUNG um eine vierstellige Zahl, 26 | welche bei allen Büchern, die innerhalb des selben Bestellvorgangs gekauft 27 | wurden, identisch ist. 28 | Dies wurde mit mehreren Bestellungen von fünf, drei bzw. einem Buch nachvollzogen. 29 | -------------------------------------------------------------------------------- /api/pageplace.family-v1-family-members-xxx.rst: -------------------------------------------------------------------------------- 1 | ============================================================ 2 | ``DELETE https://family.pageplace.de/v1/family/members/xxx`` 3 | ============================================================ 4 | 5 | Remove someone from own family. 6 | 7 | 8 | Request 9 | ======= 10 | Header 11 | See `family v1 header set`_. 12 | 13 | ``xxx`` 14 | Family member ID. Example: ``90498`` 15 | 16 | 17 | Response 18 | ======== 19 | Success 20 | ------- 21 | HTTP status code ``200 OK``. 22 | 23 | No response body (status code thus should be 204). 24 | 25 | 26 | Removing non-member 27 | ------------------- 28 | Status code: ``401 Unauthorized``. No response body. 29 | 30 | 31 | Missing OAuth token 32 | ------------------- 33 | Status code: ``401 Unauthorized``. Body:: 34 | 35 | { 36 | "timestamp":"2021-04-08T15:52:13.186+00:00", 37 | "status":403, 38 | "error":"Forbidden", 39 | "message":"", 40 | "path":"/v1/family/members/90490" 41 | } 42 | -------------------------------------------------------------------------------- /api/pageplace.family-v1-shares.response.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "type": "RECEIVED", 4 | "publicationId": "DT0400.9783739616957_A25832535", 5 | "sharer": { 6 | "membershipId": 67674, 7 | "nickname": "oldtest" 8 | }, 9 | "receivers": [ 10 | { 11 | "membershipId": 67675, 12 | "nickname": "devnew" 13 | } 14 | ] 15 | }, 16 | { 17 | "type": "SHARED", 18 | "publicationId": "DT0400.9783739673417_A27522964", 19 | "sharer": { 20 | "membershipId": 67675, 21 | "nickname": "devnew" 22 | }, 23 | "receivers": [ 24 | { 25 | "membershipId": 67674, 26 | "nickname": "oldtest" 27 | } 28 | ] 29 | }, 30 | { 31 | "type": "SHARED", 32 | "publicationId": "DT0400.9783641243609_A40398678", 33 | "sharer": { 34 | "membershipId": 67675, 35 | "nickname": "devnew" 36 | }, 37 | "receivers": [ 38 | { 39 | "membershipId": 67674, 40 | "nickname": "oldtest" 41 | } 42 | ] 43 | } 44 | ] 45 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-sync-data.request-highlight-remove.json: -------------------------------------------------------------------------------- 1 | { 2 | "revision": "mpUEbwYtp/eTagD0N86YpmDfuHc9O9NiQuGXKm3W/Hw6kiAzVlOHYaJYF3sCUNxUdanemyU8jvsTIkSJe4EeZSVugO5ALKPSFiYcaMWekNSyeSeiGXHXVnx6WCiBrpnJ", 3 | "patches": [ 4 | { 5 | "path": "/publications/DT0400.9783739673417_A27522964/comments/606876020", 6 | "value": { 7 | "revision": "mpUEbwYtp/eTagD0N86YpmDfuHc9O9NiQuGXKm3W/HzKtqyrc3pLZBtEfixwK6/TwRHTxnb2tzpI7SUOBZdRrCGJ53Gmzjz6qBsW1xEVyFM5++J3MUSW/vu1egX6wv1m+dGa/u3Xy8Vzrn/rvwTfvA==", 8 | "text": "Dass sie Mysterien bürgen, die ihrer aller Leben von Grund auf veränderten. Er wollte studieren, doch gehörte er nur einem kleinen Farmerstamm an. Der bedeutungslos, weit außerhalb der großen Ansiedlungen, seine Au", 9 | "endPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:682)", 10 | "modified": 1612127804121, 11 | "startPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:463)" 12 | }, 13 | "op": "remove" 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-sync-data.response-highlight-remove.json: -------------------------------------------------------------------------------- 1 | { 2 | "revision": "mpUEbwYtp/eTagD0N86Ypvl4Mzbf6ddMxlIZRmiD007iIIVRjSkpSWU5SS/bYaVeN4irJYl9nIs8N1Z1O8k9r4yZPEN6LkrJ03n7hG73yWEkJBqK7dQr8rNheL8GgQGC", 3 | "patches": [ 4 | { 5 | "op": "remove", 6 | "path": "/publications/DT0400.9783739673417_A27522964/comments/606876020", 7 | "value": { 8 | "revision": "mpUEbwYtp/eTagD0N86Ypvl4Mzbf6ddMxlIZRmiD006/DLEE5jYDKecIq5j4vZPOwkSBnzwhepvJ2yCb2LtBnEXpgQStn2FDw78xI/l7M9L+yWtHyOte1/u+6tcebmfbQZ2JQFfSnzsbv0FfVKEWcg==", 9 | "modified": 1612127804121, 10 | "text": "Dass sie Mysterien bürgen, die ihrer aller Leben von Grund auf veränderten. Er wollte studieren, doch gehörte er nur einem kleinen Farmerstamm an. Der bedeutungslos, weit außerhalb der großen Ansiedlungen, seine Au", 11 | "startPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:463)", 12 | "endPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:682)" 13 | } 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-sync-data.response-highlight-add.json: -------------------------------------------------------------------------------- 1 | { 2 | "revision": "mpUEbwYtp/eTagD0N86YpmDfuHc9O9NiQuGXKm3W/Hw6kiAzVlOHYaJYF3sCUNxUdanemyU8jvsTIkSJe4EeZSVugO5ALKPSFiYcaMWekNSyeSeiGXHXVnx6WCiBrpnJ", 3 | "patches": [ 4 | { 5 | "op": "add", 6 | "path": "/publications/DT0400.9783739673417_A27522964/comments/606876020", 7 | "value": { 8 | "revision": "mpUEbwYtp/eTagD0N86YpmDfuHc9O9NiQuGXKm3W/HzKtqyrc3pLZBtEfixwK6/TwRHTxnb2tzpI7SUOBZdRrCGJ53Gmzjz6qBsW1xEVyFM5++J3MUSW/vu1egX6wv1m+dGa/u3Xy8Vzrn/rvwTfvA==", 9 | "modified": 1612127738093, 10 | "transientId": "11", 11 | "text": "Dass sie Mysterien bürgen, die ihrer aller Leben von Grund auf veränderten. Er wollte studieren, doch gehörte er nur einem kleinen Farmerstamm an. Der bedeutungslos, weit außerhalb der großen Ansiedlungen, seine Au", 12 | "startPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:463)", 13 | "endPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:682)" 14 | } 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /api/usecase-setup.rst: -------------------------------------------------------------------------------- 1 | ============= 2 | Setup process 3 | ============= 4 | 5 | Initial setup of a factory-reset e-reader. 6 | 7 | 8 | Prelude 9 | ======= 10 | 1. Check if the internet is reachable: `GET http://clients3.google.com/generate_204`_ 11 | 2. Check if the internet is really reachable: `GET http://mytolino.com/tolino-status.html?responseStatus=204`_ 12 | 3. Check if the internet is really really reachable: `GET http://bosh.pageplace.de/bosh/rest/ping`_ 13 | 4. Check if the internet is really really reachable a second time, just in case: `GET http://bosh.pageplace.de/bosh/rest/ping`_ 14 | 15 | 16 | Actual requests 17 | =============== 18 | 1. Get list of allowed countries for the reader: `GET https://bosh.pageplace.de/bosh/rest/reseller/countries`_ 19 | 2. Get list of selectable book shops: `GET https://bosh.pageplace.de/bosh/rest/reseller/selection`_ 20 | 3. Notify tolino about the selected shop: `POST https://bosh.pageplace.de/bosh/rest/reseller/selection/report`_ 21 | 4. Fetch the tolino configuration for the shop: `GET https://bosh.pageplace.de/bosh/rest/v2/resellerconfig`_ 22 | 5. FIXME 23 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-v2-versioncheck.rst: -------------------------------------------------------------------------------- 1 | ============================================================ 2 | ``POST https://bosh.pageplace.de/bosh/rest/v2/versioncheck`` 3 | ============================================================ 4 | 5 | Was not used in firmware 13. 6 | 7 | 8 | Request 9 | ======= 10 | 11 | Header 12 | See `bosh v2 header set`_, plus: 13 | 14 | ``Content-Type`` 15 | ``text/plain; charset=UTF-8`` 16 | 17 | This is a lie, because the request body is JSON. 18 | 19 | Body 20 | .. include:: pageplace.bosh-bosh-rest-v2-versioncheck.request.json 21 | :code: 22 | 23 | 24 | Response 25 | ======== 26 | 27 | Example: Update available 28 | ------------------------- 29 | Tolino firmware 14 made the request, version 15.2.0 was available. 30 | 31 | Key ``update`` is ``2``. 32 | 33 | .. include:: pageplace.bosh-bosh-rest-v2-versioncheck.response-update.json 34 | :code: 35 | 36 | 37 | Example: No update available 38 | ---------------------------- 39 | Key ``update`` is ``0``. 40 | 41 | .. include:: pageplace.bosh-bosh-rest-v2-versioncheck.response-noupdate.json 42 | :code: 43 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-cover-xxx-yyy.rst: -------------------------------------------------------------------------------- 1 | ========================================================= 2 | ``GET https://bosh.pageplace.de/bosh/rest/cover/xxx/yyy`` 3 | ========================================================= 4 | Fetch the cover for a manually uploaded book. 5 | 6 | Part of the `upload process`_. 7 | 8 | Request 9 | ======= 10 | Only three headers. Unusual. 11 | 12 | Full URL example: ``https://bosh.pageplace.de/bosh/rest/cover/39549013/bosh_3_395490135492823841139311838?size=WS-B04`` 13 | 14 | URL path parts 15 | ``xxx`` 16 | 8 bytes of the publication ID 17 | 18 | Example: ``39549013`` 19 | ``yyy`` 20 | Publication ID 21 | 22 | Example: ``bosh_3_395490135492823841139311838`` 23 | Header 24 | ``m_id`` 25 | Maybe reseller ID? 26 | 27 | Example: ``3`` 28 | ``Host`` 29 | ``bosh.pageplace.de`` 30 | ``Connection`` 31 | ``Keep-Alive`` 32 | 33 | GET parameters 34 | ``size`` 35 | Image size (so we get a scaled version) 36 | 37 | Known values: 38 | 39 | - ``WS-B04`` 40 | 41 | 42 | Response 43 | ======== 44 | HTTP status code: ``200 OK``. 45 | 46 | Binary cover image data. 47 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-content-xxx-yyy.rst: -------------------------------------------------------------------------------- 1 | =========================================================== 2 | ``GET https://bosh.pageplace.de/bosh/rest/content/xxx/yyy`` 3 | =========================================================== 4 | Download a book from the cloud. 5 | 6 | The URL is obtained from `GET https://bosh.pageplace.de/bosh/rest/cloud/downloadinfo`_. 7 | 8 | Step 2 of the download process. 9 | 10 | 11 | Request 12 | ======= 13 | 14 | Header 15 | Parts of the `bosh v1 header set`_: 16 | 17 | ``hardware_id`` 18 | 19 | ``m_id`` 20 | 21 | ``t_auth_token`` 22 | 23 | Path parts 24 | Example of a full path: 25 | ``https://bosh.pageplace.de/bosh/rest/content/bf70563e-2d57-41a7-89d3-023f0c8cc650/MacBest+by+Pratchett+Terry.epub`` 26 | 27 | ``xxx`` 28 | Some kind of UUID. 29 | 30 | ``yyy`` 31 | Human-readable file name 32 | 33 | 34 | Response 35 | ======== 36 | HTTP status code: ``200 OK`` 37 | 38 | ebook file content. 39 | 40 | 41 | Error response: Header missing 42 | ------------------------------ 43 | ``HTTP/1.1 400 Bad Request`` 44 | 45 | .. include:: pageplace.bosh-bosh-rest-content-xxx-yyy.response-missingheader.json 46 | :code: 47 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-v2-registerhw.rst: -------------------------------------------------------------------------------- 1 | ========================================================== 2 | ``POST https://bosh.pageplace.de/bosh/rest/v2/registerhw`` 3 | ========================================================== 4 | Step 6 in the `Login process`_. 5 | 6 | Register the e-book reader's hardware ID with the user account. 7 | 8 | 9 | Request 10 | ======= 11 | 12 | Header 13 | See `bosh v2 header set`_, plus: 14 | 15 | ``t_auth_token`` 16 | OAuth token obtained from `POST https://thalia.de/auth/oauth2/token`_. 17 | 18 | Example: ``eyJhbGciOiJSUzI1NiJ9.eyJhdWRpZW5jZSI6InRyZWFkZXJ2aXNpb24zIiw...`` 19 | ``reseller_id`` 20 | Example: ``3`` 21 | ``Content-Type`` 22 | ``text/plain; charset=UTF-8`` 23 | 24 | This is a lie, because the request body is JSON. 25 | 26 | Body 27 | .. include:: pageplace.bosh-bosh-rest-v2-registerhw.request.json 28 | :code: 29 | 30 | 31 | Response 32 | ======== 33 | HTTP status code: ``200 OK`` 34 | 35 | Contains a device key, the changelog in several languages and 36 | the latest firmware version including its download URL. 37 | 38 | Example: 39 | 40 | .. include:: pageplace.bosh-bosh-rest-v2-registerhw.response.json 41 | :code: 42 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-cloud-downloadinfo.rst: -------------------------------------------------------------------------------- 1 | ============================================================== 2 | ``GET https://bosh.pageplace.de/bosh/rest/cloud/downloadinfo`` 3 | ============================================================== 4 | Get information where to download a book from the cloud. 5 | 6 | This is fetched when the reader shows a book available in the cloud 7 | but has not been downloaded onto the reader. 8 | Requesting the download first fetches this URL, then 9 | the ``contentUrl`` is downloaded via 10 | `GET https://bosh.pageplace.de/bosh/rest/content/xxx/yyy`_. 11 | 12 | Step 1 of the download process. 13 | 14 | 15 | Request 16 | ======= 17 | 18 | Header 19 | See `bosh v1 header set`_ 20 | 21 | Path parts 22 | Example of a full path: 23 | ``https://bosh.pageplace.de/bosh/rest/cloud/downloadinfo/Ym9zaF8zXzM5NTQ5MDEzNTEzMTE3NTc3NDgwODE5ODk2NQ/Ym9zaF8zXzM5NTQ5MDEzNTEzMTE3NTc3NDgwODE5ODk2NQ/type/ANDROID_GK_6`` 24 | 25 | FIXME: What are those parts? How to calculate them? 26 | 27 | 28 | Response 29 | ======== 30 | HTTP status code: ``200 OK`` 31 | 32 | Download info with file size, URL and MIME type. 33 | 34 | Example: 35 | 36 | .. include:: pageplace.bosh-bosh-rest-cloud-downloadinfo.response.json 37 | :code: 38 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-upload.rst: -------------------------------------------------------------------------------- 1 | =================================================== 2 | ``POST https://bosh.pageplace.de/bosh/rest/upload`` 3 | =================================================== 4 | Upload a new book ``.epub`` file. 5 | 6 | Step 1 of the `upload process`_. 7 | 8 | 9 | Request 10 | ======= 11 | Header 12 | Nearly identical to the `bosh v1 header set`_, but not exactly the same. 13 | No ``client_type``, no ``client_version``. 14 | 15 | ``Content-Type`` 16 | ``multipart/form-data; boundary="Boundary1612163626238"`` 17 | ``Content-Transfer-Encoding`` 18 | ``binary`` 19 | ``Content-Length`` 20 | Depending on the request body. 21 | 22 | Request body 23 | Control data 24 | Header 25 | ``Content-Disposition: form-data; name="control"`` 26 | Content 27 | JSON 28 | ``{"filesize":334499,"transactionId":"84401550-d933-4f12-b168-87421835bada"}`` 29 | File data 30 | Header 31 | ``Content-Disposition: form-data; name="file"; filename="MacBest by Pratchett Terry.epub"`` 32 | Content 33 | Binary .epub file contents 34 | 35 | 36 | Response 37 | ======== 38 | HTTP status code: ``200 OK``. 39 | 40 | Meta data entry for the uploaded file. 41 | 42 | Example: 43 | 44 | .. include:: pageplace.bosh-bosh-rest-upload.response.json 45 | :code: 46 | -------------------------------------------------------------------------------- /api/thalia-auth-oauth2-authorize.rst: -------------------------------------------------------------------------------- 1 | =============================================== 2 | ``GET https://thalia.de/auth/oauth2/authorize`` 3 | =============================================== 4 | Fetch URL of actual login page. 5 | 6 | First step in the `Login process`_. 7 | 8 | Source 9 | ====== 10 | This URL is provided in the reseller configuration, 11 | key ``config.URL_OAUTH_ACCESSTOKEN``. 12 | 13 | 14 | Request 15 | ======= 16 | GET Parameters 17 | ``response_type`` 18 | Example: ``code`` 19 | ``scope`` 20 | Example: ``SCOPE_BOSH%20SCOPE_BUCHDE%20SCOPE_MANDANT_ID.2004%20SCOPE_LOGIN%20FAMILY`` 21 | ``redirect_uri`` 22 | Example: ``epublishing://login`` 23 | ``x_buchde.skin_id`` 24 | Example: ``17`` 25 | ``client_id`` 26 | Example: ``treadervision3`` 27 | Headers 28 | ``User-Agent`` 29 | Browser user agent. 30 | ``lcp`` 31 | Example: ``1`` 32 | ``X-Requested-With`` 33 | Example: ``de.telekom.epub`` 34 | 35 | 36 | Response 37 | ======== 38 | Redirect to actual login page. 39 | 40 | Status code: HTTP/1.1 302 41 | 42 | Header 43 | ``Location``: 44 | Example: ``https://thalia.de/de.thalia.ecp.authservice.application/oauth2/login?response_type=code&scope=SCOPE_BOSH%20SCOPE_BUCHDE%20SCOPE_MANDANT_ID.2004%20SCOPE_LOGIN%20FAMILY&redirect_uri=epublishing://login&x_buchde.skin_id=17&client_id=treadervision3`` 45 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-cover.rst: -------------------------------------------------------------------------------- 1 | ================================================== 2 | ``POST https://bosh.pageplace.de/bosh/rest/cover`` 3 | ================================================== 4 | Upload the cover for an uploaded ``.epub`` file. 5 | 6 | Step 2 of the `upload process`_. 7 | 8 | Request 9 | ======= 10 | Header 11 | ``Content-Type`` 12 | ``multipart/form-data; boundary="Boundary1612163626238"`` 13 | 14 | Request body 15 | Control data 16 | Header 17 | ``Content-Disposition: form-data; name="control"`` 18 | Content 19 | JSON 20 | ``{"filesize":334499,"transactionId":"84401550-d933-4f12-b168-87421835bada"}`` 21 | 22 | The transaction ID is different than the one for the epub upload. 23 | File data 24 | Header 25 | ``Content-Disposition: form-data; name="file"; filename="1092560016"`` 26 | Content 27 | Binary cover image contents 28 | Book reference 29 | Header 30 | ``Content-Disposition: form-data; name="deliverableId"`` 31 | Content 32 | ``deliverableId`` of the epub upload response. 33 | 34 | Example: ``bosh_3_395490135492823841139311838`` 35 | 36 | 37 | 38 | Response 39 | ======== 40 | HTTP status code: ``200 OK``. 41 | 42 | Meta data entry for the uploaded cover. 43 | 44 | Example: 45 | 46 | .. include:: pageplace.bosh-bosh-rest-cover.response.json 47 | :code: 48 | -------------------------------------------------------------------------------- /api/usecase-sync.rst: -------------------------------------------------------------------------------- 1 | ============ 2 | Sync process 3 | ============ 4 | The user presses the synchronization button on the "My books" screen. 5 | 6 | 1. Check if the device is online: `GET http://bosh.pageplace.de/bosh/rest/ping`_ 7 | 2. Fetch the reseller configuration: `GET https://bosh.pageplace.de/bosh/rest/v2/resellerconfig`_ 8 | 3. Fetch the number of books/items in the cloud: `GET https://bosh.pageplace.de/bosh/rest/inventory/count`_ 9 | 4. Fetch cloud book information: `GET https://inventory.pageplace.de/v2/inventory`_ 10 | 5. Fetch the current date/time: `GET https://bosh.pageplace.de/bosh/rest/time`_ 11 | 6. Fetch changes since last sync: `PATCH https://bosh.pageplace.de/bosh/rest/sync-data`_ 12 | 7. Get list of resellers: `GET https://bosh.pageplace.de/bosh/rest/handshake/resellers`_ 13 | 8. Fetch advertisements for the main screen: `GET https://bosh.pageplace.de/bosh/rest/recommendation/xyz`_ 14 | 9. Fetch family membership information: `GET https://family.pageplace.de/v1/myself`_ 15 | 16 | When the user is part of a family: 17 | 18 | 10. Fetch list of available dictionaries: `GET https://bosh.pageplace.de/bosh/rest/dictionary/list`_ 19 | 11. Fetch list of family members: `GET https://family.pageplace.de/v1/family`_ 20 | 12. Fetch list of shared books: `GET https://family.pageplace.de/v1/shares`_ 21 | 22 | 23 | FIXME: What happens if the inventory count is 0? Is the inventory not fetched then? 24 | 25 | FIXME: What happens if there is only one family member? Is the list of shared books fetched then? 26 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-v2-resellerconfig.rst: -------------------------------------------------------------------------------- 1 | ============================================================= 2 | ``GET https://bosh.pageplace.de/bosh/rest/v2/resellerconfig`` 3 | ============================================================= 4 | 5 | Fetch information about a given tolino reseller (shop): 6 | 7 | - Authentication URLs 8 | - Browser start page 9 | - Brand name ("Thalia.de") 10 | - if LCP encryption is available 11 | 12 | etc. 13 | 14 | 15 | Request 16 | ======= 17 | Header 18 | See `bosh v2 header set`_, plus: 19 | 20 | ``ifmodifiedsince`` 21 | Timestamp with microseconds of last reseller config file version 22 | 23 | Example: ``1603111725000`` 24 | ``reseller_id`` 25 | Example: ``3`` 26 | ``client_type`` 27 | Required. "400 Bad Request" if missing. 28 | 29 | 30 | Response 31 | ======== 32 | 33 | ``HTTP/1.1 304 Not Modified`` if the ``ifmodifiedsince`` header is equal or 34 | later than the modification date. 35 | 36 | 37 | Success 38 | ------- 39 | ``HTTP/1.1 200 OK`` for the content 40 | 41 | Example for headers ``reseller_id:3`` and ``client_type:TOLINO_VISION_3``: 42 | 43 | .. include:: pageplace.bosh-bosh-rest-v2-resellerconfig.response-ok.json 44 | :code: 45 | 46 | 47 | Example for headers ``reseller_id:3`` and ``client_type:TOLINO_VISION_2``: 48 | 49 | .. include:: pageplace.bosh-bosh-rest-v2-resellerconfig.response-ok-tolinovision2.json 50 | :code: 51 | 52 | 53 | Example for headers ``reseller_id:3`` and ``client_type:TOLINO_VISION_1``: 54 | 55 | .. include:: pageplace.bosh-bosh-rest-v2-resellerconfig.response-ok-tolinovision1.json 56 | :code: 57 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-reseller-countries.rst: -------------------------------------------------------------------------------- 1 | ============================================================== 2 | ``GET https://bosh.pageplace.de/bosh/rest/reseller/countries`` 3 | ============================================================== 4 | 5 | Fetch list of countries the e-reader can be used with. 6 | 7 | Step 1 of the `Setup process`_. 8 | 9 | ``pageplace.de`` seems to have a list of hardware IDs and their 10 | associated sellers. 11 | E-reader devices sold by thalia.de can only choose thalia as book shop 12 | when it is being setup. 13 | 14 | Only those countries are returned that the device seller is available in. 15 | 16 | Request 17 | ======= 18 | Header 19 | ``hardware_id`` 20 | Required. 21 | 22 | Example: ``665fc389ef4e47258c5db9fa7821bd19`` 23 | ``client_type`` 24 | Example: ``TOLINO_VISION_3`` 25 | ``client_version`` 26 | Example: ``14.1.0`` 27 | 28 | GET parameters 29 | ``languageCode`` 30 | Two-letter e-reader interface language code. 31 | 32 | Does not seem to have any influence on the response. 33 | 34 | Example: ``en`` 35 | 36 | Response 37 | ======== 38 | 39 | Non-rebrandable device 40 | ---------------------- 41 | HTTP status code ``200 OK``. 42 | 43 | Has ``rebrandable`` property set to ``false``. 44 | 45 | Example: 46 | 47 | .. include:: pageplace.bosh-bosh-rest-reseller-countries.response.json 48 | :code: 49 | 50 | 51 | Missing hardware_id header 52 | -------------------------- 53 | When no hardware_id is passed, a ``404 Not Found`` status code is returned 54 | together with an error message: 55 | 56 | .. include:: pageplace.bosh-bosh-rest-reseller-countries.response-nohardwareid.json 57 | :code: 58 | -------------------------------------------------------------------------------- /api/thalia-auth-oauth2-token-post.rst: -------------------------------------------------------------------------------- 1 | ============================================ 2 | ``POST https://thalia.de/auth/oauth2/token`` 3 | ============================================ 4 | Step 4 of the `Login process`_. 5 | 6 | Uses: 7 | 8 | 1. Log in to obtain an access token. 9 | 2. Generate access token from a refresh token. 10 | 11 | 12 | Request 13 | ======= 14 | GET parameters 15 | ``client_secret`` 16 | Provided in the reseller configuration. 17 | 18 | Example: ``gU5a7CA9`` 19 | 20 | Headers 21 | ``Content-Type`` 22 | ``application/x-www-form-urlencoded`` 23 | ``User-Agent`` 24 | ``DT_EINK_10_NETRONIX DT_EINK_UPD_PP_14.1.0`` 25 | ``Cookie``: 26 | The ``refresh_token`` request sends no cookie. 27 | 28 | Example: ``gcor=SIDYBbxYkmvUvoO8hy@2Sfx4QAAA9o; ab_bucket=9; ab_container=3; OAUTH-JSESSIONID=9C95C20ECEE74164E76F60C205147822.15acdb90`` 29 | ``Cookie2`` 30 | ``$Version=1`` 31 | 32 | POST parameters: New token 33 | ``grant_type``: 34 | ``authorization_code`` 35 | ``redirect_uri`` 36 | ``epublishing://login`` 37 | 38 | The e-reader internal login process 39 | ``code`` 40 | Obtained from login form page redirect. 41 | 42 | Example: ``GK6jDC`` 43 | ``client_id`` 44 | Example: ``treadervision3`` 45 | 46 | POST parameters: Refresh token 47 | ``grant_type`` 48 | ``refresh_token`` 49 | ``refresh_token`` 50 | Obtained in the last OAuth token response. 51 | 52 | Example: ``91132a11-dd87-4450-bf16-a63dff1da4d1`` 53 | ``client_id`` 54 | Example: ``treadervision3`` 55 | 56 | 57 | 58 | Response 59 | ======== 60 | HTTP status code ``200 OK`` 61 | 62 | .. include:: thalia-auth-oauth2-token-post.response.json 63 | :code: 64 | -------------------------------------------------------------------------------- /api/javascript.rst: -------------------------------------------------------------------------------- 1 | ============== 2 | Javascript API 3 | ============== 4 | 5 | Non-browser web views have a special JavaScript API that provides 6 | integration with Tolino UI elements. 7 | 8 | Example is the ShopWebViewActivity that is opens when clicking the 9 | "To the shop" link and the recommendations/advertisements on the main page. 10 | 11 | 12 | ``android_init()`` 13 | ================== 14 | When the page has been loaded in the web view, 15 | a function ``android_init`` is invoked. 16 | This can be used to detect if the page has been loaded on a Tolino. 17 | 18 | 19 | ``screenController`` 20 | ==================== 21 | Each web view has a JavaScript variable ``screenController`` 22 | that provides the interface to the Tolino UI. 23 | 24 | 25 | ``screenController.hideNavigationHeader()`` 26 | Hides the header when it was enabled with ``showNavigationHeader``. 27 | 28 | ``screenController.hideProgressDialog()`` 29 | FIXME 30 | 31 | ``screenController.refreshScreen()`` 32 | Re-draw the e-ink screen 33 | 34 | ``screenController.setNavigationHeaderTitle("my header")`` 35 | Override the title in the navigation header. 36 | Call ``showNavigationHeader`` first. 37 | 38 | ``screenController.setNavigationHeaderUrl("epublishing://closeshop")`` 39 | Set the URL of the "back" arrow button. 40 | 41 | ``screenController.setTokens("accesstoken", "refreshtoken")`` 42 | FIXME 43 | 44 | ``screenController.showNavigationHeader("header title")`` 45 | Show the native navigation header and set its title 46 | 47 | ``screenController.showProgressDialog()`` 48 | FIXME 49 | 50 | ``screenController.processHTML("")`` 51 | Firmware 15.2: Does nothing 52 | 53 | Firmware 15.4.0, Vision 6/Epos 3: Logs the HTML content to the application log. 54 | -------------------------------------------------------------------------------- /api/internal-urls.rst: -------------------------------------------------------------------------------- 1 | ============= 2 | Internal URLs 3 | ============= 4 | 5 | ``epublishing://closeshop`` 6 | URL of the close button inside the online shop. 7 | Goes back to the main screen. 8 | 9 | ``epublishing://closeshop_skoti`` 10 | Close the Skoobe shop 11 | 12 | ``epublishing://handshakeCancel`` 13 | FIXME 14 | 15 | ``epublishing://handshakeFinish`` 16 | FIXME 17 | 18 | ``epublishing://library`` 19 | Open the "my books" library view 20 | 21 | ``epublishing://library_skoti`` 22 | FIXME 23 | 24 | ``epublishing://login?code=GK6jDC`` 25 | The ``code`` is optional. 26 | 27 | ``epublishing://openbook`` 28 | Start the reading mode for the given book 29 | 30 | Parameters: 31 | ``deliverableid`` 32 | Book ID to open. 33 | 34 | Example: ``DT0400.9783641267575_A39529579`` 35 | 36 | ``epublishing://openbook_skoti`` 37 | FIXME 38 | 39 | ``epublishing://openextract`` 40 | Download the file and start the reading mode for a demo book extract 41 | (German: "Leseprobe") 42 | 43 | Parameters (all 4 must be passed): 44 | ``extractcoverurl`` 45 | URL of the book cover image. 46 | 47 | ``extractdeliverableid`` 48 | Book ID 49 | 50 | ``extractdownloadurl`` 51 | Download URL for the book demo ``.epub`` file. 52 | 53 | ``extractpurchaseurl`` 54 | Where to buy the book after reading the extract. 55 | 56 | Is used at the "To the shop" button that is shown on top of 57 | the reading view for demo books. 58 | 59 | The URL in the web view must not be escaped for this link to work. 60 | Escpecially the ``&`` may not be escaped as ``&`` 61 | (which would be correct HTML), so you are forced to provide invalid HTML. 62 | 63 | 64 | ``epublishing://opensearchresult`` 65 | FIXME 66 | 67 | ``epublishing://requestauth`` 68 | FIXME "Open login" 69 | 70 | Parameters: 71 | ``loginfailureurl`` 72 | FIXME 73 | 74 | ``targeturl`` 75 | FIXME 76 | 77 | ``epublishing://resellerChangeFinishFactoryReset`` 78 | FIXME 79 | 80 | ``epublishing://search`` 81 | Open the "search books" view. 82 | 83 | Parameters: 84 | ``q`` 85 | Search term to search the books list for. 86 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-reseller-selection.rst: -------------------------------------------------------------------------------- 1 | ============================================================== 2 | ``GET https://bosh.pageplace.de/bosh/rest/reseller/selection`` 3 | ============================================================== 4 | 5 | Fetch list of book sellers the e-reader can be used with. 6 | 7 | Step 2 of the `Setup process`_. 8 | 9 | ``pageplace.de`` seems to have a list of hardware IDs and their 10 | associated sellers. 11 | E-reader devices sold by thalia.de can only choose thalia as book shop 12 | when it is being setup. 13 | 14 | Only those book shops are returned that the device may be used with. 15 | 16 | Request 17 | ======= 18 | Header 19 | ``hardware_id`` 20 | Required. 21 | 22 | Example: ``665fc389ef4e47258c5db9fa7821bd19`` 23 | ``client_type`` 24 | Example: ``TOLINO_VISION_3`` 25 | ``client_version`` 26 | Example: ``14.1.0`` 27 | 28 | GET parameters 29 | ``client_type`` 30 | Required. 31 | 32 | Example: ``TOLINOVISION3_14.1.0`` 33 | ``countryCode`` 34 | Required. 35 | 36 | The two-letter uppercase country code taken from `GET https://bosh.pageplace.de/bosh/rest/reseller/countries`_ 37 | 38 | Example: ``DE`` 39 | ``languageCode`` 40 | Two-letter e-reader interface language code. 41 | 42 | Does not seem to have any influence on the response. 43 | 44 | Example: ``en`` 45 | 46 | Response 47 | ======== 48 | 49 | Non-rebrandable device 50 | ---------------------- 51 | HTTP status code ``200 OK``. 52 | 53 | Returns only one reseller. 54 | 55 | Example: 56 | 57 | .. include:: pageplace.bosh-bosh-rest-reseller-selection.response.json 58 | :code: 59 | 60 | 61 | Missing countryCode parameter 62 | ----------------------------- 63 | Status Code: ``400 Bad Request`` 64 | 65 | .. include:: pageplace.bosh-bosh-rest-reseller-selection.response-missingparam.json 66 | :code: 67 | 68 | 69 | Missing hardware_id header 70 | -------------------------- 71 | When no or an unknown ``hardware_id`` header is passed, 72 | a ``404 Not Found`` status code is returned together with an error message: 73 | 74 | .. include:: pageplace.bosh-bosh-rest-reseller-selection.response-nohardwareid.json 75 | :code: 76 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-v2-registerhw.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "initAppResponse": { 3 | "deviceKey": "5Iq76M_tEoze3w49c-IOug", 4 | "update": 0, 5 | "updateVersion": "14.1.0", 6 | "userId": "2086910932", 7 | "config": [ 8 | { 9 | "key": "CHANGELOG_NL", 10 | "value": "Verbeterde prestaties, verbeterde functies en betere integratie van onze nieuwe tolino-leeservaring. (BÈTA)\nWe hebben de software verbeterd, bugs verholpen en gezorgd voor meer stabiliteit." 11 | }, 12 | { 13 | "key": "CHANGELOG_EN", 14 | "value": "Improved performance, feature enhancement and better integration of our new tolino reading experience. (BETA)\nWe have improved the software, fixed bugs and ensured more stability." 15 | }, 16 | { 17 | "key": "CHANGELOG_FR", 18 | "value": "Amélioration des performances, amélioration des fonctionnalités et meilleure intégration de notre nouvelle expérience de lecture tolino. (BÊTA)\nNous avons amélioré le logiciel, corrigé des bugs et assuré plus de stabilité." 19 | }, 20 | { 21 | "key": "DOWNLOAD_FILE_MD5", 22 | "value": "930d0eb9e4c861a43d8360fc8dbc0ced" 23 | }, 24 | { 25 | "key": "CHANGELOG_ES", 26 | "value": "Rendimiento mejorado, mejora de funciones y mejor integración con nuestra nueva experiencia de lectura de tolino. (BETA)\nHemos mejorado el software, arreglado los errores y asegurado una mayor estabilidad.\n" 27 | }, 28 | { 29 | "key": "CHANGELOG_DE", 30 | "value": "Verbesserte Leistung, Funktionserweiterungen und bessere Integration unseres neuen tolino-Leseerlebnisses (BETA).\nWir haben die Software verbessert, Fehler behoben und für mehr Stabilität gesorgt.\n" 31 | }, 32 | { 33 | "key": "DOWNLOAD_URL", 34 | "value": "https://download.pageplace.de/ereader/14.1.0/alldevices/update.zip" 35 | }, 36 | { 37 | "key": "CHANGELOG_IT", 38 | "value": "Prestazioni migliorate, funzionalità avanzate e migliore integrazione della nostra nuova esperienza di lettura tolino. (BETA)\nAbbiamo migliorato il software, corretto i bug e assicurato una maggiore stabilità.\n" 39 | } 40 | ] 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /api/pageplace.inventory-v2-inventory.rst: -------------------------------------------------------------------------------- 1 | =================================================== 2 | ``GET https://inventory.pageplace.de/v2/inventory`` 3 | =================================================== 4 | Fetch information about books stored in the cloud. 5 | 6 | Part of the `sync process`_. 7 | 8 | 9 | Request 10 | ======= 11 | Full example request URL:: 12 | 13 | https://inventory.pageplace.de/v2/inventory?page=0&size=300&includeLoaned=true&contentTypeFilter=EBOOK&contentFormatFilter=ACSM&contentFormatFilter=EPUB&contentFormatFilter=PDF 14 | 15 | Header 16 | ``Authorization`` 17 | OAuth token obtained from `POST https://thalia.de/auth/oauth2/token`_. 18 | 19 | Example: ``Bearer eyJhbGciOiJSUzI1NiJ9.eyJhdWRpZW5jZSI6InRyZWFkZXJ2aXNpb24zIiw...`` 20 | ``Accept`` 21 | Example: ``application/json; charset=UTF-8`` 22 | ``Accept-Encoding`` 23 | ``gzip`` 24 | ``m_id`` 25 | FIXME: Maybe reseller ID? 26 | 27 | Example: ``3`` 28 | ``Hardware-Id`` 29 | Example: ``665fc389ef4e47258c5db9fa7821bd19`` 30 | ``Content-Type`` 31 | ``application/json; charset=UTF-8`` 32 | 33 | This is a lie; there is no request body. 34 | ``client_type`` 35 | Example: ``TOLINO_VISION_3`` 36 | ``client_version`` 37 | Example: ``14.1.0`` 38 | ``Reseller-Id`` 39 | Example: ``3`` 40 | ``Cookie`` 41 | Multiple times: 42 | 43 | - ``OAUTH-JSESSIONID=3EFAEC6B69D811252C75861880C338AB.15acdb90; Path=/; Secure; HttpOnly`` 44 | - ``JSESSIONID=C0D8A077F6D2E13251ECDCD60FE6D18A`` 45 | ``Cookie2`` 46 | Example: ``$Version=1`` 47 | 48 | GET parameters 49 | ``fullResponse`` 50 | Optional. Values: ``true`` 51 | ``page`` 52 | Example: ``0`` 53 | ``size`` 54 | Example: ``300`` 55 | ``includeLoaned`` 56 | Example: ``true`` 57 | ``contentTypeFilter`` 58 | Example: ``EBOOK`` 59 | ``contentFormatFilter``: 60 | Multiple values allowed (repeat the parameter) 61 | 62 | Allowed values: 63 | - ``ACSM`` 64 | - ``EPUB`` 65 | - ``PDF`` 66 | 67 | 68 | Response 69 | ======== 70 | Header 71 | ``Content-Type`` 72 | ``application/json;charset=UTF-8`` 73 | 74 | Example: 75 | 76 | .. include:: pageplace.inventory-v2-inventory.response.json 77 | :code: 78 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-v2-versioncheck.response-noupdate.json: -------------------------------------------------------------------------------- 1 | { 2 | "initAppResponse": { 3 | "deviceKey": "", 4 | "update": 0, 5 | "updateVersion": "15.2.0", 6 | "userId": "", 7 | "config": [ 8 | { 9 | "key": "CHANGELOG_NL", 10 | "value": "Met deze update hebben we de zoekmachine van de webbrowser gewijzigd in een meer privacyvriendelijke service. Verder hebben we de levensduur van de batterij verbeterd, de prestaties verbeterd en meer stabiliteit aan uw tolino toegevoegd." 11 | }, 12 | { 13 | "key": "CHANGELOG_EN", 14 | "value": "With this update we have changed the web browser search engine to more privacy friendly service. Furthermore, we have improved the battery life, enhanced the performance and added more stability to your tolino." 15 | }, 16 | { 17 | "key": "CHANGELOG_FR", 18 | "value": "Avec cette mise à jour, nous avons changé le moteur de recherche du navigateur web pour un service plus respectueux de la vie privée. De plus, nous avons amélioré l'autonomie de la batterie, les performances et la stabilité de votre tolino." 19 | }, 20 | { 21 | "key": "DOWNLOAD_FILE_MD5", 22 | "value": "9bebf4437a81cfe1106f89b44e611dd6" 23 | }, 24 | { 25 | "key": "CHANGELOG_ES", 26 | "value": "Con esta actualización hemos cambiado el motor de búsqueda del navegador por un servicio más respetuoso con la privacidad. Además, hemos mejorado la duración de la batería, incrementado el rendimiento y añadido más estabilidad en tu tolino." 27 | }, 28 | { 29 | "key": "CHANGELOG_DE", 30 | "value": "Mit diesem Update haben wir die Suchmaschine im Browser auf einen datenschutzfreundlicheren Anbieter umgestellt sowie Deinen tolino weiter optimiert, indem wir die Fehler behoben und die Stabilität sowie die Batterielaufzeit erhöht haben. Genieße nun wie gewohnt weiter spannende Lese-Abenteuer auf Deinem tolino!" 31 | }, 32 | { 33 | "key": "DOWNLOAD_URL", 34 | "value": "https://download.pageplace.de/ereader/15.2.0/OS44/update.zip" 35 | }, 36 | { 37 | "key": "CHANGELOG_IT", 38 | "value": "Con questo aggiornamento abbiamo cambiato il motore di ricerca del browser web con un servizio più rispettoso della privacy. Inoltre, abbiamo migliorato la durata della batteria, migliorato le prestazioni ed aggiunto più stabilità al tuo tolino." 39 | } 40 | ] 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-v2-versioncheck.response-update.json: -------------------------------------------------------------------------------- 1 | { 2 | "initAppResponse": { 3 | "deviceKey": "", 4 | "update": 2, 5 | "updateVersion": "15.2.0", 6 | "userId": "", 7 | "config": [ 8 | { 9 | "key": "CHANGELOG_NL", 10 | "value": "Met deze update hebben we de zoekmachine van de webbrowser gewijzigd in een meer privacyvriendelijke service. Verder hebben we de levensduur van de batterij verbeterd, de prestaties verbeterd en meer stabiliteit aan uw tolino toegevoegd." 11 | }, 12 | { 13 | "key": "CHANGELOG_EN", 14 | "value": "With this update we have changed the web browser search engine to more privacy friendly service. Furthermore, we have improved the battery life, enhanced the performance and added more stability to your tolino." 15 | }, 16 | { 17 | "key": "CHANGELOG_FR", 18 | "value": "Avec cette mise à jour, nous avons changé le moteur de recherche du navigateur web pour un service plus respectueux de la vie privée. De plus, nous avons amélioré l'autonomie de la batterie, les performances et la stabilité de votre tolino." 19 | }, 20 | { 21 | "key": "DOWNLOAD_FILE_MD5", 22 | "value": "9bebf4437a81cfe1106f89b44e611dd6" 23 | }, 24 | { 25 | "key": "CHANGELOG_ES", 26 | "value": "Con esta actualización hemos cambiado el motor de búsqueda del navegador por un servicio más respetuoso con la privacidad. Además, hemos mejorado la duración de la batería, incrementado el rendimiento y añadido más estabilidad en tu tolino." 27 | }, 28 | { 29 | "key": "CHANGELOG_DE", 30 | "value": "Mit diesem Update haben wir die Suchmaschine im Browser auf einen datenschutzfreundlicheren Anbieter umgestellt sowie Deinen tolino weiter optimiert, indem wir die Fehler behoben und die Stabilität sowie die Batterielaufzeit erhöht haben. Genieße nun wie gewohnt weiter spannende Lese-Abenteuer auf Deinem tolino!" 31 | }, 32 | { 33 | "key": "DOWNLOAD_URL", 34 | "value": "https://download.pageplace.de/ereader/15.2.0/OS44/update.zip" 35 | }, 36 | { 37 | "key": "CHANGELOG_IT", 38 | "value": "Con questo aggiornamento abbiamo cambiato il motore di ricerca del browser web con un servizio più rispettoso della privacy. Inoltre, abbiamo migliorato la durata della batteria, migliorato le prestazioni ed aggiunto più stabilità al tuo tolino." 39 | } 40 | ] 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /api/headers.rst: -------------------------------------------------------------------------------- 1 | ======= 2 | Headers 3 | ======= 4 | 5 | ``User-Agent`` 6 | Normal API requests: 7 | 8 | ``Dalvik/1.6.0 (Linux; U; Android 4.4.2; tolino Build/KOT49H)`` 9 | 10 | The browser: 11 | 12 | ``Mozilla/5.0 (Linux; Android 4.4.2; en-; tolino vision 3 HD/14.1.0) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Mobile Safari/537.36 READER OS_BUILD/KOT49H.41429.1044823`` 13 | 14 | 15 | bosh v1 header set 16 | ================== 17 | Headers common in all HTTP requests to ``https://bosh.pageplace.de/bosh/rest/...`` 18 | (except ``../rest/v2/``). 19 | 20 | ``t_auth_token`` 21 | OAuth token obtained from `POST https://thalia.de/auth/oauth2/token`_. 22 | 23 | Example: ``eyJhbGciOiJSUzI1NiJ9.eyJhdWRpZW5jZSI6InRyZWFkZXJ2aXNpb24zIiw...`` 24 | ``Accept`` 25 | Example: ``application/json; charset=UTF-8`` 26 | ``m_id`` 27 | Probably the reseller ID 28 | 29 | Example: ``3`` 30 | ``hardware_id`` 31 | Serial number of the ebook reader. 32 | 33 | Second part of the serial number that can be obtained via shell:: 34 | 35 | $ getprop ro.serialno 36 | 60239815,665fc389ef4e47258c5db9fa7821bd19 37 | 38 | Example: ``665fc389ef4e47258c5db9fa7821bd19`` 39 | ``Content-Type`` 40 | ``application/json; charset=UTF-8`` 41 | 42 | Always set even if there is no request body. 43 | ``client_type`` 44 | Example: ``TOLINO_VISION_3`` 45 | ``client_version`` 46 | Example: ``14.1.0`` 47 | 48 | 49 | bosh v2 header set 50 | ================== 51 | Headers common in all HTTP requests to ``https://bosh.pageplace.de/bosh/rest/v2/...``. 52 | 53 | ``hardware_type`` 54 | Example: ``tolino_vision_3`` 55 | ``os_version`` 56 | Android version 57 | 58 | Example: ``4.4.2`` 59 | ``language_code`` 60 | Example: ``en`` 61 | ``hardware_id`` 62 | Example: ``665fc389ef4e47258c5db9fa7821bd19`` 63 | ``client_type`` 64 | Example: ``TOLINO_VISION_3`` 65 | ``client_version`` 66 | Tolino firmware version 67 | 68 | Example: ``14.1.0``, ``15.2.0`` 69 | 70 | 71 | 72 | 73 | family v1 header set 74 | ==================== 75 | ``Authorization`` 76 | OAuth token obtained from `POST https://thalia.de/auth/oauth2/token`_. 77 | 78 | Example: ``Bearer eyJhbGciOiJSUzI1NiJ9.eyJhdWRpZW5jZSI6InRyZWFkZXJ2aXNpb24zIiw...`` 79 | ``Accept`` 80 | Example: ``application/json; charset=UTF-8`` 81 | ``Accept-Encoding`` 82 | ``gzip`` 83 | ``m_id`` 84 | Probably reseller ID. 85 | 86 | Example: ``3`` 87 | ``Hardware-Id`` 88 | Serial number of the ebook reader. 89 | 90 | Second part of the serial number that can be obtained via shell:: 91 | 92 | $ getprop ro.serialno 93 | 60239815,665fc389ef4e47258c5db9fa7821bd19 94 | 95 | Example: ``665fc389ef4e47258c5db9fa7821bd19`` 96 | ``Content-Type`` 97 | ``application/json; charset=UTF-8`` 98 | 99 | Always set even if there is no request body. 100 | ``client_type`` 101 | Example: ``TOLINO_VISION_3`` 102 | ``client_version`` 103 | Example: ``14.1.0`` 104 | ``Reseller-Id`` 105 | Example: ``3`` 106 | ``Cookie`` 107 | Multiple times: 108 | 109 | - ``OAUTH-JSESSIONID=3EFAEC6B69D811252C75861880C338AB.15acdb90; Path=/; Secure; HttpOnly`` 110 | - ``JSESSIONID=C0D8A077F6D2E13251ECDCD60FE6D18A`` 111 | ``Cookie2`` 112 | Example: ``$Version=1`` 113 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | ****************************** 2 | Tolino cloud API documentation 3 | ****************************** 4 | 5 | Servers the Tolino Vision 3/4 HD talk to (Firmware 14.x). 6 | 7 | Work in progress. 8 | 9 | .. contents:: 10 | :depth: 2 11 | 12 | 13 | General information 14 | ******************* 15 | .. include:: api/headers.rst 16 | .. include:: api/domains.rst 17 | .. include:: api/doc-official.rst 18 | .. include:: api/identifiers.rst 19 | 20 | 21 | Use cases 22 | ********* 23 | .. include:: api/usecase-setup.rst 24 | .. include:: api/usecase-login.rst 25 | .. include:: api/usecase-sync.rst 26 | .. include:: api/usecase-upload.rst 27 | 28 | 29 | API calls 30 | ********* 31 | .. include:: api/pageplace.bosh-bosh-rest-cloud-downloadinfo.rst 32 | .. include:: api/pageplace.bosh-bosh-rest-content-xxx-yyy.rst 33 | .. include:: api/pageplace.bosh-bosh-rest-content-delete.rst 34 | .. include:: api/pageplace.bosh-bosh-rest-cover.rst 35 | .. include:: api/pageplace.bosh-bosh-rest-cover-xxx-yyy.rst 36 | .. include:: api/pageplace.bosh-bosh-rest-dictionary-list.rst 37 | .. include:: api/pageplace.bosh-bosh-rest-handshake-resellers.rst 38 | .. include:: api/pageplace.bosh-bosh-rest-inventory-count.rst 39 | .. include:: api/pageplace.bosh-bosh-rest-ping.rst 40 | .. include:: api/pageplace.bosh-bosh-rest-recommendation-xyz.rst 41 | .. include:: api/pageplace.bosh-bosh-rest-reseller-countries.rst 42 | .. include:: api/pageplace.bosh-bosh-rest-reseller-selection.rst 43 | .. include:: api/pageplace.bosh-bosh-rest-reseller-selection-report-post.rst 44 | .. include:: api/pageplace.bosh-bosh-rest-sync-data.rst 45 | .. include:: api/pageplace.bosh-bosh-rest-time.rst 46 | .. include:: api/pageplace.bosh-bosh-rest-upload.rst 47 | .. include:: api/pageplace.bosh-bosh-rest-userid-xxx.rst 48 | .. include:: api/pageplace.bosh-bosh-rest-v2-registerhw.rst 49 | .. include:: api/pageplace.bosh-bosh-rest-v2-resellerconfig.rst 50 | .. include:: api/pageplace.bosh-bosh-rest-v2-versioncheck.rst 51 | .. include:: api/pageplace.family-v1-family.rst 52 | .. include:: api/pageplace.family-v1-family-post.rst 53 | .. include:: api/pageplace.family-v1-family-members-xxx.rst 54 | .. include:: api/pageplace.family-v1-myself.rst 55 | .. include:: api/pageplace.family-v1-myself-put.rst 56 | .. include:: api/pageplace.family-v1-shares.rst 57 | .. include:: api/pageplace.family-v1-shares-delete.rst 58 | .. include:: api/pageplace.family-v1-shares-post.rst 59 | .. include:: api/pageplace.inventory-v2-inventory.rst 60 | .. include:: api/thalia-auth-oauth2-authorize.rst 61 | .. include:: api/thalia-auth-oauth2-token-post.rst 62 | 63 | 64 | Other requests 65 | ************** 66 | .. include:: api/google.clients3-generate_204.rst 67 | .. include:: api/mytolino-tolino-status.rst 68 | .. include:: api/internal-urls.rst 69 | .. include:: api/javascript.rst 70 | 71 | 72 | About 73 | ***** 74 | This documentation has been written by Christian Weiske, 75 | cweiske+tolino@cweiske.de. 76 | 77 | Last update: ##UPDATE## 78 | 79 | 80 | ======= 81 | License 82 | ======= 83 | It is licensed under the GNU Free Documentation License. 84 | 85 | 86 | =========== 87 | Source code 88 | =========== 89 | The documentation sources are available at 90 | http://git.cweiske.de/tolino-api-docs.git/ 91 | and mirrored at 92 | https://github.com/cweiske/tolino-api-docs 93 | 94 | 95 | ========= 96 | Home page 97 | ========= 98 | A rendered version of this documentation is available at 99 | http://cweiske.de/tolino-api-docs.htm 100 | 101 | 102 | ======== 103 | Building 104 | ======== 105 | You need to install ``rst2html5`` before (the version with bootstrap CSS):: 106 | 107 | $ pip3 install rst2html5-tools 108 | 109 | Rendering the docs is done via the Makefile:: 110 | 111 | $ make 112 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-sync-data.response-bookmarks-comments.json: -------------------------------------------------------------------------------- 1 | { 2 | "revision": "HMwySkb2QvTCBdlNAyjAEpf+UKHoFxsaWV3yQdMYlu9lJYnoUMNDwRowMvHSFOu3DsPw+mRfrkPaZiXBeqJ8MitfmhiSoQlNBT6FYjaD4rW6Bcrv7xGvauypLFYkaq9o", 3 | "patches": [ 4 | { 5 | "op": "add", 6 | "path": "/publications/DT0400.9783641243609_A40398678/comments/606778818", 7 | "value": { 8 | "revision": "Lmu7TngaxhKWHdv2FFktQFdz4lyc7kDFlZaAS+HeJfHWU2bv9FiPCTCUkDXUo7SKAncqxyDwCxG95t2u0JBMdstap9i8kDytw9JveNZhINal0xDzllUVFMfKm7HBt9m7cLdbVaqPZBKTi8XqBRFK8Q==", 9 | "modified": 1612116489908, 10 | "text": "»Würdet ihr die Aufgabe ablehnen, wenn es so wäre?«, fragte ich zurück.", 11 | "startPosition": "OEBPS/0159E511E7C147BFA524CA3DDE0E937C.xhtml#point(/1/4/2/78/1:0)", 12 | "endPosition": "OEBPS/0159E511E7C147BFA524CA3DDE0E937C.xhtml#point(/1/4/2/78/1:76)" 13 | } 14 | }, 15 | { 16 | "op": "add", 17 | "path": "/publications/DT0400.9783641243609_A40398678/bookmark/606777963", 18 | "value": { 19 | "revision": "Lmu7TngaxhKWHdv2FFktQFdz4lyc7kDFlZaAS+HeJfHWU2bv9FiPCTCUkDXUo7SKUVTLMA8s57HlhB0Q8mKpZDUmAw+NJyupu0vRits89G6tnbMbc+VW/XxzNQfKsE9BQWfoivx5yoKm7w3r+jgQLw==", 20 | "modified": 1612116494839, 21 | "progress": 0.26923078, 22 | "position": "OEBPS/0159E511E7C147BFA524CA3DDE0E937C.xhtml#point(/1/4/2/70/1:0)", 23 | "currentPosition": "7", 24 | "lastPosition": "26" 25 | } 26 | }, 27 | { 28 | "op": "add", 29 | "path": "/publications/DT0400.9783739673417_A27522964/bookmark/606779074", 30 | "value": { 31 | "revision": "HMwySkb2QvTCBdlNAyjAEpf+UKHoFxsaWV3yQdMYlu/jWquQkHI8AFujlvCDEN6Az/cX05Tmdnoti+PCVOZHjmK0futElUUgQ9l34qpnOLlQbyTlM7SrR6xheKDt04fTHhP1CTD45tmWERGvV3e+xA==", 32 | "modified": 1612116931592, 33 | "progress": 0.043393, 34 | "position": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/1/1:0)", 35 | "lastPosition": "16" 36 | } 37 | }, 38 | { 39 | "op": "add", 40 | "path": "/publications/DT0400.9783739673417_A27522964/comments/606780680", 41 | "value": { 42 | "revision": "HMwySkb2QvTCBdlNAyjAEpf+UKHoFxsaWV3yQdMYlu/jWquQkHI8AFujlvCDEN6AxhqFD9WE9tS0SL4VnneAHAwlYWr6D5bEdS9Fyg0Mu/EYUTVuwD28pyiFSp++vhGtDKhUCfPCS0Ohi0C7PXJGtA==", 43 | "modified": 1612116905561, 44 | "text": "er einen Gleiter starten", 45 | "startPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/4/1:768)", 46 | "endPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/4/1:792)" 47 | } 48 | }, 49 | { 50 | "op": "add", 51 | "path": "/publications/DT0400.9783739673417_A27522964/comments/606780681", 52 | "value": { 53 | "revision": "HMwySkb2QvTCBdlNAyjAEpf+UKHoFxsaWV3yQdMYlu/jWquQkHI8AFujlvCDEN6APKHWbB8HNf1ruRvf+UK5IkjbMGqptZkx8vMscjqcvlVw68+UeS+OAUKuotNqOLayfG2hLLmPZRGz1CyqOZL2Pg==", 54 | "modified": 1612116914525, 55 | "text": "Der Sturm brach ohne Vorwarnung los.", 56 | "startPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/2/1:0)", 57 | "endPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/2/1:36)" 58 | } 59 | }, 60 | { 61 | "op": "add", 62 | "path": "/publications/DT0400.9783739673417_A27522964/comments/606780682", 63 | "value": { 64 | "revision": "HMwySkb2QvTCBdlNAyjAEpf+UKHoFxsaWV3yQdMYlu/jWquQkHI8AFujlvCDEN6A/r2JVv++Ix5Vk+IcC/9AXtWuTStnbObbxNIzKNHLGFS4L1ZLK8QsUFpdQfGAH5B9C/Sr3Ra+qLV2ayYULwCxkA==", 65 | "modified": 1612116925942, 66 | "note": "eine Notiz", 67 | "text": "kürzester Zeit", 68 | "startPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/2/1:263)", 69 | "endPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/2/1:278)" 70 | } 71 | } 72 | ] 73 | } 74 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-handshake-resellers.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "resellerListResponse": { 3 | "resellers": [ 4 | { 5 | "reseller_id": "81", 6 | "reseller_name": "eBook.de", 7 | "reseller_connected": false, 8 | "reseller_logo": "https://download.pageplace.de/icons_rc/81/android/81_reseller_logo.png" 9 | }, 10 | { 11 | "reseller_id": "80", 12 | "reseller_name": "myBookShop", 13 | "reseller_connected": false, 14 | "reseller_logo": "https://download.pageplace.de/icons_rc/80/android/80_reseller_logo.png" 15 | }, 16 | { 17 | "reseller_id": "30", 18 | "reseller_name": "buecher.de", 19 | "reseller_connected": false, 20 | "reseller_logo": "https://download.pageplace.de/icons_rc/30/android/30_reseller_logo.png" 21 | }, 22 | { 23 | "reseller_id": "90", 24 | "reseller_name": "IBS.it", 25 | "reseller_connected": false, 26 | "reseller_logo": "https://download.pageplace.de/icons_rc/90/android/90_reseller_logo.png" 27 | }, 28 | { 29 | "reseller_id": "23", 30 | "reseller_name": "OSIANDER", 31 | "reseller_connected": false, 32 | "reseller_logo": "https://download.pageplace.de/icons_rc/23/Android/23_reseller_logo.png" 33 | }, 34 | { 35 | "reseller_id": "24", 36 | "reseller_name": "MAYERSCHE", 37 | "reseller_connected": false, 38 | "reseller_logo": "https://download.pageplace.de/icons_rc/24/android/24_reseller_logo.png" 39 | }, 40 | { 41 | "reseller_id": "1", 42 | "reseller_name": "PagePlace", 43 | "reseller_connected": false, 44 | "reseller_logo": "http://www.pageplace.de/media/eink-reader/logo_pageplace_hd.png" 45 | }, 46 | { 47 | "reseller_id": "4", 48 | "reseller_name": "Thalia.at", 49 | "reseller_connected": false, 50 | "reseller_logo": "https://images.thalia.de/md4/ereader/Logo-eReading.png" 51 | }, 52 | { 53 | "reseller_id": "7", 54 | "reseller_name": "Buch.ch", 55 | "reseller_connected": false, 56 | "reseller_logo": "https://download.pageplace.de/icons_rc/7/android/7_reseller_logo.png" 57 | }, 58 | { 59 | "reseller_id": "11", 60 | "reseller_name": "Weltbild.at", 61 | "reseller_connected": false, 62 | "reseller_logo": "https://download.pageplace.de/icons_rc/11/android/11_reseller_logo.png" 63 | }, 64 | { 65 | "reseller_id": "12", 66 | "reseller_name": "Weltbild.ch", 67 | "reseller_connected": false, 68 | "reseller_logo": "https://download.pageplace.de/icons_rc/12/android/12_reseller_logo.png" 69 | }, 70 | { 71 | "reseller_id": "13", 72 | "reseller_name": "Hugendubel", 73 | "reseller_connected": false, 74 | "reseller_logo": "https://download.pageplace.de/icons_rc/13/android/13_reseller_logo.png" 75 | }, 76 | { 77 | "reseller_id": "3", 78 | "reseller_name": "Thalia.de", 79 | "reseller_connected": true, 80 | "reseller_logo": "https://images.thalia.de/md2/ereader/Logo-eReading.png" 81 | }, 82 | { 83 | "reseller_id": "10", 84 | "reseller_name": "Weltbild.de", 85 | "reseller_connected": false, 86 | "reseller_logo": "https://download.pageplace.de/icons_rc/10/android/10_reseller_logo.png" 87 | }, 88 | { 89 | "reseller_id": "8", 90 | "reseller_name": "Orell Füssli", 91 | "reseller_connected": false, 92 | "reseller_logo": "https://images.thalia.de/md37/ereader/Logo-eReading.png" 93 | }, 94 | { 95 | "reseller_id": "91", 96 | "reseller_name": "LIBRACCIO", 97 | "reseller_connected": false, 98 | "reseller_logo": "https://download.pageplace.de/icons_rc/91/android/91_reseller_logo.png" 99 | }, 100 | { 101 | "reseller_id": "82", 102 | "reseller_name": "LIBRIS.NL", 103 | "reseller_connected": false, 104 | "reseller_logo": "https://download.pageplace.de/icons_rc/82/android/82_reseller_logo.png" 105 | } 106 | ] 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-reseller-countries.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "resellerCountryResponse": { 3 | "resellerCountryGroups": [ 4 | { 5 | "languageCode": "DE", 6 | "resellerCountries": [ 7 | { 8 | "languageTag": "de-DE", 9 | "language": "Deutsch", 10 | "country": "Deutschland", 11 | "countryCode": "DE" 12 | }, 13 | { 14 | "languageTag": "de-CH", 15 | "language": "Deutsch", 16 | "country": "Schweiz", 17 | "countryCode": "CH" 18 | }, 19 | { 20 | "languageTag": "de-AT", 21 | "language": "Deutsch", 22 | "country": "Österreich", 23 | "countryCode": "AT" 24 | } 25 | ] 26 | }, 27 | { 28 | "languageCode": "EN", 29 | "resellerCountries": [ 30 | { 31 | "languageTag": "de-AT", 32 | "language": "German", 33 | "country": "Austria", 34 | "countryCode": "AT" 35 | }, 36 | { 37 | "languageTag": "de-DE", 38 | "language": "German", 39 | "country": "Germany", 40 | "countryCode": "DE" 41 | }, 42 | { 43 | "languageTag": "de-CH", 44 | "language": "German", 45 | "country": "Switzerland", 46 | "countryCode": "CH" 47 | } 48 | ] 49 | }, 50 | { 51 | "languageCode": "FR", 52 | "resellerCountries": [ 53 | { 54 | "languageTag": "de-DE", 55 | "language": "allemand", 56 | "country": "Allemagne", 57 | "countryCode": "DE" 58 | }, 59 | { 60 | "languageTag": "de-AT", 61 | "language": "allemand", 62 | "country": "Autriche", 63 | "countryCode": "AT" 64 | }, 65 | { 66 | "languageTag": "de-CH", 67 | "language": "allemand", 68 | "country": "Suisse", 69 | "countryCode": "CH" 70 | } 71 | ] 72 | }, 73 | { 74 | "languageCode": "ES", 75 | "resellerCountries": [ 76 | { 77 | "languageTag": "de-DE", 78 | "language": "alemán", 79 | "country": "Alemania", 80 | "countryCode": "DE" 81 | }, 82 | { 83 | "languageTag": "de-AT", 84 | "language": "alemán", 85 | "country": "Austria", 86 | "countryCode": "AT" 87 | }, 88 | { 89 | "languageTag": "de-CH", 90 | "language": "alemán", 91 | "country": "Suiza", 92 | "countryCode": "CH" 93 | } 94 | ] 95 | }, 96 | { 97 | "languageCode": "IT", 98 | "resellerCountries": [ 99 | { 100 | "languageTag": "de-AT", 101 | "language": "tedesco", 102 | "country": "Austria", 103 | "countryCode": "AT" 104 | }, 105 | { 106 | "languageTag": "de-DE", 107 | "language": "tedesco", 108 | "country": "Germania", 109 | "countryCode": "DE" 110 | }, 111 | { 112 | "languageTag": "de-CH", 113 | "language": "tedesco", 114 | "country": "Svizzera", 115 | "countryCode": "CH" 116 | } 117 | ] 118 | }, 119 | { 120 | "languageCode": "NL", 121 | "resellerCountries": [ 122 | { 123 | "languageTag": "de-DE", 124 | "language": "Duits", 125 | "country": "Duitsland", 126 | "countryCode": "DE" 127 | }, 128 | { 129 | "languageTag": "de-AT", 130 | "language": "Duits", 131 | "country": "Oostenrijk", 132 | "countryCode": "AT" 133 | }, 134 | { 135 | "languageTag": "de-CH", 136 | "language": "Duits", 137 | "country": "Zwitserland", 138 | "countryCode": "CH" 139 | } 140 | ] 141 | } 142 | ], 143 | "rebrandable": false 144 | } 145 | } 146 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-v2-resellerconfig.response-ok.json: -------------------------------------------------------------------------------- 1 | { 2 | "reseller_id": 3, 3 | "client_type": "TOLINO_VISION_3", 4 | "version": "1.7.0", 5 | "lastModified": 1603111725000, 6 | "config": { 7 | "URL_HANDSHAKE": "https://management.mytolino.com/index.html?reseller=3&platform=eink", 8 | "STRING_BRAND_NAME": "Thalia.de", 9 | "URL_SHOP_EBOOK_SEARCH": "https://ereader.thalia.de/de.thalia.ers.sun/api/2004/sun/suche?einsprung=firmware&search_complex=", 10 | "FAMILY_SHARING_ACTIVE": "true", 11 | "LCP_ACTIVATED": "true", 12 | "URL_SHOP_EBOOK_START_PAGE": "https://ereader.thalia.de/de.thalia.ers.sun/api/2004/sun/startseite?einsprung=firmware", 13 | "SHOP_BASE": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco", 14 | "URL_OAUTH_ACCESSTOKEN_FAMILY": "https://thalia.de/auth/oauth2/token?client_secret=gU5a7CA9", 15 | "IS_EXTERNAL_LINK_ENABLED": "true", 16 | "URL_RESELLER_LOGO": "http://www.tpereader.thalia.de/logos/Prod/thalia_de_sw_klein.png", 17 | "IS_LCP_ACTIVATED": "false", 18 | "URL_BOOKSHELF": "https://bosh.pageplace.de/bosh/rest", 19 | "OAUTH_CLIENT_ID": "treadervision3", 20 | "ENABLE_DATA_RECOVERY": "true", 21 | "URL_DEVICE_MANAGEMENT": "https://management.mytolino.com/index.html?reseller=3&platform=eink", 22 | "URL_BROWSER_START_PAGE": "https://www.google.de", 23 | "ADVERTISING_REDIRECT_BASE": "redirect.mytolino.com", 24 | "URL_OAUTH_AUTHORIZATION": "https://thalia.de/auth/oauth2/authorize?response_type=code&scope=SCOPE_BOSH SCOPE_BUCHDE SCOPE_MANDANT_ID.2004 SCOPE_LOGIN FAMILY&redirect_uri=epublishing://login&x_buchde.skin_id=17", 25 | "RECOMMENDATIONS_IS_SHUFFLE_ENABLED": "false", 26 | "URL_OAUTH_ACCESSTOKEN": "https://thalia.de/auth/oauth2/token?client_secret=gU5a7CA9", 27 | "URL_FAMILY_SHARING_MANUAL": "https://mytolino.de/family-sharing-handbuch-ereader", 28 | "URL_OAUTH_REVOKETOKEN": "https://thalia.de/auth/oauth2/revoke" 29 | }, 30 | "configLanguageSpecific": [ 31 | { 32 | "language": "FR", 33 | "languageConfig": { 34 | "STRING_ARRAY_SUPPORT_CONTACT": "E-mail: info@thalia.de##Hotline: +49 (0) 251 530 94 44##(Du lundi au vendredi de 9 h à 18 h)", 35 | "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Choisissez vos coups de cœur personnels parmi plus d'un million d'ebooks dans l'ebook-shop de Thalia.##Lisez parallèlement sur la tablette ou sur le smartphone avec l'appli eReading de Thalia.##Synchronisez vos ebooks en sécurité, confortablement et gratuitement à travers le tolino Cloud sur plusieurs appareils.##Avec votre tolino, utilisez gratuitement tous les hotspots de la Deutsche Telekom." 36 | } 37 | }, 38 | { 39 | "language": "EN", 40 | "languageConfig": { 41 | "STRING_ARRAY_SUPPORT_CONTACT": "E-Mail: info@thalia.de##Hotline: +49 (0)251 530 94 44##(German speaking customer care:##Monday to Friday, 9 a.m. to 6 p.m.)", 42 | "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Browse through over 1,000,000 e-books in the Thalia shop.##Use the Thalia eBooks app to read in parallel on your tablet, computer or smartphone.##Synchronize your titles across various devices securely and free of charge via the tolino Cloud.##Use all Deutsche Telekom HotSpots free of charge with your tolino." 43 | } 44 | }, 45 | { 46 | "language": "ES", 47 | "languageConfig": { 48 | "STRING_ARRAY_SUPPORT_CONTACT": "E-Mail: info@thalia.de##Línea directa: +49 (0) 251 530 94 44##(Lunes a viernes de 9:00 a 18:00 horas)", 49 | "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Seleccione de entre más de un millo de libros electrónicos en la tienda de eBooks de Thalia su destacados personalizados.##Lea de forma paralela con la aplicación de lectura digital de Thalia en su tableta o smartphone.##Sincronice sus libros electrónicos de forma segura, cómoda y gratuita a través de la tolino Cloud en distintos dispositivos.##Utilice con su dispositivo tolino de forma gratuita todos los HotSpots de la Deutsche Telekom." 50 | } 51 | }, 52 | { 53 | "language": "NL", 54 | "languageConfig": { 55 | "STRING_ARRAY_SUPPORT_CONTACT": "E-Mail: info@thalia.de##Hotline: +49 (0) 251 530 94 44##(Maandag t/m vrijdag 9:00 uur - 18:00 uur)", 56 | "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Kies uit meer dan een miljoen ebooks in de Thalia eBook-Shop uw persoonlijke favorieten.##Lees met de Thalia eReading-app ook parallel op de tablet of smartphone.##Synchroniseer uw ebooks veilig, comfortabel en kosteloos via de tolino Cloud op verschillende apparaten.##Maak met uw tolino gratis gebruik van alle HotSpots van de Deutsche Telekom." 57 | } 58 | }, 59 | { 60 | "language": "DE", 61 | "languageConfig": { 62 | "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Wählen Sie aus über einer Million eBooks im Thalia eBook-Shop Ihre persönlichen Highlights.##Lesen Sie mit der Thalia eReading App auch parallel auf dem Tablet oder Smartphone.##Synchronisieren Sie Ihre eBooks sicher, komfortabel und kostenlos über die tolino Cloud auf verschiedenen Geräten.##Nutzen Sie mit Ihrem tolino alle HotSpots der Deutschen Telekom kostenlos.", 63 | "STRING_ARRAY_SUPPORT_CONTACT": "E-Mail: info@thalia.de##Rufnummer: 0251 5309 444##(Montag bis Freitag 9 - 18 Uhr, Samstag 9:30 - 18 Uhr)" 64 | } 65 | }, 66 | { 67 | "language": "IT", 68 | "languageConfig": { 69 | "STRING_ARRAY_SUPPORT_CONTACT": "E-mail: info@thalia.de##Hot line: +49 (0) 251 530 94 44##(da lunedì a venerdì, dalle ore 9 alle ore 18)", 70 | "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Scegli le tue letture preferite tra oltre un milione di eBook nell'eBook shop Thalia.##Con l'app Thalia eReading, leggi in parallelo anche sul tablet o lo smartphone.##Sincronizza i tuoi eBook in modo sicuro, comodo e gratuito su dispositivi diversi tramite tolino Cloud.##Con il tuo tolino, sfrutta gratis tutti gli hot spot di Deutsche Telekom." 71 | } 72 | } 73 | ] 74 | } 75 | -------------------------------------------------------------------------------- /api/pageplace.inventory-v2-inventory.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "lastModifiedDate": 1612123999080, 3 | "page": { 4 | "content": [ 5 | { 6 | "publicationId": "DT0400.9783641243609_A40398678", 7 | "resellerId": "3", 8 | "resellerName": "THALIA.DE", 9 | "contentType": "EBOOK", 10 | "shelfId": "39549013", 11 | "authors": [ 12 | { 13 | "name": null, 14 | "firstName": "Patrick", 15 | "lastName": "Ness" 16 | } 17 | ], 18 | "title": "Chaos Walking - Die Mission (E-Only)", 19 | "subtitle": "Die Vorgeschichte zur »Chaos Walking«-Trilogie", 20 | "isbnEan": "9783641243609", 21 | "language": null, 22 | "keywords": [ 23 | "Tribute von Panem; Divergent; Dystopie; Tom Holland; Daisy Ridley; Mads Mikkelsen; Young Adult; Nick Jonas; Hollywood-Verfilmung", 24 | "9783641243609" 25 | ], 26 | "publisher": "Random House ebook", 27 | "issuedDate": 1607900400000, 28 | "fileResources": [ 29 | { 30 | "resource": "https://cdp.pageplace.de/cdp/public/publications/DT0400/9783641243609_A40398678/cover", 31 | "format": "image/jpeg", 32 | "type": "COVER_IMAGE", 33 | "lastModifiedDate": null 34 | } 35 | ], 36 | "contentProtectionType": "UNPROTECTED", 37 | "purchasedDate": 1612116184445, 38 | "sequenceNo": null, 39 | "transactionId": "339905364", 40 | "contentSources": [ 41 | "PURCHASED" 42 | ], 43 | "readableContentInfo": { 44 | "isTextToSpeechEnabled": false, 45 | "renderingEngine": "FGRE" 46 | }, 47 | "audioContentInfo": null, 48 | "subscriptionInfo": null, 49 | "familySharing": true, 50 | "defaultCover": null, 51 | "contentFormat": "application/epub+zip", 52 | "abstract": "Wer ist das Mädchen an der Seite von Todd Hewitt?\n\nAls Todd Hewitt auf das Mädchen Viola trifft, verändert dies sein Leben schlagartig. Er erkennt, dass es auf einer Lüge aufgebaut war. Er ist plötzlich in tödlicher Gefahr. Er hat zum ersten Mal in seinem Leben jemanden gefunden, dessen Gedanken er nicht lesen kann - und den er trotzdem perfekt versteht. Doch woher nur kommt die geheimnisvolle Viola, mit der er auf der Flucht ist? Die exklusive Vorgeschichte zur »Chaos Walking«-Bestseller-Trilogie beantwortet diese Frage zum ersten Mal." 53 | }, 54 | { 55 | "publicationId": "DT0400.9783739673417_A27522964", 56 | "resellerId": "3", 57 | "resellerName": "THALIA.DE", 58 | "contentType": "EBOOK", 59 | "shelfId": "39549013", 60 | "authors": [ 61 | { 62 | "name": null, 63 | "firstName": "Caterina", 64 | "lastName": "di Montebasso" 65 | } 66 | ], 67 | "title": "Das Relikt", 68 | "subtitle": "Sci Fi Kurzgeschichte", 69 | "isbnEan": "9783739673417", 70 | "language": "de", 71 | "keywords": [], 72 | "publisher": "BookRix", 73 | "issuedDate": 1473804000000, 74 | "fileResources": [ 75 | { 76 | "resource": "https://cdp.pageplace.de/cdp/public/publications/DT0400/9783739673417_A27522964/cover", 77 | "format": "image/jpeg", 78 | "type": "COVER_IMAGE", 79 | "lastModifiedDate": null 80 | } 81 | ], 82 | "contentProtectionType": "WATERMARK", 83 | "purchasedDate": 1612116343128, 84 | "sequenceNo": null, 85 | "transactionId": "339901326", 86 | "contentSources": [ 87 | "PURCHASED" 88 | ], 89 | "readableContentInfo": { 90 | "isTextToSpeechEnabled": true, 91 | "renderingEngine": "FGRE" 92 | }, 93 | "audioContentInfo": null, 94 | "subscriptionInfo": null, 95 | "familySharing": true, 96 | "defaultCover": null, 97 | "contentFormat": "application/epub+zip", 98 | "abstract": "

Eine Pyramide. Niemand kennt ihren wahren Ursprung. Mythen und falsche Interpretationen umwölken sie. Puhlie, ein Farmerjunge aus dem Volk der Amaranth, gibt sich mit den alten Erklährungen nicht zufrieden. Er widmet sein Leben der Lösung des Rätsels. Doch erst eine Generation später wird es entschlüsselt. Ungeheure Umwälzungen durchströmen daraufhin das gesamte Universum. Doch geschiet dies alles nicht zum ersten Mal.

" 99 | }, 100 | { 101 | "publicationId": "DT0400.9783842028357_A29383154", 102 | "resellerId": "3", 103 | "resellerName": "THALIA.DE", 104 | "contentType": "EBOOK", 105 | "shelfId": "39549013", 106 | "authors": [ 107 | { 108 | "name": null, 109 | "firstName": "Ban", 110 | "lastName": "Zarbo" 111 | } 112 | ], 113 | "title": "Gratis-Leseprobe: Kamo - Pakt mit der Geisterwelt", 114 | "subtitle": null, 115 | "isbnEan": "9783842028357", 116 | "language": null, 117 | "keywords": [ 118 | "Shounen; Shonen Jump; Abenteuer; Action; Mystery; Shonen; Geist; Geister; Dämon; Dämonen; Tod; Bleach; Death Note; Fantasy" 119 | ], 120 | "publisher": "TOKYOPOP Verlag", 121 | "issuedDate": 1489618800000, 122 | "fileResources": [ 123 | { 124 | "resource": "https://cdp.pageplace.de/cdp/public/publications/DT0400/9783842028357_A29383154/cover", 125 | "format": "image/jpeg", 126 | "type": "COVER_IMAGE", 127 | "lastModifiedDate": null 128 | } 129 | ], 130 | "contentProtectionType": "WATERMARK", 131 | "purchasedDate": 1612116728634, 132 | "sequenceNo": null, 133 | "transactionId": "339906865", 134 | "contentSources": [ 135 | "PURCHASED" 136 | ], 137 | "readableContentInfo": { 138 | "isTextToSpeechEnabled": true, 139 | "renderingEngine": "FGRE" 140 | }, 141 | "audioContentInfo": null, 142 | "subscriptionInfo": null, 143 | "familySharing": true, 144 | "defaultCover": null, 145 | "contentFormat": "application/pdf", 146 | "abstract": "All die Jahre hat der herzkranke Kamo gegen den Tod gekämpft, doch vergebens - sein junges Leben neigt sich dem Ende zu. Kurz vor seinem letzten Atemzug erhält er Besuch von Crimson, einem mächtigen Geist, der ihm ein unglaubliches Angebot macht: \"Hilf mir, zwölf Geister zu besiegen und ihre Seelen einzufangen, und ich schenke dir ein neues Herz.\" Aber welchen Preis zahlt man für einen Pakt mit einem Geist?" 147 | } 148 | ], 149 | "totalElements": 3, 150 | "totalPages": 1, 151 | "numberOfElements": 3, 152 | "size": 300, 153 | "number": 0 154 | }, 155 | "deletedContent": [] 156 | } 157 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-dictionary-list.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "dictionaryListResponse": { 3 | "dictionaryEntries": [ 4 | { 5 | "id": 15, 6 | "filename": "EN-IT.quickdic", 7 | "file_sha1": "bf31e5d240e8c044c11b0e338fe520648d701dec", 8 | "download_url": "https://download.pageplace.de/dictionary/EN-IT.quickdic.zip", 9 | "file_size": 107805685, 10 | "language_from": "EN", 11 | "language_to": "IT", 12 | "last_modified": 1470058728000, 13 | "created": 1416587670000 14 | }, 15 | { 16 | "id": 16, 17 | "filename": "IT-ES.quickdic", 18 | "file_sha1": "8d891665a0f3f894fe7f8565cedd301c7e92095f", 19 | "download_url": "https://download.pageplace.de/dictionary/IT-ES.quickdic.zip", 20 | "file_size": 706110, 21 | "language_from": "IT", 22 | "language_to": "ES", 23 | "last_modified": 1416587671000, 24 | "created": 1416587671000 25 | }, 26 | { 27 | "id": 17, 28 | "filename": "IT-FR.quickdic", 29 | "file_sha1": "fd0e84f7273ed8642f2ca1b55dc679607245b068", 30 | "download_url": "https://download.pageplace.de/dictionary/IT-FR.quickdic.zip", 31 | "file_size": 700760, 32 | "language_from": "IT", 33 | "language_to": "FR", 34 | "last_modified": 1416587672000, 35 | "created": 1416587672000 36 | }, 37 | { 38 | "id": 1410196761, 39 | "filename": "FR.quickdic", 40 | "file_sha1": "beee10118cfd6ee32542a3a5eee7a71a3007e798", 41 | "download_url": "https://download.pageplace.de/dictionary/FR.quickdic.zip", 42 | "file_size": 116064083, 43 | "language_from": "FR", 44 | "language_to": null, 45 | "last_modified": 1391428950000, 46 | "created": 1384855786000 47 | }, 48 | { 49 | "id": 1410196762, 50 | "filename": "ES.quickdic", 51 | "file_sha1": "7f994be6876686dd0a4432060266b0c4dbfb41db", 52 | "download_url": "https://download.pageplace.de/dictionary/ES.quickdic.zip", 53 | "file_size": 53858404, 54 | "language_from": "ES", 55 | "language_to": null, 56 | "last_modified": 1384855788000, 57 | "created": 1384855788000 58 | }, 59 | { 60 | "id": 8, 61 | "filename": "DE.quickdic", 62 | "file_sha1": "dedc33464bfd0a34ee401dba6e3c8856f3219634", 63 | "download_url": "https://download.pageplace.de/dictionary/DE.quickdic.zip", 64 | "file_size": 79032764, 65 | "language_from": "DE", 66 | "language_to": null, 67 | "last_modified": 1384855908000, 68 | "created": 1380285437000 69 | }, 70 | { 71 | "id": 9, 72 | "filename": "NL.quickdic", 73 | "file_sha1": "8e4fa722779bc5b54089bd85856890ea32d2ab71", 74 | "download_url": "https://download.pageplace.de/staging/dictionary/NL.quickdic.zip", 75 | "file_size": 24209379, 76 | "language_from": "NL", 77 | "language_to": null, 78 | "last_modified": 1403259975000, 79 | "created": 1403259975000 80 | }, 81 | { 82 | "id": 10, 83 | "filename": "DE_NL.quickdic", 84 | "file_sha1": "2ef65bddb61b6a0ae502e803e456e238671f03a1", 85 | "download_url": "https://download.pageplace.de/staging/dictionary/DE_NL.quickdic.zip", 86 | "file_size": 947379, 87 | "language_from": "DE", 88 | "language_to": "NL", 89 | "last_modified": 1403260008000, 90 | "created": 1403260008000 91 | }, 92 | { 93 | "id": 11, 94 | "filename": "EN_NL.quickdic", 95 | "file_sha1": "6084cddce46832aea01eb58542a4844a2ae4ee3e", 96 | "download_url": "https://download.pageplace.de/staging/dictionary/EN_NL.quickdic.zip", 97 | "file_size": 5687123, 98 | "language_from": "NL", 99 | "language_to": "EN", 100 | "last_modified": 1403260051000, 101 | "created": 1403260051000 102 | }, 103 | { 104 | "id": 12, 105 | "filename": "FR_NL.quickdic", 106 | "file_sha1": "88f5974614a98d328930149e1d009b41470c17fb", 107 | "download_url": "https://download.pageplace.de/staging/dictionary/FR_NL.quickdic.zip", 108 | "file_size": 3991711, 109 | "language_from": "NL", 110 | "language_to": "FR", 111 | "last_modified": 1403260078000, 112 | "created": 1403260078000 113 | }, 114 | { 115 | "id": 13, 116 | "filename": "NO_NL.quickdic", 117 | "file_sha1": "1e20eb807ff5fdf2169d905ce23fa2d74732ffca", 118 | "download_url": "https://download.pageplace.de/staging/dictionary/NO_NL.quickdic.zip", 119 | "file_size": 847956, 120 | "language_from": "NL", 121 | "language_to": "NO", 122 | "last_modified": 1403260107000, 123 | "created": 1403260107000 124 | }, 125 | { 126 | "id": 1610761154, 127 | "filename": "EN-FR.quickdic", 128 | "file_sha1": "5c419822146d2ad3f941fc2659c4346c53a46f06", 129 | "download_url": "https://download.pageplace.de/staging/dictionary/EN-FR.quickdic.zip", 130 | "file_size": 97389181, 131 | "language_from": "EN", 132 | "language_to": "FR", 133 | "last_modified": 1463490158000, 134 | "created": 1463490158000 135 | }, 136 | { 137 | "id": 2, 138 | "filename": "DE-EN.quickdic", 139 | "file_sha1": "eab9d5be9fc01a7cb9e689f865febf088bd9f56c", 140 | "download_url": "https://download.pageplace.de/dictionary/DE-EN.quickdic.zip", 141 | "file_size": 49376638, 142 | "language_from": "DE", 143 | "language_to": "EN", 144 | "last_modified": 1381395549000, 145 | "created": null 146 | }, 147 | { 148 | "id": 3, 149 | "filename": "DE-ES.quickdic", 150 | "file_sha1": "6b26b23ad8658bdffb7d68c54451f36734fde3e2", 151 | "download_url": "https://download.pageplace.de/dictionary/DE-ES.quickdic.zip", 152 | "file_size": 2742937, 153 | "language_from": "DE", 154 | "language_to": "ES", 155 | "last_modified": 1381395549000, 156 | "created": null 157 | }, 158 | { 159 | "id": 4, 160 | "filename": "DE-FR.quickdic", 161 | "file_sha1": "0f0bb4334b8c5ea21fa3b7063a36943914793746", 162 | "download_url": "https://download.pageplace.de/dictionary/DE-FR.quickdic.zip", 163 | "file_size": 12732080, 164 | "language_from": "DE", 165 | "language_to": "FR", 166 | "last_modified": 1381395549000, 167 | "created": null 168 | }, 169 | { 170 | "id": 5, 171 | "filename": "DE-IT.quickdic", 172 | "file_sha1": "236b5aae8488ce1b7709f84d7eab1a2d75152405", 173 | "download_url": "https://download.pageplace.de/dictionary/DE-IT.quickdic.zip", 174 | "file_size": 8348482, 175 | "language_from": "DE", 176 | "language_to": "IT", 177 | "last_modified": 1381395549000, 178 | "created": null 179 | }, 180 | { 181 | "id": 6, 182 | "filename": "EN.quickdic", 183 | "file_sha1": "9b541e02abcb9f2cfe06ae5762dc00f1919c8495", 184 | "download_url": "https://download.pageplace.de/dictionary/EN.quickdic.zip", 185 | "file_size": 113927204, 186 | "language_from": "EN", 187 | "language_to": null, 188 | "last_modified": 1381395549000, 189 | "created": null 190 | }, 191 | { 192 | "id": 7, 193 | "filename": "IT.quickdic", 194 | "file_sha1": "5970a7ca9bf905693c4138ad0fbbc3b1c0f8c92d", 195 | "download_url": "https://download.pageplace.de/dictionary/IT.quickdic.zip", 196 | "file_size": 11566432, 197 | "language_from": "IT", 198 | "language_to": null, 199 | "last_modified": 1416392412000, 200 | "created": null 201 | } 202 | ] 203 | } 204 | } 205 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-sync-data.rst: -------------------------------------------------------------------------------- 1 | ======================================================= 2 | ``PATCH https://bosh.pageplace.de/bosh/rest/sync-data`` 3 | ======================================================= 4 | Send changes to the server and get changes since last sync back. 5 | This is the main API method for synchronization. 6 | 7 | Part of the `Sync process`_. 8 | 9 | Request 10 | ======= 11 | Header 12 | Similar to `bosh v1 header set`_, but not exactly the same. 13 | Uses ``reseller_id`` instead of ``m_id`` and does not send the ``client_version``. 14 | 15 | ``t_auth_token`` 16 | OAuth token obtained from `POST https://thalia.de/auth/oauth2/token`_. 17 | 18 | Example: ``eyJhbGciOiJSUzI1NiJ9.eyJhdWRpZW5jZSI6InRyZWFkZXJ2aXNpb24zIiw...`` 19 | ``Content-Type`` 20 | ``application/json; charset=UTF-8`` 21 | ``Accept`` 22 | ``application/json; charset=UTF-8`` 23 | ``reseller_id`` 24 | Example: ``3`` 25 | ``hardware_id`` 26 | Example: ``665fc389ef4e47258c5db9fa7821bd19`` 27 | ``client_type`` 28 | Example: ``TOLINO_VISION_3`` 29 | GET parameters 30 | ``paths`` 31 | Example: ``publications`` 32 | 33 | FIXME: What else? 34 | Request body parameters 35 | ``revision`` 36 | ``revision`` of last sync response. 37 | 38 | ``null`` when it is the first sync ever for this device. 39 | ``patches`` 40 | Array of changes. 41 | 42 | When no data to sync: 43 | 44 | - in the request: Empty array ``[]``. 45 | - in the response: Property ``patches`` is omitted. 46 | 47 | Changes are objects with the following properties: 48 | 49 | ``op`` 50 | The patch operation: ``add``, ``replace``, ``remove`` 51 | 52 | ``replace`` is used to update the reading position or to rename 53 | a collection. 54 | 55 | ``path`` 56 | Examples: 57 | 58 | - ``/publications/DT0400.9783739673417_A27522964/bookmark/606779074`` 59 | - ``/publications/DT0400.9783641243609_A40398678/tags`` 60 | 61 | Consists of several parts: 62 | 63 | 1. The prefix seems always to be ``/publications/``. 64 | 2. A publication ID ``DT0400.9783739673417_A27522964`` 65 | 3. The type that is created/updated/deleted: 66 | 67 | - ``bookmark`` is the reading position 68 | - ``dogears`` when bookmarking a page in the e-book 69 | - ``comments`` when highlighting/marking some text or adding a note 70 | - ``tags`` for collection management 71 | 4. Server-side database ID. 72 | 73 | When doing ``op=add`` requests, the ID is only in the response, 74 | but not in the request. 75 | 76 | ``value`` 77 | Details of the change. Properties depend on the type. 78 | 79 | ``modified`` 80 | Time when this action was done in milliseconds. Type: Integer. 81 | 82 | Example: ``1612127562802`` 83 | ``position`` 84 | File name of the chapter in the epub, 85 | plus specific data in the anchor. Type: String. 86 | 87 | Example: ``OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:114)`` 88 | ``revision`` 89 | FIXME. Type: String. 90 | 91 | FIXME: Can be ``null``: 92 | 93 | - When the book is added to a new collection. 94 | 95 | The patch part revisions share some prefix with the patch revision, 96 | but are a bit longer. 97 | Seem to be base64-encoded, since the often (always?) have ``==`` at the end. 98 | 99 | In the response, the patch part revisions also share some prefix with 100 | the new server revision. 101 | 102 | Example: ``Lmu7TngaxhKWHdv2FFktQNcGFPmnOshpANcqFEx7udpEDvQDdiq93W8ryZG4oSfm9D9sp2Aowkhu/1wg8qj4PglnxUFM96DOLgZMd9NVnTByM/ZG1vgkHHCrqwpA/7bO67OjTjo1TLKVL442Lx3sGw==`` 103 | ``category`` 104 | Known values: 105 | 106 | - ``collection`` (add or remove book from a collection (group of books)) 107 | 108 | Only for ``tags`` (collection) patches. 109 | ``progress`` 110 | Reading progress in the ranging from 0-1. Type: Float. 111 | 112 | Only for ``bookmark`` (reading position) patches. 113 | 114 | Example: ``0.41666666`` 115 | ``currentPosition`` 116 | Current page number. Type: String. 117 | 118 | Only for ``bookmark`` (reading position) patches. 119 | 120 | Example: ``"5"`` 121 | ``lastPosition`` 122 | Last page number in the book. Type: String 123 | 124 | Only for ``bookmark`` (reading position) patches. 125 | 126 | Example: ``"12"`` 127 | ``transientId`` 128 | FIXME. Type: String. String Content: Integer. 129 | 130 | Only when ``op=add`` on ``dogears`` (bookmark), ``comments`` 131 | and ``tags`` (collection). 132 | 133 | Example: ``"3"``, ``"50"``. 134 | ``name`` 135 | ``dogears``: Text on the bookmarked page. Type: String. 136 | 137 | ``tags``: Name of the collection (book group). 138 | 139 | Only for ``dogears`` (bookmark) and ``tags`` add+remove operations. 140 | ``text`` 141 | Highlighted text. Type: String 142 | 143 | Only for ``comments`` (highlight/note) add+remove operations. 144 | ``startPosition`` 145 | Start of highlighted text. Type: String. 146 | 147 | Only for ``comments`` (highlight/note) add+remove operations. 148 | 149 | Example: ``OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:463)`` 150 | ``endPosition`` 151 | End of highlighted text. Type: String. 152 | 153 | Only for ``comments`` (highlight/note) add+remove operations. 154 | 155 | Example: ``OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:682)`` 156 | ``note`` 157 | Manually entered text (note). Type: String. 158 | 159 | Only for ``comments`` (note) add+remove operations. 160 | 161 | Property does not appear for non-note highlights. 162 | 163 | Example: ``Really?`` 164 | 165 | 166 | When closing a book (going back to the book list), the current reading 167 | position is synchronized to the server - regardless if it changed. 168 | I removed that from the requests + responses to have cleaner examples. 169 | 170 | The ``revision`` in the request is the ``revision`` the server returned 171 | in the last response. 172 | 173 | 174 | First sync request 175 | ------------------ 176 | When nothing needs to be synchronized to the server, and nothing 177 | ever has been synchronized: 178 | 179 | .. include:: pageplace.bosh-bosh-rest-sync-data.request-first.json 180 | :code: 181 | 182 | 183 | Set reading position 184 | -------------------- 185 | Reading a page in the book and exiting back to the books list: 186 | 187 | .. include:: pageplace.bosh-bosh-rest-sync-data.request-reading-position.json 188 | :code: 189 | 190 | 191 | 192 | Response 193 | ======== 194 | HTTP status code: ``200 OK`` 195 | 196 | When something changed, a new ``revision`` number is returned. 197 | 198 | When synchronizing local changes to the server - and the server has no 199 | changes from other readers, 200 | the request is mirrored back in the response 201 | (only the revision number is updated). 202 | 203 | The server first ingests the request's patch data into its database, 204 | and then calculates and returns the changes from the 205 | requests's ``revision`` number to the current revision. 206 | Those changes are returned in the response, together with the current 207 | latest revision number. 208 | 209 | Same structure as the request data. 210 | 211 | 212 | Set reading position 213 | -------------------- 214 | The "Set reading position" changes and a new revision is returned. 215 | 216 | .. include:: pageplace.bosh-bosh-rest-sync-data.response-reading-position.json 217 | :code: 218 | 219 | 220 | Set a bookmark 221 | -------------- 222 | 223 | .. include:: pageplace.bosh-bosh-rest-sync-data.response-bookmark-set.json 224 | :code: 225 | 226 | 227 | Remove a bookmark 228 | ----------------- 229 | 230 | .. include:: pageplace.bosh-bosh-rest-sync-data.response-bookmark-remove.json 231 | :code: 232 | 233 | 234 | Add a highlight 235 | --------------- 236 | 237 | .. include:: pageplace.bosh-bosh-rest-sync-data.response-highlight-add.json 238 | :code: 239 | 240 | 241 | Remove a highlight 242 | ------------------ 243 | 244 | .. include:: pageplace.bosh-bosh-rest-sync-data.response-highlight-remove.json 245 | :code: 246 | 247 | 248 | Add a note 249 | ---------- 250 | 251 | .. include:: pageplace.bosh-bosh-rest-sync-data.response-note-add.json 252 | :code: 253 | 254 | 255 | Remove a note 256 | ------------- 257 | 258 | .. include:: pageplace.bosh-bosh-rest-sync-data.response-note-remove.json 259 | :code: 260 | 261 | 262 | Remove from collection 263 | ---------------------- 264 | Here the book gets removed from the group (collection) "Zweicoll". 265 | 266 | .. include:: pageplace.bosh-bosh-rest-sync-data.response-collection-remove.json 267 | :code: 268 | 269 | 270 | New bookmarks and comments 271 | -------------------------- 272 | Example: 273 | 274 | .. include:: pageplace.bosh-bosh-rest-sync-data.response-bookmarks-comments.json 275 | :code: 276 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-v2-resellerconfig.response-ok-tolinovision2.json: -------------------------------------------------------------------------------- 1 | { 2 | "reseller_id": 3, 3 | "client_type": "TOLINO_VISION_2", 4 | "version": "1.7.0", 5 | "lastModified": 1603111725000, 6 | "config": { 7 | "STRING_SUPPORT_CONTACT": "E-Mail: info@thalia.de Rufnummer: +49 (0) 251 530 94 44 (Montag bis Freitag 9:00 Uhr - 18:00 Uhr)", 8 | "STRING_BRAND_NAME": "Thalia.de", 9 | "STRING_ARRAY_ACTIVATION_ADVANTAGES_ES": "{[\"Seleccione de entre más de un millo de libros electrónicos en la tienda de eBooks de Thalia su destacados personalizados.\",\"Lea de forma paralela con la aplicación de lectura digital de Thalia en su tableta o smartphone.\",\"Sincronice sus libros electrónicos de forma segura, cómoda y gratuita a través de la tolino Cloud en distintos dispositivos.\",\"Utilice con su dispositivo tolino de forma gratuita todos los HotSpots de la Deutsche Telekom.\"]}", 10 | "SKIN_ID_VALUE_DE": "17", 11 | "URL_REVOKETOKEN": "https://auth.buch.de/auth/oauth2/revoke", 12 | "URL_SHOP_EBOOK_START_PAGE": "https://ereader.thalia.de/de.thalia.ers.sun/api/2004/sun/startseite?einsprung=firmware", 13 | "STRING_ARRAY_ACTIVATION_ADVANTAGES_IT": "{[\"Scegli le tue letture preferite tra oltre un milione di eBook nell'eBook shop Thalia.\",\"Con l'app Thalia eReading, leggi in parallelo anche sul tablet o lo smartphone.\",\"Sincronizza i tuoi eBook in modo sicuro, comodo e gratuito su dispositivi diversi tramite tolino Cloud.\",\"Con il tuo tolino, sfrutta gratis tutti gli hot spot di Deutsche Telekom.\"]}", 14 | "URL_HELP_EN": "https://ereader.thalia.de/ebooks/shop/faq.jsp?oid=4&lb_m=2004", 15 | "ENABLE_DATA_RECOVERY": "true", 16 | "OAUTH_CLIENT_ID": "treadervision2", 17 | "SKIN_ID_KEY": "x_buchde.skin_id", 18 | "URL_ACCESSTOKEN": "https://www.thalia.de/de.buch.appservices/api/2004/oauth2/token?client_secret=treaderapp_password", 19 | "URL_OAUTH_AUTHORIZATION": "https://thalia.de/auth/oauth2/authorize?response_type=code&scope=SCOPE_BOSH SCOPE_BUCHDE SCOPE_MANDANT_ID.2004 SCOPE_LOGIN FAMILY&redirect_uri=epublishing://login&x_buchde.skin_id=17", 20 | "STRING_ARRAY_ACTIVATION_ADVANTAGES_EN": "{[\"Browse through over 1,000,000 e-books in the Thalia shop.\", \"Use the Thalia eBooks app to read in parallel on your tablet, computer or smartphone.\",\"Synchronize your titles across various devices securely and free of charge via the tolino Cloud.\",\"Use all Deutsche Telekom HotSpots free of charge with your tolino.\"]}", 21 | "BROWSER_START_PAGE": "https://www.google.de", 22 | "URL_SHOP_EBOOK_SEARCH": "https://ereader.thalia.de/de.thalia.ers.sun/api/2004/sun/suche?einsprung=firmware&search_complex=", 23 | "SKIN_ID_VALUE_EN": "17", 24 | "SCOPE": "SCOPE_BOSH SCOPE_BUCHDE SCOPE_MANDANT_ID.2004", 25 | "URL_HELP_DE": "https://ereader.thalia.de/ebooks/shop/faq.jsp?oid=4&lb_m=2004", 26 | "APP_SHOP_SEARCH_TYPE": "WEBVIEW", 27 | "LCP_ACTIVATED": "true", 28 | "STRING_ARRAY_ACTIVATION_ADVANTAGES_DE": "{[\"Wählen Sie aus über einer Million eBooks im Thalia eBook-Shop Ihre persönlichen Highlights.\",\"Lesen Sie mit der Thalia eReading App auch parallel auf dem Tablet oder Smartphone.\",\"Synchronisieren Sie Ihre eBooks sicher, komfortabel und kostenlos über die tolino Cloud auf verschiedenen Geräten.\",\"Nutzen Sie mit Ihrem tolino alle HotSpots der Deutschen Telekom kostenlos.\"]}", 29 | "STRING_SUPPORT_CONTACT_DE": "E-Mail: info@thalia.de Rufnummer: +49 (0) 251 530 94 44 (Montag bis Freitag 9:00 Uhr - 18:00 Uhr)", 30 | "URL_DEVICE_MANAGEMENT": "https://management.mytolino.com/index.html?reseller=3&platform=eink", 31 | "ADVERTISING_REDIRECT_BASE": "redirect.mytolino.com", 32 | "URL_HANDSHAKE": "https://management.mytolino.com/index.html?reseller=3&platform=eink", 33 | "STRING_SUPPORT_CONTACT_FR": "E-mail: info@thalia.de Hotline: +49 (0) 251 530 94 44 (Du lundi au vendredi de 9 h à 18 h)", 34 | "SHOP_BASE": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco", 35 | "URL_OAUTH_ACCESSTOKEN_FAMILY": "https://thalia.de/auth/oauth2/token?client_secret=GPvCYjsNqZJkQsyZ9VUF", 36 | "IS_EXTERNAL_LINK_ENABLED": "true", 37 | "URL_RESELLER_LOGO": "http://www.tpereader.thalia.de/logos/Prod/thalia_de_sw_klein.png", 38 | "IS_LCP_ACTIVATED": "false", 39 | "WEBVIEW_SHOP_SEARCH_URL": "https://ereader.thalia.de/ebooks/shop/search.jsp?oid=4&lb_m=2004&appsearch=1&search_complex=", 40 | "URL_FAMILY_SHARING_MANUAL": "https://mytolino.de/family-sharing-handbuch-ereader", 41 | "URL_OAUTH_ACCESSTOKEN": "https://thalia.de/auth/oauth2/token?client_secret=GPvCYjsNqZJkQsyZ9VUF", 42 | "BOOKSHELF_URL": "https://bosh.pageplace.de/bosh/rest", 43 | "URL_OAUTH_REVOKETOKEN": "https://thalia.de/auth/oauth2/revoke", 44 | "URL_AUTHORIZATION": "https://auth.buch.de/auth/oauth2/authorize", 45 | "FAMILY_SHARING_ACTIVE": "true", 46 | "STRING_SUPPORT_CONTACT_EN": "E-Mail: info@thalia.de Hotline: +49 (0)251 530 94 44 (German speaking customer care: Monday to Friday 9a.m. to 6p.m.)", 47 | "CLIENT_ID": "treaderapp01", 48 | "STRING_SUPPORT_CONTACT_ES": "E-Mail: info@thalia.de Línea directa: +49 (0) 251 530 94 44 (Lunes a viernes de 9:00 a 18:00 horas)", 49 | "STRING_ARRAY_ACTIVATION_ADVANTAGES_NL": "{[\"Kies uit meer dan een miljoen ebooks in de Thalia eBook-Shop uw persoonlijke favorieten.\",\"Lees met de Thalia eReading-app ook parallel op de tablet of smartphone.\",\"Synchroniseer uw ebooks veilig, comfortabel en kosteloos via de tolino Cloud op verschillende apparaten.\",\"Maak met uw tolino gratis gebruik van alle HotSpots van de Deutsche Telekom.\"]}", 50 | "STRING_SUPPORT_CONTACT_NL": "E-Mail: info@thalia.de Hotline: +49 (0) 251 530 94 44 (Maandag t/m vrijdag 9:00 uur - 18:00 uur)", 51 | "STRING_SUPPORT_CONTACT_IT": "E-mail: info@thalia.de Hot line: +49 (0) 251 530 94 44 (da lunedì a venerdì, dalle ore 9 alle ore 18)", 52 | "URL_BOOKSHELF": "https://bosh.pageplace.de/bosh/rest", 53 | "STRING_ARRAY_ACTIVATION_ADVANTAGES_FR": "{[\"Choisissez vos coups de cœur personnels parmi plus d'un million d'ebooks dans l'ebook-shop de Thalia.\",\"Lisez parallèlement sur la tablette ou sur le smartphone avec l'appli eReading de Thalia.\",\"Synchronisez vos ebooks en sécurité, confortablement et gratuitement à travers le tolino Cloud sur plusieurs appareils.\",\"Avec votre tolino, utilisez gratuitement tous les hotspots de la Deutsche Telekom.\"]}", 54 | "URL_BROWSER_START_PAGE": "https://www.google.de", 55 | "RECOMMENDATIONS_IS_SHUFFLE_ENABLED": "false" 56 | }, 57 | "configLanguageSpecific": [ 58 | { 59 | "language": "FR", 60 | "languageConfig": { 61 | "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Choisissez vos coups de cœur personnels parmi plus d'un million d'ebooks dans l'ebook-shop de Thalia.##Lisez parallèlement sur la tablette ou sur le smartphone avec l'appli eReading de Thalia.##Synchronisez vos ebooks en sécurité, confortablement et gratuitement à travers le tolino Cloud sur plusieurs appareils.##Avec votre tolino, utilisez gratuitement tous les hotspots de la Deutsche Telekom.", 62 | "STRING_ARRAY_SUPPORT_CONTACT": "E-mail: info@thalia.de##Hotline: +49 (0) 251 530 94 44##(Du lundi au vendredi de 9 h à 18 h)" 63 | } 64 | }, 65 | { 66 | "language": "EN", 67 | "languageConfig": { 68 | "STRING_ARRAY_SUPPORT_CONTACT": "E-Mail: info@thalia.de##Hotline: +49 (0)251 530 94 44##(German speaking customer care:##Monday to Friday, 9 a.m. to 6 p.m.)", 69 | "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Browse through over 1,000,000 e-books in the Thalia shop.##Use the Thalia eBooks app to read in parallel on your tablet, computer or smartphone.##Synchronize your titles across various devices securely and free of charge via the tolino Cloud.##Use all Deutsche Telekom HotSpots free of charge with your tolino." 70 | } 71 | }, 72 | { 73 | "language": "ES", 74 | "languageConfig": { 75 | "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Seleccione de entre más de un millo de libros electrónicos en la tienda de eBooks de Thalia su destacados personalizados.##Lea de forma paralela con la aplicación de lectura digital de Thalia en su tableta o smartphone.##Sincronice sus libros electrónicos de forma segura, cómoda y gratuita a través de la tolino Cloud en distintos dispositivos.##Utilice con su dispositivo tolino de forma gratuita todos los HotSpots de la Deutsche Telekom.", 76 | "STRING_ARRAY_SUPPORT_CONTACT": "E-Mail: info@thalia.de##Línea directa: +49 (0) 251 530 94 44##(Lunes a viernes de 9:00 a 18:00 horas)" 77 | } 78 | }, 79 | { 80 | "language": "NL", 81 | "languageConfig": { 82 | "STRING_ARRAY_SUPPORT_CONTACT": "E-Mail: info@thalia.de##Hotline: +49 (0) 251 530 94 44##(Maandag t/m vrijdag 9:00 Uhr - 18:00 Uhr)", 83 | "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Kies uit meer dan een miljoen ebooks in de Thalia eBook-Shop uw persoonlijke favorieten.##Lees met de Thalia eReading-app ook parallel op de tablet of smartphone.##Synchroniseer uw ebooks veilig, comfortabel en kosteloos via de tolino Cloud op verschillende apparaten.##Maak met uw tolino gratis gebruik van alle HotSpots van de Deutsche Telekom." 84 | } 85 | }, 86 | { 87 | "language": "DE", 88 | "languageConfig": { 89 | "STRING_ARRAY_SUPPORT_CONTACT": "E-Mail: info@thalia.de##Rufnummer: 0251 5309 444##(Montag bis Freitag 9 - 18 Uhr, Samstag 9:30 - 18 Uhr)", 90 | "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Wählen Sie aus über einer Million eBooks im Thalia eBook-Shop Ihre persönlichen Highlights.##Lesen Sie mit der Thalia eReading App auch parallel auf dem Tablet oder Smartphone.##Synchronisieren Sie Ihre eBooks sicher, komfortabel und kostenlos über die tolino Cloud auf verschiedenen Geräten.##Nutzen Sie mit Ihrem tolino alle HotSpots der Deutschen Telekom kostenlos." 91 | } 92 | }, 93 | { 94 | "language": "IT", 95 | "languageConfig": { 96 | "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Scegli le tue letture preferite tra oltre un milione di eBook nell'eBook shop Thalia.##Con l'app Thalia eReading, leggi in parallelo anche sul tablet o lo smartphone.##Sincronizza i tuoi eBook in modo sicuro, comodo e gratuito su dispositivi diversi tramite tolino Cloud.##Con il tuo tolino, sfrutta gratis tutti gli hot spot di Deutsche Telekom.", 97 | "STRING_ARRAY_SUPPORT_CONTACT": "E-mail: info@thalia.de##Hot line: +49 (0) 251 530 94 44##(da lunedì a venerdì, dalle ore 9 alle ore 18)" 98 | } 99 | } 100 | ] 101 | } 102 | -------------------------------------------------------------------------------- /api/pageplace.bosh-bosh-rest-recommendation-xyz.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendationResponse": { 3 | "recommendations": [ 4 | { 5 | "publicationId": "DT0400.9783751502405_A40541228", 6 | "description": "Der erste Band der Bridgerton-Serie von Julia Quinn - die Inspiration zur Netflix-Serie! Nichts wünscht die warmherzige Daphne Bridgerton sich mehr, als zu heiraten und Kinder zu bekommen. Dafür schließt sie einen Pakt mit Simon Basset, dem heiratsunwilligen Duke of Hastings: Indem er ihr den Hof macht, erscheint der umschwärmte Aristokrat vergeben. Und Daphne rückt durch das Interesse des Herzogs gesellschaftlich in den Mittelpunkt. Ein prickelndes Spiel, bei dem es nur Sieger zu geben scheint - bis Daphne erkennt, dass nur einem Mann ihr Herz gehört: Simon!", 7 | "title": "Bridgerton - Der Duke und ich", 8 | "author": "Julia Quinn", 9 | "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=149846249&turl=%2Fshop%2Farticle.jsp%3F149846249", 10 | "cover_url": "https://assets.thalia.media/img/artikel/0ce02217be038330f409a07aa79be644e41d9b85-00_BF160-240.jpeg", 11 | "publicationType": null 12 | }, 13 | { 14 | "publicationId": "DT0400.9783641267575_A39529579", 15 | "description": "Zwei Frauen auf der Flucht. Eine Entscheidung, die alles verändert. Und kein Weg zurück. New York, Flughafen JFK: Claire soll nach Puerto Rico reisen, um ihren Mann, einen ehrgeizigen Politiker, beim Wahlkampf zu unterstützen. Doch in Wahrheit will sie nichts als fliehen - vor seinen gewalttätigen Übergriffen und der lückenlosen Kontrolle, die er über sie ausübt. Sie kommt mit Eva ins Gespräch, die bei ihrem schwerkranken Mann Sterbehilfe geleistet hat. Zu Hause in Kalifornien erwartet sie die Polizei. Innerhalb weniger Sekunden beschließen sie, die Bordkarten zu tauschen und sich gegenseitig ein neues Leben zu schenken. Erleichtert landet Claire in Kalifornien. In Evas Haus gibt es allerdings keine Hinweise auf einen Ehemann. Dann erfährt sie, dass das Flugzeug nach Puerto Rico abgestürzt ist. Und kurz darauf entdeckt sie die vermeintlich abgestürzte Eva in einer Fernsehreportage über das Unglück. Lebendig. Hat sie die Flucht in das Leben einer Anderen am Ende doch nur in eine Falle gelockt? ", 16 | "title": "Der Tausch - Zwei Frauen. Zwei Tickets. Und nur ein Ausweg.", 17 | "author": "Julie Clark", 18 | "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=147900787&turl=%2Fshop%2Farticle.jsp%3F147900787", 19 | "cover_url": "https://assets.thalia.media/img/artikel/5113d1ed25c611ab7619b4b9d64f735ab4920c7d-00_BF160-240.jpeg", 20 | "publicationType": null 21 | }, 22 | { 23 | "publicationId": "DT0400.9783426439838_A39547289", 24 | "description": "Wer das Datum seines Todes kennt, hat mit dem Sterben schon begonnen - der neue Bestseller von Sebastian Fitzek! Es ist Samstag, kurz nach 22.00 Uhr. Jules Tannberg sitzt am Begleittelefon. Ein ehrenamtlicher Telefonservice für Frauen, die zu später Stunde auf ihrem Heimweg Angst bekommen und sich einen telefonischen Begleiter wünschen, dessen beruhigende Stimme sie sicher durch die Nacht nach Hause führt - oder im Notfall Hilfe ruft. Noch nie gab es eine wirklich lebensgefährliche Situation. Bis heute, als Jules mit Klara spricht. Die junge Frau hat entsetzliche Angst. Sie glaubt, von einem Mann verfolgt zu werden, der sie schon einmal überfallen hat und der mit Blut ein Datum auf ihre Schlafzimmerwand malte: Klaras Todestag! Und dieser Tag bricht in nicht einmal zwei Stunden an ... Geheimnisvoll, beklemmend, nervenaufreibend. Sebastian Fitzeks bislang unheimlichster Psychothriller.", 25 | "title": "Der Heimweg", 26 | "author": "Sebastian Fitzek", 27 | "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=147930114&turl=%2Fshop%2Farticle.jsp%3F147930114", 28 | "cover_url": "https://assets.thalia.media/img/artikel/165a3878ec433697eb2e7519f4e96b6d29896e54-00_BF160-240.jpeg", 29 | "publicationType": null 30 | }, 31 | { 32 | "publicationId": "DT0400.9783641201968_A40493558", 33 | "description": "Sieben Sterne umfasst das Sternbild der Plejaden, und die Schwestern d'Aplièse tragen ihre Namen. Stets war ihre siebte Schwester aber ein Rätsel für sie, denn Merope ist verschwunden, seit sie denken können. Eines Tages überbringt der Anwalt der Familie die verblüffende Nachricht, dass er eine Spur entdeckt hat: Ein Weingut in Neuseeland und die Zeichnung eines sternförmigen Rings weisen den Weg. Es beginnt eine Jagd quer über den Globus, denn Mary McDougal - die Frau, die als Einzige bestätigen kann, ob ihre Tochter Mary-Kate die verschwundene Schwester ist - befindet sich auf einer Weltreise. Während die Schwestern ihre Suche nach Neuseeland, Kanada, England, Frankreich und Irland führt, schlüpft ihnen Mary immer wieder durch die Finger. Und es scheint, als wolle sie unbedingt verhindern, gefunden werden ... ", 34 | "title": "Die verschwundene Schwester", 35 | "author": "Lucinda Riley", 36 | "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=149697970&turl=%2Fshop%2Farticle.jsp%3F149697970", 37 | "cover_url": "https://assets.thalia.media/img/artikel/d72cbd3faa63e6797600e121206703fdb0674945-00_BF160-240.jpeg", 38 | "publicationType": null 39 | }, 40 | { 41 | "publicationId": "DT0400.9783641263140_A40225527", 42 | "description": "Wenn dich die Angst dein Leben lang verfolgt, weil du zu viel weißt ... Ein wolkenloser Sommertag, die Hitze drückt aufs Land. Im Zug von London nach York zielt ein Fremder mit einer Pistole auf eine Frau. Sie entkommt in letzter Sekunde. Zwei Tage später: Eine junge Frau stürzt mit ihrem Fahrrad, weil jemand einen dünnen Draht über den Weg gespannt hat. Sie ist sofort bewusstlos. Den folgenden Schuss hört sie schon nicht mehr. Die Frauen stehen in keiner Verbindung zueinander, aber die Tatwaffe ist dieselbe. Kate Linville, neu bei der North Yorkshire Police, wird sofort in die Ermittlungen hineingezogen. Sie kommt einem grausamen Geheimnis auf die Spur und gerät selbst in tödliche Gefahr. Denn der Täter, der eine vermeintliche Schuld rächen will, gibt nicht auf ... Weitere Fälle für Kate Linville und Caleb Hale: Die Betrogene Die Suche ", 43 | "title": "Ohne Schuld", 44 | "author": "Charlotte Link", 45 | "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=149148070&turl=%2Fshop%2Farticle.jsp%3F149148070", 46 | "cover_url": "https://assets.thalia.media/img/artikel/abc400a8f5e7c7ef80964cbd2b107db03d338ffb-00_BF160-240.jpeg", 47 | "publicationType": null 48 | }, 49 | { 50 | "publicationId": "DT0400.9783968170367_A39435394", 51 | "description": "Der erste Fall für Profiler und Frauenheld Nick Stein Ein fesselnder Krimi für Fans von Nele Neuhaus Eigentlich wollte Nick Stein, Profiler und bester Mann beim BKA, seine Heimatstadt Mödling so weit wie möglich hinter sich lassen. Doch wegen des Mordes an einer alten Schulkollegin, die er damals verspottete, kehrt er zurück. Genau genommen müsste er den Fall abgeben, denn die Ermittlungen führen mitten hinein in seine alte, feierfreudige Clique, die mittlerweile zur Mödlinger Elite gehört. Aber private Gefühle können einen Nick Stein nicht ablenken, er ist schließlich promovierter Psychologe. Allerdings kann der charismatische Nick den Frauen nach wie vor genauso wenig widerstehen wie sie ihm, selbst wenn ihn eine leise Stimme warnt, dass er den Lebensstil seiner alten Freunde seinerzeit nicht grundlos aufgegeben hat. Als sich auch noch der Bürgermeister einmischt und ein zweiter Mord geschieht, ist es mit der professionellen Distanz endgültig vorbei, denn hinter den bürgerlichen Fassaden lauert das nackte Grauen ... Erste Leserstimmen \"ich war überrascht, welche Wendungen die Geschichte immer wieder nimmt\" \"ein Showdown, wie ihn ein Krimi braucht, spannend bis zum Schluss\" \"der Plot ist gut konstruiert und ein Verwirrspiel der Extraklasse nimmt seinen Lauf\" \"der flüssige Schreibstil des Autors hat mich sehr gut duch die Geschichte geleitet\" \"gelungener Krimi mit viel Ermittlerarbeit, einer Prise Erotik und einem spannenden Plot\" Weitere Titel dieser Reihe Stille Schuld (ISBN: 9783968170404)", 52 | "title": "Narbenfrau", 53 | "author": "Gerlinde Friewald", 54 | "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=147662274&turl=%2Fshop%2Farticle.jsp%3F147662274", 55 | "cover_url": "https://assets.thalia.media/img/artikel/04273d0b2c505f2a895adbf008cfa2bfd17a47aa-00_BF160-240.jpeg", 56 | "publicationType": null 57 | }, 58 | { 59 | "publicationId": "DT0400.9783641117009_A23157788", 60 | "description": "Der erste Roman einer faszinierenden Reihe um die \"Sieben Schwestern\". Maia ist die älteste von sechs Schwestern, die alle von ihrem Vater adoptiert wurden, als sie sehr klein waren. Sie lebt als Einzige noch auf dem herrschaftlichen Anwesen ihres Vaters am Genfer See, denn anders als ihre Schwestern, die es drängte, draußen in der Welt ein ganz neues Leben als Erwachsene zu beginnen, fand die eher schüchterne Maia nicht den Mut, ihre vertraute Umgebung zu verlassen. Doch das ändert sich, als ihr Vater überraschend stirbt und ihr einen Umschlag hinterlässt - und sie plötzlich den Schlüssel zu ihrer bisher unbekannten Vorgeschichte in Händen hält: Sie wurde in Rio de Janeiro in einer alten Villa geboren, deren Adresse noch heute existiert. Maia fasst den Entschluss, nach Rio zu fliegen, und an der Seite von Floriano Quintelas, eines befreundeten Schriftstellers, beginnt sie, das Rätsel ihrer Herkunft zu ergründen. Dabei stößt sie auf eine tragische Liebesgeschichte in der Vergangenheit ihrer Familie, und sie taucht ein in das mondäne Paris der Jahrhundertwende, wo einst eine schöne junge Frau aus Rio einem französischen Bildhauer begegnete. Und erst jetzt fängt Maia an zu begreifen, wer sie wirklich ist und was dies für ihr weiteres Leben bedeutet ... ", 61 | "title": "Die sieben Schwestern Bd.1", 62 | "author": "Lucinda Riley", 63 | "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=41227640&turl=%2Fshop%2Farticle.jsp%3F41227640", 64 | "cover_url": "https://assets.thalia.media/img/artikel/a720d7e96c65406afe20df76d459365e246e7dc7-00_BF160-240.jpeg", 65 | "publicationType": null 66 | }, 67 | { 68 | "publicationId": "DT0400.9783104912998_A39626270", 69 | "description": "Die Platz-1-Bestseller-Serie aus Dänemark »Vor kurzem noch unbekannt, überholt Anne Mette Hancock jetzt Jo Nesbø und Jussi Adler-Olsen auf den Bestsellerlisten.« Berlingske Die Kopenhagener Investigativ-Journalistin Heloise Kaldan steckt in einer heiklen Jobkrise, als sie einen mysteriösen Brief erhält: von einer gesuchten Mörderin. Darin stehen Dinge über Heloise, die eigentlich niemand wissen kann. Beunruhigt beginnt Heloise, auf eigene Faust zu recherchieren. Die Absenderin ist seit einem brutalen Mord vor einigen Jahren spurlos verschwunden. Was will sie nun ausgerechnet von Heloise, und woher hat sie die Informationen über sie? Zur gleichen Zeit erhält auch Kommissar Erik Schäfer einen neuen Hinweis auf die Gesuchte. Alle Spuren scheinen zu Heloise Kaldan zu führen. Ist ihr Leben in Gefahr? Und können der Polizist und die Journalistin einander vertrauen? Der erste Fall der Erfolgs-Reihe um Heloise Kaldan und Erik Schäfer. Ausgezeichnet mit dem dänischen Krimi-Preis. Ein fesselnd persönlicher Thriller über Rache, Gerechtigkeit und Vergebung. »Bezwingendes Crime-Debüt auf höchstem skandinavischen Niveau.« Litteratursiden", 70 | "title": "Leichenblume", 71 | "author": "Anne Mette Hancock", 72 | "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=148123770&turl=%2Fshop%2Farticle.jsp%3F148123770", 73 | "cover_url": "https://assets.thalia.media/img/artikel/96e70f5e92341412d8462adf041226819bbc62bf-00_BF160-240.jpeg", 74 | "publicationType": null 75 | }, 76 | { 77 | "publicationId": "DT0400.9780063045118_A39289545", 78 | "description": "An enchanting collection containing the first three novels in New York Times bestselling author Julia Quinn's beloved Bridgerton series set in Regency England—The Duke and I, The Viscount Who Loved Me, and An Offer from a Gentleman—now a series created by Shonda Rhimes for Netflix. The Duke and I When Daphne Bridgerton and Simon Basset, Duke of Hastings, agree to a fake courtship, they think they've found the perfect solution to their problems. Romantically associated with one of London's most desirable catches, Daphne's prospects among the ton will soar. For avowed bachelor Simon, an attachment to Daphne will deter would-be brides and their ambitious mamas. Their plan works like a charm—at first. But amid the glittering, gossipy, cut-throat world of London's elite, there is only one certainty: love ignores every rule. . . The Viscount Who Loved Me London's most elusive bachelor, Anthony Bridgerton is determined to wed. But one obstacle stands in his way—his intended's older sister, Kate Sheffield, who is driving Anthony mad with her determination to stop the betrothal. Kate is quite sure that reformed rakes do not make the best husbands, and Anthony Bridgerton is the most wicked rogue of them all. She's determined to protect her sister—even as she fears she may not be able to resist the reprehensible and oh so desirable rake herself . . . An Offer from a Gentleman Sophie Beckett never dreamed she'd be able to sneak into Lady Bridgerton's famed masquerade ball—or that she would be spinning in the arms of her \"Prince Charming\"—the debonair and devastatingly handsome Benedict Bridgerton. But when the clock strikes midnight, Sophie's enchanting evening ends. Since that night Benedict has been able to think of nothing but the bewitching young woman, and he's sworn to find and wed his mystery miss. Yet will another unexpectedly steal his heart—and his chance for a fairy tale love? ", 79 | "title": "Bridgerton Collection Volume 1", 80 | "author": "Julia Quinn", 81 | "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=147088413&turl=%2Fshop%2Farticle.jsp%3F147088413", 82 | "cover_url": "https://assets.thalia.media/img/artikel/ba2c5db01eef33c301fdaa951bd98d7a52192152-00_BF160-240.jpeg", 83 | "publicationType": null 84 | }, 85 | { 86 | "publicationId": "DT0400.9783736314221_A39672730", 87 | "description": "Er glaubt nicht mehr an die Liebe. Bis er sie trifft ... Auf dem Weg zu einem Vorstellungsgespräch passiert es: Elodie erwischt mit ihrem alten Jeep den glänzenden Mercedes eines reichen Schnösels. Es ist Abneigung auf den ersten Blick, als ihr der arrogante - wenn auch leider attraktive - Geschäftsmann die alleinige Schuld an dem Unfall gibt. Nach einem hitzigen Wortgefecht muss die temperamentvolle New Yorkerin sich sputen, um noch pünktlich zu ihrem Termin zu erscheinen - und staunt nicht schlecht, als sich ihr Unfallgegner als ihr zukünftiger Chef entpuppt ... \"Welch. Ein. Spaß!!! Ich habe dieses Buch von Anfang bis Ende einfach nur geliebt!\" Maryse's Book Blog Der neue Bestseller des Erfolgsduos Vi Keeland und Penelope Ward", 88 | "title": "Park Avenue Player", 89 | "author": "Vi Keeland,Penelope Ward", 90 | "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=148210090&turl=%2Fshop%2Farticle.jsp%3F148210090", 91 | "cover_url": "https://assets.thalia.media/img/artikel/3a198b0f827f682a2f5d971528944a8aa5502aed-00_BF160-240.jpeg", 92 | "publicationType": null 93 | }, 94 | { 95 | "publicationId": "DT0400.9783751505147_A40777800", 96 | "description": "Auftakt der bezaubernden Smythe-Smith-Serie von Julia Quinn! \"Wie, bitteschön, soll ich heiraten, wenn kein Gentleman um mich anhält?\" Tatendurstig beschließt Honoria Smythe-Smith, dem Eheglück etwas nachzuhelfen. Doch in die Falle, die sie stellt, tappt ausgerechnet Marcus Holroyd, Earl of Chatteris. Dass ihr Freund aus Kindertagen mehr als einen verstauchten Knöchel davonträgt, erweist sich als schicksalhaft. Denn Honoria muss Marcus pflegen - und liegt plötzlich in seinen Armen. Ist er derjenige, mit dem sie lachen, den sie heiraten und aufrichtig lieben kann? Zu spät erfährt Honoria, was Marcus einst ihrem Bruder geschworen hat ...", 97 | "title": "Mit List und Küssen", 98 | "author": "Julia Quinn", 99 | "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=150416693&turl=%2Fshop%2Farticle.jsp%3F150416693", 100 | "cover_url": "https://assets.thalia.media/img/artikel/605e9f44edac70fb867944e9320b3d7c94acbd18-00_BF160-240.jpeg", 101 | "publicationType": null 102 | }, 103 | { 104 | "publicationId": "DT0400.9783968172187_A40776890", 105 | "description": "Ein brutaler Mord und ein Opfer mit vielen Feinden - Nick Stein ermittelt Der spannende Krimi für Fans von Andreas Gruber Nach seinem letzten Fall hat sich Nick Stein auf unbestimmte Zeit vom BKA beurlauben lassen und hält Vorträge an diversen Universitäten. Doch die Ruhe währt nicht lange. Während seines Vortrags an der psychologischen Fakultät der LMU bittet ihn der Münchner Kriminalbeamte Axel Mayr um Hilfe bei einem Mordfall. Sofort ist Nicks Neugier geweckt, denn der Fall hat es in sich. Mit Unterstützung so mancher alter Weggefährten stürzt sich Nick in die Ermittlungen und wird immer weiter in den komplexen Fall um Geldwäsche, Prostitution und Vergewaltigung hineingezogen. Schließlich ist er dem Täter dicht auf den Fersen - doch sein Bauchgefühl sagt ihm, dass irgendetwas nicht stimmt … Weitere Titel dieser Reihe Narbenfrau (ISBN: 9783968170367) Stille Schuld (ISBN: 9783968170404) Erste Leserstimmen „Ein sorgsam konstruierter Krimi, der nie an Spannung verliert.\" „Zum Glück ist Nick Stein kein Typ für den Ruhestand. Auch sein dritter Fall ist wieder rätselhaft, komplex und unglaublich fesselnd.\" „Als Krimi-Fan war ich begeistert und habe zu jedem Zeitpunkt mit dem Ermittlerteam mitgefiebert.\" „Ein mitreißender Kriminalfall voller interessanter Wendungen.\"", 106 | "title": "Totenstein (nur bei Thalia!)", 107 | "author": "Gerlinde Friewald", 108 | "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=150412963&turl=%2Fshop%2Farticle.jsp%3F150412963", 109 | "cover_url": "https://assets.thalia.media/img/artikel/aa36dbdd3dab5a9f1f8aea75119c429f0315b9c6-00_BF160-240.jpeg", 110 | "publicationType": null 111 | } 112 | ] 113 | } 114 | } 115 | --------------------------------------------------------------------------------