Giter Club home page Giter Club logo

ebook-reader's Introduction

logo

ッツ Ebook Reader

An online e-book reader that supports dictionary extensions like Yomitan, which is hosted on https://reader.ttsu.app

Note: The reader was created for japanese (language learners) - while books in other languages may work to a specific degree other functionalites (e. g. character counter etc.) may have unsupported / unexpected results

Features

  • Supports HTMLZ, Plain Text and EPUB files
  • Customizable environment (e. g. themes, font size, image blur, furigana settings etc.)
  • Continuous / Pagination reader mode
  • Vertical / Horizontal reading mode
  • Basic Time/Character and Reading Goals Tracker
  • Reading Data Statistics
  • Character count and progress display
  • Table of content support for EPUB files
  • (Auto) bookmark functionality
  • Auto scroll (continuous mode)
  • Book manager
  • Data import/export via local and external sources
  • Installation and offline capabilities

Usage

The first time you enter the page (or have no files loaded yet) you will need to select the books you want to read from your device. You can load files by clicking/tapping on the dropzone or respective Icons. Alternatively, you can also drag & drop files or folders on the manager if your device supports it.

Note for Text Files: The book title (which is also used to check for duplicates) will be the name of the file. The text will be splitted into paragraphs by punctuation (。?!) and closing brackets/parenthesis (」)). Sections will be splitted around 10000 characters each. The file content will be parsed as plain text - any html tags (e. g. links) will therefore be printed out as text and not elements.

Note: The character count is mainly based on paragraph nodes in the book. Configuring e. g. a very high line height or similar may update the counter more slowly

You can find most of the reader controls in the reader header which you can open by clicking/tapping in the upper area of the page:

Control Description
Icon Opens the table of content if available
Icon Allows you to create a bookmark at your current location (keybind b)
Icon Returns to bookmark location (keybind r)
Image Displays current auto scroll speed (keybind a/d)
Icon Allows you to complete the current book
Icon Allows you to execute a custom reader point action
Icon Allows you to enter fullscreen mode (keybind F11)
Icon Navigates you to the statistics with the current Book as Filter
Icon Opens the Book Image Gallery
Icon Navigates you to the settings
Icon Navigates you to the book manager or opens the action menu
Icon Displayed at the current bookmark location

Book Image Gallery Note: Using the "Blur Images" setting will be applied unidirectional to the gallery meaning showing an image in the reader will also remove the spoilter tag in the gallery (but not vice versa)

You may find the following controls in the reader footer:

Control Description
Icon Indicates that the Reading Tracker is paused. Double Click/Tap to start tracking or single Click/Tap to show the Tracker menu
Icon Indicates that the Reading Tracker is running. Double Click/Tap to stop tracking or single Click/Tap to show the Tracker menu.
Pulses in case you have an active Freeze Position
Icon Indicates that there is data which will be exported if a sync target and auto export is configured. Click/Tap to execute a manual export
Icon Indicates that multiple auto export attempts failed. Click/Tap to execute a manual export
Image Displays your reading progress. Click/Tap on it to copy the current progress to the clipboard.
The book progress is calculated by dividing the current character location by total book characters. Characters counted are Japanese Glyphs without latin letters, punctuation or similar

Click/Tap on some free space in the footer to hide the reading progress.

Note: The setting "Close Confirmation" will handle reloading and closing tabs but not other ways of navigation like e. g. clicking/tapping the back button / closing pages via mobile browser menu etc. There are known limitations on mobile iOS and therefore this functionality may not work as expected on this platform

Custom reading points and the respective change in the character count in pagination mode are temporary - changing the current page or resizing the reader window will reset them. When having "Selection to Bookmark" enabled and using a custom reading point at the same time, selected text will be prioritized over a custom reading point for positioning bookmarks etc.

Note: Overlapping elements or controls coming from e. g. browser extensions or app wrappers may impact what node will be selected for a custom reading point. Move them out of the reader area or disable them in case of issues. In case the selected node breaks across multiple columns or pages the bookmark may be placed on previous elements instead. You can experiment with the "Avoid Page Break" option, simply fallback to the default bookmark by clearing your selection/custom reading point or selecting a different node.

Note for custom user fonts: After storing/using a custom font the first time or on hard refreshing the reader tab you may encounter longer load times / not loading font. A normal tab refresh should solve this in order to make the service worker serving the respective file

Note for "Disabled Wheel Navigation": If enabled mouse wheel clicks are intercepted and may not work as expected. E. g. for Yomitan you need to keep the wheel pressed while moving the cursor to trigger a popup etc.

Note for "New Only" Import/Export Behavior:: The time used for comparison is based on the device time setting. In case you have different settings across used devices you may encounter unexpected results for sync (e. g. data not uploaded, data not downloaded etc.)

Desktop Keybinds

Note: The keys are currently bound to their physical location.

Explanation from MDN:

For example, the code returned is "KeyQ" for the Q key on a QWERTY layout keyboard, but the same code value also represents the ' key on Dvorak keyboards and the A key on AZERTY keyboards.

Key Code Description
Space Toggle auto-scroll (continuous mode)
a Increase auto-scroll speed
d Decrease auto-scroll speed
b Create bookmark at your current location
r Return to bookmark location
t Select a new custom reading point
p Toggles Reading Tracker
f Toggles a Reading Tracker Freeze Position
PageDown Move to next page
PageUp Move to previous page
n Move to next/previous chapter
m Move to next/previous chapter

Book Manager

You can open the book manager by clicking/tapping on the respective icon in the reader. You will be presented with a list of covers for all the imported books with their respective titles and progress (determined by bookmark location). Book placeholder created by loading data from external sources are visible in the browser db manager if configured and displayed as slighty grayed out covers.

Books are sorted based on your selected sort option with ascending title sort for items with equal values

You may:

  • Switch the current manager source between browser db, filesystem or an external hoster
  • Switch books by clicking/tapping on the book covers
  • Delete books by clicking/tapping on the delete icon (Warning: Bookmark progress will also get removed along with the book)
  • View available detail data by clicking/tapping on the info icon of a selected book
  • Click/tap on the centered list icon to select all books
  • Click/tap on the X icon to deselect all books

You may find the following controls in the manager:

