Compare commits

...
266 Commits
Author SHA1 Message Date
Daniel 3ab7bbb652 fix: discover pages now correctly using opds pagination (#179)
Mirror to Codeberg / Mirror to Codeberg (push) Canceled after 0s
2026-07-22 07:56:54 +02:00
Daniel aeef8274e2 feature: added more sources to isbn queries + you can manually reorder them (#180) 2026-07-22 07:35:38 +02:00
VitaliiandHosted Weblate b263033912 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (28 of 28 strings)

Translation: Calibre Web Companion/metadata
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/metadata/uk/
2026-07-20 21:01:31 +02:00
VitaliiandHosted Weblate 1c54db5f16 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (551 of 551 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/uk/
2026-07-20 21:01:26 +02:00
LibreandHosted Weblate 1497ca4c5f Translated using Weblate (Spanish)
Currently translated at 100.0% (551 of 551 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/es/
2026-07-20 21:01:22 +02:00
LibreandHosted Weblate 397f60dbfb Translated using Weblate (Spanish)
Currently translated at 100.0% (547 of 547 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/es/
2026-07-19 17:01:32 +00:00
Daniel a72522bf44 updated changelog 2026-07-19 10:31:07 +02:00
Daniel e46c928af9 feature: added ability to change probe endpoint for offline check + edit settings in offline mode (#177) 2026-07-19 10:30:14 +02:00
Daniel a9e2af5626 Version bump (v2.2.1+40) 2026-07-18 23:44:26 +02:00
Daniel 9ffeef5bed fix: updated offline mode identification (#177) 2026-07-18 23:40:08 +02:00
Enric Pagès i GassullandHosted Weblate df55659293 Translated using Weblate (Catalan)
Currently translated at 100.0% (546 of 546 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ca/
2026-07-18 13:01:32 +00:00
Daniel ad021bc9e8 fix: added reauth popup when using soo (#174) 2026-07-18 13:11:52 +02:00
Daniel 3bfc9b91d1 feature: added a better folder view for series on the bookView page (#176) 2026-07-18 12:46:23 +02:00
VitaliiandHosted Weblate 7699cde92b Translated using Weblate (Ukrainian)
Currently translated at 100.0% (27 of 27 strings)

Translation: Calibre Web Companion/metadata
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/metadata/uk/
2026-07-16 13:01:26 +00:00
VitaliiandHosted Weblate ee5378546e Translated using Weblate (Ukrainian)
Currently translated at 100.0% (546 of 546 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/uk/
2026-07-16 13:01:22 +00:00
VitaliiandHosted Weblate 50d2ef28f7 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (26 of 26 strings)

Translation: Calibre Web Companion/metadata
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/metadata/uk/
2026-07-14 19:01:57 +00:00
VitaliiandHosted Weblate 833a130ecd Translated using Weblate (Ukrainian)
Currently translated at 100.0% (527 of 527 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/uk/
2026-07-14 19:01:54 +00:00
Daniel 3556b18fe1 fix: increased ios minimum version to 14.0 2026-07-13 17:01:19 +02:00
Daniel bd72089ad9 feat: updated SSO login flow and enhance cookie handling in LoginRemoteDataSource (#174) 2026-07-13 16:38:14 +02:00
Daniel 545a0d8c3b docs: version bump (v2.2.0+39) 2026-07-13 16:21:17 +02:00
Daniel 10068bde93 feature: added two more widget types (#172) 2026-07-13 16:13:53 +02:00
Daniel c94f842cd4 fix: OpenFile now gets the right mime type (#173) 2026-07-13 15:11:24 +02:00
Daniel 1fde5359ca fix: improved widget settings and widget color 2026-07-07 17:54:29 +02:00
Daniel 6d62d7cfaf feature: begon to work on the homescreen widgets 2026-07-07 10:47:35 +02:00
Mas WangandHosted Weblate ff03d4eda6 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 53.3% (281 of 527 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/zh_Hans/
2026-07-01 02:01:52 +02:00
Márton KónyaandHosted Weblate 355262210f Translated using Weblate (Hungarian)
Currently translated at 100.0% (527 of 527 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/hu/
2026-07-01 02:01:43 +02:00
Michele AbbondanzaandHosted Weblate 65b75cf908 Translated using Weblate (Italian)
Currently translated at 96.3% (508 of 527 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/it/
2026-07-01 02:01:36 +02:00
LibreandHosted Weblate e614f00c1e Translated using Weblate (Spanish)
Currently translated at 100.0% (527 of 527 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/es/
2026-06-27 18:01:25 +00:00
Daniel d09527427a feature: Added Codeberg mirror 2026-06-25 14:35:34 +02:00
Daniel 3f328c2985 fix: offline mode wouldnt launch on app start + account switcher wouldnt reload book view 2026-06-25 11:30:57 +02:00
Daniel 245ccf5242 docs: version bump (v2.1.0+38) 2026-06-25 10:38:48 +02:00
E TaandHosted Weblate d5f85309d0 Translated using Weblate (Arabic)
Currently translated at 63.9% (334 of 522 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ar/
2026-06-25 08:30:36 +00:00
Daniel 86bf7f5163 feature: added support for the calibre hosted web server 2026-06-24 17:49:03 +02:00
தமிழ்நேரம்andHosted Weblate 41a163b537 Translated using Weblate (Tamil)
Currently translated at 100.0% (25 of 25 strings)

Translation: Calibre Web Companion/metadata
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/metadata/ta/
2026-06-24 11:01:41 +02:00
தமிழ்நேரம்andHosted Weblate 754b4dbc11 Translated using Weblate (Tamil)
Currently translated at 99.2% (518 of 522 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ta/
2026-06-24 11:01:36 +02:00
VitaliiandHosted Weblate b39edd9fa1 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (25 of 25 strings)

Translation: Calibre Web Companion/metadata
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/metadata/uk/
2026-06-24 11:01:27 +02:00
VitaliiandHosted Weblate b3a9b06333 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (522 of 522 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/uk/
2026-06-24 11:01:24 +02:00
VitaliiandHosted Weblate 8825335dd7 Translated using Weblate (Ukrainian)
Currently translated at 92.0% (23 of 25 strings)

Translation: Calibre Web Companion/metadata
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/metadata/uk/
2026-06-23 08:01:57 +00:00
VitaliiandHosted Weblate 7f0edc8e90 Translated using Weblate (Ukrainian)
Currently translated at 99.8% (518 of 519 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/uk/
2026-06-23 08:01:54 +00:00
reducedradiusandHosted Weblate 08e22097c8 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 52.6% (273 of 519 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/zh_Hans/
2026-06-23 08:01:51 +00:00
Daniel 92cfb7b5f7 fix: small api service fix (#154) 2026-06-22 12:51:30 +02:00
Daniel 669777b999 fix: recognize stock calibre software with the diagnostic tool 2026-06-22 12:40:17 +02:00
Daniel 153b85d4c8 fix: shelfmark integration still went back to defaulting german over the selected language (fixes: #103) 2026-06-22 12:15:58 +02:00
Daniel 0259c08c78 fix: when updating a book and using the system back gesture, the book view woudlnt update (fixes: #168) 2026-06-22 12:04:03 +02:00
Daniel aafbc5effe Merge branch '167-feature-request-offline-reading' into dev 2026-06-22 11:48:53 +02:00
Daniel def4311a87 fix: adde books to the download manager when using the "read now" function (#169) 2026-06-22 11:47:47 +02:00
தமிழ்நேரம்andHosted Weblate c27ffb0be9 Added translation using Weblate (Tamil) 2026-06-22 05:14:05 +02:00
VitaliiandHosted Weblate 10b2b26713 Translated using Weblate (Ukrainian)
Currently translated at 77.2% (401 of 519 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/uk/
2026-06-22 05:14:04 +02:00
VitaliiandHosted Weblate 37d52bbd84 Added translation using Weblate (Ukrainian) 2026-06-21 17:35:07 +02:00
Márton KónyaandHosted Weblate b9dc3a02b4 Translated using Weblate (Hungarian)
Currently translated at 95.3% (495 of 519 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/hu/
2026-06-19 17:01:18 +02:00
Daniel 47c06f4e52 fix: there was an issue what logged you out every time the app restarts 2026-06-18 19:16:41 +02:00
AxGDandHosted Weblate 7accb69fd0 Translated using Weblate (French)
Currently translated at 89.0% (462 of 519 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/fr/
2026-06-18 13:01:17 +00:00
Daniel 2b83638417 feature: added offline access to downloaded books 2026-06-18 13:55:55 +02:00
AnonymousandHosted Weblate 8bb65e8637 Translated using Weblate (Dutch)
Currently translated at 6.3% (27 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/nl/
2026-06-17 11:03:43 +02:00
AnonymousandHosted Weblate ba434d4c00 Translated using Weblate (Portuguese)
Currently translated at 82.7% (354 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/pt/
2026-06-17 11:03:33 +02:00
RubensandHosted Weblate 5ce6ffae82 Translated using Weblate (Catalan)
Currently translated at 100.0% (428 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ca/
2026-06-17 11:03:24 +02:00
AnonymousandHosted Weblate bf8b20e094 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 52.8% (226 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/zh_Hans/
2026-06-17 11:03:05 +02:00
AnlorandHosted Weblate a18a13dbcd Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 52.8% (226 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/zh_Hans/
2026-06-17 11:03:01 +02:00
AnonymousandHosted Weblate 567e6bca2f Translated using Weblate (Estonian)
Currently translated at 18.4% (79 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/et/
2026-06-17 11:02:51 +02:00
AnonymousandHosted Weblate 26ca1db904 Translated using Weblate (Italian)
Currently translated at 98.8% (423 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/it/
2026-06-17 11:02:42 +02:00
Michele AbbondanzaandHosted Weblate f70b0fd99f Translated using Weblate (Italian)
Currently translated at 98.8% (423 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/it/
2026-06-17 11:02:42 +02:00
AnonymousandHosted Weblate 2dd4670f36 Translated using Weblate (Swedish)
Currently translated at 86.2% (369 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/sv/
2026-06-17 11:02:22 +02:00
Daniel WiikandHosted Weblate 453a766545 Translated using Weblate (Swedish)
Currently translated at 86.2% (369 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/sv/
2026-06-17 11:02:20 +02:00
AnonymousandHosted Weblate f52d7a379b Translated using Weblate (Arabic)
Currently translated at 63.7% (273 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ar/
2026-06-17 11:02:02 +02:00
E. Ta.andHosted Weblate 43885be65d Translated using Weblate (Arabic)
Currently translated at 63.7% (273 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ar/
2026-06-17 11:01:59 +02:00
Márton KónyaandHosted Weblate 58978b4883 Translated using Weblate (Hungarian)
Currently translated at 100.0% (428 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/hu/
2026-06-17 11:01:51 +02:00
LibreandHosted Weblate 43be8c5cab Translated using Weblate (Spanish)
Currently translated at 100.0% (428 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/es/
2026-06-17 11:01:41 +02:00
AnonymousandHosted Weblate 6e6e7bdfc7 Translated using Weblate (Spanish)
Currently translated at 100.0% (428 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/es/
2026-06-17 11:01:39 +02:00
AnonymousandHosted Weblate d868de7c84 Translated using Weblate (Turkish)
Currently translated at 14.2% (61 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/tr/
2026-06-17 11:01:09 +02:00
AnonymousandHosted Weblate f60fde40fb Translated using Weblate (French)
Currently translated at 91.8% (393 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/fr/
2026-06-17 11:00:58 +02:00
AxGDandHosted Weblate 7cf9153d10 Translated using Weblate (French)
Currently translated at 91.8% (393 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/fr/
2026-06-17 11:00:52 +02:00
AnonymousandHosted Weblate c10770ebd7 Translated using Weblate (German)
Currently translated at 100.0% (428 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/de/
2026-06-17 11:00:48 +02:00
XapitonovandHosted Weblate 25347f40ca Translated using Weblate (Russian)
Currently translated at 100.0% (428 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ru/
2026-06-17 11:00:40 +02:00
DanielandGitHub 121d75d128 Merge branch 'main' into dev 2026-06-17 10:23:01 +02:00
Daniel 4c611ed07d fix: updated comos_epub package to allow reproducibles builds for F-Droid 2026-06-17 10:21:38 +02:00
Daniel 463853a5f7 docs: version bump 2026-06-16 17:53:42 +02:00
DanielandGitHub 231008dd26 docs: version bump 2026-06-16 17:52:13 +02:00
DanielandGitHub 638c61adaf Merge pull request #165 from doen1el/dev
v2.0.1
2026-06-16 17:44:19 +02:00
Daniel 5ddaa03d93 docs: added changelog 2026-06-16 17:29:23 +02:00
Daniel 62a053b32a fix: swapped barcode reader package to a foss version 2026-06-16 17:28:08 +02:00
Daniel c72c7423aa docs: small pipeline update 2026-06-16 12:32:57 +02:00
DanielandGitHub 2cfcbd260d Merge pull request #164 from doen1el/dev
v2.0.0
2026-06-16 12:28:32 +02:00
Daniel 5f72004594 fix: upadted "whatsnew" script to keep text below 500 characters 2026-06-16 12:15:37 +02:00
Daniel fb4ba75bd5 fix: adjusted pipeline with new java version (termurin) 2026-06-16 11:58:49 +02:00
Daniel a6e1480cb7 fix: issue in build.gradle file 2026-06-16 11:41:37 +02:00
Daniel 10791d33aa docs: added new feature graphics
fix: updated folder handling on ios (#155)
2026-06-16 10:19:37 +02:00
Daniel 9b6219ceca fix: adjusted shelfmark integration 2026-06-16 08:19:47 +02:00
Daniel 1f7a083856 fix: ui issues in the account switcher 2026-06-16 07:47:59 +02:00
Daniel 133a8771c2 fix: card theming 2026-06-16 07:28:30 +02:00
Daniel 7926449fd9 fix: updated ndkVersion to '28.2.13676358' 2026-06-14 10:42:41 +02:00
Daniel 40445fd83f fix: internal e-reader epubx issues
fix: gradle issues due to flutter migration
fix: minor colortheme adjustments
2026-06-14 10:40:07 +02:00
Daniel 1f7d5e4324 feat: update version to 2.0.0, enhance README and full description, and add changelog for new features and fixes 2026-06-13 22:44:57 +02:00
Daniel 6d94748ffa feat: update CI workflow and add Play Store changelog generation script 2026-06-13 22:31:36 +02:00
Daniel ae62666dfc feat: support for magic shelves (view, edit, create, delete) (#163) 2026-06-13 14:10:40 +02:00
Daniel d99f2e9556 Added connection report to better identify connection issues + made adjustments to webview sso (Reverse proxy authentication: can log in but no data
Fixes #33)
2026-06-12 11:00:33 +02:00
Daniel 0f217440a7 Adjusted shelfmark config fetching (maybe fixed issue #103) 2026-06-09 23:41:45 +02:00
Daniel 9ee558b92c Simplified Shelfmark and Send2Ereader integration 2026-06-09 17:32:01 +02:00
Daniel ad2694ccbf Connection Setting will now be saved directly, without pressing the 'save' button at the top right 2026-06-09 17:11:07 +02:00
Daniel 830b6f6f46 Adjusted self signed certificate settings (maybe fixed issue #44) 2026-06-09 17:00:56 +02:00
Daniel 10db9a5935 Adjusted api service and maybe resolved Issue #83 2026-06-09 10:10:10 +02:00
Daniel a68a007e1a Added ability to search for metadata from providers when editing a book 2026-06-08 14:49:00 +02:00
Daniel d3f5ea5953 small adjustments for integration tests 2026-06-08 14:35:12 +02:00
Daniel ffd73a65cb Fixed logger issue 2026-06-07 20:48:41 +02:00
Daniel 1b9f35222d Added series index to book card + added series filter options + created better search with autosuggestions (Feature request - series
Fixes #158)
2026-06-07 18:03:48 +02:00
Daniel 12110a6ee3 You can now also toggle between list and grid view in shelf details + added inkwell effect to book cards 2026-06-07 08:23:26 +02:00
Daniel 15a7232a4e Added pagination to shelf details (Shelves with multiple pages
Fixes #162)
2026-06-07 07:56:18 +02:00
Daniel babb8685ac Added ability to change font size + added new grid view and list view also to discover tabs + update library search on homescreen 2026-06-06 23:48:47 +02:00
Daniel 7844be0e69 Fixed issue with Author (A-Z) filter 2026-06-06 23:24:34 +02:00
Daniel 21e10904e6 small update to the manifest file 2026-06-06 23:17:11 +02:00
Daniel 401000755e Added new ability to quickly scan book barcodes to add them to calibre or download them via shelfmark (#159) 2026-06-06 13:42:59 +02:00
Daniel cb39460219 New epub reader (cosmo ereader) + integtration tests for api + many small fixes 2026-06-05 13:13:59 +02:00
Stef BaeyensandHosted Weblate 991a9714d4 Translated using Weblate (Dutch)
Currently translated at 6.3% (27 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/nl/
2026-05-09 22:11:33 +02:00
E. Ta.andHosted Weblate c24f9c2958 Translated using Weblate (Arabic)
Currently translated at 63.7% (273 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ar/
2026-04-23 02:09:49 +02:00
XapitonovandHosted Weblate a87e961bea Translated using Weblate (Russian)
Currently translated at 100.0% (428 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ru/
2026-04-21 20:09:56 +02:00
Daniel faa0963b14 You can now select a folder on ios 2026-04-16 16:10:41 +02:00
Daniel 6a59ef6620 Added Dutch language setting (thanks to Cédric Vanbeveren) 2026-04-16 15:24:02 +02:00
DanielandGitHub 3a4e7a6b8d Merge pull request #153 from Rescue9/dev
Fixed centering on book actions
2026-04-16 15:18:30 +02:00
E. Ta.andHosted Weblate 440b424e67 Translated using Weblate (Arabic)
Currently translated at 63.5% (272 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ar/
2026-04-15 19:09:50 +02:00
Andrew BuskovandGitHub 139882d707 Merge branch 'doen1el:dev' into dev 2026-04-14 20:20:19 -05:00
E. Ta.andHosted Weblate 015cc818c0 Translated using Weblate (Arabic)
Currently translated at 58.8% (252 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ar/
2026-04-14 16:09:55 +00:00
Priit JõerüütandHosted Weblate 213c94ffd5 Translated using Weblate (Estonian)
Currently translated at 18.4% (79 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/et/
2026-04-14 16:09:50 +00:00
E. Ta.andHosted Weblate ab187a7f09 Translated using Weblate (Arabic)
Currently translated at 53.2% (228 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ar/
2026-04-13 15:09:55 +00:00
Cédric VanbeverenandHosted Weblate 506b518484 Translated using Weblate (Dutch)
Currently translated at 27.2% (6 of 22 strings)

Translation: Calibre Web Companion/metadata
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/metadata/nl/
2026-04-10 14:09:57 +00:00
Cédric VanbeverenandHosted Weblate a5b8210231 Translated using Weblate (French)
Currently translated at 86.9% (372 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/fr/
2026-04-10 14:09:55 +00:00
E. Ta.andHosted Weblate 7c3fc6d81a Translated using Weblate (Arabic)
Currently translated at 100.0% (22 of 22 strings)

Translation: Calibre Web Companion/metadata
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/metadata/ar/
2026-04-10 14:09:54 +00:00
E. Ta.andHosted Weblate ad94fbd737 Translated using Weblate (Arabic)
Currently translated at 33.8% (145 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ar/
2026-04-10 14:09:50 +00:00
Cédric VanbeverenandHosted Weblate 7a95c4aee3 Added translation using Weblate (Dutch) 2026-04-09 15:25:57 +02:00
E. Ta.andHosted Weblate 9528ec3b7f Translated using Weblate (Arabic)
Currently translated at 29.6% (127 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ar/
2026-04-09 15:25:57 +02:00
E. Ta.andHosted Weblate 446d18756c Translated using Weblate (Arabic)
Currently translated at 100.0% (22 of 22 strings)

Translation: Calibre Web Companion/metadata
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/metadata/ar/
2026-04-09 08:10:18 +00:00
E. Ta.andHosted Weblate 4d8df534f0 Translated using Weblate (Arabic)
Currently translated at 29.6% (127 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ar/
2026-04-09 08:10:03 +00:00
Lucas ProneandHosted Weblate 5c6c48547d Translated using Weblate (Spanish)
Currently translated at 99.7% (427 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/es/
2026-04-06 08:12:12 +02:00
DanielandGitHub 463806c654 Updated downloads badges 2026-04-03 13:13:33 +02:00
DanielandGitHub 5182f9b4da Added F-Droid total downloads badge 2026-04-03 13:09:20 +02:00
Michele AbbondanzaandHosted Weblate 8043218df4 Translated using Weblate (Italian)
Currently translated at 98.8% (423 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/it/
2026-03-31 10:09:49 +02:00
Rescue9 ff3ffce5a7 Merge branch 'dev' of github.com:Rescue9/calibre-web-companion into dev 2026-03-28 20:20:04 +00:00
Rescue9 b97d6d7dac Fix centering for book actions
MainAxisAlignment fails because SingleChildScrollView provides an unconstrained container. Without constraints, the content can't center.
2026-03-28 20:19:47 +00:00
RubensandHosted Weblate c9e8f37089 Translated using Weblate (Catalan)
Currently translated at 100.0% (428 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ca/
2026-03-25 21:09:51 +01:00
Daniel FinolandHosted Weblate ba98beb055 Translated using Weblate (Spanish)
Currently translated at 98.8% (423 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/es/
2026-03-25 21:09:50 +01:00
Márton KónyaandHosted Weblate 9882eaf342 Translated using Weblate (Hungarian)
Currently translated at 100.0% (428 of 428 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/hu/
2026-03-25 21:09:48 +01:00
XapitonovandHosted Weblate 8b2a2216e7 Translated using Weblate (Russian)
Currently translated at 100.0% (22 of 22 strings)

Translation: Calibre Web Companion/metadata
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/metadata/ru/
2026-03-24 13:10:07 +01:00
XapitonovandHosted Weblate 75eda29055 Translated using Weblate (Russian)
Currently translated at 100.0% (426 of 426 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ru/
2026-03-24 13:10:04 +01:00
Daniel 6c611c69a0 Changed "Booklore" to "Grimmory" 2026-03-23 23:03:58 +01:00
Daniel 628e4c6616 Added ability to choose what book format you want to use for the internal reader (.kepub files not opening in internal reader
Fixes #152)
2026-03-23 22:53:32 +01:00
DanielandGitHub 1b466dd8ad Merge pull request #151 from Rescue9/dev
Fix swipe back gesture crashing application
2026-03-23 10:04:58 +01:00
Rescue9 30668f1e6e Fix swipe back gesture crashing application 2026-03-21 15:57:14 +00:00
Márton KónyaandHosted Weblate 6ecca17e75 Translated using Weblate (Hungarian)
Currently translated at 100.0% (426 of 426 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/hu/
2026-03-20 07:09:49 +00:00
Márton KónyaandHosted Weblate 5a511f8726 Translated using Weblate (Hungarian)
Currently translated at 100.0% (22 of 22 strings)

Translation: Calibre Web Companion/metadata
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/metadata/hu/
2026-03-20 07:09:48 +00:00
AnlorandHosted Weblate c60c266ec9 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 53.4% (226 of 423 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/zh_Hans/
2026-03-18 15:10:03 +00:00
DanielandGitHub e798db33ff Merge pull request #148 from doen1el/dev
v1.8.9
2026-03-16 11:33:41 +01:00
Daniel 7935058a83 Added changelog 2026-03-16 11:16:57 +01:00
Daniel 71aaa2ca38 Updated version code 2026-03-16 11:14:25 +01:00
Daniel 46cbab7b46 Added: Option to save books that send to ereader to the specified downloads folder (Download when open in external reader
Fixes #146)
2026-03-16 11:14:02 +01:00
Daniel 28f9539943 Fixed: Adjusted Shelfmark integration for new version (Download search not finding any books
Fixes #147)
2026-03-16 10:44:09 +01:00
Daniel 56960199c1 Added arabic and chinese language support 2026-03-16 10:23:32 +01:00
Michele AbbondanzaandHosted Weblate f14f45bcea Translated using Weblate (Italian)
Currently translated at 99.5% (421 of 423 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/it/
2026-03-16 01:01:56 +01:00
Márton KónyaandHosted Weblate 24c2746056 Translated using Weblate (Hungarian)
Currently translated at 100.0% (21 of 21 strings)

Translation: Calibre Web Companion/metadata
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/metadata/hu/
2026-03-12 07:09:54 +01:00
AnlorandHosted Weblate f646302b84 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 24.1% (102 of 423 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/zh_Hans/
2026-03-12 07:09:49 +01:00
Chen XiandHosted Weblate c62646310f Added translation using Weblate (Chinese (Simplified Han script)) 2026-03-11 06:35:14 +01:00
RubensandHosted Weblate 7b7b950da3 Translated using Weblate (Catalan)
Currently translated at 100.0% (423 of 423 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ca/
2026-03-10 09:09:47 +00:00
Márton KónyaandHosted Weblate cfb6669846 Translated using Weblate (Hungarian)
Currently translated at 66.6% (14 of 21 strings)

Translation: Calibre Web Companion/metadata
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/metadata/hu/
2026-03-08 01:09:51 +01:00
RubensandHosted Weblate 700f4cf21d Translated using Weblate (Catalan)
Currently translated at 98.3% (416 of 423 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ca/
2026-03-08 01:09:47 +01:00
Márton KónyaandHosted Weblate 501a927484 Translated using Weblate (Hungarian)
Currently translated at 100.0% (423 of 423 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/hu/
2026-03-07 01:04:30 +01:00
E. Ta.andHosted Weblate 6220042cb1 Translated using Weblate (Arabic)
Currently translated at 2.3% (10 of 423 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ar/
2026-03-06 22:09:53 +01:00
E. Ta.andHosted Weblate 18e9e19e1c Translated using Weblate (Arabic)
Currently translated at 52.3% (11 of 21 strings)

Translation: Calibre Web Companion/metadata
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/metadata/ar/
2026-03-06 22:09:52 +01:00
DanielandGitHub 96bdc91f14 Merge pull request #143 from doen1el/dev
v1.8.8
2026-03-06 09:44:15 +01:00
E. Ta.andHosted Weblate b8eab6ef1d Added translation using Weblate (Arabic) 2026-03-05 21:48:17 +01:00
Daniel 9b7fe19226 Added changelog 2026-03-05 11:59:48 +01:00
Daniel 500a72d781 Added better error message in sync settings when section in calibre-web is disabled 2026-03-05 11:55:08 +01:00
Daniel c596d137fc Added ability to view and copy app logs for bug reports 2026-03-05 11:48:24 +01:00
Daniel 52fe342902 Remodeld Settings Page 2026-03-05 11:37:18 +01:00
Daniel 1c60d9e7bd Added ability to reorder and disable discover sections via settings 2026-03-05 11:21:40 +01:00
Daniel bc0281e45a Added ability to reorder and hide book details via settings 2026-03-05 11:09:28 +01:00
Daniel fae9729a93 Added ability to change book actions order and visbility trough settings 2026-03-05 11:03:25 +01:00
Daniel c12638c00b Upated version code + pipeline 2026-03-05 10:17:27 +01:00
Daniel 18f942c433 small ui improvements 2026-03-05 10:16:34 +01:00
DanielandGitHub 59737309d1 Merge pull request #142 from jarynclouatre/fix-shelf-cover-auth
fix: resolve 401 unauthorized on shelf covers
2026-03-05 09:29:45 +01:00
jarynclouatre 89989fd92c fix: resolve 401 unauthorized on shelf covers
Fixes an issue where shelf covers failed to load because the auth headers map was unmodifiable. Changing it to a mutable map allows the basic auth credentials to be appended properly.
2026-03-04 17:50:57 -06:00
RubensandHosted Weblate 8d78b927a9 Translated using Weblate (Catalan)
Currently translated at 100.0% (413 of 413 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ca/
2026-03-04 08:09:52 +00:00
DanielandGitHub 18c49b39e3 Merge pull request #136 from Rescue9/dev
Rework book details page
2026-03-03 23:02:11 +01:00
Andrew BuskovandGitHub 11a8607abe Merge branch 'doen1el:dev' into dev 2026-03-03 13:08:57 -06:00
Rescue9 90700f8b9c Fixed bottom gradient transparancy issues 2026-03-03 13:06:21 -06:00
Rescue9 14dd28ffa8 Changed scale and padding 2026-03-03 13:01:36 -06:00
Rescue9 30295a35fe Better layout for stretch 2026-03-02 20:58:23 -06:00
Rescue9 67637090a0 Details title and scale working 2026-03-02 18:54:50 -06:00
Rescue9 b3b3347c46 Reworking book details
More image, less gradient, paralax, still a work in progress.
2026-03-02 17:28:52 -06:00
Rescue9 227ec4a191 Fixed background image top and width 2026-03-02 16:03:28 -06:00
DanielandGitHub 6492125d2b Merge pull request #135 from jarynclouatre/main
Fix: shelf add/remove broken due to missing csrfTokenUrl (405 error)
2026-03-02 13:39:09 +01:00
jarynclouatreandGitHub 017e485802 Fix shelf add/remove sending GET instead of POST due to missing csrfTokenUrl
addBookToShelf and removeBookFromShelf were missing csrfTokenUrl, causing
apiService.post to fetch the CSRF token by doing a GET to the shelf endpoint
itself (/shelf/add/<id>/<id>). Calibre-Web only accepts POST on that route,
so it returned 405, the CSRF token was never obtained, and the POST was never
sent. Books appeared to be added (toast showed) but nothing persisted.

Fix: add csrfTokenUrl: '/me' so the token is fetched from a GET-accessible
page, and add contentType to match what Calibre-Web expects. Also corrected
success status code check to include 204 (what Calibre-Web actually returns
for XHR shelf requests) and 302 in addition to 200.

Fixes #75
2026-03-01 18:05:18 -06:00
Rescue9 46371777b5 Simple gradient adjustment 2026-03-01 15:37:19 -06:00
DanielandGitHub b12b017990 Added "keepandroidopen.org" to README 2026-03-01 20:42:50 +01:00
Rescue9 999a482e28 Book Details background
Use full book cover on book details for background.
2026-03-01 11:19:08 -06:00
DanielandGitHub 5fd1e1f187 Merge pull request #133 from Rescue9/dev
Display full book cover
2026-02-28 23:45:48 +01:00
Rescue9 96536187bc Display full book cover
Full book cover is displayed. The title/author overlay is semi-transparent with a gradient.
2026-02-28 13:53:49 -06:00
DanielandGitHub 788eaeaf61 Merge pull request #132 from Rescue9/dev
Stop tracking generated localizations
2026-02-27 22:42:32 +01:00
Rescue9 7e2a58b111 Stop tracking generated localizations
Removed app_localization.dart files from tracking and added to .gitignore. Fixes #131
2026-02-27 15:27:58 -06:00
DanielandGitHub e66f118720 Merge pull request #130 from Rescue9/dev
Sync Configuration Fix
2026-02-27 20:34:54 +01:00
Rescue9 57175c64f1 Sync Configuration Fix
Russian translations off-by-one until f8f8c74e3d. Cast {count} in "all:' translation was breaking code. Fixing translation negates need for "as String" modifier. This fixes white screen when opening Sync Configuration from Settings.
2026-02-27 12:32:10 -06:00
Márton KónyaandHosted Weblate ad8d1bd172 Translated using Weblate (Hungarian)
Currently translated at 100.0% (413 of 413 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/hu/
2026-02-27 14:10:14 +00:00
XapitonovandHosted Weblate 6a28a10991 Translated using Weblate (Russian)
Currently translated at 100.0% (19 of 19 strings)

Translation: Calibre Web Companion/metadata
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/metadata/ru/
2026-02-27 14:10:13 +00:00
XapitonovandHosted Weblate f8f8c74e3d Translated using Weblate (Russian)
Currently translated at 100.0% (413 of 413 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ru/
2026-02-27 14:10:11 +00:00
DanielandGitHub 683d123199 Merge pull request #129 from doen1el/dev
v1.8.7
2026-02-27 09:36:42 +01:00
Daniel 39645fe603 Updated PlayStore pipeline 2026-02-27 09:19:41 +01:00
Daniel 46d5e586a8 Added Changelog 2026-02-27 08:45:16 +01:00
XapitonovandHosted Weblate 09a0de6579 Translated using Weblate (Russian)
Currently translated at 99.5% (405 of 407 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ru/
2026-02-26 12:21:26 +00:00
Daniel 2ddebfc5bf Added option to disable animations for eink devices (Options to reduce animation
Fixes #127)
2026-02-24 22:32:45 +01:00
Daniel e9c1f6d37c Added ability to delete books from book details page (deleting from server?
Fixes #128)
2026-02-24 22:18:45 +01:00
Daniel af9477da4b Updated version code 2026-02-24 22:00:07 +01:00
Márton KónyaandHosted Weblate 70be7d7067 Translated using Weblate (Hungarian)
Currently translated at 100.0% (407 of 407 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/hu/
2026-02-22 15:09:51 +00:00
DanielandGitHub 2e2d000d6c Merge pull request #126 from doen1el/dev
v1.8.6
2026-02-20 16:30:22 +01:00
Daniel d04dcf38bf Added: Changelog 2026-02-20 15:16:35 +01:00
Daniel 38264c31cb Updated: Version Code 2026-02-20 15:13:30 +01:00
Daniel a83fa2e680 Updated: Set default download option to english (shelfmark) 2026-02-20 15:11:53 +01:00
Daniel 872dc6f42b You can now hide the "Send to Ereader button" (Send to E-reader
Fixes #125)
2026-02-20 11:23:22 +01:00
Daniel a0e2e8abf6 Added: Russian Language support 2026-02-20 11:09:31 +01:00
Daniel bfe826caaa Updated for new calibre db format ("No books found"
Fixes #123 and No books found and limited authors and other categories
Fixes #124)
2026-02-20 11:03:28 +01:00
XapitonovandHosted Weblate a91f6e9f64 Translated using Weblate (Russian)
Currently translated at 100.0% (405 of 405 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ru/
2026-02-14 08:09:58 +01:00
XapitonovandHosted Weblate 99d3d03825 Translated using Weblate (Russian)
Currently translated at 100.0% (18 of 18 strings)

Translation: Calibre Web Companion/metadata
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/metadata/ru/
2026-02-14 08:09:50 +01:00
XapitonovandHosted Weblate a66b9d849b Added translation using Weblate (Russian) 2026-02-13 06:52:28 +01:00
Michele AbbondanzaandHosted Weblate c5b12bc191 Translated using Weblate (Italian)
Currently translated at 99.5% (403 of 405 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/it/
2026-02-11 12:09:47 +01:00
Márton KónyaandHosted Weblate 3714378ad9 Translated using Weblate (Hungarian)
Currently translated at 27.7% (5 of 18 strings)

Translation: Calibre Web Companion/metadata
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/metadata/hu/
2026-02-11 12:09:46 +01:00
Michele AbbondanzaandHosted Weblate 21da1211da Translated using Weblate (Italian)
Currently translated at 97.5% (395 of 405 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/it/
2026-02-05 07:01:49 +01:00
Márton KónyaandHosted Weblate 7a09c312f2 Translated using Weblate (Hungarian)
Currently translated at 100.0% (405 of 405 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/hu/
2026-02-02 12:02:04 +01:00
RubensandHosted Weblate 039fc46797 Translated using Weblate (Catalan)
Currently translated at 100.0% (405 of 405 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ca/
2026-02-02 12:02:03 +01:00
DanielandGitHub 30d93e6074 Merge pull request #120 from doen1el/dev
v1.8.5
2026-02-01 10:54:43 +00:00
Daniel 833ff65c81 Fixed shelf details bug (Books don't look belonging to a shelf while they do #113) + updated version code + changelog 2026-02-01 11:32:52 +01:00
Daniel fd8a7109c4 Add ability to fast switch accounts (Could you consider adding a feature to easily switch between multiple Calibre-web libraries (e.g., two or three)? #117) 2026-02-01 10:46:22 +01:00
Daniel 22668cb851 added authorSort download path option (Feature Request : Add Author_Sort as option for download destination #119) 2026-01-31 21:43:49 +01:00
Daniel dfd4636b64 Fixed read status flag problem in book details view (Book read flag not working #116) 2026-01-31 21:20:36 +01:00
Daniel c8bc147546 added read status indicator on the book view page (Book read flag not working #116) 2026-01-31 21:11:48 +01:00
Daniel c516400c2d Added catalan support (Added Catalan Translation #115) 2026-01-31 14:28:57 +01:00
Daniel 7ad6a3fbc4 Sync feature will now query avaible formats from server (Add support for kepub files #114) 2026-01-31 14:26:07 +01:00
Daniel 90574f5b6f Fixed ios build ([FR] iOS ipa for sideload #118) 2026-01-31 14:16:55 +01:00
RubensandHosted Weblate 08e14547f2 Translated using Weblate (Catalan)
Currently translated at 100.0% (395 of 395 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/ca/
2026-01-26 14:31:27 +01:00
RubensandHosted Weblate 4dea376d7c Added translation using Weblate (Catalan) 2026-01-26 05:51:39 +00:00
Daniel 7bdb4b8006 fix for google play 2026-01-25 15:34:19 +01:00
DanielandGitHub d33e383409 Merge pull request #112 from doen1el/dev
v1.8.4
2026-01-25 12:19:15 +00:00
Daniel b90fb0b70b updated readme 2026-01-25 12:57:20 +01:00
Daniel 49bc624887 updated version code 2026-01-25 12:56:52 +01:00
Daniel f4a95ef5b1 Added Library Sync feature (Feature request: Bulk downloads for offline libraries #107) 2026-01-25 12:40:34 +01:00
Daniel 3a88af9b12 added check, if book is already downloaded 2026-01-24 23:17:35 +01:00
Daniel 5c0429dcf2 added better error feedback when book details couldnt be loaded (ISBN only books #109) 2026-01-24 13:28:58 +01:00
Daniel 850f85db97 fixed booklore issue when reopening the app after a while (XML2Json #100) 2026-01-20 15:38:11 +01:00
Daniel 9806ebb5b7 fixed authentication issue when using shelfmark (Support Calibre Web Automated Book Downloader username/password authentication #94) 2026-01-20 14:48:27 +01:00
Daniel eb2c475241 added hungarian + swedish + turkish languages (No Hungarian language in settings #108) 2026-01-20 13:48:01 +01:00
Daniel WiikandHosted Weblate 70fbff7b9b Translated using Weblate (Swedish)
Currently translated at 100.0% (369 of 369 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/sv/
2026-01-16 21:01:56 +00:00
Daniel WiikandHosted Weblate e820116fbe Translated using Weblate (Swedish)
Currently translated at 60.0% (9 of 15 strings)

Translation: Calibre Web Companion/metadata
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/metadata/sv/
2026-01-16 21:01:49 +00:00
Daniel WiikandHosted Weblate 832c57a5a5 Added translation using Weblate (Swedish) 2026-01-15 21:07:20 +01:00
Daniel b23befd4a5 changed the name of CWABD to Shelfmark 2026-01-14 14:41:58 +01:00
DanielandGitHub 2d1c7f4b90 Merge pull request #105 from doen1el/dev
v1.8.3
2026-01-09 23:08:55 +00:00
Daniel 952740430c Hotfix: Internal Epub Reader Crash Fixes 2026-01-09 23:48:26 +01:00
DanielandGitHub df80c5a8fa Merge pull request #104 from doen1el/dev
v1.8.2
2026-01-09 21:56:41 +00:00
Daniel 06b6281cbc added changelog + updated version code 2026-01-09 22:35:20 +01:00
Daniel f9496e053d Downloader filters are now persistant across app restarts (Downloader defaults to German on startup #103) 2026-01-09 21:30:02 +01:00
Daniel 62417f3369 Fixed that users without upload permission can now send books via email (Can't send by mail if user doesn't have right to upload books #101) 2026-01-09 21:06:18 +01:00
Daniel c944f37d52 Fixed duplicate books bug on book view page (Book list show first 20 books twice #102) 2026-01-09 20:58:36 +01:00
Bora AtıcıandHosted Weblate 787d034ef6 Translated using Weblate (Turkish)
Currently translated at 16.5% (61 of 369 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/tr/
2026-01-09 20:56:25 +01:00
Márton KónyaandHosted Weblate 5229fa0bc8 Translated using Weblate (Hungarian)
Currently translated at 23.0% (3 of 13 strings)

Translation: Calibre Web Companion/metadata
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/metadata/hu/
2026-01-09 20:56:24 +01:00
Márton KónyaandHosted Weblate 9b6dc066be Translated using Weblate (Hungarian)
Currently translated at 98.9% (365 of 369 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/hu/
2026-01-09 03:52:42 +01:00
Márton KónyaandHosted Weblate 8a9456f3e8 Added translation using Weblate (Hungarian) 2026-01-09 01:26:00 +01:00
Priit JõerüütandHosted Weblate b6245a34ca Translated using Weblate (Estonian)
Currently translated at 20.8% (77 of 369 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/et/
2026-01-07 04:01:54 +00:00
Daniel cc9e3f831d some minor csrf improvements 2026-01-06 16:26:34 +01:00
Daniel 52162aec81 Maybe fixed: F-Droid build failed #98 2026-01-05 14:34:13 +01:00
Daniel cc1764c55d added better feedback when trying to read PDFs with the internal reader since it does not support them (FormatException when reading pdf books #97) 2026-01-05 13:49:30 +01:00
Daniel 8e6ee13849 downloaders config will now be fetched directly after setting up url (CWA DL 401 Error #64) 2026-01-05 13:22:43 +01:00
Michele AbbondanzaandHosted Weblate da5826a74b Translated using Weblate (Italian)
Currently translated at 100.0% (364 of 364 strings)

Translation: Calibre Web Companion/app
Translate-URL: https://hosted.weblate.org/projects/calibre-web-companion/app/it/
2026-01-05 13:08:57 +01:00
Daniel ae88a8abae added ability to change reading direction in the settings (Ebook reader to horizontal page slider? #96) 2026-01-05 13:08:37 +01:00
602 changed files with 44139 additions and 18140 deletions
+35
View File
@@ -0,0 +1,35 @@
#!/usr/bin/env bash
# Generates a Play Store "What's New" directory from the Fastlane changelogs of
# the current versionCode.
set -euo pipefail
VERSION_CODE="${1:?versionCode required}"
OUT_DIR="${2:-distribution/whatsnew}"
META_DIR="fastlane/metadata/android"
MAX_LEN=500
rm -rf "$OUT_DIR"
mkdir -p "$OUT_DIR"
found=0
for dir in "$META_DIR"/*/; do
locale="$(basename "$dir")"
changelog="${dir}changelogs/${VERSION_CODE}.txt"
[[ -f "$changelog" ]] || continue
text="$(cat "$changelog")"
if [[ "${#text}" -gt "$MAX_LEN" ]]; then
echo "::warning::Changelog for $locale ($VERSION_CODE) is ${#text} chars (>$MAX_LEN); truncating."
text="${text:0:$((MAX_LEN - 10))}..."
fi
printf '%s' "$text" > "$OUT_DIR/whatsnew-${locale}"
echo " $locale -> whatsnew-${locale}"
found=$((found + 1))
done
if [[ "$found" -eq 0 ]]; then
echo "::warning::No Fastlane changelogs found for versionCode $VERSION_CODE."
fi
echo "Generated $found What's-New file(s) in $OUT_DIR"
+53 -9
View File
@@ -14,19 +14,21 @@ jobs:
#1 Checkout Repository
- name: Checkout Repository
uses: actions/checkout@v4
with:
fetch-depth: 0
#2 Setup Java
- name: Set Up Java
uses: actions/setup-java@v3.12.0
with:
distribution: 'oracle'
distribution: 'temurin'
java-version: '17'
#3 Setup Flutter
- name: Set Up Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.38.5'
flutter-version: '3.44.2'
channel: 'stable'
#4 Install Dependencies
@@ -57,6 +59,23 @@ jobs:
- name: Build APKs (Split per ABI)
run: flutter build apk --release --split-per-abi --no-tree-shake-icons
#6.3 Version + previous tag (used by Play changelogs and release notes)
- name: Extract version and previous tag
id: version
run: |
full=$(grep '^version: ' pubspec.yaml | cut -d ' ' -f 2 | tr -d '\r ')
version="${full%%+*}"
code="${full##*+}"
prev_tag=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
echo "VERSION=$version" >> "$GITHUB_ENV"
echo "VERSION_CODE=$code" >> "$GITHUB_ENV"
echo "PREV_TAG=$prev_tag" >> "$GITHUB_ENV"
echo "Version $version (code $code), previous tag: '${prev_tag:-none}'"
#6.4 Generate Play Store "What's New" from the Fastlane changelogs
- name: Generate Play Store changelogs
run: bash .github/scripts/generate_whatsnew.sh "$VERSION_CODE"
#7 Upload to Play Store
- name: Upload to Google Play
uses: r0adkll/upload-google-play@v1
@@ -64,9 +83,10 @@ jobs:
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
packageName: de.doen1el.calibreWebCompanion
releaseFiles: build/app/outputs/bundle/release/app-release.aab
track: production
tracks: production
status: completed
releaseName: 'Release ${{ github.run_number }}'
whatsNewDirectory: distribution/whatsnew
# #8 Build iOS (.app)
# - name: Build iOS (Unsigned)
@@ -87,12 +107,36 @@ jobs:
path: |
build/app/outputs/flutter-apk/*.apk
#11 Extract Version
- name: Extract version from pubspec.yaml
id: extract_version
#11 Build the GitHub release body from the fastlane changelog and template
- name: Build release notes
run: |
version=$(grep '^version: ' pubspec.yaml | cut -d ' ' -f 2 | tr -d '\r' | sed 's/+.*//')
echo "VERSION=$version" >> $GITHUB_ENV
changelog="fastlane/metadata/android/en-US/changelogs/${VERSION_CODE}.txt"
{
echo "## v${VERSION}"
echo
echo "_TODO: Write a short summary of this release._"
echo
echo "Special thanks to:"
echo "_TODO: @mention the contributors_"
echo
echo "And everyone else who created issues! ❤️"
echo
echo "## What's Changed"
if [ -f "$changelog" ]; then
# Normalise trailing newlines so the next heading renders.
printf '%s\n' "$(cat "$changelog")"
else
echo "- _No changelog found for build ${VERSION_CODE}._"
fi
echo
if [ -n "$PREV_TAG" ]; then
echo
echo "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${PREV_TAG}...v${VERSION}"
fi
echo "## 📥 Download"
} > release_notes.md
echo "----- release_notes.md -----"
cat release_notes.md
#12 Create GitHub Release
- name: Create Release Draft
@@ -103,4 +147,4 @@ jobs:
draft: true
token: ${{ secrets.TOKEN }}
name: 'Release v${{ env.VERSION }}'
generateReleaseNotes: true
bodyFile: release_notes.md
+26
View File
@@ -0,0 +1,26 @@
name: 'Mirror to Codeberg'
on:
push:
branches:
- '**'
tags:
- '**'
jobs:
mirror:
name: Mirror to Codeberg
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Push to Codeberg
uses: yesolutions/mirror-action@master
with:
REMOTE: 'https://codeberg.org/doen1el/calibre-web-companion.git'
GIT_USERNAME: doen1el
GIT_PASSWORD: ${{ secrets.CODEBERG_TOKEN }}
+6
View File
@@ -46,3 +46,9 @@ app.*.map.json
*.jks
de.doen1el.calibreWebCompanion.yml
# Don't track generated localization files
lib/l10n/app_localizations*.dart
test/test_env.dart
release_notes.md
distribution/whatsnew/
+30 -27
View File
@@ -1,12 +1,18 @@
> [!CAUTION]
> ‼️ Android will become a locked-down platform. Learn more: https://keepandroidopen.org/
<p align="center">
<img src="docs/icon/icon.png" alt="App Icon" width="100" />
<br>
v1.8.1
v2.2.2
</p>
<p align="center">
<a href="https://github.com/doen1el/calibre-web-companion/releases">
<img src="https://img.shields.io/github/downloads/doen1el/calibre-web-companion/total?color=green&label=github%20downloads" alt="GitHub all releases">
<img src="https://img.shields.io/github/downloads/doen1el/calibre-web-companion/total?color=green&label=Downloads%20(GitHub)" alt="GitHub all releases">
</a>
<a href="https://f-droid.org/en/packages/de.doen1el.calibreWebCompanion/" >
<img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgithub.com%2Fkitswas%2Ffdroid-metrics-dashboard%2Fraw%2Frefs%2Fheads%2Fmain%2Fprocessed%2Ftotal%2Fde.doen1el.calibreWebCompanion.json&query=%24.total_downloads&logo=fdroid&label=Downloads%20(F-Droid)">
</a>
<a href="https://github.com/doen1el/calibre-web-companion/releases">
<img src="https://img.shields.io/github/v/release/doen1el/calibre-web-companion?color=green&label=download&sort=semver" alt="GitHub release (latest SemVer)">
@@ -17,11 +23,14 @@
<a href="https://hosted.weblate.org/engage/calibre-web-companion/">
<img src="https://hosted.weblate.org/widget/calibre-web-companion/svg-badge.svg" alt="Translation status" />
</a>
<a href="https://codeberg.org/doen1el/calibre-web-companion">
<img src="https://img.shields.io/badge/mirror-Codeberg-2185D0?logo=codeberg&logoColor=white" alt="Codeberg mirror">
</a>
</p>
# Calibre Web Companion
This is an unofficial companion application for [Calibre Web](https://github.com/janeczku/calibre-web) (which also works for [Calibre Web Automated](https://github.com/crocodilestick/Calibre-Web-Automated)) that allows you to browse your book collection and download books directly to your device. You can also interact with your books by marking them as read, unread or bookmarked. It is also possible to send books directly to your e-reader (Kindle/Kobo) thanks to the great work of [send2ereader](https://github.com/daniel-j/send2ereader).
This is an unofficial companion application for [Calibre Web](https://github.com/janeczku/calibre-web) (which also works for [Calibre Web Automated](https://github.com/crocodilestick/Calibre-Web-Automated), [Grimmory](https://github.com/grimmory-tools/grimmory), [Calibre 'Sharing over the net'](https://github.com/kovidgoyal/calibre) and other OPDS providers (beta)), that allows you to browse your book collection and download books directly to your device. You can also interact with your books by marking them as read, unread or bookmarked. It is also possible to send books directly to your e-reader (Kindle/Kobo) thanks to the great work of [send2ereader](https://github.com/daniel-j/send2ereader).
The app is built with [Flutter](https://github.com/flutter/flutter) and uses **Material You**. It is currently available for **Android** only.
@@ -44,18 +53,21 @@ The app is built with [Flutter](https://github.com/flutter/flutter) and uses **M
## 💪 Features
- Log into your Calibre Web (Automated) server.
- Enjoy seamless navigation through your book collection.
- Explore books organized by various categories, such as author, series, trending, and more.
- View detailed information about each book.
- Easily mark books as read or unread, organize them into shelves, or archive them.
- Access comprehensive collection statistics at a glance.
- Download books directly onto your device.
- Instantly send books to your e-reader using [send2ereader](https://github.com/daniel-j/send2ereader) or via Calibre Web's mail function. You can also use your own send2ereader instance.
- Automatically download books to your collection with [calibre-web-automated-book-downloader](https://github.com/calibrain/calibre-web-automated-book-downloader).
- Manage and customize your shelves.
- Upload books to your Calibre Web server.
- Edit your book's metadata and upload new covers.
- Connect to your Calibre-Web (Automated), Grimmory, Calibre and OPDS servers, including reverse proxy/SSO setups, custom HTTP headers and self-signed certificates.
- Browse your whole library with smooth, fast navigation.
- Discover books by category, authors, series, publishers, ratings, hot & trending, and more.
- View rich details for every book, edit its metadata, and upload new covers.
- Mark books as read or unread, archive them, and organize them into shelves.
- Create, edit and browse Magic Shelves, dynamic, rulebased shelves (CalibreWeb Automated only).
- Add books quickly by scanning their ISBN barcode.
- Read books in the builtin eBook reader and sync your reading progress across devices via WebDAV.
- Send books to your ereader via [send2ereader](https://github.com/daniel-j/send2ereader) (or your own instance) or CalibreWeb's email function.
- Download books straight into your collection with [shelfmark](https://github.com/calibrain/shelfmark).
- ⚠️ This app does **not** support, encourage or facilitate the piracy of copyrighted works. Please only download content you are legally entitled to, respecting copyright is your responsibility.
- Upload books to your CalibreWeb server.
- Sync your whole library or selected books for offline reading.
- Check your collection statistics at a glance.
- Make it yours: reorder or hide book actions, detail sections and Discover sections, choose a theme, enable eink mode, and adjust the text size, available in 15 languages.
## 🖼️ Impressions
@@ -80,24 +92,15 @@ You can help translate Calibre Web Companion on [Weblate](https://hosted.weblate
You can of course open issues for bugs, feedback, and feature ideas. All suggestions are very welcome :)
## 🚧 Roadmap
- [x] Add localization
- [x] Add dark mode
- [x] Toggle read/unread status
- [x] Add bookmark function
- [x] Calibre Web Automated Download integration
- [x] Add and remove from shelfs
- [x] Code refactoring
- [x] Better error handling
- [x] Integrate [Weblate](https://hosted.weblate.org/) for translations
The source code is also mirrored on [Codeberg](https://codeberg.org/doen1el/calibre-web-companion). GitHub remains the primary repository, so please open issues and pull requests here.
## 📜 Credits
- [Calibre Web](https://github.com/janeczku/calibre-web)
- [Calibre Web Automated](https://github.com/crocodilestick/Calibre-Web-Automated)
- [calibre-web-automated-book-downloader](https://github.com/calibrain/calibre-web-automated-book-downloader)
- [shelfmark](https://github.com/calibrain/shelfmark)
- [send2ereader](https://github.com/daniel-j/send2ereader)
- [Flutter](https://github.com/flutter/flutter)
- [IconKitchen](https://icon.kitchen)
- [Weblate](https://hosted.weblate.org/)
- [CosmosEpub](https://github.com/Mamasodikov/cosmos_epub)
+4
View File
@@ -9,6 +9,10 @@
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
analyzer:
exclude:
- packages/**
linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
+21 -3
View File
@@ -29,7 +29,7 @@ require(detStorePassword != null) { "storePassword not found in key.properties f
android {
namespace = "de.doen1el.calibreWebCompanion"
compileSdk = 36
ndkVersion = "27.0.12077973"
ndkVersion = "28.2.13676358"
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
@@ -61,10 +61,28 @@ android {
}
buildTypes {
getByName("debug") {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
isDebuggable = true
}
getByName("release") {
signingConfig = signingConfigs.getByName("release")
isMinifyEnabled = false
isShrinkResources = false
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
}
+43
View File
@@ -0,0 +1,43 @@
-keep class com.vocsy.epub_viewer.** { *; }
-keep class com.fasterxml.jackson.** { *; }
-keepnames class com.fasterxml.jackson.** { *; }
-dontwarn java.beans.**
-dontwarn javax.xml.**
-dontwarn org.w3c.dom.bootstrap.**
-keep class com.folioreader.** { *; }
-keep interface com.folioreader.** { *; }
-dontwarn org.joda.convert.**
-dontwarn org.joda.time.**
-keep class org.greenrobot.eventbus.** { *; }
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
-keep class retrofit2.** { *; }
-dontwarn retrofit2.**
-keep class okhttp3.** { *; }
-dontwarn okhttp3.**
-dontwarn okio.**
-keep class androidx.** { *; }
-keep interface androidx.** { *; }
-dontwarn androidx.**
-dontwarn com.google.android.play.**
-keep class org.readium.** { *; }
-keepclassmembers class org.readium.** {
public <init>();
}
-keep class org.nanohttpd.** { *; }
-keepclassmembers class org.nanohttpd.** {
public <init>();
}
+70 -14
View File
@@ -2,14 +2,13 @@
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<application
android:label="Calibre Web Companion"
android:name="${applicationName}"
@@ -28,10 +27,6 @@
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
@@ -41,17 +36,78 @@
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<receiver
android:name=".CurrentBookWidgetProvider"
android:exported="true"
android:label="@string/widget_current_book_label">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/current_book_widget_info" />
</receiver>
<receiver
android:name=".LibraryStatsWidgetProvider"
android:exported="true"
android:label="@string/widget_stats_label">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/library_stats_widget_info" />
</receiver>
<receiver
android:name=".ShelfWidgetProvider"
android:exported="true"
android:label="@string/widget_shelf_label">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/shelf_widget_info" />
</receiver>
<receiver
android:name=".QuickActionsWidgetProvider"
android:exported="true"
android:label="@string/widget_quick_actions_label">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/quick_actions_widget_info" />
</receiver>
<service
android:name=".ShelfWidgetService"
android:exported="false"
android:permission="android.permission.BIND_REMOTEVIEWS" />
<receiver
android:name="es.antonborri.home_widget.HomeWidgetBackgroundReceiver"
android:exported="true">
<intent-filter>
<action android:name="es.antonborri.home_widget.action.BACKGROUND" />
</intent-filter>
</receiver>
<service
android:name="es.antonborri.home_widget.HomeWidgetBackgroundService"
android:exported="false"
android:permission="android.permission.BIND_JOB_SERVICE" />
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
<!-- Required to query activities that can process text, see:
https://developer.android.com/training/package-visibility and
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
<queries>
<intent>
<action android:name="android.intent.action.PROCESS_TEXT"/>
@@ -0,0 +1,79 @@
package de.doen1el.calibreWebCompanion
import android.appwidget.AppWidgetManager
import android.content.Context
import android.content.SharedPreferences
import android.net.Uri
import android.view.View
import android.widget.RemoteViews
import es.antonborri.home_widget.HomeWidgetLaunchIntent
import es.antonborri.home_widget.HomeWidgetProvider
import java.io.File
class CurrentBookWidgetProvider : HomeWidgetProvider() {
override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray,
widgetData: SharedPreferences
) {
for (widgetId in appWidgetIds) {
val views = RemoteViews(context.packageName, R.layout.widget_current_book)
val uuid = widgetData.getString("cb_uuid", "") ?: ""
val title = widgetData.getString("cb_title", "") ?: ""
val authors = widgetData.getString("cb_authors", "") ?: ""
val coverPath = widgetData.getString("cb_cover", "") ?: ""
val progress = (widgetData.getString("cb_progress", "0") ?: "0").toIntOrNull() ?: 0
if (uuid.isEmpty()) {
views.setViewVisibility(R.id.widget_empty, View.VISIBLE)
views.setViewVisibility(R.id.widget_content, View.GONE)
} else {
views.setViewVisibility(R.id.widget_empty, View.GONE)
views.setViewVisibility(R.id.widget_content, View.VISIBLE)
views.setTextViewText(R.id.widget_title, title)
views.setTextViewText(R.id.widget_authors, authors)
val decoded =
if (coverPath.isNotEmpty() && File(coverPath).exists()) {
WidgetImages.decodeScaledCover(coverPath)
} else {
null
}
if (decoded != null) {
val radius = 10f * context.resources.displayMetrics.density
views.setImageViewBitmap(
R.id.widget_cover,
WidgetImages.roundBitmap(decoded, radius)
)
} else {
views.setImageViewResource(R.id.widget_cover, R.drawable.widget_cover_placeholder)
}
if (progress in 1..99) {
views.setViewVisibility(R.id.widget_percent_container, View.VISIBLE)
views.setTextViewText(R.id.widget_percent, "$progress%")
} else {
views.setViewVisibility(R.id.widget_percent_container, View.GONE)
}
}
WidgetTheming.palette(context, widgetData)?.let { p ->
views.setInt(R.id.widget_bg, "setColorFilter", p.background)
views.setTextColor(R.id.widget_title, p.onBackground)
views.setTextColor(R.id.widget_empty, p.onBackground)
views.setTextColor(R.id.widget_authors, WidgetTheming.muted(p.onBackground))
views.setInt(R.id.widget_percent_bg, "setColorFilter", p.accent)
views.setTextColor(R.id.widget_percent, p.onAccent)
}
val uri = Uri.parse("calibrewebcompanion://widget/current?uuid=$uuid")
val pendingIntent =
HomeWidgetLaunchIntent.getActivity(context, MainActivity::class.java, uri)
views.setOnClickPendingIntent(R.id.widget_root, pendingIntent)
appWidgetManager.updateAppWidget(widgetId, views)
}
}
}
@@ -0,0 +1,67 @@
package de.doen1el.calibreWebCompanion
import android.appwidget.AppWidgetManager
import android.content.Context
import android.content.SharedPreferences
import android.net.Uri
import android.widget.RemoteViews
import es.antonborri.home_widget.HomeWidgetLaunchIntent
import es.antonborri.home_widget.HomeWidgetProvider
class LibraryStatsWidgetProvider : HomeWidgetProvider() {
override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray,
widgetData: SharedPreferences
) {
for (widgetId in appWidgetIds) {
val views = RemoteViews(context.packageName, R.layout.widget_library_stats)
views.setTextViewText(R.id.stat_books_value, widgetData.getString("st_books", "0"))
views.setTextViewText(R.id.stat_authors_value, widgetData.getString("st_authors", "0"))
views.setTextViewText(
R.id.stat_categories_value,
widgetData.getString("st_categories", "0")
)
views.setTextViewText(R.id.stat_series_value, widgetData.getString("st_series", "0"))
WidgetTheming.palette(context, widgetData)?.let { p ->
views.setInt(R.id.widget_bg, "setColorFilter", p.background)
views.setTextColor(R.id.stats_label, WidgetTheming.muted(p.onBackground))
for (tileBg in intArrayOf(
R.id.tile_bg_books,
R.id.tile_bg_authors,
R.id.tile_bg_categories,
R.id.tile_bg_series
)) {
views.setInt(tileBg, "setColorFilter", p.tile)
}
for (value in intArrayOf(
R.id.stat_books_value,
R.id.stat_authors_value,
R.id.stat_categories_value,
R.id.stat_series_value
)) {
views.setTextColor(value, p.onTile)
}
for (label in intArrayOf(
R.id.stat_books_label,
R.id.stat_authors_label,
R.id.stat_categories_label,
R.id.stat_series_label
)) {
views.setTextColor(label, WidgetTheming.muted(p.onTile))
}
}
val uri = Uri.parse("calibrewebcompanion://widget/stats")
val pendingIntent =
HomeWidgetLaunchIntent.getActivity(context, MainActivity::class.java, uri)
views.setOnClickPendingIntent(R.id.stats_root, pendingIntent)
appWidgetManager.updateAppWidget(widgetId, views)
}
}
}
@@ -1,5 +1,32 @@
package de.doen1el.calibreWebCompanion
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import es.antonborri.home_widget.HomeWidgetLaunchIntent
import io.flutter.embedding.android.FlutterActivity
class MainActivity : FlutterActivity()
class MainActivity : FlutterActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
restoreWidgetUri(intent)
super.onCreate(savedInstanceState)
}
override fun onNewIntent(intent: Intent) {
restoreWidgetUri(intent)
super.onNewIntent(intent)
}
private fun restoreWidgetUri(intent: Intent?) {
if (intent == null) return
if (intent.action != HomeWidgetLaunchIntent.HOME_WIDGET_LAUNCH_ACTION) return
if (intent.data != null) return
val uri = intent.getStringExtra(EXTRA_WIDGET_URI) ?: return
intent.data = Uri.parse(uri)
}
companion object {
const val EXTRA_WIDGET_URI = "widget_uri"
}
}
@@ -0,0 +1,69 @@
package de.doen1el.calibreWebCompanion
import android.appwidget.AppWidgetManager
import android.content.Context
import android.content.SharedPreferences
import android.net.Uri
import android.view.View
import android.widget.RemoteViews
import es.antonborri.home_widget.HomeWidgetLaunchIntent
import es.antonborri.home_widget.HomeWidgetProvider
class QuickActionsWidgetProvider : HomeWidgetProvider() {
private data class Action(
val slotId: Int,
val tileId: Int,
val iconId: Int,
val labelId: Int,
val key: String
)
private val actions = listOf(
Action(R.id.qa_slot_search, R.id.qa_tile_search, R.id.qa_icon_search, R.id.qa_label_search, "search"),
Action(R.id.qa_slot_scan, R.id.qa_tile_scan, R.id.qa_icon_scan, R.id.qa_label_scan, "scan"),
Action(R.id.qa_slot_read, R.id.qa_tile_read, R.id.qa_icon_read, R.id.qa_label_read, "read"),
Action(R.id.qa_slot_downloads, R.id.qa_tile_downloads, R.id.qa_icon_downloads, R.id.qa_label_downloads, "downloads")
)
override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray,
widgetData: SharedPreferences
) {
val downloadsEnabled = widgetData.getString("qa_downloads", "0") == "1"
val palette = WidgetTheming.palette(context, widgetData)
for (widgetId in appWidgetIds) {
val views = RemoteViews(context.packageName, R.layout.widget_quick_actions)
palette?.let { views.setInt(R.id.widget_bg, "setColorFilter", it.background) }
for (action in actions) {
if (action.key == "downloads" && !downloadsEnabled) {
views.setViewVisibility(action.slotId, View.GONE)
continue
}
views.setViewVisibility(action.slotId, View.VISIBLE)
views.setOnClickPendingIntent(
action.slotId,
HomeWidgetLaunchIntent.getActivity(
context,
MainActivity::class.java,
Uri.parse("calibrewebcompanion://widget/action?do=${action.key}")
)
)
palette?.let { p ->
views.setInt(action.tileId, "setColorFilter", p.tile)
views.setInt(action.iconId, "setColorFilter", p.onTile)
views.setTextColor(action.labelId, p.onBackground)
}
}
appWidgetManager.updateAppWidget(widgetId, views)
}
}
}
@@ -0,0 +1,79 @@
package de.doen1el.calibreWebCompanion
import android.app.PendingIntent
import android.appwidget.AppWidgetManager
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.net.Uri
import android.widget.RemoteViews
import es.antonborri.home_widget.HomeWidgetBackgroundIntent
import es.antonborri.home_widget.HomeWidgetLaunchIntent
import es.antonborri.home_widget.HomeWidgetProvider
class ShelfWidgetProvider : HomeWidgetProvider() {
override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray,
widgetData: SharedPreferences
) {
for (widgetId in appWidgetIds) {
val views = RemoteViews(context.packageName, R.layout.widget_shelf)
val title = widgetData.getString("sh_title", "") ?: ""
views.setTextViewText(
R.id.shelf_title,
if (title.isEmpty()) context.getString(R.string.widget_shelf_recent) else title
)
val adapterIntent = Intent(context, ShelfWidgetService::class.java).apply {
putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId)
// Makes the intent unique per widget so each keeps its own adapter.
data = Uri.parse(toUri(Intent.URI_INTENT_SCHEME))
}
views.setRemoteAdapter(R.id.shelf_grid, adapterIntent)
views.setEmptyView(R.id.shelf_grid, R.id.shelf_empty)
val template = Intent(context, MainActivity::class.java).apply {
action = HomeWidgetLaunchIntent.HOME_WIDGET_LAUNCH_ACTION
}
views.setPendingIntentTemplate(
R.id.shelf_grid,
PendingIntent.getActivity(
context,
0,
template,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
)
)
WidgetTheming.palette(context, widgetData)?.let { p ->
views.setInt(R.id.widget_bg, "setColorFilter", p.background)
views.setTextColor(R.id.shelf_title, p.onBackground)
views.setTextColor(R.id.shelf_empty, WidgetTheming.muted(p.onBackground))
views.setInt(R.id.shelf_refresh, "setColorFilter", p.accent)
}
// Reloads the shelf in a background isolate, without opening the app.
val refresh = HomeWidgetBackgroundIntent.getBroadcast(
context,
Uri.parse("calibrewebcompanion://widget/refresh")
)
views.setOnClickPendingIntent(R.id.shelf_refresh, refresh)
views.setOnClickPendingIntent(R.id.shelf_empty, refresh)
views.setOnClickPendingIntent(
R.id.shelf_header,
HomeWidgetLaunchIntent.getActivity(
context,
MainActivity::class.java,
Uri.parse("calibrewebcompanion://widget/shelf")
)
)
appWidgetManager.updateAppWidget(widgetId, views)
appWidgetManager.notifyAppWidgetViewDataChanged(widgetId, R.id.shelf_grid)
}
}
}
@@ -0,0 +1,122 @@
package de.doen1el.calibreWebCompanion
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.widget.RemoteViews
import android.widget.RemoteViewsService
import es.antonborri.home_widget.HomeWidgetPlugin
import org.json.JSONArray
import java.io.File
import kotlin.math.sqrt
private const val MIN_COVER_DIMEN = 96
private const val MAX_COVER_DIMEN = 256
class ShelfWidgetService : RemoteViewsService() {
override fun onGetViewFactory(intent: Intent): RemoteViewsFactory =
ShelfRemoteViewsFactory(applicationContext)
}
private data class ShelfItem(
val uuid: String,
val title: String,
val authors: String,
val cover: String
)
private class ShelfRemoteViewsFactory(private val context: Context) :
RemoteViewsService.RemoteViewsFactory {
private var items: List<ShelfItem> = emptyList()
private var palette: WidgetTheming.Palette? = null
private var coverDimen: Int = MAX_COVER_DIMEN
override fun onCreate() = Unit
override fun onDataSetChanged() {
val data = HomeWidgetPlugin.getData(context)
items = parse(data.getString("sh_json", "") ?: "")
palette = WidgetTheming.palette(context, data)
coverDimen = coverDimenFor(items.size)
}
private fun coverDimenFor(count: Int): Int {
if (count <= 0) return MAX_COVER_DIMEN
val metrics = context.resources.displayMetrics
val hostLimit =
metrics.widthPixels.toLong() * metrics.heightPixels.toLong() * 4L * 3L / 2L
val perItem = hostLimit * 30 / 100 / count
val height = sqrt(perItem / 2.7).toInt()
return height.coerceIn(MIN_COVER_DIMEN, MAX_COVER_DIMEN)
}
override fun onDestroy() {
items = emptyList()
}
override fun getCount(): Int = items.size
override fun getViewAt(position: Int): RemoteViews {
val views = RemoteViews(context.packageName, R.layout.widget_shelf_item)
val item = items.getOrNull(position) ?: return views
views.setTextViewText(R.id.item_title, item.title)
views.setTextViewText(R.id.item_authors, item.authors)
views.setContentDescription(R.id.item_cover, item.title)
val decoded =
if (item.cover.isNotEmpty() && File(item.cover).exists()) {
WidgetImages.decodeScaledCover(item.cover, maxDimen = coverDimen)
} else {
null
}
if (decoded != null) {
val radius = 8f * context.resources.displayMetrics.density
views.setImageViewBitmap(R.id.item_cover, WidgetImages.roundBitmap(decoded, radius))
} else {
views.setImageViewResource(R.id.item_cover, R.drawable.widget_cover_placeholder)
}
palette?.let { p ->
views.setTextColor(R.id.item_title, p.onBackground)
views.setTextColor(R.id.item_authors, WidgetTheming.muted(p.onBackground))
}
val target = "calibrewebcompanion://widget/book?uuid=${item.uuid}"
views.setOnClickFillInIntent(
R.id.item_root,
Intent()
.setData(Uri.parse(target))
.putExtra(MainActivity.EXTRA_WIDGET_URI, target)
)
return views
}
override fun getLoadingView(): RemoteViews? = null
override fun getViewTypeCount(): Int = 1
override fun getItemId(position: Int): Long = position.toLong()
override fun hasStableIds(): Boolean = true
private fun parse(json: String): List<ShelfItem> {
if (json.isEmpty()) return emptyList()
return runCatching {
val array = JSONArray(json)
(0 until array.length()).mapNotNull { index ->
val entry = array.optJSONObject(index) ?: return@mapNotNull null
ShelfItem(
uuid = entry.optString("uuid"),
title = entry.optString("title"),
authors = entry.optString("authors"),
cover = entry.optString("cover")
)
}
}.getOrDefault(emptyList())
}
}
@@ -0,0 +1,47 @@
package de.doen1el.calibreWebCompanion
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.BitmapShader
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.RectF
import android.graphics.Shader
object WidgetImages {
fun decodeScaledCover(path: String, maxDimen: Int = 512): Bitmap? {
val bounds = BitmapFactory.Options().apply { inJustDecodeBounds = true }
BitmapFactory.decodeFile(path, bounds)
if (bounds.outWidth <= 0 || bounds.outHeight <= 0) return null
var sampleSize = 1
val longestEdge = maxOf(bounds.outWidth, bounds.outHeight)
while (longestEdge / sampleSize > maxDimen * 2) {
sampleSize *= 2
}
val options = BitmapFactory.Options().apply { inSampleSize = sampleSize }
val decoded = BitmapFactory.decodeFile(path, options) ?: return null
val longestDecoded = maxOf(decoded.width, decoded.height)
if (longestDecoded <= maxDimen) return decoded
val scale = maxDimen.toFloat() / longestDecoded
val width = (decoded.width * scale).toInt().coerceAtLeast(1)
val height = (decoded.height * scale).toInt().coerceAtLeast(1)
val scaled = Bitmap.createScaledBitmap(decoded, width, height, true)
if (scaled != decoded) decoded.recycle()
return scaled
}
fun roundBitmap(src: Bitmap, radius: Float): Bitmap {
val output = Bitmap.createBitmap(src.width, src.height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(output)
val paint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
shader = BitmapShader(src, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)
}
val rect = RectF(0f, 0f, src.width.toFloat(), src.height.toFloat())
canvas.drawRoundRect(rect, radius, radius, paint)
return output
}
}
@@ -0,0 +1,37 @@
package de.doen1el.calibreWebCompanion
import android.content.Context
import android.content.SharedPreferences
import android.content.res.Configuration
import android.graphics.Color
object WidgetTheming {
data class Palette(
val background: Int,
val onBackground: Int,
val tile: Int,
val onTile: Int,
val accent: Int,
val onAccent: Int
)
fun palette(context: Context, data: SharedPreferences): Palette? {
val night = (context.resources.configuration.uiMode and
Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES
val suffix = if (night) "dark" else "light"
val background = parse(data, "th_bg_$suffix") ?: return null
val onBackground = parse(data, "th_on_bg_$suffix") ?: return null
val tile = parse(data, "th_tile_$suffix") ?: background
val onTile = parse(data, "th_on_tile_$suffix") ?: onBackground
val accent = parse(data, "th_accent_$suffix") ?: onBackground
val onAccent = parse(data, "th_on_accent_$suffix") ?: background
return Palette(background, onBackground, tile, onTile, accent, onAccent)
}
fun muted(color: Int): Int = (color and 0x00FFFFFF) or (0xB3 shl 24)
private fun parse(data: SharedPreferences, key: String): Int? =
data.getString(key, null)?.let { runCatching { Color.parseColor(it) }.getOrNull() }
}
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF1A1C18"
android:pathData="M18,2H6c-1.1,0 -2,0.9 -2,2v16c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V4c0,-1.1 -0.9,-2 -2,-2zM6,4h5v8l-2.5,-1.5L6,12V4z" />
</vector>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF1A1C18"
android:pathData="M19,9h-4V3H9v6H5l7,7 7,-7zM5,18v2h14v-2H5z" />
</vector>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF1A1C18"
android:pathData="M17.65,6.35C16.2,4.9 14.21,4 12,4c-4.42,0 -7.99,3.58 -8,8s3.57,8 8,8c3.73,0 6.84,-2.55 7.73,-6h-2.08c-0.82,2.33 -3.04,4 -5.65,4 -3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6c1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z" />
</vector>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF1A1C18"
android:pathData="M3,5v4h2V5h4V3H5C3.9,3 3,3.9 3,5zM5,15H3v4c0,1.1 0.9,2 2,2h4v-2H5V15zM19,19h-4v2h4c1.1,0 2,-0.9 2,-2v-4h-2V19zM19,3h-4v2h4v4h2V5C21,3.9 20.1,3 19,3z" />
<path
android:fillColor="#FF1A1C18"
android:pathData="M4,11h16v2H4z" />
</vector>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF1A1C18"
android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z" />
</vector>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="20dp" />
<solid android:color="@color/widget_background" />
</shape>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="6dp" />
<solid android:color="@color/widget_tile_background" />
</shape>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="10dp" />
<solid android:color="#B3000000" />
</shape>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="14dp" />
<solid android:color="@color/widget_tile_background" />
</shape>
@@ -0,0 +1,97 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget_root"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/widget_bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@null"
android:scaleType="fitXY"
android:src="@drawable/widget_background" />
<LinearLayout
android:id="@+id/widget_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="8dp">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<ImageView
android:id="@+id/widget_cover"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/widget_current_book_label"
android:scaleType="centerCrop"
android:src="@drawable/widget_cover_placeholder" />
<FrameLayout
android:id="@+id/widget_percent_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|end"
android:layout_margin="6dp"
android:visibility="gone">
<ImageView
android:id="@+id/widget_percent_bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@null"
android:scaleType="fitXY"
android:src="@drawable/widget_percent_badge" />
<TextView
android:id="@+id/widget_percent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="7dp"
android:paddingTop="3dp"
android:paddingEnd="7dp"
android:paddingBottom="3dp"
android:textColor="#FFFFFFFF"
android:textSize="12sp"
android:textStyle="bold" />
</FrameLayout>
</FrameLayout>
<TextView
android:id="@+id/widget_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@color/widget_text_primary"
android:textSize="14sp"
android:textStyle="bold" />
<TextView
android:id="@+id/widget_authors"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/widget_text_secondary"
android:textSize="12sp" />
</LinearLayout>
<TextView
android:id="@+id/widget_empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:padding="12dp"
android:text="@string/widget_current_book_empty"
android:textColor="@color/widget_text_secondary"
android:textSize="13sp"
android:visibility="gone" />
</FrameLayout>
@@ -0,0 +1,202 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/stats_root"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/widget_bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@null"
android:scaleType="fitXY"
android:src="@drawable/widget_background" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="12dp">
<TextView
android:id="@+id/stats_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:layout_marginBottom="6dp"
android:text="@string/widget_stats_label"
android:textColor="@color/widget_text_secondary"
android:textSize="12sp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<FrameLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_margin="3dp"
android:layout_weight="1">
<ImageView
android:id="@+id/tile_bg_books"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@null"
android:scaleType="fitXY"
android:src="@drawable/widget_tile_background" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/stat_books_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textColor="@color/widget_text_primary"
android:textSize="22sp"
android:textStyle="bold" />
<TextView
android:id="@+id/stat_books_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/widget_stat_books"
android:textColor="@color/widget_text_secondary"
android:textSize="11sp" />
</LinearLayout>
</FrameLayout>
<FrameLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_margin="3dp"
android:layout_weight="1">
<ImageView
android:id="@+id/tile_bg_authors"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@null"
android:scaleType="fitXY"
android:src="@drawable/widget_tile_background" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/stat_authors_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textColor="@color/widget_text_primary"
android:textSize="22sp"
android:textStyle="bold" />
<TextView
android:id="@+id/stat_authors_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/widget_stat_authors"
android:textColor="@color/widget_text_secondary"
android:textSize="11sp" />
</LinearLayout>
</FrameLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<FrameLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_margin="3dp"
android:layout_weight="1">
<ImageView
android:id="@+id/tile_bg_categories"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@null"
android:scaleType="fitXY"
android:src="@drawable/widget_tile_background" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/stat_categories_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textColor="@color/widget_text_primary"
android:textSize="22sp"
android:textStyle="bold" />
<TextView
android:id="@+id/stat_categories_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/widget_stat_categories"
android:textColor="@color/widget_text_secondary"
android:textSize="11sp" />
</LinearLayout>
</FrameLayout>
<FrameLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_margin="3dp"
android:layout_weight="1">
<ImageView
android:id="@+id/tile_bg_series"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@null"
android:scaleType="fitXY"
android:src="@drawable/widget_tile_background" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/stat_series_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textColor="@color/widget_text_primary"
android:textSize="22sp"
android:textStyle="bold" />
<TextView
android:id="@+id/stat_series_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/widget_stat_series"
android:textColor="@color/widget_text_secondary"
android:textSize="11sp" />
</LinearLayout>
</FrameLayout>
</LinearLayout>
</LinearLayout>
</FrameLayout>
@@ -0,0 +1,186 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/qa_root"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/widget_bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@null"
android:scaleType="fitXY"
android:src="@drawable/widget_background" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="8dp">
<LinearLayout
android:id="@+id/qa_slot_search"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<FrameLayout
android:layout_width="44dp"
android:layout_height="44dp">
<ImageView
android:id="@+id/qa_tile_search"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@null"
android:scaleType="fitXY"
android:src="@drawable/widget_tile_background" />
<ImageView
android:id="@+id/qa_icon_search"
android:layout_width="22dp"
android:layout_height="22dp"
android:layout_gravity="center"
android:contentDescription="@string/widget_action_search"
android:src="@drawable/ic_widget_search" />
</FrameLayout>
<TextView
android:id="@+id/qa_label_search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/widget_action_search"
android:textColor="@color/widget_text_primary"
android:textSize="11sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/qa_slot_scan"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<FrameLayout
android:layout_width="44dp"
android:layout_height="44dp">
<ImageView
android:id="@+id/qa_tile_scan"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@null"
android:scaleType="fitXY"
android:src="@drawable/widget_tile_background" />
<ImageView
android:id="@+id/qa_icon_scan"
android:layout_width="22dp"
android:layout_height="22dp"
android:layout_gravity="center"
android:contentDescription="@string/widget_action_scan"
android:src="@drawable/ic_widget_scan" />
</FrameLayout>
<TextView
android:id="@+id/qa_label_scan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/widget_action_scan"
android:textColor="@color/widget_text_primary"
android:textSize="11sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/qa_slot_read"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<FrameLayout
android:layout_width="44dp"
android:layout_height="44dp">
<ImageView
android:id="@+id/qa_tile_read"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@null"
android:scaleType="fitXY"
android:src="@drawable/widget_tile_background" />
<ImageView
android:id="@+id/qa_icon_read"
android:layout_width="22dp"
android:layout_height="22dp"
android:layout_gravity="center"
android:contentDescription="@string/widget_action_read"
android:src="@drawable/ic_widget_book" />
</FrameLayout>
<TextView
android:id="@+id/qa_label_read"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/widget_action_read"
android:textColor="@color/widget_text_primary"
android:textSize="11sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/qa_slot_downloads"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<FrameLayout
android:layout_width="44dp"
android:layout_height="44dp">
<ImageView
android:id="@+id/qa_tile_downloads"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@null"
android:scaleType="fitXY"
android:src="@drawable/widget_tile_background" />
<ImageView
android:id="@+id/qa_icon_downloads"
android:layout_width="22dp"
android:layout_height="22dp"
android:layout_gravity="center"
android:contentDescription="@string/widget_action_downloads"
android:src="@drawable/ic_widget_download" />
</FrameLayout>
<TextView
android:id="@+id/qa_label_downloads"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/widget_action_downloads"
android:textColor="@color/widget_text_primary"
android:textSize="11sp" />
</LinearLayout>
</LinearLayout>
</FrameLayout>
@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/shelf_root"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/widget_bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@null"
android:scaleType="fitXY"
android:src="@drawable/widget_background" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="12dp">
<LinearLayout
android:id="@+id/shelf_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/shelf_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/widget_shelf_recent"
android:textColor="@color/widget_text_primary"
android:textSize="13sp"
android:textStyle="bold" />
<ImageView
android:id="@+id/shelf_refresh"
android:layout_width="20dp"
android:layout_height="20dp"
android:contentDescription="@string/widget_shelf_refresh"
android:src="@drawable/ic_widget_refresh" />
</LinearLayout>
<TextView
android:id="@+id/shelf_empty"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:padding="12dp"
android:text="@string/widget_shelf_empty"
android:textColor="@color/widget_text_secondary"
android:textSize="13sp"
android:visibility="gone" />
<GridView
android:id="@+id/shelf_grid"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:columnWidth="96dp"
android:horizontalSpacing="6dp"
android:numColumns="auto_fit"
android:stretchMode="columnWidth"
android:verticalSpacing="8dp" />
</LinearLayout>
</FrameLayout>
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="2dp"
android:paddingEnd="2dp">
<ImageView
android:id="@+id/item_cover"
android:layout_width="match_parent"
android:layout_height="130dp"
android:contentDescription="@null"
android:scaleType="centerCrop"
android:src="@drawable/widget_cover_placeholder" />
<TextView
android:id="@+id/item_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@color/widget_text_primary"
android:textSize="11sp"
android:textStyle="bold" />
<TextView
android:id="@+id/item_authors"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/widget_text_secondary"
android:textSize="10sp" />
</LinearLayout>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="widget_current_book_label">Aktuelles Buch</string>
<string name="widget_current_book_description">Zeigt das Buch, das du gerade liest</string>
<string name="widget_current_book_empty">Öffne ein Buch, um es hier zu sehen</string>
<string name="widget_stats_label">Bibliothek</string>
<string name="widget_stats_description">Deine Bibliothek auf einen Blick</string>
<string name="widget_stat_books">Bücher</string>
<string name="widget_stat_authors">Autoren</string>
<string name="widget_stat_categories">Kategorien</string>
<string name="widget_stat_series">Serien</string>
</resources>
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="widget_background">#FF1A1C18</color>
<color name="widget_tile_background">#FF2C2F27</color>
<color name="widget_text_primary">#FFE3E3DB</color>
<color name="widget_text_secondary">#FFC4C8BA</color>
</resources>
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="widget_background">#FFF7F7F4</color>
<color name="widget_tile_background">#FFE7E7E1</color>
<color name="widget_text_primary">#FF1A1C18</color>
<color name="widget_text_secondary">#FF44483D</color>
</resources>
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="widget_current_book_label">Current book</string>
<string name="widget_current_book_description">Shows the book you are currently reading</string>
<string name="widget_current_book_empty">Open a book to see it here</string>
<string name="widget_stats_label">Library</string>
<string name="widget_stats_description">Your library at a glance</string>
<string name="widget_stat_books">Books</string>
<string name="widget_stat_authors">Authors</string>
<string name="widget_stat_categories">Categories</string>
<string name="widget_stat_series">Series</string>
<string name="widget_shelf_label">Shelf</string>
<string name="widget_shelf_description">A grid of books from a shelf, the library or your downloads</string>
<string name="widget_shelf_recent">Recently added</string>
<string name="widget_shelf_empty">No books yet — tap to refresh</string>
<string name="widget_shelf_refresh">Refresh</string>
<string name="widget_quick_actions_label">Quick actions</string>
<string name="widget_quick_actions_description">Search, scan and keep reading</string>
<string name="widget_action_search">Search</string>
<string name="widget_action_scan">Scan</string>
<string name="widget_action_read">Read</string>
<string name="widget_action_downloads">Downloads</string>
</resources>
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="110dp"
android:minHeight="180dp"
android:targetCellWidth="2"
android:targetCellHeight="3"
android:description="@string/widget_current_book_description"
android:initialLayout="@layout/widget_current_book"
android:previewLayout="@layout/widget_current_book"
android:resizeMode="horizontal|vertical"
android:updatePeriodMillis="0"
android:widgetCategory="home_screen" />
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="180dp"
android:minHeight="110dp"
android:targetCellWidth="3"
android:targetCellHeight="2"
android:description="@string/widget_stats_description"
android:initialLayout="@layout/widget_library_stats"
android:previewLayout="@layout/widget_library_stats"
android:resizeMode="horizontal|vertical"
android:updatePeriodMillis="0"
android:widgetCategory="home_screen" />
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="250dp"
android:minHeight="70dp"
android:targetCellWidth="4"
android:targetCellHeight="1"
android:description="@string/widget_quick_actions_description"
android:initialLayout="@layout/widget_quick_actions"
android:previewLayout="@layout/widget_quick_actions"
android:resizeMode="horizontal"
android:updatePeriodMillis="0"
android:widgetCategory="home_screen" />
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="250dp"
android:minHeight="200dp"
android:targetCellWidth="4"
android:targetCellHeight="4"
android:description="@string/widget_shelf_description"
android:initialLayout="@layout/widget_shelf"
android:previewLayout="@layout/widget_shelf"
android:resizeMode="horizontal|vertical"
android:updatePeriodMillis="0"
android:widgetCategory="home_screen" />
+28
View File
@@ -1,3 +1,5 @@
import com.android.build.gradle.LibraryExtension
allprojects {
repositories {
google()
@@ -5,6 +7,22 @@ allprojects {
}
}
subprojects {
plugins.withId("com.android.library") {
if (name == "jni") {
extensions.configure<LibraryExtension>("android") {
defaultConfig {
externalNativeBuild {
cmake {
arguments += "-DCMAKE_SHARED_LINKER_FLAGS=-Wl,--build-id=none"
}
}
}
}
}
}
}
val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get()
rootProject.layout.buildDirectory.value(newBuildDir)
@@ -16,6 +34,16 @@ subprojects {
project.evaluationDependsOn(":app")
}
gradle.projectsEvaluated {
subprojects {
tasks.configureEach {
if (name.contains("lintVitalAnalyzeRelease") || name.contains("lintVitalRelease") || name.contains("lintVitalReportRelease")) {
enabled = false
}
}
}
}
tasks.register<Delete>("clean") {
delete(rootProject.layout.buildDirectory)
}
File diff suppressed because one or more lines are too long
+2
View File
@@ -1,3 +1,5 @@
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true
android.enableJetifier=true
android.builtInKotlin=false
android.newDsl=false
+1 -1
View File
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-all.zip
+1 -1
View File
@@ -18,7 +18,7 @@ pluginManagement {
plugins {
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
id("com.android.application") version "8.9.1" apply false
id("com.android.application") version "8.11.1" apply false
id("org.jetbrains.kotlin.android") version "2.3.0" apply false
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 263 KiB

After

Width:  |  Height:  |  Size: 359 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 285 KiB

After

Width:  |  Height:  |  Size: 371 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 KiB

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 118 KiB

@@ -0,0 +1,3 @@
- تحديث رمز الإصدار
- إصلاح عاجل لمشكلة تنزيل الكتب
- إزالة توصيات الكتب (مؤقتًا)
@@ -0,0 +1 @@
- تمت إزالة معلومات التبعيات الخاصة بنسخة F-Droid
@@ -0,0 +1 @@
- تم إصلاح مشكلة كان من الممكن فيها تسجيل الدخول ببيانات اعتماد خاطئة
@@ -0,0 +1,5 @@
- تمت إضافة اسم سلسلة قابل للنقر
- تمت إضافة وسم قابل للنقر
- تمت إضافة خاصية التعبئة التلقائية لصفحة تسجيل الدخول
- تمت إضافة إمكانية فتح الكتب في برامج القراءة المثبتة
- تمت إضافة دعم مصادقة الخادم الوكيل العكسي
@@ -0,0 +1,5 @@
- تمت إضافة إمكانية تغيير عدد الأعمدة في قائمة الكتب
- تمت إضافة إمكانية رفع الكتب إلى Calibre Web
- تمت إضافة إمكانية إضافة نسخة مخصصة من Send2eReader
- تم إصلاح مشكلة عدم إمكانية فتح ملفات PDF في برامج القراءة المثبتة
- تم إصلاح مشكلة عدم ظهور جميع الكتب عند فرزها حسب المؤلف
@@ -0,0 +1,20 @@
- أصبحت بيانات تسجيل الدخول ثابتة الآن عبر عمليات إعادة تشغيل التطبيق، وسيحاول التطبيق تسجيل الدخول تلقائيًا عند انتهاء صلاحية الجلسة.
- أصبح الآن مسموحًا باستخدام المزيد من أنواع الملفات عند تحميل الكتب.
- إمكانية إنشاء أرفف عامة/غير عامة.
- تم إصلاح خطأ كان يحدث عند وجود رف واحد فقط.
- يتم الآن عرض السلاسل بشكل صحيح في تفاصيل الكتاب.
- تم تحديث خط أنابيب البناء لدعم أنواع APK الأخرى، ونسخة iOS والنشر في سوق Play.
- تم إصلاح مشكلة عند تنزيل الكتب بتنسيقات متعددة.
- تم تحديث تكامل Calibre Web Automated Book Downloader إلى أحدث إصدار.
- تمت إزالة عناصر HTML من تعليقات الكتب.
- تمت إضافة الترتيب الأبجدي في صفحة ”اكتشاف“.
- تمت إضافة إمكانية تغيير ”إرسال إلى قارئ كتب إلكترونية“ إلى ”قراءة الآن“.
- تمت إضافة عرض قائمة إلى الصفحة الرئيسية.
- تم تحسين تحميل الكتب من الرفوف وصفحة ”اكتشاف“.
- تم تنفيذ إمكانية تغيير بيانات تعريف الكتب.
- تم تنفيذ إمكانية تغيير أغلفة الكتب.
- تمت إضافة تعليقات أفضل في حالة تعطيل فئة ”اكتشاف“.
- تم تحسين وظيفة العنوان المخصص.
- تمت إضافة دعم ترجمة Weblate.
- تمت إضافة الترجمة البرتغالية.
- تم إصلاح بعض الأخطاء الطفيفة
@@ -0,0 +1,13 @@
- تم تحديث مسار المعالجة لإزالة الوسوم المنشأة بشكل خاطئ
- تم تحديث لون خلفية أزرار أيقونة تعديل البيانات الوصفية
- تمت إضافة برنامج نصي لإنشاء ملفات .ipa لـ iOS
- تمت إضافة إعدادات اتصال جديدة لـ Booklore وOPDS (إصدار تجريبي)
- تمت إضافة خاصية المصادقة لبرنامج Calibre Web Automated Book Downloader
- تمت إضافة إمكانية تحميل إعدادات برنامج Calibre Web Automated Book Downloader من الخادم
- تمت إضافة رأسيات المصادقة لطلبات برنامج Calibre Web Automated Book Downloader
- تمت إضافة ترجمات إلى اللغتين الإستونية والإيطالية
- تمت إضافة قارئ EPUB داخلي جديد
- تمت إضافة إمكانية مزامنة تقدم القراءة عبر WebDAV مع أجهزة أخرى
- تم تحسين معالجة تسجيل الدخول الموحد
- تمت إضافة صفحة التراخيص إلى الإعدادات
- بعض الإصلاحات والتحسينات الطفيفة
@@ -0,0 +1,8 @@
- تمت إضافة إمكانية تغيير اتجاه القراءة للقارئ الداخلي إلى الإعدادات.
- سيتم الآن جلب تكوين أداة التنزيل مباشرةً عند تمكينها في الإعدادات.
- تم إصلاح الخلل الذي كان يتسبب في ظهور الكتب المكررة في عرض الكتب.
- تم إصلاح الخلل الذي كان يمنع المستخدمين من إرسال الكتب الإلكترونية عبر البريد الإلكتروني دون أذون التحميل.
- يتم الآن تخزين عوامل تصفية أداة التنزيل عبر عمليات إعادة تشغيل التطبيق.
- تم إصلاح مشكلة إنشاء F-Droid.
- تم إجراء بعض التحسينات على رمز CSRF.
- تمت إضافة الترجمات الإيطالية والهنغارية.
@@ -0,0 +1 @@
- تحديث: إصلاحات لمشكلة تعطل قارئ الكتب الإلكترونية الداخلي
@@ -0,0 +1,6 @@
- تم تغيير اسم Calibre-Web-Book-Downloader إلى Shelfmark
- تمت إضافة ترجمات إلى الهنغارية والسويدية والتركية
- تم إصلاح مشكلة المصادقة عند استخدام Booklore
- تم إصلاح مشكلة المصادقة عند استخدام Shelfmark
- تمت إضافة آلية تحقق محسّنة للتأكد من تحميل الكتاب مسبقًا
- تمت إضافة ميزة مزامنة المكتبة لتحميل الكتب دفعة واحدة
@@ -0,0 +1 @@
- إصلاح لسوق Google Play
@@ -0,0 +1,8 @@
- تمت إضافة الترجمة القطلونية.
- تم إصلاح نص الإنشاء البرمجي لملفات .ipa.
- ستعمل ميزة المزامنة على الاستعلام عن التنسيقات المتاحة من الخادم.
- تمت إضافة مؤشر حالة القراءة إلى الصفحة الرئيسة.
- تم إصلاح مشكلة علامة حالة القراءة.
- تمت إضافة خيار فرز المؤلف إلى إعدادات مسار التنزيل.
- تمت إضافة إمكانية التبديل السريع بين نسخ Calibre Web (وغيرها).
- تم إصلاح مشكلة في خيار "إضافة إلى الرف" في صفحة وصف الكتاب.
@@ -0,0 +1,4 @@
- تم التحديث: تم تعديل الكود ليتوافق مع تنسيق قاعدة بيانات Calibre الجديد.
- تمت الإضافة: دعم اللغة الروسية.
- تمت الإضافة: يمكنك الآن إخفاء زر "إرسال إلى قارئ إلكتروني".
- تم التحديث: تم ضبط خيار التنزيل الافتراضي على اللغة الإنجليزية (Shelfmark).
@@ -0,0 +1,2 @@
- تمت إضافة إمكانية حذف الكتب من الخادم عبر صفحة تفاصيل الكتاب.
- تمت إضافة خيار لتعطيل رسوميات التطبيق المتحركة على أجهزة الحبر الإلكتروني
@@ -0,0 +1,10 @@
- تمت إضافة رسالة خطأ أفضل إلى صفحة إعدادات المزامنة عند تعطيل قسم Calibre Web.
- تمت إضافة إمكانية عرض سجلات التطبيق ونسخها للإبلاغ عن الأخطاء.
- تمت إضافة إمكانية إعادة ترتيب أقسام صفحة ”اكتشاف“ وتعطيلها عبر الإعدادات.
- تمت إضافة إمكانية إعادة ترتيب تفاصيل الكتب وإخفائها عبر الإعدادات.
- تمت إضافة إمكانية تغيير ترتيب ورؤية إجراءات الكتاب عبر الإعدادات.
- تم إصلاح مشكلة (خطأ 401 (غير مصرّح)) على أغلفة الرفوف.
- تم إصلاح مشكلة تعطل إضافة/إزالة الكتب من الرفوف بسبب عدم وجود csrfTokenUrl (خطأ 405).
- تمت إعادة تصميم صفحة الإعدادات.
- تحسينات طفيفة على واجهة المستخدم.
- تمت إعادة تصميم صفحة تفاصيل الكتب.
@@ -0,0 +1,3 @@
- تمت إضافة ترجمات عربية وصينية.
- تم إصلاح: تم تعديل تكامل Shelfmark للإصدار الجديد.
- تمت إضافة: خيار لحفظ الكتب المرسلة إلى قارئ الكتب الإلكترونية في مجلد التنزيلات المحدّد.
@@ -0,0 +1,5 @@
- تمت إضافة إمكانية تغيير لون السمة
- تمت إضافة إمكانية تحديد مخططات مجلدات مختلفة
- تمت إضافة صفحة توصيات الكتب
- تمت إضافة إمكانية التنزيل إلى صفحة التوصيات
- إصلاحات طفيفة لبعض الأخطاء وتحسينات في واجهة المستخدم
@@ -0,0 +1,4 @@
- تمت إضافة مجلد تنزيل مجموعة القدرات على مستوى النظام
- تمت إضافة مخطط تنزيل مجموعة القدرات على مستوى النظام
- تم إصلاح خطأ سلسلة مخطط التنزيل
- تم تحديث سير العمل لتجنب تعارض التحديثات
@@ -0,0 +1,2 @@
- تمت إضافة ترجمة لإعدادات التنزيل
- تم تغيير ترتيب الحصول على أذون المجلد
@@ -0,0 +1,35 @@
تطبيق مصاحب غير رسمي لـ Calibre Web و Calibre Web Automated يتيح لك تصفح مجموعتك من الكتب وإدارة مكتبتك الرقمية أثناء التنقل.
تم تصميمه باستخدام <b>Flutter</b> و <b>Material You</b> لتوفير تجربة مستخدم حديثة وبديهية وسريعة الاستجابة.
<b>الميزات المدعومة:</b>
<ul>
<li>تصفح مكتبة Calibre Web الخاصة بك</li>
<ul>
<li>عرض الكتب حسب المؤلف والسلسلة والاتجاهات وغيرها</li>
<li>عرض معلومات مفصلة عن الكتب</li>
<li>الوصول إلى إحصائيات شاملة عن المجموعة</li>
</ul>
<li>إدارة المكتبة</li>
<ul>
<li>وضع علامة على الكتب كمقروءة أو غير مقروءة</li>
<li>أرشفة الكتب وإلغاء أرشفتها</li>
<li>تنظيم الكتب في أرفف</li>
<li>إدارة أرففك وتخصيصها</li>
</ul>
<li>القراءة والأجهزة</li>
<ul>
<li>تنزيل الكتب مباشرةً على جهازك</li>
<li>إرسال الكتب إلى قارئك الإلكتروني (Kindle/Kobo) عبر send2ereader</li>
<li>استخدام وظيفة البريد في Calibre Web لتسليم الأجهزة</li>
</ul>
<li>تكامل الأتمتة</li>
<ul>
<li>يعمل مع Calibre Web Automated</li>
<li>تنزيل الكتب تلقائيًا باستخدام calibre-web-automated-book-downloader</li>
</ul>
</ul>
يُرجى ملاحظة أن التطبيق قيد التطوير حاليًا. يمكنك فتح مشكلات على GitHub للإبلاغ عن الأخطاء وتقديم الملاحظات واقتراح الأفكار الخاصة بالميزات.
الاعتمادات: Calibre Web، Calibre Web Automated، send2ereader، calibre-web-automated-book-downloader
@@ -0,0 +1 @@
تطبيق مصاحب غير رسمي لبرنامج Calibre Web (تلقائي)
+1
View File
@@ -0,0 +1 @@
Calibre Web Companion
@@ -0,0 +1,8 @@
- The ability to change the reading direction for the internal reader has been added to the settings.
- The downloader configuration will now be fetched directly when enabled in the settings.
- Fixed bug where duplicate books appeared in Books view.
- Fixed a bug where users could not send ebooks via email without upload permissions.
- Downloader filters are now stored across app restarts.
- Fixed F-Droid building issue.
- Made some CSRF token improvements.
- Added Italian and Hungarian translations.
@@ -0,0 +1 @@
- Hotfix: Internal Epub Reader Crash Fixes
@@ -0,0 +1,6 @@
- changed Calibre-Web-Book-Downloader to Shelfmark
- added hungarian, swedish and turkish translations
- fixed authentication issue when using Booklore
- fixed authentication issue when using Shelfmark
- added better check when book is already downloaded
- added library sync feature to bulk download books
@@ -0,0 +1 @@
- Fix for Google Play
@@ -0,0 +1,8 @@
- Catalan translation added.
- Fixed the building script for .ipa files.
- The sync feature will query the available formats from the server.
- Read status indicator added to homepage.
- Fixed the read status flag problem.
- Added the authorSort option to the download path settings.
- The ability to quickly switch between Calibre Web (and other) instances has been added.
- Fixed a problem with the 'Add to Shelf' option on the book description page.
@@ -0,0 +1,4 @@
- Updated: Adjusted code for the new Calibre database format.
- Added: Russian language support
- Added: You can now hide the 'Send to Ereader' button.
- Updated: Set the default download option to English (Shelfmark).
@@ -0,0 +1,2 @@
- Added ability to delete books from the server via the book details page.
- Added option to disable app animations for eink devices
@@ -0,0 +1,10 @@
- Added a better error message to the Sync Settings page when the Calibre Web section is disabled.
- Added the ability to view and copy app logs for bug reports.
- Added the ability to reorder and disable Discover sections via Settings.
- Added the ability to reorder and hide book details via settings.
- Added the ability to change the order and visibility of book actions via settings.
- Fixed: Resolved 401 Unauthorized on Shelf Covers.
- Fixed: Shelf add/remove broken due to missing csrfTokenUrl (405 error).
- Redesigned the Settings page.
- Small UI improvements
- Reworked the book details page.
@@ -0,0 +1,3 @@
- Arabic and Chinese translations have been added.
- Fixed: Adjusted Shelfmark integration for the new version.
- Added: Option to save books sent to eReader to specified downloads folder.
@@ -0,0 +1,9 @@
- New: Magic Shelves, create, edit and browse dynamic, rule-based shelves (Calibre-Web Automated only).
- New: Scan a book's ISBN barcode to add it to Calibre or download it via Shelfmark.
- New: Connection Diagnostics screen plus improved reverse-proxy / SSO login.
- New: Search book metadata from online providers while editing a book.
- New: Series index and series filter on book cards, with search autosuggestions.
- New: Pagination and a list/grid toggle in shelves; adjustable font size and grid/list view in Discover.
- New: Refreshed built-in eBook reader with selectable reading format.
- Added Dutch translation and many translation updates.
- Fixed: self-signed certificates, "logged in but no data" on reverse proxies, Shelfmark config, the Author (A-Z) filter and a swipe-back crash.
@@ -0,0 +1 @@
- Fixed: swapped mobile_scanner package to barcode_scan2
@@ -0,0 +1 @@
- Fixed: libisar.so was removed and the cosmos_epub package was changed to enable a reproducible build for F-Droid.
@@ -0,0 +1,6 @@
- Added: new Ukrainian (@Vitali) and Tamil (@தமிழ்நேரம்) translations.
- Feature: Offline mode has been added to the app, allowing users to access their downloaded books without an internet connection.
- Feature: Support added for the WebServer provided by the Calibre Desktop application.
- Fixed: the 'Read Now' button now correctly downloads the book.
- Fix: When editing a book and then using the system back button, the changes are now saved correctly.
- Fix: Shelfmark integration will no longer fall back to 'German' by default.
@@ -0,0 +1,4 @@
- Feature: Homescreen widgets added (Quick Actions, Stats, Currently Reading Book, Shelf Grid).
- Fix: Fixed an issue where FileOpener was not using the correct MIME type for EPUB files, causing some apps to fail to open them correctly.
- Fix: Updated SSO login flow and enhance cookie handling in LoginRemoteDataSource
- Language: Updated translations: Spanish (@Libre), Italian (@Michele Abbondanza), Hungarian (@Márton Kónya) and Chinese (Simplified Han script) (@Mas Wang).
@@ -0,0 +1,5 @@
- Feature: New shelf view on the home screen.
- Feature: Added ability to change probe endpoint for reachability checks.
- Fix: A reauth popup has been added when the SSO session expires.
- Fix: Fixed an issue with identifying offline status.
- Language: Updated translations: Ukrainian (@Vitalii), Catalan (@Nric Pagès i Gassull).
@@ -0,0 +1 @@
- Feature: ISBN scan now queries several catalogues at once (Open Library, Google Books, BnF, optionally Hardcover and ISBNdb) and merges their metadata. Sources can be switched on/off and reordered in the settings.
@@ -1,35 +1,21 @@
Unofficial companion application for Calibre Web and Calibre Web Automated that lets you browse your book collection and manage your digital library on the go.
Unofficial companion app for Calibre-Web and Calibre-Web Automated. Browse your book collection and manage your digital library on the go.
Built with <b>Flutter</b> and <b>Material You</b> to deliver a modern, intuitive and responsive user experience.
Built with Flutter and Material You for a modern, intuitive and responsive experience. Available for Android, in 15 languages.
<b>Supported features:</b>
<ul>
<li>Browse your Calibre Web library</li>
<ul>
<li>View books by author, series, trending, and more</li>
<li>View detailed book information</li>
<li>Access comprehensive collection statistics</li>
</ul>
<li>Library management</li>
<ul>
<li>Mark books as read or unread</li>
<li>Archive and unarchive books</li>
<li>Organize books into shelves</li>
<li>Manage and customize your shelves</li>
</ul>
<li>Reading & devices</li>
<ul>
<li>Download books directly to your device</li>
<li>Send books to your e-reader (Kindle/Kobo) via send2ereader</li>
<li>Use Calibre Web's mail function for device delivery</li>
</ul>
<li>Automation integration</li>
<ul>
<li>Works with Calibre Web Automated</li>
<li>Automatically download books with calibre-web-automated-book-downloader</li>
</ul>
</ul>
Features:
Please note that the app is currently in active development. You can open issues on GitHub for bugs, feedback, and feature ideas.
- Connect to your Calibre-Web (Automated) server, including reverse-proxy / SSO setups, custom HTTP headers and self-signed certificates.
- Browse your whole library and discover books by author, series, publisher, rating, hot & trending, and more.
- View rich details for every book, edit its metadata, and upload new covers.
- Mark books as read or unread, archive them, and organize them into shelves.
- Create, edit and browse Magic Shelves: dynamic, rule-based shelves (Calibre-Web Automated only).
- Add books quickly by scanning their ISBN barcode.
- Read books in the built-in eBook reader and sync your reading progress across devices via WebDAV.
- Send books to your e-reader (Kindle/Kobo) via send2ereader or Calibre-Web's email function.
- Download books into your collection with Shelfmark. This app does not support or encourage the piracy of copyrighted works; please only download content you are legally entitled to.
- Upload books to your server, and sync your whole library or selected books for offline reading.
- Make it yours: reorder or hide book actions and sections, choose a theme, enable e-ink mode, and adjust the text size.
Credits: Calibre Web, Calibre Web Automated, send2ereader, calibre-web-automated-book-downloader
The app is in active development. You can open issues on GitHub for bugs, feedback and feature ideas.
Credits: Calibre-Web, Calibre-Web Automated, Shelfmark, send2ereader, Flutter.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 263 KiB

After

Width:  |  Height:  |  Size: 359 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 285 KiB

After

Width:  |  Height:  |  Size: 371 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 118 KiB

@@ -0,0 +1,3 @@
- Verzió kód generálás frissítve
- Hot fix könyvletöltéshez
- Könyvajánlások eltávolítva (egyelőre)
@@ -0,0 +1 @@
- Függőség info eltávolítva f-droid verziónál
@@ -0,0 +1 @@
- Javítva a hiba amivel úgymond be lehetett jelentkezni hibás bejelentkezési adatokkal
@@ -0,0 +1,5 @@
- Kattintható sorozatnév hozzáadva
- Kattintható címke hozzáadva
- Automatikus kitöltés bejelentkezéskor
- Könyvek megnyitása telepített olvasóban
- Reverse proxy hitelesítés hozzáadva

Some files were not shown because too many files have changed in this diff Show More