Control Description
Icon Toggles book selection
Icon Selects all books
Icon Allows you to import new books to the library
Icon Allows you to import new books from a folder to the library (desktop only)
Icon Allows you to import a previous exported zip file
Icon Indicates that data from the browser db is displayed
Icon Indicates that data from the configured default GDrive source is displayed
Icon Indicates that data from the configured default OneDrive source is displayed
Icon Indicates that data from the configured default filesystem source is displayed
Icon Allows you to download data for a bug report
Icon Navigates you to the settings
Icon Opens the action menu
Icon Opens the export menu for the selected books
Icon Opens the statistics tab (filtered by selected books if any)
Icon Deletes statistics of selected books
Icon Cancels the current book operation

Reading Tracker

ッツ Ebook Reader provides a basic time/character and reading goal tracker. You can open your data while reading a book and single click/tap on the tracker icon in the left bottom page corner. It gives an Overview about occured update errors, your reading goal progress, some timer controls and respective Data for your current Reading Session (across days), data of the current Day (across Sessions) and all Time (across sessions and days). If you are using the Continuous Mode with Autoscroll you will find an additional Autoscroller Section with a separate Set of Reading Data which is not persisted and reset between Autoscroll Pauses. Tracking Data will be persisted around every 10 seconds or when tracking gets paused.

Clicking on a tracker item label will toggle a blur effect in case you don't want to see the respective value.

Note: The Tracker is paused by default when opening a Book, giving you the ability to relocate your current position,enter fullscreen etc. before starting to track your session.

You may find following Controls in the Current Session Section:

Control Description
Icon Restarts the Reading Tracker when closing the Menu
Icon Stops the Reading Tracker when closing the Menu
Icon Updates the Tracker Character Position to the current Book Location
Icon Toggles a Reading Tracker Freeze Position
Icon Saves tracking Data manually to the Database

Freeze Position Note: A Freezing Position lets you remember the current Location and ignoring any time and character change until you hit the same (or any later) character position again while keeping the tracker on. This allows you to go back to previous pages without impacting your current session data. After reaching the same Location again or toggling the position off the tracker will start to capture time and characters again. Note: If you pause the tracker manually or it gets autopaused (e.g. by idleing) the tracker will not automatically restart on its own when reaching the previous Location - you still need to unpause it yourself in oder to start tracking again.

You will also find a Recent History List in the Current Session Section which gives you an Overview about the last captured tracking Data. It will display time of tracking, amount of passed seconds and amount of characters read. Data will be displayed in green if the data was added and red if it was subtracted from your statistics. You can navigate between pages by clicking on respective Arrow Icons.

You may find following Controls in the Recent History :

Control Description
Icon Reverts the item. Positive (green) Data will be subtracted, negative (red) Data added
Icon Indicates an Item which was not yet stored in the database
Icon Indicates an Item which was already stored in the database

The Data will be tracked based on the Time of your Device and configured Starting Hours. Crossing a Day is accordingly be reflected in the respective "Today" Tracking Section and on idle rollbacks while the current Session will show all Data since you have opened the current Book without leaving or reloading the reader page.

The Tracker is currently capturing (but not necessarily displaying) following Data (per Book and Day):

  • Reading Time
  • Characters Read (based on the character counter in the bottom right corner)
  • Minimum Reading Speed per Hour (lowest Value seen across all Time, including ticks without any character read changes)
  • Alt. Minimum Reading Speed per Hour (lowest Value seen across all Times, including only ticks with character read changes)
  • Maximum Reading Speed per Hour (highest Value seen across all Time)
  • Book Start Date (first day of opening)
  • Book Completion Date (and previous mentioned data as per time of completion)

The Tracker will auto pause and unpause on certain Reader Events like:

  • Opening the Table Of Contents Menu
  • Opening the Tracker Menu
  • Changing the current Chapter
  • Setting a Custom Reading Point (if respective option is disabled)
  • Return to Bookmark
  • Entering/Leaving Fullscreen
  • Resizing the Browser Window

The Idle Time is resetted by:

  • Changes to the current Book Location (current character count)
  • Moving your Mouse Cursor on the Page
  • Selecting/Highlighting Text on the Page

Note: It is recommended to either keep the Auto Pause Option to "Moderate" or higher or to manually pause the timer when putting the Tab into Background for longer durations. Otherwise you may run into the risk of Timer Drifting as Browser will throttle Timers of Tabs not being in the foreground after a short Time. Some Browser may also have memory optimization functionality which -if not disabled- may unload a Page completely when unused. Therefore you may want to pause the timer when planning to go idling for a longer time period

Idle Rollback / Revert Note: The Tracker does not capture Data on a level to properly rollback values for Min/Max values like "Min Reading Speed". Keep in mind that those values represent all time and are not changed/adjusted by rollbacks of idle times or reverts from the recent history

Deletion Note: Deleting books from your local Browser Storage will not delete related statistics except you disabled respective Option. This is only applicable for local Data - Data on external Storage Sources like GDrive will always be deleted if you remove the respective Book etc. Deleting Statistics of a Book will also lead to a loss of Book Start / Completion Data

Clear Zombie Statistics: If you run this operation all local entries of statistics for which currently no local book copy exists in your browser will be deleted

Statistics Merge Mode

Import/Export Behavior + Merge Merge Description
New Only + Merge Will attempt a merge in case the last modified Statistic on the target is older than the source or data is not existing
A Statistic will be added to the final Result in Case no other Data for this day exists or it has a newer last Modified Date
Deleted data on one side may be readded back again on the other
New Only + Replace Will overwrite all Data on the target in case the last modified Statistic on it is older than the source or data is not existing
Can be used to propagate deleted Data from one side to the other
Overwrite + Merge Will always attempt a merge between source and target
A Statistic will be added to the final Result in Case no other Data for this day exists or in case it comes from the source
Deleted data on one side may be readded back again on the other
Overwrite + Replace Will always replace all Data on target from source
Can be used to propagate deleted Data from one side to the other

Reading Goals

You are able to configure a Time or Character Goal and Frequency in the "Statistics" Tab of the Settings. Entering 0 as Goal Value will effectively disable this type while you are still able to give a tracking value to the other Goal Type. Saving 0 as Value for Time and Character on an existing reading goal will delete it.

Note: After setting a Goal it will automatically be tracked based on the given Start Date and choosen Frequency Interval until you stop it. You are free to delete, modify or reschedule the Goal as you prefer and archive the Time Window. Should the Date be in the Future and no further Data exists afterwards you can simply save the change. In Case you are trying to modify an ongoing goal or in case there is conflicting data after respective start data you need to first decide about if you want to archive the current Goal and start a new one afterwards or if you want to replace existing Data. You will also see what data would be replaced in case you continue.

The configured Start / End Dates for a Reading Goal are inclusive. Example: A Reading Goal from 01.01.2024 - 07.01.2024 with starting Hours 0 will count Data seen from 01.01.2024 00:00:00 until 07.01.2024 23:59:59 while a Reading Goal from 10.02.2024 - 10.02.20024 with starting Hours 6 will count Data seen from 10.02.2024 06:00:00 - 11.02.2024 05:59:59.

Reading Goals Merge Mode

Import/Export Behavior + Merge Mede Description
New Only + Merge Will attempt a merge in case the last modified Reading Goal on the target is older than the source or data is not existing
A Reading Goal will be added to the final Result in Case no overlapping Time Window exists or it is the last modified Goal for this window
Deleted data on one side may be readded back again on the other
New Only + Replace Will overwrite all Data on the target in case the last modified Reading Goal on it is older than the source or data is not existing
Can be used to propagate deleted Data from one side to the other
Overwrite + Merge Will always attempt a merge between source and target
A Reading Goal will be added to the Result in Case no overlapping Time Window exists or in case it comes from the source
Deleted data on one side may be readded back again on the other
Overwrite + Replace Will always replace all Data on target from source
Can be used to propagate deleted Data from one side to the other

Statistics

In the Statistics Tab of ッツ Ebook Reader you can find various visualizations of your tracked Reading Data. You can reach it via the Book Reader (prefilters Data to the current opened Book), Book Manager (displays all Reading Data) and Book Manager Card Selection (prefilters Data to the selected Books).

You may find the following controls in the statistics page header:

Control Description
Icon Opens Book Manager or Action Menu on Mobile
Icon Opens Book Reader Settings
Icon Opens Statistics Settings
Icon Opens the Title Filter Menu
Icon Opens the Heatmap Overview Tab
Icon Opens the Summary Tab
Icon Opens the Copy Action Menu

Desktop Keybinds

See also the Note for the general Desktop Keybinds

Key Code Description
t Toggles through the Time Templates
a Toggles through the Primary Aggregation Options

Title Filter

The Title Filter Menu lets you filter part of the Data based on the book title.

You may find the following controls in the filter menu:

Control Description
Icon Apply selected Title Filters
Icon Selects all Titles
Icon Deselects all Titles
Icon Displays Titles across all Time
Icon Displays only Titles in current Date Selection
Icon Displays all Titles (selected and unselected)
Icon Displays only selected Titles
Icon Removes any prefilters and shows the all title filters

Heatmap / Overview

The Overview Tab features two Heatmaps. The Reading Data Heatmap is colorized based on the amount of Reading Time on the day and displays the amount/percentage of days read. The Reading Goal Data Heatmap is colorized based on the completion of the respective current Reading Goal and displays the amount/percentage of completed (100%) Reading Goals. Both Heatmaps shows in addition the respective longest and current Streaks. Clicking/Tapping on a Day will open a popover with Detail Data. Clicking/Tapping on a Streak will toggle the scroll and highlighting of all days belonging to the respective Streak.

You may find the following controls in the heatmap:

Control Description
Icon Returns the heatmap to the current Year
Icon Switches between All Time / Current Year Data

Statistics Summary

The Statistics Summary Tab displays detail Deta for the configured Date Range and Aggregration/Data Sources. Clicking on the attribute name lets you quick switch between them, clicking on the Sort Icon will toggle the Direction. The sort Icon will be grayed out in case the column isn't the active sorting attribute.

You may find the following controls in the summary section:

Control Description
Icon Deletes the selected row from the database
Icon Allows you to edit a row in "None" primary aggregation mode
Icon Cancels the row editing mode
Icon Saves the edited row back to the database

Data Import/Export

You can transfer books and their related data between devices/browsers by importing and exporting data via different storage sources

Note: Imports/Exports are intended to move small volumes of data and not as frequent backup of the whole library or similar

Following export targets are available:

Source Description
Zip File Creates an offline archive of the selected data
GDrive Allows you to upload and download data to your GDrive account.
Requires a google login - the default session is valid for 50 minutes and requires a manual reauthentication/export afterwards if no custom credentials with a client secret are used.
You can revoke the app permissions any time in your google security settings
OneDrive Allows you to upload and download data to your OneDrive account.
Requires a microsoft login - the default session is valid for 50 minutes and requires a manual reauthentication/export afterwards if no custom credentials with a client secret are used.
You can revoke the app permissions any time in your microsoft account privacy settings
Filesystem Allows you to store and read data from a configured folder on your hard drive.
You have to grant permissions once per new opened tab.
Only available on desktop chromium browsers - some browser like Brave may need additional flags in the browser settings enabled in order to see/use this option

To export data select books in the manager and click/tap on the respective icon in the header. Besides the export target you can also choose what kind of data you want to export:

Option Content
Book Data Book data like text content, images, chapters etc.
Bookmark Progress data like scroll position, percentage etc.
Statistics Tracked Time and Characters for a day etc.

Note: Imports/Exports are additive and will only store/overwrite data but never delete it by default - exceptions are types configured with a merge mode of "overwrite" like statistics or reading goals. Data like bookmarks for items in the browser db will only be written in case a local book copy exists while external sources allow to store them without the need of exporting the book before.

After confirmation the export will start and the progress with average remaining time will be displayed. During this time you will not be able to excute other operations like opening,deleting or importing books. To reimport an exported zip file click on the import icon when no books are selected. Both - export and import - can be canceled by clicking/tapping on the respective button besides the progress bar. Already processed data will stay as is.

You can read books from external sources without having a local book copy (this will redownload the data every time). This may create empty placeholder data in case there is no local copy present in your browser. Placeholder data is filtered out by default from the browser db manager but can be enabled via settings in case you want to delete it.

Note: When opening a book from an external source it will override your configured sync target temporarily. The import/export of data itself will still follow your configured auto import/export setting.

Other Data which can be imported/exported include:

Data Location
Reading Goals Sync Button in "Statistics" Tab / Reading Goals Section
Statistics Regular Book Data Export or Export Buttons in "Statistics" Tab Settings

Storage Sources

ッツ Ebook Reader provides default storage sources for data import/export via GDrive or OneDrive which requires a reauthentication every 50 minutes in order to be functional. Storage Sources under Settings => Data let you add additional custom sources for the filesystem target and/or a custom set of credentials for an external hoster which may can create persistent sessions and therefore asks for reauthentication less often in case you add a client secret.

Note: The timeout for login is currently 45 seconds after which the login popup will close with an error

To create such custom credentials follow these steps for the hoster you want to add.

GDrive
  1. Register a google account if required
  2. Go to the project page and click on "Create Project"
  3. Choose a name and click on "Create"
  4. Open the side menu by clicking on the navigation menu item in the upper left corner
  5. Navigate to "APIs & Services" > "Enabled APIs & services"
  6. Click on "+ ENABLE APIS AND SERVICES"
  7. Search for "Google Drive" and click on the result item
  8. Click on the "ENABLE" button to add it
  9. Navigate to "OAuth consent screen"
  10. Choose "External" and click on "CREATE"
  11. Choose a name, enter your google mail in all email fields, leave logo empty and click on "SAVE AND CONTINUE"
  12. Click on "ADD OR REMOVE SCOPES", check the ".../auth/drive.file" Scope and click on "UPDATE"
  13. The selected scope should be visible under "Your non-sensitive scopes" - click on "SAVE AND CONTINUE"
  14. You can add your google mail as test user if you want to restrict it to your user only - otherwise leave all empty
  15. Click on "SAVE AND CONTINUE"
  16. Click on "BACK TO DASHBOARD"
  17. If you don't want to restrict the credentials to your user click on "PUBLISH APP" and "CONFIRM"
  18. Navigate to "Credentials" and click on "CREATE CREDENTIALS" - select "OAuth client ID"
  19. Select "Web Application" as "Application type" and choose a name
  20. Click on "ADD URI" under "Authorized JavaScript origins" and add "https://reader.ttsu.app"
  21. Repeat Step 20 for "https://ttu-ebook.web.app"
  22. If you develop locally or self host the reader repeat step 20 for "http://localhost:5173" + "http://127.0.0.1:5173" and/or adjust ports etc. depending on your needs
  23. Click on "ADD URI" under "Authorized redirect URIs" and add "https://reader.ttsu.app/auth"
  24. Repeat Step 23 for "https://ttu-ebook.web.app/auth"
  25. If you develop locally or self host the reader repeat step 23 for "http://localhost:5173/auth" + "http://127.0.0.1:5173/auth" and/or adjust ports etc. depending on your needs
  26. Click on "CREATE" and copy Client Id and Client Secret values for the next step
  27. Create a new GDrive source on ッツ Ebook Reader with the client id and/or client secret you just have created

OneDrive
  1. Register an account for microsoft azure if required
  2. Go to the project page and register a new application
  3. Choose a name, select "Personal Microsoft accounts only" as type and click on "Register"
  4. Navigate to the menu item "Authentication"
  5. Click on "Add a Platform" in the "Platform configurations" section
  6. Choose "Single-page application"
  7. Enter "https://reader.ttsu.app/auth" or "https://ttu-ebook.web.app/auth" as value for "Redirect URIs" (depending on which site you use)
  8. Check "Access tokens (used for implicit flows)" and click on "Configure"
  9. If you develop locally or self host the reader click on "Add URI" inside the "Single-page Application" box and add "http://localhost:5173/auth" and/or adjust ports etc. depending on your needs
  10. Navigate to the menu item "Overview"
  11. Copy the "Application (client) ID" for later
  12. Navigate to the menu item "Certificates & secrets"
  13. Click on "New client secret"
  14. Fill out available options as you wish
  15. Click on "Add"
  16. Copy the value for later
  17. Create a new OneDrive source on ッツ Ebook Reader with the client id and/or client secret you just have created

You may find following additional controls for storage source settings:

Control Description
Icon Toggles the storage source as sync target for the auto import/export option
You can only configure one sync target across all storage sources
Grayed out if the storage source is not the current sync target
Can be temporarily overwritten when opening a book from an external source
Icon Toggles the storage source as default source for this type and allows to display data on the manager page from it
You can only enable one default source per storage type at the same time
Grayed out if the storage source is not the current data source default for this type

If you develop locally or self host the reader you need to provide credentials for the the default connections by adding an .env.local in the apps\web folder. Following environment variables can be used:

Environment Variables
  • VITE_STORAGE_ROOT_NAME - Name of the folder in which data will be stored (default: ttu-reader-data)
  • VITE_GDRIVE_AUTH_ENDPOINT - Google endpoint to which the user is redirected for the oauth authentication
  • VITE_GDRIVE_TOKEN_ENDPOINT - Google endpoint to which the token for the oauth code flow is send
  • VITE_GDRIVE_REFRESH_ENDPOINT - Google endpoint to get a new refresh token
  • VITE_GDRIVE_REVOKE_ENDPOINT - Google endpoint to revoke a refresh token
  • VITE_GDRIVE_SCOPE - Scope to request for the google source
  • VITE_GDRIVE_CLIENT_ID - Client id for the google source
  • VITE_GDRIVE_CLIENT_SECRET - Client secret for the google source
  • VITE_ONEDRIVE_AUTH_ENDPOINT - OneDrive endpoint to which the user is redirected for the oauth authentication
  • VITE_ONEDRIVE_TOKEN_ENDPOINT - OneDrive endpoint to which the token for the oauth code flow is send
  • VITE_ONEDRIVE_DISCOVERY - OneDrive discovery endpoint (currently not used)
  • VITE_ONEDRIVE_SCOPE - Scope to request for the OneDrive source
  • VITE_ONEDRIVE_CLIENT_ID - Client id for the OneDrive source
  • VITE_ONEDRIVE_CLIENT_SECRET - Client secret for the OneDrive source

Example
VITE_STORAGE_ROOT_NAME="ttu-reader-data"
VITE_GDRIVE_AUTH_ENDPOINT="https://accounts.google.com/o/oauth2/v2/auth"
VITE_GDRIVE_TOKEN_ENDPOINT="https://oauth2.googleapis.com/token"
VITE_GDRIVE_REFRESH_ENDPOINT="https://oauth2.googleapis.com/token"
VITE_GDRIVE_REVOKE_ENDPOINT="https://oauth2.googleapis.com/revoke"
VITE_GDRIVE_SCOPE="https://www.googleapis.com/auth/drive.file"
VITE_GDRIVE_CLIENT_ID="1234567890"
VITE_GDRIVE_CLIENT_SECRET="0987654321"
VITE_ONEDRIVE_AUTH_ENDPOINT="https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize"
VITE_ONEDRIVE_TOKEN_ENDPOINT="https://login.microsoftonline.com/consumers/oauth2/v2.0/token"
VITE_ONEDRIVE_DISCOVERY="https://login.microsoftonline.com/consumers/v2.0/.well-known/openid-configuration"
VITE_ONEDRIVE_SCOPE="files.readwrite"
VITE_ONEDRIVE_CLIENT_ID="abcdefg"
VITE_ONEDRIVE_CLIENT_SECRET1="gfedcba"

General Note: Depending on your settings data from storage sources can be cached locally. In case you read and/or modifiy your library on a different device/tab it is recommended to refresh ッツ Ebook Reader tabs or start a new one after you have switched devices/tabs to ensure having all the latest data. The related "Cache Storage Data" option under settings only covers the list of files - in case you delete and readd files on a different device/ tab you should always refresh the tab in order to prevent issues

Cover Note: When caching for storage data is enabled and/or you are using an external storage source links for book cover may expire. If you notice issues with loading covers refresh the current tab to renew them

GDrive Note: Permissions are scoped to the client id and client secret which means different GDrive storage sources can only see their own data and will create their own "ttu-reader-data" folder. Also data added by you manually on the google website will not be displayed - you should use the functionality provided by ッツ Ebook Reader in order to add/delete books etc.

OneDrive Note: OneDrive only allows to add localhost addresses - in case you host or develop on 127.0.0.1 you should either switch to localhost or need to manually type in the localhost address in the address bar in order to use OneDrive. The maximum file size of a book for this storage source is currently 60 MB. In case you encounter an ETag Error simply retry your export attempt - typically it should work the 2nd time

Security Considerations

ッツ Ebook Reader has no backend component to store/retrieve your storage source data like refresh tokens in a secure way at runtime. Access to data like the refresh tokens allows to access external hosted Data on your behalf without you potentially even noticing it. You are therefore asked to provide a password for storage sources of external hoster which is used to secure and encrypt the data locally. As this password is only known to you and will not be stored you will have to (re)enter it whenever you want to delete/edit the storage source or ッツ Ebook Reader needs to access data from the storage source. For the same reason the password can't be restored - if you forget it you will not be able to interact with this storage source anymore. The password should follow common best practices in terms of complexity and length though there are currently no rules enforced on the site for it.

Password Manager

Available if your browser supports the PasswordCredentials Api (or by using it manually). In order to use the "Store in Manager" setting you need to have password save settings in your browser enabled (at the time of creation/update of a storage source - it can be disabled afterwards). New passwords will trigger a native save dialog, in case there is already a password under the same name stored it will be updated automatically. Depending on your "Autofill" browser settings you will be presented with a browser dialog to select a pair of credentials or a notification about the usage of credentials is displayed whenever ッツ Ebook Reader needs to access the storage source data. You can always check the stored passwords in the browser password manager site.

Note: The API does not expose methods to delete credentials. In case you update the name of a storage source or delete it you need to manually remove the stored credentials in your password manager.

Using the "Store in Manager" setting may lead to following risks:

  • Password Storage is only as safe as the browser implementation
  • Third Party Code / Applications may trigger a password request at any time and can get access to the password in order to decrypt the storage source data if you confirm it

Disable Password/Encryption

Enabling this option will store the storage source data in plain text to the local browser database. This may lead to following risks:

  • Data can be simply read and copied via browser console
  • Data is extractable by Third Party Code / Application without you noticing

Recommendations

The most secure configuration is to not use the password manager and to keep the data encryption enabled. In case you use one of the mentioned settings you may want to consider following options to increase the level of security of your data:

  • Do not use "Autofill" in combination with a password manager
  • Only allow access to the password vault when doing storage related actions (export,import etc.) and/or when the indicator for data sync is shown. Unexpected requests should be canceled
  • Keep external applications in testing and don't put them public/in production
  • Restrict the group of users allowed to use the application to you and trusted persons via respective application settings
  • Consider a separate Account which has not stored any private Data

Storage Limits

Data like books or bookmarks will be (depending on the storage source and data type) stored locally in your browser storage. Browsers typically apply certain limits on how much a website can store on your computer. Those limits are different across different browsers and options you may have enabled.

When the available disk space is filled up, the quota manager will start clearing out data based on an LRU policy — the least recently used origin will be deleted first, then the next one, until the browser is no longer over the limit.

Therefore your data can be lost based on the amount you stored and how much storage is available. In order to overcome this limitation ッツ Ebook Reader will try to request for persistant storage during data insertion to the browser db. Based on your browser you will see different behavior. E. g. firefox will ask you for your confirmation while chrome will not display any dialog but automatically grant the permissions if you frequently interacted with / bookmarked the page and / or have granted notification permissions to the site. You can see the current status of persistant storage in the reader data settings.

Note: Other browsers may have additional criteria for data eviction which are not affected by this setting. E. g. iOS > 13.3 may delete all your page data if you haven't interacted with the reader for 7 days etc.

Data stored on other storage sources than the browser db are not impacted by those limits but need to be kept up to date by exports. Exceptions are the configurations of storage sources which may need to be added back in case your storage got cleared.

For more Information and Details check out this Documentation

Self Host

If for some reason you want to host the reader by yourself, you can use the following approach.

Using Docker

  1. Install and launch Docker
  2. Run the commands below
docker build -t ebook-reader -f apps/web/Dockerfile .
docker run --name ebook-reader -d -p 8080:80 ebook-reader
  1. Visit http://localhost:8080 to use the app

Using Docker Compose

  1. Install and launch Docker Compose
  2. Run the command below
docker-compose up
  1. Visit http://localhost:9010 to use the app

Using HTTP Hosting App

  1. Have Node.js and pnpm installed
  2. Run the commands below
cd apps/web
pnpm install --frozen-lockfile
pnpm svelte-kit sync
pnpm build
  1. Have your server (such as http-server) point towards apps/web/build

External Hoster

In case you want to use external hoster like GDrive for data import/export follow the steps described in Storage Sources

ebook-reader's People

Contributors

ale-meacci avatar arianneorpilla avatar chaseoxide avatar kojocrash avatar kojozero avatar marvnc avatar renji-xd avatar renovate-bot avatar renovate[bot] avatar ttu-ttu avatar victormatheusek avatar wizo06 avatar yellowjello avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

ebook-reader's Issues

Books skip to the end often

Using this on iPad and on the safari browser. Works well for the most part, but often skips to the end of the book. If I have the tab open, and quickly switch to another app, then return, it often reloads the book and takes me back to the start as well.

Let me know if you need more info, thanks all.

compatibility issue with chrome highlight extension

I'm currently developing a chrome extension, which highlights some English words in the text, there is a compatibility issue.

the highlight function replaces the word with an HTML tag, for example, a sentence like:

<p>Imgbot is a friendly robot that optimizes your images and saves you time.</p>

may be replaced by

<p>Imgbot is a friendly robot that <mark>optimizes</mark> your images and saves you time.</p>

The problem is that the ebook-reader's code keeps the text nodes reference in the js memory:

and use the references later:

but after the extension replaced the text, the paragraph text node does not exist anymore, so when it runs into range.selectNode(node); will throw out an error, and the page renders nothing.

I think we can make some changes here to avoid such compatibility issues with extension.

  • do not keep the references, and query the paragraphs every time.
  • use the parent P tag instead of using the text node inside.

what do you think?

Stylus not working with the reader anymore?

Been using stylus to change font and background colors apart from those available by default, it did work before the new update.

Was trying to do something like

:root {
	--background-color: rgb(180, 180, 180);
}

body {
    background-color: var(--background-color);
}

Lost Book Manager and bookmarks

Hello,
I'm using https://ttu-ebook.web.app on Brave browser and I was all happy and set up with my library when suddenly I notice today that it's empty. It prompts me to open an epub and of course the bookmark is lost. Is there a way to prevent this from happening again in the future?

Thanks.

[Feature] ProgressBar

As an User i want to be able to display a ProgressBar indicating my current Book Progress instead of a textual Representation.

Could be more "satisfying" than text but potentially also be more friendly on smaller screens (at least on an old phone of mine the text is really small)

On Desktop there could be a Hover Dialog displaying current details (/max (percentage)), for mobile additionally on click.
Opt-in Functionality - if disabled the old Text is displayed, otherwise the bar (color also configureable)

[enhancement] On Page Changelog

As a User i want to see feature changes and enhancements on a page side changelog (either via modal or new route). E. g. Year and month grouped changes pushed with respective pr to a simple html block or whatever

On Update Notification i often feel like to check the repo and see what changed in the history - but not all people seem to know this page or are able to read commit history.

Not sure how much value a changelog would bring / how often it would need an update (as most of the recent updates were related to dependencies anyways). Also it doesn't look like the readme would get much love so not sure if the changelog would be updated accordingly xD

Resizing window while opening a book removes bookmark

Not sure if this is a known bug or not, but I found that when resizing my Chrome tab (or web app window, tried both) while loading a book with a bookmark in it, the bookmark disappears and the book places me at the beginning instead of my bookmarked location. I'm using Windows 11, haven't tested on another machine.

[Feature] Tracker Functionality

As an User i want to be able to track the spent Time i am reading a book.

Timer should be pauseable (and start in pause - due to initial scrolling / or user may want to adjust the position before)
There could be different Display Modes: Time Only, previous and (real) read characters + characters/h, previous and estimated time to finish (based on read characters in specific time)
Update in 10 seconds Interval should be fine (optionally when timer enters pause state)
Potential Companion Option: Auto Pause Mode (off, lax - auto pause in case tab loses focus / dialogs are opened, strict - any loss of window focus (e .g. yomichan, leaving browser etc.) will pause)

"Simple" Case:
Global Timer

Medium Case:
Timer Data per Book (stored in new Table or among existing data)

Complex Case:
Global and Book specific Data which can be e. g. toggled

For the Beginning the Timer Data could be based on the Session (as long as Page is not reloaded etc.)
But Potentially opens up the next big use case of collecting historical Data which could be displayed with nice graphs on a separate analyics route or similar

Some books contains spacing that breaks yomichan's scanning

I found that some books have weird spacing in them when there is a furigana which breaks yomichan's scanning:

image

Can the reader strip spaces like these so that yomichan scanning would work? If there is a way to remove spaces like these from the file itself, that would also be great.

a way to link mobile and pc? or any devices in genral

hello i usually like to read on diffrent devices, i may have the same book on my pc ttu but not on my phone's and even if i have it on both when i read i don't remember my progress, therefore i am asking for anyway to sync both

[Feature] Ability to select multiple Files or a Directory

As an User i want to be able to select multiple Files at once or a Directory for which recursively all Files are added.

Navigation / last Item can remain the same (meaning update it to the last item in the list and stored in db)

Single Click => One File, Double Click => Directory

Not sure how many People will actually use it but the effort / implication on the app seems relative low (and could also be useful for testing other stuff like book manager etc.)

stronger "hide furigana" feature

I like to use my mouse to keep track of my reading position, but if you have a book that has a lot of furigana (such as the Harry Potter books) this leads to furigana being un-hidden very often even if you have "hide furigana" enabled. It would be nice if you had to actually click to show the furigana, or if there was a toggleable rt { display: none; } button that completely abolished furigana and the bolding effect on hidden-furigana words.

[Feature] Book Manager

As a User i want to be able to see a list of all my books i loaded to the page with the Ability to easily switch between them / delete them from the local db.

  • May make sense to leverage something like https://swiperjs.com/get-started which has already touch support etc. built in (not sure yet about operation controls / ui)
  • Could allow different effects as Setting
  • Functionality would be available via new Icon (e. g. list) and keybind (e. g. alt+l), one icon to quick delete current book
  • Modal like Settings maybe the best
  • When current Book gets deleted, its navigating the User to the previous Book in the List
  • When all Books are deleted, its navigating to the initial Start Screen
  • Multi Selection would be nice i guess but low prio

Edit just in case: Example of mentioned swiperjs i played with for a browser extension i started to work on before this repo was public => https://imgur.com/a/6Nn54JT

Highlight text feature request

i don't know if it possible or not, but i would like to see highlighting text feature, sometimes i want to reread some part of the novel, but it is hard to find it without highlighting text

[Feature] Hovering Controls for Desktop

As a Desktop User i want to be able to configure the action container and the information-overlay as hoverable.

When enabled both divs will be invisible until the User moves his Mouse into the respective Corners

[suggestion/feature] Slow initial loading on older/cheap phones. Fix might be hiding images?

My assumption is that images in an ebook will cause long loading times is because you always see the pictures visually loading and taking their sweet time as you are locked out until they are done loading. And, you are forced to load the pictures at a start of a book because each time the reader loads it doesn't jump straight to the bookmark, it always loads the start of the book before jumping forward.

Small QoL improvement would be adding an option to not load images at all until requested, kinda like spoiler but when clicking the spoiler the image will load there and then rather than initial loading of book. (or rather just make this the default behaviour of spoiler even)

Another way to improve performance might be to reduce the amount of pre-rendered text off screen, I'm not sure if you can control this, but I think it'd help especially slow devices.

[Feature Request] Additional options for sorting

This isn't a major issue or anything.
But I've wondered whether it might be possible to add additional options for sorting on the home screen.
E.g. going back to sorting only by date added or maybe even alphabetically, so that novel series don't end up being all jumbled up the way they are right now.

ttu

Errors when trying to build the project

I tried building the reader to test changes, etc. and ran into a few errors when dealing with the scss files. Maybe I am doing it wrong, but I don't see a development guide:

Steps taken:

  • Fresh clone
  • npm install
  • npn run build

Npm version: 8.1.0

Error: ./src/styles.scss
Module build failed (from ./node_modules/mini-css-extract-plugin/dist/loader.js):
ModuleBuildError: Module build failed (from ./node_modules/css-loader/dist/cjs.js):
Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath './package.json' is not defined by "exports" in /Users/jim/Github/ebook-reader/node_modules/postcss/package.json
    at new NodeError (node:internal/errors:371:5)
    at throwExportsNotFound (node:internal/modules/esm/resolve:416:9)
    at packageExportsResolve (node:internal/modules/esm/resolve:669:3)
    at resolveExports (node:internal/modules/cjs/loader:482:36)
    at Function.Module._findPath (node:internal/modules/cjs/loader:522:31)
    at Function.Module._resolveFilename (node:internal/modules/cjs/loader:919:27)
    at Function.Module._load (node:internal/modules/cjs/loader:778:27)
    at Module.require (node:internal/modules/cjs/loader:999:19)
    at require (node:internal/modules/cjs/helpers:102:18)
    at Object.<anonymous> (/Users/jim/Github/ebook-reader/node_modules/css-loader/dist/index.js:12:39)
    at Module._compile (node:internal/modules/cjs/loader:1095:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1147:10)
    at Module.load (node:internal/modules/cjs/loader:975:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Module.require (node:internal/modules/cjs/loader:999:19)
    at require (node:internal/modules/cjs/helpers:102:18)
    at /Users/jim/Github/ebook-reader/node_modules/webpack/lib/NormalModule.js:316:20
    at /Users/jim/Github/ebook-reader/node_modules/loader-runner/lib/LoaderRunner.js:367:11
    at /Users/jim/Github/ebook-reader/node_modules/loader-runner/lib/LoaderRunner.js:172:11
    at loadLoader (/Users/jim/Github/ebook-reader/node_modules/loader-runner/lib/loadLoader.js:32:11)
    at iteratePitchingLoaders (/Users/jim/Github/ebook-reader/node_modules/loader-runner/lib/LoaderRunner.js:169:2)
    at runLoaders (/Users/jim/Github/ebook-reader/node_modules/loader-runner/lib/LoaderRunner.js:365:2)
    at NormalModule.doBuild (/Users/jim/Github/ebook-reader/node_modules/webpack/lib/NormalModule.js:295:3)
    at NormalModule.build (/Users/jim/Github/ebook-reader/node_modules/webpack/lib/NormalModule.js:446:15)
    at Compilation.buildModule (/Users/jim/Github/ebook-reader/node_modules/webpack/lib/Compilation.js:739:10)
    at /Users/jim/Github/ebook-reader/node_modules/webpack/lib/Compilation.js:1111:12
    at /Users/jim/Github/ebook-reader/node_modules/webpack/lib/NormalModuleFactory.js:409:6
    at /Users/jim/Github/ebook-reader/node_modules/webpack/lib/NormalModuleFactory.js:155:13
    at AsyncSeriesWaterfallHook.eval [as callAsync] (eval at create (/Users/jim/Github/ebook-reader/node_modules/webpack/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:18:1)
    at AsyncSeriesWaterfallHook.lazyCompileHook (/Users/jim/Github/ebook-reader/node_modules/webpack/node_modules/tapable/lib/Hook.js:154:20)
    at /Users/jim/Github/ebook-reader/node_modules/webpack/lib/NormalModuleFactory.js:138:29
    at /Users/jim/Github/ebook-reader/node_modules/webpack/lib/NormalModuleFactory.js:346:9
 @ multi ./src/styles.scss styles[0]

Wrong Counter for a pacticular book

The counter for the book 1984 is wrong. It says I'm 9% through a book when I'm actually somewhere in the middle.
Tested with both firefox and brave

Here's the link to the book in base64:
aHR0cHM6Ly9iLW9rLnh5ei9ib29rLzExODYzMDYyLzliMTU3OAo=

yomichan popup window + settings not showing up properly on mobile

I've been trying to read epubs on mobile using kiwi browser + yomichan. The popup window shows up out of frame(?) usually all the way to the left, meaning I can see the corner of it but not really what's written in it. Also the fullscreen button doesn't show up either which makes me assume it's all the way to the left. When I click settings it also seems to be showing up to the left too where I can't see it. Yomichan works perfectly on other websites, only gets funny with this ebook reader.
I'm currently using a Samsung Galaxy A02s, do you guys think it's the phone's problem?
Screenshot_20211113-223606_Kiwi Browser
Screenshot_20211113-223553_Kiwi Browser

blank pages until next chapter if this: <span class="board_3d">

My ebook had lots of this 3d board around text, to highlight stuff like name of stores
Once that happened, I got blank pages till next chapter begins
I had to manually edit the epub and the line I had to remove was this: <span class="board_3d">
Reporting it just in case. Here's a bit of another chapter I found later that has it as well,

<p class="board"><span class="board1">ブラジル産ボア・コンストリクター 大ニシキヘビ</span></p><p class="epubfirstparagraph2">と書いてある。</p><p class="epubfirstparagraph2"> 「いいところなの?」</p><p class="epubfirstparagraph2"> ニシキヘビはもう一度尾で掲示板をつついた。</p><p class="board"><span class="board1">このヘビは動物園で生まれました</span></p><p class="epubfirstparagraph2"> 

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

This repository currently has no open or pending branches.

Detected dependencies

docker-compose
docker-compose.yml
dockerfile
apps/web/Dockerfile
  • nginx 1.27-alpine
github-actions
.github/workflows/ci.yml
  • actions/checkout v4
  • actions/setup-node v4
.github/workflows/deploy.yml
  • actions/checkout v4
  • actions/setup-node v4
  • cloudflare/pages-action v1.5.0
npm
apps/web/package.json
  • @fortawesome/fontawesome-svg-core 6.6.0
  • @fortawesome/free-regular-svg-icons 6.6.0
  • @fortawesome/free-solid-svg-icons 6.6.0
  • @popperjs/core 2.11.8
  • balanced-match 3.0.1
  • fake-indexeddb 6.0.0
  • fast-xml-parser 4.4.1
  • idb 8.0.0
  • p-limit 6.1.0
  • path-browserify 1.0.1
  • rxjs 7.8.1
  • svelte-fa 4.0.2
  • svelte-gestures 5.0.4
  • svelte-meta-tags 3.1.3
  • ua-parser-js 1.0.38
  • @sveltejs/adapter-static 3.0.4
  • @sveltejs/kit 2.5.22
  • @sveltejs/vite-plugin-svelte 3.1.1
  • @tailwindcss/aspect-ratio 0.4.2
  • @tailwindcss/forms 0.5.7
  • @types/balanced-match 3.0.2
  • @types/path-browserify 1.0.2
  • @types/ua-parser-js 0.7.39
  • @types/webappsec-credential-management 0.6.8
  • @types/wicg-file-system-access 2023.10.5
  • autoprefixer 10.4.20
  • postcss 8.4.41
  • sass 1.77.8
  • svelte 4.2.18
  • svelte-check 3.8.5
  • svelte-preprocess 6.0.2
  • tailwindcss 3.4.10
  • tslib 2.6.3
  • typescript 5.5.4
  • vite 5.4.0
package.json
  • @commitlint/cli 19.4.0
  • @commitlint/config-conventional 19.2.2
  • @eslint/compat 1.1.1
  • @eslint/js 9.9.0
  • @types/eslint__js 8.42.3
  • @types/node 20.14.15
  • eslint 9.9.0
  • eslint-config-prettier 9.1.0
  • eslint-import-resolver-typescript 3.6.1
  • eslint-plugin-headers 1.1.2
  • eslint-plugin-prettier 5.2.1
  • eslint-plugin-rxjs 5.0.3
  • eslint-plugin-svelte 2.43.0
  • husky 9.1.4
  • lint-staged 15.2.9
  • prettier 3.3.3
  • prettier-plugin-svelte 3.2.6
  • prettier-plugin-tailwindcss 0.6.6
  • svelte 4.2.18
  • svelte-eslint-parser 0.41.0
  • typescript 5.5.4
  • typescript-eslint 8.1.0

  • Check this box to trigger a request for Renovate to run again on this repository

[Feature Request] Adding more default fonts

In phones and Android e-readers, it is not possible to change the font. By any chance, would you add more fonts to the reader itself?

Some suggestions: Google Font's Klee One, shoui's recommended fonts: 源暎こぶり明朝 v5, 秀英体, しっぽり明朝

Font does not change (???firefox-based browsers???)

I'm using Librewolf. I can't change the default font. I thought it was Librewolf since it's a modified version of Firefox. But I've installed Firefox and I can't change the default font using Firefox.
I've installed Chromium. I was able to change the default font. I've installed chromium-based browsers to test: Brave and Iridium. Both of them let me change fonts.

Bookmarks disappear

I like to read a bunch of different books at the same time so maybe that's why but my bookmarks seem to disappear frequently. A fix for this would be appreciated.

[Feature Request] OPDS catalog integration

Hi! Loving the app, but right now the biggest pain is having to redownload my ebooks every time I move to another device/browser.

I was wondering if it would be worth adding integration with ODPS catalogs. Calibre exposes an OPDS server by default, so this way I could just connect to my Calibre server (where I store all my ebooks) and grab any book I need.

[Request] Add releases to Github page

Some people would prefer to run ttu locally with a lightweight web server so that they don't have to depend on an internet connection to read ebooks. Building the site requires both npm and over 600mb of npm dependencies to produce a small folder which can be hosted by any standard web server.

I am personally interested in creating a wrapper script with the extremely light http server darkhttpd to launch ttu lightweight and locally, and putting this script in user package repositories like the AUR. Adding github releases would help greatly as they can be fetched and used quickly, programmatically, and without npm.

Reading speed stats

Two reading speed stats (in characters per hour) would be really helpful for tracking reading speed. These should appear next to the book progress stat at the bottom right.

CPH if you keep reading at the same speed

Every minute, count the number of characters in between the line that was in the middle of the screen a minute ago and the line in the middle of the screen now then multiply that number by 60. Maybe this isn't a good way of doing it?

CPH if you keep autoscrolling at the same speed

If autoscroll is enabled, a second stat should show that displays at what speed (in characters per hour) the screen is scrolling. This could either be done by counting exactly how many characters that will appear in the next minute then multiplying by 60, or, using a constant that is different for every novel based on average number of characters you would scroll in an hour.
I like the latter here because you'd be able to use it to make better estimations about the whole book in calculations.

[Feature Request] Save writing mode's option per ebook

Hello, your application is awesome! :)

I think the option "Writing Mode" shouldn't be global to all ebooks.
Light novels are better displayed verticaly.
But textbook are better displayed horizontaly.

It could be an option on the book manager page for example.

[Feature request] Table of content support

For ebooks with properly embedded TOC, any of these features would be nice:

  • displaying a number of characters left in the current chapter
  • a menu or sidebar with a TOC allowing for quick navigation at any time, preferably displaying the character counts at which the chapters begin, i.e. something like this:
プロローグ	178
第一章 母親と少年	2607
第二章 告白と困惑	13768
etc.

Empty page in between paragraphs

Sometimes the reader may display empty page for paginated mode when there's a br tag right before a long paragraph (with page-break-inside)

Loading to much epubs in the app

I tried this a while ago (over 800), whenever you go to the manager, it takes like 30 seconds to load all books.

Possible fix: make it load like a max of 200? Then when you're at the end, load another 200 books, and so on.

[Suggestion] User Guide / Documentation

While playing around with the web app, it took me a while to figure out that the PageUp and PageDown keys were mapped.
After finding this github page and taking a look at the source code, I saw that the A and D keys were also mapped.

Maybe there should be a built-in user guide listing all the available keyboard shortcuts or a link to the (eventual) github documentation in the settings window.
Or did you plan on making the keyboard shortcuts fully customizable?

Something simple like this should do (could also include mouse controls, mobile gestures)

Gesture/Shortcut Key Description
Escape Close Panels
Space Toggle Auto-Scrolling
A,D Adjust Auto-Scrolling Speed
B Set Bookmark
PageDown,PageUp Turn Pages
Swipe ...

Another minor thing, but I also noticed a general lack of tooltips.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.