Compare commits

...

912 Commits

Author SHA1 Message Date
Prateek Sunal
f0982e01d7 fix: add temporary changes 2025-02-17 18:52:17 +05:30
github-actions[bot]
dd52ee7763 [auth] New translations (#5085)
New translations from
[Crowdin](https://crowdin.com/project/ente-authenticator-app)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-02-17 11:02:52 +05:30
Manav Rathi
387e4ae826 [server] Fix publish workflow (#5089)
Fixes for https://github.com/ente-io/ente/pull/5088
2025-02-17 11:01:34 +05:30
Andrés Ignacio Torres
098ff4e664 [auth] Add custom icon for EVE Online (#5078)
## Description

Added an Ente Auth custom icon for the EVE Online game service. I
followed the guidance
[here](https://github.com/ente-io/ente/blob/main/auth/docs/adding-icons.md)
to add the entry for EVE Online.

The icon itself comes from [Wikimedia
Commons](https://commons.wikimedia.org/wiki/File:EVE_online_logo.svg)
and was adapted to a square. I also added a custom hex color code to
ensure the logo is visible when using dark mode.

Noting that this is my first contribution as I've recently started using
Ente Auth, any feedback or suggestions would be appreciated :-)

## Tests

Visual change, no code changes.
2025-02-17 11:01:21 +05:30
Manav Rathi
00a04f18e4 [server] Fix publish workflow
Fixes for https://github.com/ente-io/ente/pull/5088
2025-02-17 11:00:21 +05:30
Rflew33
b8304f0ec5 Additional Icons (#5072)
## Description
Added Aruba. OnShape, RealVNC icons
## Tests
2025-02-17 10:59:39 +05:30
Manav Rathi
979fa5e6da [server] Publish Docker image automatically on 15th of every month (#5088) 2025-02-17 10:58:54 +05:30
Manav Rathi
91f356ceda [server] Publish Docker image automatically on 15th of every month 2025-02-17 10:51:23 +05:30
Manav Rathi
a019aaf5fc [web] New translations (#5084)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2025-02-17 10:18:51 +05:30
Crowdin Bot
a9df48ea5d New Crowdin translations by GitHub Action 2025-02-17 00:36:04 +00:00
Vishnu Mohandas
be6ce6d639 feat: create video-streaming.md (#5080)
## Description

Add FAQs for streaming

## Tests
2025-02-16 21:31:36 +05:30
vishnukvmd
9d421e79a7 Cosmetic changes 2025-02-16 21:30:25 +05:30
Prateek Sunal
d1d8144fd1 Update sidebar.ts 2025-02-16 19:59:12 +05:30
Prateek Sunal
7302f1d4ab feat: create video-streaming.md 2025-02-16 19:54:53 +05:30
Ashil
39788341db [docs] Upgrade background sync doc: Mention how background sync won't work if app is in private space on android 15 and later (#5067) 2025-02-14 19:41:45 +05:30
Neeraj
6c86fe0d53 [mob] Remove internal flag (#5071)
## Description

## Tests
2025-02-14 19:34:09 +05:30
Neeraj Gupta
30ed06cfda [mob] Remove internal flag 2025-02-14 19:30:41 +05:30
Prateek Sunal
21788c28cf [mob] streaming fixes (#5055)
## Description

## Tests
2025-02-14 18:28:25 +05:30
Manav Rathi
2969b5c9a5 [web] Code restructuring - Part 2 (#5070)
Continuation of https://github.com/ente-io/ente/pull/5069
2025-02-14 18:22:56 +05:30
Manav Rathi
aa74948f4a Workaround bad types is file 2025-02-14 18:14:04 +05:30
Manav Rathi
1bdbfe0580 More 2025-02-14 18:06:13 +05:30
Manav Rathi
cacf4212c7 Silence some 2025-02-14 18:05:16 +05:30
Manav Rathi
8f540f23dc Types 2025-02-14 18:03:02 +05:30
Manav Rathi
17d76e50da Fix lints 2025-02-14 18:00:33 +05:30
Manav Rathi
db26923d68 Move 2025-02-14 17:56:38 +05:30
Manav Rathi
4670be9bba Move 2025-02-14 17:52:36 +05:30
Manav Rathi
f8c2f4b9dd Move 2025-02-14 17:38:28 +05:30
Manav Rathi
396065e80c Move 2025-02-14 17:30:03 +05:30
Manav Rathi
5a755d851a Move 2025-02-14 17:12:17 +05:30
Manav Rathi
286a968f65 Props 2025-02-14 17:03:39 +05:30
Manav Rathi
efff97bc71 [web] Code restructuring (#5069) 2025-02-14 16:35:31 +05:30
Manav Rathi
2a73de848c Lint 2025-02-14 16:25:41 +05:30
Neeraj
c7c8fd65b6 [mob] Fix collection attribute motification (#5068)
## Description

## Tests
2025-02-14 15:56:17 +05:30
Neeraj Gupta
8d7eef99ad [mob] Fix collection attribute motification 2025-02-14 15:54:14 +05:30
Manav Rathi
1605b44c6e Fin 2025-02-14 15:30:35 +05:30
ashilkn
578a92d4bc [docs] Upgrade background sync doc: Mention how background sync won't work if app is in private space on android 15 and later 2025-02-14 15:18:58 +05:30
Manav Rathi
bf3ed6f478 Namespace 2025-02-14 15:06:39 +05:30
Manav Rathi
92a9698df5 Prune 2025-02-14 14:59:03 +05:30
Manav Rathi
342ac3258a Direct 2025-02-14 14:56:54 +05:30
Manav Rathi
e4427d7605 Direct 2025-02-14 14:52:11 +05:30
Manav Rathi
6f729c01e1 Direct 2025-02-14 14:47:05 +05:30
Manav Rathi
0d7c319903 Swap 2025-02-14 14:41:10 +05:30
Manav Rathi
6d552f5190 Unnest 2025-02-14 14:29:43 +05:30
Manav Rathi
06450a0ce0 Tweak 2025-02-14 14:23:56 +05:30
Manav Rathi
72d6789739 In photos 2025-02-14 14:22:53 +05:30
Manav Rathi
3d2d0cc345 More 2025-02-14 14:20:08 +05:30
Manav Rathi
884246d2ab Provide 2025-02-14 14:17:29 +05:30
Manav Rathi
cf25cc40e4 Extra 2025-02-14 14:09:42 +05:30
Manav Rathi
7138510e48 Rename 2025-02-14 14:01:56 +05:30
Manav Rathi
15e7e0ae9d Move 2025-02-14 13:58:53 +05:30
Manav Rathi
9dcced260f Same nomenclature 2025-02-14 13:21:12 +05:30
Manav Rathi
2d5dc734aa Up 2025-02-14 13:17:44 +05:30
Manav Rathi
1d93d44180 ud 2025-02-14 13:10:43 +05:30
Manav Rathi
0aeb9f0c82 Up 2025-02-14 12:59:43 +05:30
Manav Rathi
183bbdd145 Fix 2025-02-14 12:26:30 +05:30
Manav Rathi
8d701d4fd5 Match reality 2025-02-14 12:13:45 +05:30
Manav Rathi
c6f6041d24 Pass context method 2025-02-14 12:07:31 +05:30
Manav Rathi
f49ece10e6 Move 2025-02-14 11:57:45 +05:30
Manav Rathi
d0f206741f Undep 2025-02-14 11:51:25 +05:30
Manav Rathi
87ff5c5c0b Undep 2025-02-14 11:37:41 +05:30
Manav Rathi
b931dac18b Doc 2025-02-14 11:30:32 +05:30
Manav Rathi
2b52616ba5 Undep 2025-02-14 11:11:57 +05:30
Manav Rathi
e66ee5bcb1 to-base 2025-02-14 11:08:56 +05:30
Manav Rathi
f18bcc71d3 Move 2025-02-14 11:03:16 +05:30
Manav Rathi
43a7cb1223 Move 2025-02-14 10:48:38 +05:30
Manav Rathi
ceb25651f2 [web] Use upstream PhotoSwipe (Much WIP) (#5066) 2025-02-14 08:54:25 +05:30
Manav Rathi
8a8934eacd LF 2025-02-14 08:48:54 +05:30
Manav Rathi
20fea517ce Revert "Workbench"
This reverts commit 4736ec7e0a.
2025-02-14 08:46:13 +05:30
Manav Rathi
0d32bd55dd Plumb 2025-02-14 08:34:11 +05:30
Manav Rathi
20bbdb131d Get file 2025-02-14 08:28:11 +05:30
Manav Rathi
1980cb035e Add example 2025-02-14 08:28:11 +05:30
Manav Rathi
bd00c27dc6 Same name as docs 2025-02-14 08:28:11 +05:30
Manav Rathi
e8fa86e2ad Loader 2025-02-14 08:28:11 +05:30
Manav Rathi
baa72202b2 Icon 2 2025-02-14 08:28:11 +05:30
Manav Rathi
46658a26f3 Icon 1 2025-02-14 08:28:11 +05:30
Manav Rathi
6653b36764 Use order to position it 2025-02-14 08:28:11 +05:30
Manav Rathi
c17d0d0087 Handle keyboard focus when auto hiding 2025-02-14 08:28:11 +05:30
Manav Rathi
b823a8d6a1 Cleanup 2025-02-14 08:28:11 +05:30
Manav Rathi
e06b20a566 Fix 2025-02-14 08:28:11 +05:30
Manav Rathi
8218bfba04 Try and alternative event to resize 2025-02-14 08:28:11 +05:30
Manav Rathi
8df5831944 Some overlay 2025-02-14 08:28:11 +05:30
Manav Rathi
6e774d6758 Pause on changing video slide 2025-02-14 08:28:11 +05:30
Manav Rathi
981c74d3f1 Don't auto load vids
Ref: 5e32d6589d/dist/photoswipe-video-plugin.esm.js (L77)
2025-02-14 08:28:11 +05:30
Manav Rathi
18ee3b19f7 Set 2025-02-14 08:28:11 +05:30
Manav Rathi
aa27191ddc CSS for vids 2025-02-14 08:28:11 +05:30
Manav Rathi
0883fe1d05 Take 2 disable thumb zoom 2025-02-14 08:28:11 +05:30
Manav Rathi
17e59de59c Revert "Note diversion that didn't work"
This reverts commit 0791a8f659e7aad48ff69c53f07c7894db663345.
2025-02-14 08:28:11 +05:30
Manav Rathi
bdb30d64f0 Note diversion that didn't work 2025-02-14 08:28:11 +05:30
Manav Rathi
57881f34c3 Image dims 2025-02-14 08:28:11 +05:30
Manav Rathi
6ef3c01030 Fix 2025-02-14 08:28:11 +05:30
Manav Rathi
d4ddc0f919 The dimensions are necessary
the CSS was masking the issue
2025-02-14 08:28:11 +05:30
Manav Rathi
4736ec7e0a Workbench 2025-02-14 08:28:11 +05:30
Neeraj
0840c66a34 [mob] Mark collection owner, sharee and publicUrls as non-nullable field (#5063)
## Description

## Tests
2025-02-13 16:15:37 +05:30
Neeraj Gupta
eb2f6aec68 [mob] refactor 2025-02-13 16:12:56 +05:30
mangesh
45074f85d9 [server] API for modifying family member storage limit (#5028)
## Tests 

Tested in followin cases 
1. various statuses "REJECTED", "REVOKED" and "SELF" etc
2. user not part of any family & admin user
3. storage limit check on bulk upload
4. reduce storage check 
5. set storage bigger than anything available in the world
6. admin shouldn't be able to set his own storage.

- [x] check for potential refactoring
2025-02-13 16:07:16 +05:30
mngshm
c46c27d21d if storageLimit == null, set no limit for member 2025-02-13 16:03:20 +05:30
Neeraj Gupta
3ff8d04d7b [mob] Mark collection owner, sharee and publicUrls as non-nullable field 2025-02-13 15:36:20 +05:30
Prateek Sunal
437eb246b0 fix: reduce it to 10 minutes minimum 2025-02-13 15:35:32 +05:30
Laurens Priem
5e383f3844 [mob][photos] bump for internal release (#5061)
## Description

## Tests
2025-02-13 15:25:07 +05:30
Manav Rathi
9bce8dc878 [desktop] Dark WCO title bar overlay (#5062) 2025-02-13 15:24:13 +05:30
Manav Rathi
a447d615e0 [desktop] Dark WCO title bar overlay 2025-02-13 15:22:54 +05:30
laurenspriem
239e6a3158 [mob][photos] bump for internal release 2025-02-13 15:21:35 +05:30
mngshm
5a72d62555 chore: validate memberUsage check inside *storageLimit nil check 2025-02-13 15:08:18 +05:30
mngshm
7aa8f6f00f chore: wrap everything inside nil check for storageLimit 2025-02-13 14:59:52 +05:30
Manav Rathi
5b168021f4 [desktop] Add IndexedDB circuit breaker (#5058)
From one customer's logs (Windows):

[rndr] [error] Unhandled promise rejection: Error: The user's token was
present in local storage but not in IndexedDB

And thereafter the app started behaving erratically. Restarting fixed
it. This
sequence happened during an app update.

This sequence is not reproducible, but adding as a extra precaution
adding a
circuit breaker to prevent execution if IndexedDB is not readable.
2025-02-13 14:48:14 +05:30
mngshm
a407b1baad fix: allow modification for invited user
fix: adds bonus + storage to get total storage

fix: var name changes, use NewBadRequestWithmessage
2025-02-13 14:36:46 +05:30
Manav Rathi
3589cc5bbf Lint 2025-02-13 14:35:08 +05:30
Manav Rathi
0cef0656f3 [desktop] Add IndexedDB circuit breaker
From one customer's logs (Windows):

[rndr] [error] Unhandled promise rejection: Error: The user's token was present in local storage but not in IndexedDB

And thereafter the app started behaving erratically. Restarting fixed it. This
sequence happened during an app update.

This sequence is not reproducible, but adding as a extra precaution adding a
circuit breaker to prevent execution if IndexedDB is not readable.
2025-02-13 14:29:34 +05:30
mngshm
3b3ba721a2 revert errors.go 2025-02-13 14:17:19 +05:30
Manav Rathi
d899be6eac [web] Improve logging of new HTTP errors (#5057)
...to match how the old HTTPService ones would've behaved.
2025-02-13 13:16:13 +05:30
Manav Rathi
17c713d3de Ignore the temporary desktop build folder 2025-02-13 13:11:09 +05:30
Manav Rathi
0e9153f4ab [web] Improve logging of new HTTP errors
...to match how the old HTTPService ones would've behaved.
2025-02-13 13:06:26 +05:30
Laurens Priem
5484a95bf4 Ram logging (#5056)
## Description

Extra debug options related to ML
2025-02-13 12:55:34 +05:30
Laurens Priem
2a1c1a30e9 [mob][photos] Fix empty facethumbnail due to decoding issue (#5054)
## Description

Resolve face thumbnail issue.
2025-02-13 12:52:37 +05:30
laurenspriem
f902b7e75c [mob][photos] ML dev options 2025-02-13 12:51:38 +05:30
Prateek Sunal
ac9f4e3181 fix: behavior 2025-02-13 12:46:43 +05:30
Prateek Sunal
b68b1a97b5 Merge branch 'main' into streaming-release-ready 2025-02-13 12:45:08 +05:30
Prateek Sunal
b8de2bf736 chore: update locks 2025-02-13 12:41:06 +05:30
Prateek Sunal
d35975b26e fix(preview-queue): put higher duration videos at last 2025-02-13 12:13:52 +05:30
laurenspriem
c2ca87d3af [mob][photos] log device ram 2025-02-13 12:13:14 +05:30
mngshm
a41c359ae4 use FetchMembersForAdminID to get storage including bonuses
remove unneeded api calls

omit unnecessary checks
2025-02-13 11:57:36 +05:30
Neeraj
e00cdee92b [auth] Add icon for Ankama & Seafile (#5030)
## Description

SVG Icon added for [Ankama](https://www.ankama.com/) and
[Seafile](https://www.seafile.com/en/home/)

Source of the icon is their website then cropped
2025-02-13 11:18:51 +05:30
Neeraj
a4ade14794 [cli] Skip CLI init for docs,versions & help commad (#5053)
## Description

## Tests
2025-02-13 11:17:04 +05:30
laurenspriem
b1ce7b6edb [mob][photos] Fix empty facethumbnail due to decoding issue 2025-02-13 11:16:32 +05:30
Neeraj Gupta
a5efee1ae3 [cli] Update version v0.2.3 2025-02-13 11:16:15 +05:30
Neeraj Gupta
33b56a2257 [cli] Skip cli init for version,docs & help 2025-02-13 11:11:21 +05:30
Neeraj
9abdfd2555 [auth] Increase default window height (#5039)
## Description

## Tests
2025-02-13 10:49:50 +05:30
Vishnu Mohandas
81ead3e4ce [mob] Notify internal Discord when internal release is available on PlayStore (#5052) 2025-02-13 10:49:31 +05:30
Laurens Priem
95d218b3a1 [mob][photos] Trips memories (internal users only) (#5035)
## Description

Added trips memories for internal users in the moments section

## Tests

Tested in debug mode on my pixel phone.
2025-02-13 10:36:36 +05:30
laurenspriem
74db8767a2 [mob][photos] Fix base location regression 2025-02-13 10:35:54 +05:30
laurenspriem
1200dbb6a9 [mob][photos] base names 2025-02-13 10:05:40 +05:30
vishnukvmd
8a90eba39a Add webhook 2025-02-13 09:58:36 +05:30
vishnukvmd
562ead3202 [mob] Notify Discord when internal releases are ready 2025-02-13 09:56:25 +05:30
laurenspriem
2c92411596 [mob][photos] name 2025-02-13 09:38:41 +05:30
laurenspriem
2fd5c703c9 [mob][photos] Add trip location names 2025-02-13 09:33:15 +05:30
mngshm
15d58e3446 make linters happy 2025-02-12 22:23:04 +05:30
Prateek Sunal
677a473d7d fix: use crf 23 for all the compressions for better results 2025-02-12 20:39:54 +05:30
Ashil
fb0128369a [mob][photos] Join link confirmation dialog (#5046) 2025-02-12 20:23:16 +05:30
ashilkn
bc4aa85eb1 [mob][photos] Bump up to v0.9.96 2025-02-12 20:12:07 +05:30
ashilkn
b1d2de712b [mob][photos] Show confirmation dialog before joining public link 2025-02-12 20:08:12 +05:30
Ashil
526b5da40f [mobile][photos] Fix: show account owner's email in 'Link email' screen if it's not assigned to any person yet (#5045) 2025-02-12 19:46:57 +05:30
ashilkn
1c6efd4985 [mob][photos] Use better names 2025-02-12 19:42:21 +05:30
ashilkn
defd88050d [mobile][photos] Fix: show account owner's email in 'Link email' screen if it's not assigned to any person yet 2025-02-12 19:40:04 +05:30
Prateek Sunal
9e12f35650 fix: check before file size and chunk size 2025-02-12 14:49:23 +05:30
mngshm
a7f31119fe [server]fix: use proper Error causes 2025-02-12 14:47:09 +05:30
Neeraj Gupta
40959cae09 [auth] Increase default window height 2025-02-12 14:47:05 +05:30
Manav Rathi
f32874fb05 [docs] Mention desktop log paths (#5037) 2025-02-12 14:44:30 +05:30
Manav Rathi
69f9bf35ac Mention paths 2025-02-12 14:43:27 +05:30
Manav Rathi
8204ac3070 [web] Account for Exif orientation when extracting width and height (#5036)
- Prefer file tag over Exif/XMP
- Use both dim/orient from same source

Tested with a portrait (HEIC) photo taken on an iPhone. Such files have
an orientation with in the Exif section.
```
$ exiftool -u -G IMG_xxxx.HEIC | grep Orient            
[EXIF]          Orientation                     : Rotate 90 CW
```
2025-02-12 14:05:07 +05:30
Manav Rathi
115c2c7fb3 Prefer file tag over exif, and use both dim/orient from same source 2025-02-12 13:42:57 +05:30
Manav Rathi
60b7ed52b8 [web] Account for Exif orientation when extracting width and height 2025-02-12 13:24:42 +05:30
laurenspriem
e6f72ea1c3 [mob][photos] Simplify 2025-02-12 11:38:33 +05:30
laurenspriem
967d8c0f3b [mob][photos] Trip class 2025-02-12 11:15:56 +05:30
mngshm
b729b8f0ea [server]refactor: make code more readable with guard clause 2025-02-12 11:08:19 +05:30
Manav Rathi
e3323890df [web] Tweak large tile gradient to work better in light mode (#5034)
When no thumbnail is shown, e.g. for empty uncat
2025-02-12 11:04:22 +05:30
Manav Rathi
fe4b0ded71 [web] Tweak large tile gradient to work better in light mode
When no thumbnail is shown, e.g. for empty uncat
2025-02-12 10:54:56 +05:30
laurenspriem
566364191d [mob][photos] Simplify 2025-02-12 10:20:38 +05:30
laurenspriem
c1dccf438b [mob][photos] Simplify with BaseLocation 2025-02-12 10:16:46 +05:30
Manav Rathi
71e419ac20 [desktop] Fix drag and drop (#5033)
https://github.com/react-dropzone/react-dropzone/issues/1411
2025-02-12 10:11:58 +05:30
Manav Rathi
de8fb95477 [desktop] Fix drag and drop
https://github.com/react-dropzone/react-dropzone/issues/1411
2025-02-12 10:03:02 +05:30
laurenspriem
84c00d0d31 [mob][photos] todo 2025-02-12 09:03:15 +05:30
Manav Rathi
d9ed2b4c10 [web] Allow marking certain dialogs as critical / non-replacable (#5032) 2025-02-12 07:31:31 +05:30
Manav Rathi
db308fa199 Fix key 2025-02-12 07:26:10 +05:30
Manav Rathi
244599ba67 Use 2025-02-12 07:24:02 +05:30
Manav Rathi
ee8ce50649 Rename 2025-02-12 07:23:32 +05:30
Manav Rathi
5f5632aac5 [web] Allow marking certain dialogs as critical / non-replacable 2025-02-12 07:22:03 +05:30
Manav Rathi
5f736aaa10 [desktop] Update version and link (#5031) 2025-02-12 06:53:49 +05:30
Manav Rathi
f003b4f8ac [desktop] Update version and link 2025-02-12 06:52:12 +05:30
Yannick
b933a89336 [auth] Add icon for Seafile 2025-02-11 18:32:40 +01:00
Yannick
016a476895 [auth] Add icon for Ankama 2025-02-11 16:58:19 +01:00
Neeraj
94c4e1ff0d [mob] Fix exif time parsing (#5029)
## Description

## Tests
2025-02-11 20:09:12 +05:30
Neeraj Gupta
d7ee9615b7 [mob] Fix lint & missing exif for files shared to ente 2025-02-11 19:58:14 +05:30
Neeraj Gupta
bf89a0ca9e [mob] Fill dateTime and offsetTime during upload 2025-02-11 19:58:03 +05:30
Neeraj Gupta
9f1b4fc23c [mob] Refactor 2025-02-11 19:57:47 +05:30
Neeraj Gupta
f3feb4cdda [mob] Parse exif as part of MediaUploadData 2025-02-11 19:57:36 +05:30
Neeraj Gupta
0b7b4b72f3 [mob] Add support for parsing dateTime & offsetTime from pubMagicMetadata 2025-02-11 19:57:28 +05:30
Neeraj Gupta
0380a30705 [mob] Refactor 2025-02-11 19:57:19 +05:30
Neeraj Gupta
ff72dae408 [mob] Refactor 2025-02-11 19:57:11 +05:30
Neeraj Gupta
be7cbc2ba0 [mob] Fix handling of timezone 2025-02-11 19:57:03 +05:30
Neeraj Gupta
1b0d481b45 [mob] Fix creationTime parsing 2025-02-11 19:56:54 +05:30
mngshm
4ee6ef408e [server] error handling if memberUsage is more than potential modified storagelimit
some more additional checks for the adminUser
2025-02-11 19:07:19 +05:30
Manav Rathi
9eb887e511 [web] Post revert fix (#5027) 2025-02-11 18:48:38 +05:30
Manav Rathi
5dd5f7e9c5 [web] Post revert fix 2025-02-11 18:44:22 +05:30
Manav Rathi
cd7183a9ad [web] New translations (#5023)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2025-02-11 18:39:53 +05:30
Crowdin Bot
17b213e380 New Crowdin translations by GitHub Action 2025-02-11 13:09:21 +00:00
mngshm
79712182af [server] include usageRepo inside family controller 2025-02-11 18:34:41 +05:30
Neeraj
97362ddbf2 Revert "[mob] Fix exif time parsing (#4985)" (#5026)
This reverts commit 5b17711b55, reversing
changes made to 85bf3eebcb.

## Description

## Tests
2025-02-11 18:30:49 +05:30
Neeraj Gupta
7621041ce0 Revert "[mob] Fix exif time parsing (#4985)"
This reverts commit 5b17711b55, reversing
changes made to 85bf3eebcb.
2025-02-11 18:27:17 +05:30
Manav Rathi
d58c2a3d49 [web] Use upstream Photoswipe - Heavily WIP (#5025) 2025-02-11 18:10:29 +05:30
Manav Rathi
2d4e532186 LF 2025-02-11 18:06:06 +05:30
Manav Rathi
3484f81546 Prep for merge 2025-02-11 18:00:47 +05:30
Manav Rathi
54da181256 Handle both cases 2025-02-11 18:00:47 +05:30
Manav Rathi
021b6ec9b4 + bg click hide 2025-02-11 18:00:47 +05:30
Manav Rathi
b4e01d5ab5 Auto hide
Needs the new CSS, but it'll work when that is enabled
2025-02-11 18:00:47 +05:30
Manav Rathi
78334d2e22 Improve comments 2025-02-11 18:00:47 +05:30
Manav Rathi
9496baaffc zoom and click improvements 2025-02-11 18:00:47 +05:30
Manav Rathi
1feb43d3d4 pass through pointer events
+ don't close if too small
2025-02-11 18:00:47 +05:30
Manav Rathi
5d6cc892f3 Take 2 2025-02-11 18:00:47 +05:30
Manav Rathi
27070bbe4c Take 1 2025-02-11 18:00:47 +05:30
Manav Rathi
556a0d1814 lp 2025-02-11 18:00:47 +05:30
Manav Rathi
5c1d7a0315 Cleanup 2025-02-11 18:00:47 +05:30
Manav Rathi
5b1130ab24 dd 2025-02-11 18:00:47 +05:30
Manav Rathi
96937041f1 vid 1 2025-02-11 18:00:47 +05:30
Manav Rathi
6f0deba3ed full 2025-02-11 18:00:47 +05:30
Manav Rathi
ca31a422fa Multiple 2025-02-11 18:00:47 +05:30
Manav Rathi
8c68af7772 Empty seems to work 2025-02-11 18:00:47 +05:30
Manav Rathi
42ac508fe7 enqueue 1 2025-02-11 18:00:47 +05:30
Manav Rathi
2e52efb15f Class 2025-02-11 18:00:47 +05:30
Manav Rathi
825a9df9fa Cleanup up scaffold 2025-02-11 18:00:47 +05:30
Manav Rathi
f30e05389b Validate 2025-02-11 18:00:47 +05:30
Manav Rathi
e952aa80a5 Don't reuse
(see prev diversion)
2025-02-11 18:00:46 +05:30
Manav Rathi
f3d9595953 diversion: pswp doesn't reset isOpen 2025-02-11 18:00:46 +05:30
Manav Rathi
a57232c34b Link 2025-02-11 18:00:46 +05:30
Manav Rathi
5c16ce3459 Prop 2025-02-11 18:00:46 +05:30
Manav Rathi
44c64c06a7 idata 2025-02-11 18:00:46 +05:30
Manav Rathi
3bbfa71824 Doc 2025-02-11 18:00:46 +05:30
Manav Rathi
970da9f29c Direct 2025-02-11 18:00:46 +05:30
Manav Rathi
97bdc9362a Tinker 2025-02-11 18:00:46 +05:30
Manav Rathi
4881f08790 Try import 2025-02-11 18:00:46 +05:30
Manav Rathi
d322f5e1bc Take 2 2025-02-11 18:00:46 +05:30
Manav Rathi
b87b68e9d4 Scaffold differently 2025-02-11 18:00:46 +05:30
Manav Rathi
782688c1f7 Scaffold 2025-02-11 18:00:46 +05:30
mngshm
38a35696a3 fix column names in DB & include UsageCtrl in controllers 2025-02-11 17:28:30 +05:30
laurenspriem
cea9fa84a1 [mob][photos] Limit 2025-02-11 17:26:06 +05:30
mngshm
bf4807da5b [server] use custom request struct for modifying functionality 2025-02-11 17:20:04 +05:30
Prateek Sunal
dc3f074588 fix: don't index unowned files 2025-02-11 17:14:20 +05:30
Neeraj
282ecf763b [server] Make new links joinable by default (#5024)
## Description

## Tests
2025-02-11 17:00:22 +05:30
Neeraj Gupta
218c652ed1 [server] Make new links joinable by default 2025-02-11 16:57:54 +05:30
Neeraj
5b17711b55 [mob] Fix exif time parsing (#4985)
## Description

## Tests
2025-02-11 16:56:31 +05:30
Neeraj Gupta
b3d8e2e865 Merge remote-tracking branch 'origin/main' into fixTime 2025-02-11 16:14:32 +05:30
Ashil
85bf3eebcb [mob][photos] Fix: FileAppbar buttons not working on some screens (#5022)
## Description

The Appbar was getting cut off at the bottom, likely due to a larger top
inset on certain screens, which makes the AppBar buttons unclickable
(have received reports on the favourite button being unclickable).

This change ensures that the Appbar remains useable on all screens. 

#### Before  
<img
src="https://github.com/user-attachments/assets/9611aae5-0671-4767-b5b6-22bac1f9d8f3"
width="320">



#### After  
<img
src="https://github.com/user-attachments/assets/8a360440-1d92-4168-a0e6-b8151b2a2788"
width="320">
2025-02-11 16:14:00 +05:30
Neeraj
ceb3046a02 [mob] Avoid reloading all files from DB on Upload events (#4974)
## Description

## Tests
2025-02-11 16:09:04 +05:30
Neeraj
d3ebb3a50c [mob] Upgrade dio (#4944)
## Description
This should ideally improve the API req/response time (as seen by the
client) and also improve the overall support for VPN. See
https://pub.dev/packages/native_dio_adapter

There's only one open ticket for this plugin:

https://github.com/cfug/dio/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22p%3A%20native_dio_adapter%22


https://pub.dev/packages/cronet_http#use-embedded-cronet
To make sure app works without Google Play Services, we will need to
define this variable in our production + fdroid build process

> --dart-define=cronetHttpNoPlay=true
## Tests
2025-02-11 16:08:43 +05:30
laurenspriem
4a9bc84375 [mob][photos] Surface only relevant trips 2025-02-11 16:08:01 +05:30
Neeraj Gupta
2282db7800 [mob] Build changes 2025-02-11 16:06:00 +05:30
Neeraj Gupta
5abd8b8f04 Merge remote-tracking branch 'origin/main' into dio_upgrade 2025-02-11 15:56:24 +05:30
ashilkn
45f1549079 [mob][photos] Fix: FileAppbar buttons not working on some screens 2025-02-11 15:50:42 +05:30
laurenspriem
01aa679698 [mob][photos] Better merge 2025-02-11 14:17:48 +05:30
mngshm
8da160b834 minor fix for db column names in DB.Exec 2025-02-11 11:51:47 +05:30
mngshm
2947ca2e3c fix storagelimit column name in DB.Exec 2025-02-11 11:27:21 +05:30
Manav Rathi
54d63c9969 [docs] Update logs menu location (#5015) 2025-02-10 20:05:54 +05:30
Manav Rathi
77be0a18d4 [docs] Update logs menu location 2025-02-10 20:04:37 +05:30
Manav Rathi
627e170304 [desktop] next (#5014) 2025-02-10 19:55:15 +05:30
mngshm
59e26779b9 [server][WIP] functionality for modifying users storage limit 2025-02-10 19:36:40 +05:30
Manav Rathi
dda46c0639 [desktop] next 2025-02-10 19:29:49 +05:30
Manav Rathi
d0e9972547 photosd-v1.7.9 (#5013) 2025-02-10 19:26:19 +05:30
Manav Rathi
1358087ee7 photosd-v1.7.9 2025-02-10 19:22:04 +05:30
laurenspriem
5a0d2ba922 [mob][photos] Remove too small trips 2025-02-10 16:51:15 +05:30
laurenspriem
d607d8a851 [mob][photos] Merge locations better 2025-02-10 16:38:46 +05:30
laurenspriem
8d7950afea [mob][photos] Change logic for repeating trips 2025-02-10 15:49:02 +05:30
Neeraj
10ee5989f2 [server] Delete more items in single run (#5010)
## Description

## Tests
2025-02-10 15:25:36 +05:30
Neeraj Gupta
7509abd1a9 [server] Increase cron freq 2025-02-10 15:21:31 +05:30
Neeraj Gupta
b0966e0cca [server] Delete more items in single run 2025-02-10 15:19:51 +05:30
laurenspriem
d99d08e8ae [mob][photos] creationTime check 2025-02-10 14:09:56 +05:30
Neeraj
0a19b8259a [server] Speed up file deletion (#5009)
## Description

## Tests
2025-02-10 13:59:43 +05:30
laurenspriem
caf601b49b [mob][photos] Switch order 2025-02-10 13:55:59 +05:30
Neeraj Gupta
b453ffef85 [server] Speed up file deletion 2025-02-10 13:29:17 +05:30
Neeraj
1bb8facc56 fix(mob): streaming changes (#4992)
## Description

Many issues fixed that were hindering streaming experience.

## Tests
2025-02-10 13:08:57 +05:30
Neeraj Gupta
3fb4d3f7fb [mob] ios build changes 2025-02-10 13:06:48 +05:30
Neeraj
1ef396b34d [auth] Add icon for AJ Bell (#5004)
## Description

Add SVG icon for AJ Bell: https://www.ajbell.co.uk/.

See logo being used here: https://www.linkedin.com/company/ajbell/
2025-02-10 11:57:59 +05:30
Neeraj
85b9516fa7 [auth] New translations (#5008)
New translations from
[Crowdin](https://crowdin.com/project/ente-authenticator-app)
2025-02-10 11:46:26 +05:30
Neeraj Gupta
12c472ef01 [mob] Fix lint & missing exif for files shared to ente 2025-02-10 11:34:45 +05:30
laurenspriem
726c6dc8e6 [mob][photos] Increase trip distance threshold 2025-02-10 11:33:11 +05:30
Manav Rathi
bebe0f6d53 [web] New translations (#5005)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2025-02-10 10:36:44 +05:30
Crowdin Bot
e5303e8f0a New Crowdin translations by GitHub Action 2025-02-10 01:17:17 +00:00
Crowdin Bot
b4c5a7c747 New Crowdin translations by GitHub Action 2025-02-10 00:35:18 +00:00
Daniel Tsiang
4cc7bbb84a [auth] Add icon for AJ Bell 2025-02-09 20:39:43 +00:00
Prateek Sunal
837f372d4e chore: bump version 2025-02-08 05:29:32 +05:30
Prateek Sunal
b9a5f42d95 fix: details page 2025-02-08 05:29:25 +05:30
Prateek Sunal
b2d02c6a26 fix: add l10n, routing changes 2025-02-08 05:12:58 +05:30
Prateek Sunal
e0cbe47052 fix: stream size issues 2025-02-08 04:59:57 +05:30
Prateek Sunal
d0a2502a39 fix: color space check code 2025-02-08 04:04:00 +05:30
Prateek Sunal
f4b7ef19ce fix: add backup status item tap action, sorting fix, color space fix 2025-02-08 03:51:04 +05:30
Ashil
4d70556986 [mob][photos] Use leading debouncer for better UX (#4988) 2025-02-07 20:34:45 +05:30
ashilkn
dae55c7684 [mob][photos] Make field private 2025-02-07 17:57:53 +05:30
ashilkn
2c0b6f6dbc [mob][photos] Make debouncer used in AllSectionsExampleProvider a leading debouncer + delay initial load on app start + avoid a case where initial loading would have happened twice 2025-02-07 17:56:30 +05:30
ashilkn
e07a24a192 [mob][photos] Use leading debouncer where ever necessary for better UX 2025-02-07 17:17:38 +05:30
ashilkn
be5a29b6de [mob][photos] Add option to make debouncer leading or trailing 2025-02-07 17:06:51 +05:30
Neeraj Gupta
5d0a15e9e5 [mob] Fill dateTime and offsetTime during upload 2025-02-07 16:32:02 +05:30
Manav Rathi
27f51a6da4 [web] New translations (#4987)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2025-02-07 16:14:36 +05:30
Prateek Sunal
38ae9e2b19 fix: buffering indicator 2025-02-07 16:11:08 +05:30
Neeraj Gupta
8559dd8364 [mob] Refactor 2025-02-07 16:09:57 +05:30
Crowdin Bot
2ee79af5b7 New Crowdin translations by GitHub Action 2025-02-07 10:27:06 +00:00
Manav Rathi
405e51f228 [desktop] Touchups for light mode + integrated title bar release (#4986)
- Accommodate file menu items in the sidebar where possible
- IA changes since the sidebar was growing too big
2025-02-07 15:56:22 +05:30
Manav Rathi
13ca35c0f5 Tweak 2025-02-07 15:43:51 +05:30
Neeraj Gupta
b6b724f64f [mob] Parse exif as part of MediaUploadData 2025-02-07 15:38:49 +05:30
Prateek Sunal
afb139a301 Merge commit 'f65ab4a5a0ef53470673ca2c038df181075702f7' into streaming-prtk 2025-02-07 15:30:50 +05:30
Prateek Sunal
f65ab4a5a0 fix: put files while ignore the result 2025-02-07 15:29:15 +05:30
Manav Rathi
9309a68010 separate 2025-02-07 15:27:31 +05:30
Manav Rathi
caf1f715e1 Dividers 2025-02-07 15:10:32 +05:30
Prateek Sunal
d193efbe14 fix: queuing order, locals, preview status tap, remove cache preview button, refresh indicator 2025-02-07 15:06:55 +05:30
Manav Rathi
2156c3a946 Move 2025-02-07 15:03:08 +05:30
Neeraj Gupta
c20dcdae76 [mob] Add support for parsing dateTime & offsetTime from pubMagicMetadata 2025-02-07 14:59:52 +05:30
Manav Rathi
698e96c6d6 Arrange 2025-02-07 14:50:32 +05:30
Neeraj Gupta
5522121cf6 [mob] iOS podlock changes 2025-02-07 14:40:16 +05:30
Neeraj Gupta
0a9e706b50 [mob] Refactor 2025-02-07 14:36:16 +05:30
Manav Rathi
6c0622ab51 Account menu 2025-02-07 14:35:20 +05:30
Manav Rathi
2f205112d9 Move 2025-02-07 14:23:30 +05:30
Manav Rathi
edcd784852 Don't auto maximize 2025-02-07 14:16:26 +05:30
Manav Rathi
d13f6db1dc Use the web side 2025-02-07 14:15:16 +05:30
Manav Rathi
b9fb797a15 refresh 2025-02-07 14:06:03 +05:30
Manav Rathi
d595a2ec15 Handle 2025-02-07 13:59:45 +05:30
Manav Rathi
3936954ee2 Menu 2025-02-07 13:55:35 +05:30
Neeraj Gupta
602881ee26 [mob] Refactor 2025-02-07 13:54:44 +05:30
Manav Rathi
1b83acb262 hint improvements 2025-02-07 13:46:18 +05:30
Manav Rathi
3ec410f932 Make it work better with the hover state 2025-02-07 13:17:01 +05:30
Manav Rathi
8af2a75c84 tr 2025-02-07 13:07:31 +05:30
Manav Rathi
a041853657 Match 2025-02-07 12:58:46 +05:30
Manav Rathi
85f5939ce6 Help menu 2025-02-07 12:53:23 +05:30
Neeraj Gupta
10079d4cb0 [mob] Fix handling of timezone 2025-02-07 12:35:15 +05:30
Neeraj Gupta
d363f37592 [mob] Fix creationTime parsing 2025-02-07 12:26:52 +05:30
Manav Rathi
5566d5881b Tweak 2025-02-07 12:25:21 +05:30
Manav Rathi
6623c4fa7f Accomodate menu items - prep 2025-02-07 12:19:15 +05:30
Manav Rathi
a1b63b8ea4 Inline 2025-02-07 12:08:38 +05:30
Manav Rathi
0ce2ac279c View logs 2025-02-07 12:03:21 +05:30
Manav Rathi
8fc5a8ad88 Update Electron 2025-02-07 11:55:31 +05:30
Vishnu Mohandas
d48e34cfba [staff] populate attributes from userDataResponse when UpdateStorage returns data (#4982)
/cc @vishnukvmd mentioned that the json Response does not include
attributes data (like customerID, StripeAccountCountry) and it is
skipped in the jsonResponse while updating the storage.
2025-02-06 23:26:07 +05:30
Manav Rathi
ebf5a63c04 [desktop] Use custom theme-aware titlebar for end-to-end display (#4981) 2025-02-06 17:02:24 +05:30
Manav Rathi
d707b76f91 LF 2025-02-06 16:57:26 +05:30
Manav Rathi
cc6b3897a7 Enable 2025-02-06 16:55:52 +05:30
Manav Rathi
56f58e4dbe Fix the backdrop 2025-02-06 16:52:53 +05:30
Manav Rathi
bcd1609fd1 Cleanup 2025-02-06 16:45:50 +05:30
Manav Rathi
35ce21e207 Selection marker 2025-02-06 16:42:29 +05:30
Manav Rathi
c7dc01326f Improve behaviour on small screens 2025-02-06 16:26:47 +05:30
Manav Rathi
4e22fba056 Extract 2025-02-06 16:18:27 +05:30
Manav Rathi
22f65ce656 Conv 2025-02-06 16:15:24 +05:30
Manav Rathi
c35825f54e Below bar 2025-02-06 16:12:42 +05:30
Manav Rathi
a3adec3fee [desktop] Derive both formatted and timestamp from same source (#4980)
/cc @ua741
2025-02-06 15:58:12 +05:30
Manav Rathi
7d892c5285 [desktop] Derive both formatted and timestamp from same source 2025-02-06 15:50:14 +05:30
Manav Rathi
18e6bde91f Top bar pseudo sel 2025-02-06 15:14:55 +05:30
laurenspriem
8922d7e663 [mob][photos] Merge trips 2025-02-06 14:38:05 +05:30
mngshm
3ef7dca18f clear log statements 2025-02-06 14:36:15 +05:30
Manav Rathi
768b2f8e66 viewer 1 2025-02-06 14:36:02 +05:30
mngshm
578547fc75 hotfix: changes to populate attributes after userDataResponse is received 2025-02-06 14:28:00 +05:30
Neeraj
91a9ff5dd5 [mob][photos] fix: Value out of range (#4979) 2025-02-06 14:09:46 +05:30
Manav Rathi
b47a5d6a97 Tweak sel bar for shared albums 2025-02-06 14:07:22 +05:30
Manav Rathi
6249008151 Update 2025-02-06 13:45:40 +05:30
Manav Rathi
d244ce21f0 Trim 2025-02-06 13:40:46 +05:30
Manav Rathi
85b545049e Contents 2025-02-06 13:29:57 +05:30
Aman Raj Singh Mourya
362ae7f2f3 [mob][photos] fix: files list generated by where method can still be empty 2025-02-06 13:29:32 +05:30
Manav Rathi
cdf9474788 Reorder 2025-02-06 13:20:12 +05:30
Aman Raj Singh Mourya
10e61ee7f7 [mob][photos] fix: Invalid value: Valid value range is empty 2025-02-06 13:13:22 +05:30
Manav Rathi
54611ff256 Fix 2025-02-06 12:48:51 +05:30
Manav Rathi
2908c27ab4 1 is enough 2025-02-06 12:45:31 +05:30
Manav Rathi
21acd608ff Same 2025-02-06 12:40:55 +05:30
Manav Rathi
6902e0a8f7 Tweak 2025-02-06 12:38:52 +05:30
Manav Rathi
7b8ca828c9 Nomen 2025-02-06 12:19:31 +05:30
Manav Rathi
426765a1e4 Fin 2025-02-06 12:11:30 +05:30
Manav Rathi
e7d36f98a7 wip 2025-02-06 12:08:12 +05:30
Neeraj
dd7f5cef92 [server] Allow setting storageLimit for family members (#4961) 2025-02-06 11:59:16 +05:30
Manav Rathi
61d0c090b7 Swap 2025-02-06 11:51:51 +05:30
Manav Rathi
40edd3ecfd source order 2025-02-06 11:38:16 +05:30
Neeraj Gupta
d6a626fe0d Merge remote-tracking branch 'origin/main' into dio_upgrade 2025-02-06 11:33:48 +05:30
Manav Rathi
d7af576b7d gallery is dark in lm, so ditto in light mode 2025-02-06 10:45:03 +05:30
Manav Rathi
09c7cde958 Stack 2025-02-06 10:34:45 +05:30
Neeraj
eb34372a21 [mob][photos] Extract strings (#4976) 2025-02-06 10:29:23 +05:30
Manav Rathi
6fc2dc96a5 1's enough 2025-02-06 10:27:57 +05:30
Manav Rathi
7a5a708714 Same constant 2025-02-06 10:26:24 +05:30
Manav Rathi
6d842fd1e2 const 2025-02-06 10:23:39 +05:30
Manav Rathi
8333367633 Reuse 2025-02-06 10:23:29 +05:30
Manav Rathi
4ef56c3dc9 Rename again 2025-02-06 10:23:29 +05:30
Manav Rathi
684c538fe8 bespoke 2025-02-06 10:23:29 +05:30
Manav Rathi
0f6016db00 Rename as per plan 2025-02-06 10:23:22 +05:30
Manav Rathi
c6a907e9f6 Move 2025-02-06 09:55:18 +05:30
Manav Rathi
5094006712 bespoke 2025-02-06 09:53:09 +05:30
Manav Rathi
63c3e48a00 1 is enough 2025-02-06 09:47:26 +05:30
Manav Rathi
5a1b88983f It already comes after in the source order 2025-02-06 09:44:25 +05:30
Manav Rathi
27beed354e [web] Use lighter scrim for overlays atop photo viewer (#4978)
\+ continue with the custom title bar prep
2025-02-06 09:23:12 +05:30
Manav Rathi
73bbf39256 tsc fix 2025-02-06 09:16:53 +05:30
Manav Rathi
1a3d665655 Inline 2025-02-06 09:15:27 +05:30
Manav Rathi
02f3afc4cc Use the dialog's loader and error indicator 2025-02-06 09:14:31 +05:30
Manav Rathi
d492a0e695 Fin 2025-02-06 09:09:12 +05:30
Manav Rathi
299363c8c4 Add the customization 2025-02-06 08:58:40 +05:30
Manav Rathi
37774c31d7 Alt path 2025-02-06 08:55:06 +05:30
Manav Rathi
9fe36985d6 Tweak 2025-02-06 08:04:46 +05:30
Manav Rathi
eee6705e11 Rename 2025-02-06 07:45:03 +05:30
Manav Rathi
719ac8539b Outline 2025-02-06 07:42:32 +05:30
Manav Rathi
7f1d8dba94 Move out 2025-02-06 06:54:49 +05:30
Manav Rathi
92fe34d43f Reintroduce backdrop filter 2025-02-06 06:43:33 +05:30
Manav Rathi
a6a77ffb9c Alternative approach 2025-02-06 06:43:32 +05:30
ashilkn
a638cb1ece [mob][photos] Fix dirty merge conflict resolution 2025-02-05 20:27:42 +05:30
ashilkn
cf3cfe7275 [mob][photos] Resolve conflicts and merge main 2025-02-05 20:23:44 +05:30
ashilkn
edc39f3fd8 [mob][photos] Extract strings 2025-02-05 20:17:54 +05:30
Ashil
85729c9426 [mob][photos] Use first letter person avatar if no person is linked to contact in contacts section, all contacts screen and contact search results (#4975) 2025-02-05 19:23:55 +05:30
ashilkn
1e50f52801 [mob][photos] Throw exception and instruction on what to do instead if GenericSearchResult.previewThumbnail() is used when ResultType is 'shared'(which is the case for contacts search) 2025-02-05 17:37:21 +05:30
ashilkn
46c941fb8c [mob][photos] Use first letter avatar for contact in contacts section and all contacts screen if no person is linked to contact 2025-02-05 17:28:13 +05:30
Neeraj Gupta
f11803fd1f [mob] Lint fix 2025-02-05 16:58:09 +05:30
Neeraj Gupta
e3833044e9 [mob] Avoid reloading all files from DB on Upload events 2025-02-05 16:37:54 +05:30
laurenspriem
edfd86628a [mob][photos] Basic trips 2025-02-05 16:29:01 +05:30
mngshm
6e0be18500 rename column name to storage_limit 2025-02-05 16:09:30 +05:30
laurenspriem
99e5bc5050 [mob][photos] Simplify 2025-02-05 16:00:43 +05:30
Neeraj Gupta
2b3177d51c [server] refactor 2025-02-05 15:44:17 +05:30
Manav Rathi
88abe4dac1 [desktop] Custom theme aware titlebar - Part 1 (#4973) 2025-02-05 15:42:43 +05:30
Manav Rathi
e1633eccb7 Ensure mergeability 2025-02-05 15:34:10 +05:30
Manav Rathi
12e441a27b Calc 2025-02-05 15:27:50 +05:30
Manav Rathi
c6497dcb5a Rename 2025-02-05 15:24:33 +05:30
laurenspriem
252ae8169d [mob][photos] Improve base locations 2025-02-05 15:15:35 +05:30
Manav Rathi
70be419562 backdrop-filter 2025-02-05 15:00:19 +05:30
mngshm
834fcf933b [server] fixed the lousy bug o.O 2025-02-05 14:34:35 +05:30
Manav Rathi
6f7e56e796 Sidebar 1 2025-02-05 14:24:04 +05:30
laurenspriem
3478720cb3 [mob][photos] Test trips selection 2025-02-05 14:17:09 +05:30
mngshm
667a544fc2 [server] refactor 2025-02-05 13:48:15 +05:30
Manav Rathi
051ea691af Use t 2025-02-05 13:21:19 +05:30
Manav Rathi
b7db8e9e77 Title 2025-02-05 13:20:13 +05:30
Manav Rathi
d2e5b87bf7 Comment 2025-02-05 13:10:10 +05:30
Manav Rathi
de5ece27f2 Make it work on macOS too 2025-02-05 13:05:48 +05:30
Manav Rathi
55871c1f2e Try env, though it doesn't seem to be working 2025-02-05 13:03:37 +05:30
Manav Rathi
71a195a4de Framework 2025-02-05 12:57:15 +05:30
Manav Rathi
320a397b1c Fix the original issue
https://www.electronjs.org/docs/latest/tutorial/dark-mode
2025-02-05 12:51:59 +05:30
Manav Rathi
a295eb39f7 drag 2025-02-05 12:29:01 +05:30
Manav Rathi
df7ffefdf8 30px is from the example gist
https://www.electronjs.org/docs/latest/tutorial/custom-title-bar#create-a-custom-title-bar
2025-02-05 12:27:26 +05:30
Manav Rathi
5e7ac4437f Custom titlebar - step 1
https://www.electronjs.org/docs/latest/tutorial/custom-title-bar
2025-02-05 12:25:10 +05:30
Manav Rathi
b855d38864 [web][desktop] Light mode (#4971) 2025-02-05 11:40:15 +05:30
Manav Rathi
23712e6bd3 Fix cast theme 2025-02-05 11:35:07 +05:30
Manav Rathi
dff5e9f4a6 dep bump 2025-02-05 11:26:11 +05:30
Manav Rathi
fe58758523 We don't seem to require this, the browser + MUI defaults are working in both modes
Tested Chrome, Safari
2025-02-05 11:15:55 +05:30
mngshm
26a407cc81 [server[ fix nil dereferencing errors when user is not a part of family 2025-02-05 11:05:12 +05:30
mngshm
7513a84ad2 [server] fix minor syntax in InviteMember parameters
Remove unused SetStorage method
2025-02-05 11:04:39 +05:30
Manav Rathi
bf70129fb6 Fix the actual issue 2025-02-05 11:01:38 +05:30
Manav Rathi
8083cdfaa6 Fainter 2025-02-05 10:29:21 +05:30
Manav Rathi
f14f1ab6bb User facing CL 2025-02-05 10:16:42 +05:30
Manav Rathi
914802f057 CL 2025-02-05 10:01:15 +05:30
Manav Rathi
80e41c9882 Special case cast 2025-02-05 09:55:10 +05:30
Manav Rathi
8d9ec328f4 unwip 2025-02-05 09:52:36 +05:30
laurenspriem
fea6d58bd4 Merge branch 'main' into memories_trip 2025-02-05 09:51:14 +05:30
Manav Rathi
963ac63898 Enable lm 2025-02-05 09:48:34 +05:30
Manav Rathi
7b704d9ea7 [web] New translations (#4967)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2025-02-04 19:02:10 +05:30
Ashil
46669c623b [mob][photos] Change log for release (#4965) 2025-02-04 18:57:13 +05:30
mngshm
2da115b6b7 [server[ logic for blocking upload 2025-02-04 18:53:58 +05:30
Crowdin Bot
e74c6fd582 New Crowdin translations by GitHub Action 2025-02-04 13:18:11 +00:00
Manav Rathi
4be86c4c00 [web] Light mode - Part n-1/n (#4966)
Almost ready, next PR should be the final one that enables this.
2025-02-04 18:47:23 +05:30
Manav Rathi
d21f7c1a93 lint 2025-02-04 18:43:08 +05:30
Manav Rathi
a60048a4d0 Update 2025-02-04 18:40:42 +05:30
Manav Rathi
737977358a tr 2025-02-04 18:35:48 +05:30
Manav Rathi
f03fa338b1 Fix the toggle 2025-02-04 18:31:34 +05:30
Manav Rathi
e3c09d7af0 ns 2025-02-04 18:28:07 +05:30
ashilkn
1fb6b3dc89 [mob][photos] Bump up to v0.9.94 2025-02-04 18:10:41 +05:30
ashilkn
e68fa04a14 Merge branch 'main' into change_log 2025-02-04 18:08:14 +05:30
ashilkn
daf33bcb3a [mob][photos] Update change log 2025-02-04 18:03:53 +05:30
Manav Rathi
154a46b2ef Tweak 2025-02-04 18:00:30 +05:30
Manav Rathi
584d993bc0 Fix secondary 2025-02-04 17:40:12 +05:30
Manav Rathi
ddc4c9d275 Prune 2025-02-04 17:32:01 +05:30
Manav Rathi
61b5e0ae60 Prep 2025-02-04 17:30:36 +05:30
Prateek Sunal
e0789b0d5a [mob][preview] add support for video streaming (#4253) 2025-02-04 17:25:08 +05:30
Manav Rathi
8e847f12f2 Finalize for now 2025-02-04 17:21:17 +05:30
Manav Rathi
52086eb697 Tranlucent snb 2025-02-04 17:13:51 +05:30
Manav Rathi
383b7542c8 Messes with the animation of the "Copied" snackbar in auth 2025-02-04 17:04:57 +05:30
Manav Rathi
7e50de6e61 Match colors to auth/share 2025-02-04 16:58:42 +05:30
Manav Rathi
82cb806fab ep 2025-02-04 16:50:41 +05:30
Manav Rathi
3e89692ebc Switch 2025-02-04 16:28:08 +05:30
Manav Rathi
847cba9a8b Cleanup 2025-02-04 16:12:38 +05:30
Manav Rathi
5ed9ac0578 cap 2025-02-04 16:07:52 +05:30
Manav Rathi
be790b5bc5 Gallery itself is always in dark mode 2025-02-04 15:58:40 +05:30
Manav Rathi
092640af7e Cleanup 2025-02-04 15:24:16 +05:30
Manav Rathi
f8b9bcf79f Use in people section too 2025-02-04 15:21:00 +05:30
Prateek Sunal
510768bbd6 fix: add logic for caching and loading deatils 2025-02-04 15:16:14 +05:30
Prateek Sunal
c59dd66c0d fix: logic of displayling size, height and width 2025-02-04 15:13:05 +05:30
Manav Rathi
be894d0aaa Create button 2025-02-04 15:03:19 +05:30
Prateek Sunal
aa07b53bbd fix: add delay from init 2025-02-04 14:36:24 +05:30
Laurens Priem
3caeaef2b7 [mob][photos] Memories fix (#4964)
## Description

## Tests
2025-02-04 14:29:04 +05:30
laurenspriem
5804feedc4 [mob][photos] Bump for internal release 2025-02-04 14:25:32 +05:30
laurenspriem
cc098346b8 [mob][photos] Extra safety 2025-02-04 14:23:29 +05:30
Neeraj
2639b88348 [mob] Fix bad state error (#4963)
## Description

## Tests
2025-02-04 14:23:23 +05:30
Neeraj Gupta
dd061e6171 [mob] Fix stream cancellation for deeplink 2025-02-04 14:21:14 +05:30
laurenspriem
f874396694 [mob][photos] Fix infinite loop 2025-02-04 14:20:35 +05:30
laurenspriem
ed8a17ffd8 [mob][photos] Re-enable internal memories for Android 2025-02-04 14:16:35 +05:30
Manav Rathi
3988c9ad9d Allow customization 2025-02-04 14:14:22 +05:30
Neeraj Gupta
088c52b0df [mob] Fix bad state error 2025-02-04 14:10:51 +05:30
Neeraj Gupta
ed231c2260 Lint suggestions 2025-02-04 14:10:38 +05:30
Manav Rathi
b712ac8bf1 Prune 2025-02-04 14:08:58 +05:30
Manav Rathi
39a93ea8ef Inline 2025-02-04 14:07:10 +05:30
Neeraj
18e1745146 [auth] New translations (#4939)
New translations from
[Crowdin](https://crowdin.com/project/ente-authenticator-app)
2025-02-04 14:00:40 +05:30
Manav Rathi
c5fabbd50b Tile 2025-02-04 13:57:47 +05:30
Manav Rathi
d7806d3441 Rename 2025-02-04 13:55:46 +05:30
Manav Rathi
0658a5a59f Inline 2025-02-04 13:46:34 +05:30
Prateek Sunal
5203b764c5 Merge branch 'main' into mobile-preview-video 2025-02-04 13:43:55 +05:30
Prateek Sunal
d357d9ecbe fix: clear Queue code & uploading id code 2025-02-04 13:42:52 +05:30
Prateek Sunal
9bddc98827 fix: begin date conversion and check 2025-02-04 13:27:51 +05:30
Prateek Sunal
8fb51174ce fix: allow force upload on failed click 2025-02-04 13:12:20 +05:30
Prateek Sunal
d80093bfed fix: show options even if local variant is available but preview is too, shout correct errors, 2025-02-04 12:57:52 +05:30
Manav Rathi
8ba43d913a [web] Light mode WIP - Part x/x (#4962) 2025-02-04 12:44:30 +05:30
Manav Rathi
bd095f3062 Cleanup 2025-02-04 12:39:55 +05:30
mngshm
7a5d7a5c49 fix: set StorageLimit to nil
fix: utilise AddMemberInvite method instead of new SetStorageLimit method
2025-02-04 12:37:23 +05:30
Manav Rathi
7b214c1dc0 Keep the icon sizes consistent
They need to be scaled down on smaller screens, but we'll need to do that across
the board at once for them to remain consistent.
2025-02-04 12:35:07 +05:30
Manav Rathi
1047767d90 Tweak 2025-02-04 12:30:39 +05:30
Prateek Sunal
2c20ace110 fix: add delay, retry count and error 2025-02-04 12:29:25 +05:30
Manav Rathi
6b9e4b186e occam 2025-02-04 12:24:04 +05:30
Manav Rathi
c3f8e6a11d Reuse 2025-02-04 12:17:00 +05:30
Prateek Sunal
f93dbf0633 fix: issues 2025-02-04 12:09:25 +05:30
Manav Rathi
54cf5dba01 Tweak 2025-02-04 12:03:13 +05:30
Manav Rathi
748b737f74 Fix 2025-02-04 11:57:20 +05:30
Manav Rathi
071ffefffd Ensure ordering 2025-02-04 11:52:52 +05:30
Manav Rathi
3863591d26 accessor 2025-02-04 11:49:19 +05:30
Manav Rathi
d92838d9f2 Move 2025-02-04 11:34:49 +05:30
laurenspriem
e54027c5dd [mob][photos] Basic structure 2025-02-04 11:30:47 +05:30
Neeraj Gupta
36c06d5501 [mob] keep keep class org.chromium.net in droid proguard 2025-02-04 11:24:02 +05:30
Neeraj Gupta
701b7b8f37 [mob] Set cronetHttpNoPlay=true while building apk for droid 2025-02-04 11:13:09 +05:30
Manav Rathi
220e46109d Tweak gradient 2025-02-04 10:53:41 +05:30
Manav Rathi
4ace6675ce Treat white and black as constants 2025-02-04 10:32:57 +05:30
Manav Rathi
f3c5e769fe lm 2025-02-04 10:28:17 +05:30
Manav Rathi
c094a5afb5 disabled bg 2025-02-04 10:12:51 +05:30
mngshm
d1be5e4922 bonk upload if totalUploadSize > total member Storage 2025-02-04 10:09:02 +05:30
Manav Rathi
8555fed3d6 [web] Stack indicators on the album thumbnail (#4960)
+ other light mode changes
2025-02-04 10:05:44 +05:30
Manav Rathi
ccca42f757 Revert and scope backdrop overrides
Overriding it globally causes the backdrop of menus and selects to also have this.
2025-02-04 10:00:59 +05:30
Manav Rathi
4de5b9b8bb Rename 2025-02-04 09:54:21 +05:30
Manav Rathi
da5d81fe91 Prune 2025-02-04 09:53:49 +05:30
Manav Rathi
4ad13a2991 Opacity 2025-02-04 09:52:06 +05:30
Manav Rathi
c7859131b0 Tweak 2025-02-04 09:52:06 +05:30
Manav Rathi
211171b78a Use 2025-02-04 09:52:06 +05:30
Manav Rathi
e9fd33890e +attr 2025-02-04 09:52:06 +05:30
Neeraj
ee43a9c14c Added icon for keygen.sh (#4925)
## Description
Added 2 new icons
keygen icon was taken directly from keygen.sh, LinkedIn icon is from
Wikipedia

## Tests
2025-02-04 09:38:39 +05:30
Manav Rathi
011bfc1e0b [web] Tweaks to handling of the new .supplemental-metadata (#4959)
Ref: https://github.com/ente-io/ente/pull/4956
2025-02-04 09:05:00 +05:30
Manav Rathi
94cb146b3c Add some comments from the original PR for future ref
https://github.com/ente-io/ente/pull/4956
2025-02-04 08:58:56 +05:30
Manav Rathi
c48963244d User facing 2025-02-04 08:53:46 +05:30
Manav Rathi
03d7d826cf Fin 2025-02-04 08:51:22 +05:30
Manav Rathi
ef5babd40c Inline 2025-02-04 08:51:04 +05:30
Manav Rathi
01ebe68f09 Inline 2025-02-04 08:44:22 +05:30
Manav Rathi
6d02686331 Inline 2025-02-04 08:15:32 +05:30
Manav Rathi
d2ffea6cf9 Trim 2025-02-04 08:10:25 +05:30
Manav Rathi
ca841dcced Reduce exports 2025-02-04 08:09:25 +05:30
Manav Rathi
9933bd5385 Reduce duplication in tests 2025-02-04 08:06:10 +05:30
Manav Rathi
90e052fa49 Reorder 2025-02-04 07:58:43 +05:30
Manav Rathi
ad12458774 Tweak 2025-02-04 07:52:48 +05:30
Manav Rathi
fa00c06cf8 Rename 2025-02-04 07:48:01 +05:30
Manav Rathi
b8f475bf2e Rename 2025-02-04 07:43:46 +05:30
Manav Rathi
ffc87312d1 Split into groups 2025-02-04 07:38:11 +05:30
Manav Rathi
48f0f62d7c Add support for Takeout's new .supplemental-metadata.json files (#4956)
In recent Google Takeout archives, the metadata JSON files are named
"${original_filename}.supplemental-metadata.json" instead of
"${original_filename}.json", as before.

I refactored the previous code so that `getMetadataJSONMapKeyForJSON()`
only removes the ".json" suffix from the metadata filename and does not
make any other changes. All of the filename munging is now done to the
name of the media file. That was the only way I could make the process
deterministic. As far as I can figure out, there's no deterministic way
of deriving the media filename from the metadata filename -- it's only
deterministic going from the media filename to the metadata filename.

These new names are still subject to the 46-character clipping limit,
with some specific rules about how the filename is clipped:

- The ".json" suffix is never clipped, only the ".supplemental-metadata"
  portion is.
- If the original filename is longer than 46 characters, then the
  ".supplemental-metadata" suffix gets completely removed during the
  clipping, along with a portion of the original filename (as before).
- The numbered suffix (if present) is also never clipped. It is however
  added at the end of the clipped ".supplemental-metadata" portion,
  instead of after the original filename. E.g. "IMG_1234(1).jpg" would
  previously use a metadata filename of "IMG_1234.jpg(1).json". Now it
  uses a metadata filename of
  "IMG_1234.jpg.supplemental-metadata(1).json". But if the filename is
  too long, it gets turned into something like
  "IMG_1234.jpg.suppl(1).json".
- Worth noting is that if the original filename is 45 characters long,
  then everything except for the "." from ".supplemental-metadata" will
  get clipped. So the metadata file ends up with a filename like
  "filename_that_is_45_chars_long.jpg..json".

I added a bunch of additional test cases in `upload.test.ts` based on
actual filenames I have in my Google Photos Takeout archives. The new
code passes all of the new test cases, as well as the original ones.

Fixes #4953
2025-02-04 07:32:11 +05:30
Ashil
9ac2ebfc08 [mob][photos] Fix freezing app + improvements to contacts-faces linking (#4957) 2025-02-03 20:45:31 +05:30
ashilkn
c96102c2b8 [mob][photos] Fallback to using first file as thumbnail for contacts section elements if PersonFaceWidget fails in contact section 2025-02-03 19:43:16 +05:30
ashilkn
f69dd18364 [mob][photos] Show onThisDayOrWeeksResults in moments section only on iOS 2025-02-03 19:32:49 +05:30
Gary Peck
6d2c317877 Add support for Takeout's new .supplemental-metadata.json files
In recent Google Takeout archives, the metadata JSON files are named
"${original_filename}.supplemental-metadata.json" instead of
"${original_filename}.json", as before.

I refactored the previous code so that `getMetadataJSONMapKeyForJSON()`
only removes the ".json" suffix from the metadata filename and does not
make any other changes. All of the filename munging is now done to the
name of the media file. That was the only way I could make the process
deterministic. As far as I can figure out, there's no deterministic way
of deriving the media filename from the metadata filename -- it's only
deterministic going from the media filename to the metadata filename.

These new names are still subject to the 46-character clipping limit,
with some specific rules about how the filename is clipped:

- The ".json" suffix is never clipped, only the ".supplemental-metadata"
  portion is.
- If the original filename is longer than 46 characters, then the
  ".supplemental-metadata" suffix gets completely removed during the
  clipping, along with a portion of the original filename (as before).
- The numbered suffix (if present) is also never clipped. It is however
  added at the end of the clipped ".supplemental-metadata" portion,
  instead of after the original filename. E.g. "IMG_1234(1).jpg" would
  previously use a metadata filename of "IMG_1234.jpg(1).json". Now it
  uses a metadata filename of
  "IMG_1234.jpg.supplemental-metadata(1).json". But if the filename is
  too long, it gets turned into something like
  "IMG_1234.jpg.suppl(1).json".
- Worth noting is that if the original filename is 45 characters long,
  then everything except for the "." from ".supplemental-metadata" will
  get clipped. So the metadata file ends up with a filename like
  "filename_that_is_45_chars_long.jpg..json".

I added a bunch of additional test cases in `upload.test.ts` based on
actual filenames I have in my Google Photos Takeout archives. The new
code passes all of the new test cases, as well as the original ones.
2025-02-03 13:23:40 +01:00
Manav Rathi
3454536799 [web] Fix casing of source string (#4955) 2025-02-03 17:50:01 +05:30
Manav Rathi
1ecd688fb8 [web] Fix casing of source string 2025-02-03 17:46:38 +05:30
Manav Rathi
54971cbaf8 [web] New translations (#4954)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2025-02-03 17:46:20 +05:30
Crowdin Bot
a892061446 New Crowdin translations by GitHub Action 2025-02-03 12:15:21 +00:00
Manav Rathi
f6d4c632c7 [web] Light mode WIP - Part x/x (#4952) 2025-02-03 17:21:41 +05:30
Manav Rathi
919f0e2b57 Prefix to improve greppability
Didn't want to prefix with "--ente" since these are not "global" vars, they're
only for a small scope, using the mechanism that Pigment CSS is recommending
that we follow to introduce dynamism with static styling.

"et" could mean "ente" (but shorter), or "ente temp", or whatever you wish for
it to mean really.
2025-02-03 17:10:17 +05:30
Manav Rathi
388add5984 Pixel 2025-02-03 17:05:57 +05:30
mngshm
10cba852d7 fix: set storage column type to BIGINT
set default storage limit if StorageLimit is empty/0
2025-02-03 17:04:59 +05:30
Neeraj
404d1feef6 [mob][photos] Contact person linking final fixes (#4951) 2025-02-03 17:03:17 +05:30
ashilkn
d6e0b85af9 [mob][photos] Bump up to v0.9.92 2025-02-03 17:01:17 +05:30
ashilkn
58c164d2c2 Merge branch 'main' into contact_person_linking_final_fixes 2025-02-03 17:00:02 +05:30
ashilkn
7830f9b1b1 [mob][photos] Chore 2025-02-03 16:59:31 +05:30
mngshm
23db087b6a same as previous commit but for methods and 2025-02-03 16:56:10 +05:30
mngshm
43b9ae6539 querying storage in families table as convertRowsToFamilyMember also expects storage 2025-02-03 16:51:57 +05:30
Neeraj
efe3240bf4 [mob] Fix personAvatar when low score face is manually assigned (#4950)
## Description

## Tests
2025-02-03 16:50:12 +05:30
Neeraj Gupta
1446f20d69 [mob] Fix personAvatar when low score face is manually assigned 2025-02-03 16:42:46 +05:30
Manav Rathi
296579b80b Fix color 2025-02-03 16:31:47 +05:30
Manav Rathi
aea6961676 [web] New translations (#4949)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2025-02-03 16:12:16 +05:30
Crowdin Bot
6c33671da7 New Crowdin translations by GitHub Action 2025-02-03 10:41:04 +00:00
ashilkn
982e0068ee [mob][photos] Create constant variables for keys 2025-02-03 16:10:42 +05:30
Manav Rathi
256178240d [web] Manually sync with Crowdin (#4948)
Building via their dashboard is not applying these changes
2025-02-03 16:10:11 +05:30
Manav Rathi
9d931e2d8b [web] Manually sync with Crowdin
Building via their dashboard is not applying these changes
2025-02-03 16:05:13 +05:30
ashilkn
92234752a2 [mob][photos] Fix border issue 2025-02-03 15:55:48 +05:30
Manav Rathi
1d908cbed6 [web] New translations (#4947)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2025-02-03 15:55:34 +05:30
Crowdin Bot
305f727078 New Crowdin translations by GitHub Action 2025-02-03 10:24:17 +00:00
Manav Rathi
9244a1799a [web] New translations (#4946)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2025-02-03 15:49:57 +05:30
Crowdin Bot
d76c512d96 New Crowdin translations by GitHub Action 2025-02-03 10:10:30 +00:00
Manav Rathi
8fbbb3a18c [web] Misc minor color and translation fixes (#4945) 2025-02-03 15:39:48 +05:30
Manav Rathi
1b0ed23df9 Fix warning 2025-02-03 15:32:08 +05:30
Manav Rathi
9230ddba3f Prune 2025-02-03 15:30:28 +05:30
Manav Rathi
5f2a1e9386 Rename 2025-02-03 15:24:54 +05:30
Neeraj Gupta
1396ca57db [mob] Use native dio adapter 2025-02-03 15:21:46 +05:30
Manav Rathi
0d40c382ac Move 2025-02-03 15:21:18 +05:30
Manav Rathi
c1b73dc18c Rename 2025-02-03 15:20:05 +05:30
Manav Rathi
84888df08b Move 2025-02-03 15:19:11 +05:30
Manav Rathi
b43c0f6cc7 Rename 2025-02-03 15:18:23 +05:30
Manav Rathi
fb10d78c34 Rename 2025-02-03 15:13:39 +05:30
Manav Rathi
5b1365e7d1 Rename and move 2025-02-03 15:12:58 +05:30
Manav Rathi
85bf7bbc48 Rename 2025-02-03 15:12:16 +05:30
Manav Rathi
f1bf091faf Reorder 2025-02-03 15:11:04 +05:30
Neeraj Gupta
5a639a9c60 [mob] Upgrade dio 2025-02-03 15:09:52 +05:30
Manav Rathi
f1a345d04d Rename 2025-02-03 15:09:35 +05:30
Manav Rathi
2988a3983e Rename 2025-02-03 15:01:58 +05:30
ashilkn
6fd19b3dca [mob][photos] Fallback to using first letter avatar if face avatar is not available yet becuase db is not ready in UserAvatarWidget 2025-02-03 14:57:35 +05:30
Manav Rathi
58fce85696 Rename 2025-02-03 14:57:15 +05:30
Manav Rathi
fbde5625b2 Rename 2025-02-03 14:56:10 +05:30
Manav Rathi
269660c487 Rename 2025-02-03 14:55:41 +05:30
Manav Rathi
dbae45ee44 Fix 2025-02-03 14:54:40 +05:30
Manav Rathi
0b76611e11 Rename 2025-02-03 14:54:12 +05:30
Manav Rathi
b77ac99bbb Rename 2025-02-03 14:53:03 +05:30
Manav Rathi
7cfad45b65 Rename 2025-02-03 14:51:06 +05:30
Manav Rathi
a3384adfb0 Rename 2025-02-03 14:48:19 +05:30
Manav Rathi
e1e05d4781 Fix key warning 2025-02-03 14:44:59 +05:30
Manav Rathi
b8e2b265c3 Update 2025-02-03 14:39:02 +05:30
ashilkn
e3ffe3e1f0 [mob][photos] Fix search results with wrong thumbnail and possible other wrong elements 2025-02-03 14:38:36 +05:30
Manav Rathi
3c352e9ca2 both grad 2025-02-03 14:35:25 +05:30
ashilkn
85d50890a6 [mob][photos] Minor perf optimization 2025-02-03 14:33:21 +05:30
Eran Nave
0a4ad32d9c undo json autoformat 2025-02-03 09:44:25 +01:00
ashilkn
1201cfc42d [mob][photos] Show contacts that have shared nothing yet also in contacts section and search 2025-02-03 14:12:39 +05:30
Eran Nave
528526ac10 removed LinkedIn icon 2025-02-03 09:42:35 +01:00
Manav Rathi
2049bf769d gradient lm 2025-02-03 14:11:03 +05:30
Eran Nave
597190e375 Merge branch 'ente-io:main' into custom_icons 2025-02-03 09:40:44 +01:00
mngshm
47a68742d2 include storageLimit in convertRowsToFamilyMember method 2025-02-03 13:58:03 +05:30
Manav Rathi
e1327a5896 New one 2025-02-03 13:57:12 +05:30
Manav Rathi
7a9110cc9b Can use it with tsc currently 2025-02-03 13:42:05 +05:30
Manav Rathi
f64e62ba61 Reuseable 2025-02-03 13:42:05 +05:30
Manav Rathi
54681d3bde Fix the set password form showing through now that we have a translucent loading overlay 2025-02-03 13:42:05 +05:30
Neeraj
749109fc73 [mob] Store remote ml data before sechduling processing (#4942)
## Description
This will ensure that MLData that was already fetched is saved in the DB
before running the ML pipeline on files that requires indexing.

## Tests
2025-02-03 13:18:10 +05:30
Neeraj
58f84b2a73 Revert "[mobile] New translations (#4938)" (#4943)
This reverts commit 930224a2e5, reversing
changes made to 3de324f342.

## Description

## Tests
2025-02-03 11:53:40 +05:30
Neeraj Gupta
86c9b1ef00 Revert "[mobile] New translations (#4938)"
This reverts commit 930224a2e5, reversing
changes made to 3de324f342.
2025-02-03 11:50:27 +05:30
Neeraj Gupta
e98b0f4e10 [mob] Clean up 2025-02-03 11:37:28 +05:30
Neeraj
930224a2e5 [mobile] New translations (#4938)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-app)
2025-02-03 11:36:48 +05:30
Laurens Priem
3de324f342 Memories seleciton (#4926)
## Description

Complete first iteration of time based memories

## Tests

Tested in debug mode on my pixel phone.
2025-02-03 11:31:33 +05:30
laurenspriem
2e0dcc17ef [mob][photos] Bump for internal release 2025-02-03 11:24:24 +05:30
laurenspriem
10e6f797eb Merge branch 'main' into memories_seleciton 2025-02-03 11:22:59 +05:30
Manav Rathi
e8e7744af3 [meta] Use preferred casing of Wasm (#4941)
From webassembly.org

> WebAssembly (abbreviated _Wasm_) is ...
2025-02-03 11:19:38 +05:30
Neeraj Gupta
e42024c912 minor refactor 2025-02-03 11:18:01 +05:30
Manav Rathi
18cc16bcc0 Use preferred casing of Wasm
From webassembly.org

> WebAssembly (abbreviated _Wasm_) is ...
2025-02-03 11:15:00 +05:30
ashilkn
01c2348b6e [mob][photos] Minor perf optimization 2025-02-03 11:12:05 +05:30
Neeraj Gupta
4fd3a269b0 [mob] Store existing results first before yeilding for indexing 2025-02-03 11:08:56 +05:30
ashilkn
5e41952e62 [mob][photos] Fix no element error 2025-02-03 10:56:59 +05:30
ashilkn
37d38a0e6b [mob][photos] Avoid getRelevantContacts in Person Service returning account owner's User object 2025-02-03 10:52:21 +05:30
Manav Rathi
2a5d67b5ca [web] New translations (#4937)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2025-02-03 09:46:28 +05:30
Crowdin Bot
1b320000fb New Crowdin translations by GitHub Action 2025-02-03 01:17:10 +00:00
Crowdin Bot
faed01ca01 New Crowdin translations by GitHub Action 2025-02-03 01:05:07 +00:00
Crowdin Bot
ec147d57dd New Crowdin translations by GitHub Action 2025-02-03 00:34:32 +00:00
Prateek Sunal
5250f7f355 Merge branch 'main' into mobile-preview-video 2025-02-03 06:03:30 +05:30
Prateek Sunal
df769a97ec chore: bump version 2025-02-03 06:02:54 +05:30
Prateek Sunal
9f14d60b42 fix: skip local videos for preview 2025-02-03 05:40:19 +05:30
Prateek Sunal
b70de5cc67 fix: imports 2025-02-03 04:56:43 +05:30
Prateek Sunal
95ae2c30ec fix: add i18n & autoplay 2025-02-03 04:51:41 +05:30
Prateek Sunal
05d83cf390 fix: handle edge cases for preview uploads 2025-02-03 04:40:28 +05:30
Prateek Sunal
a72ae560c9 fix: processing and display logic 2025-02-03 03:37:29 +05:30
ashilkn
6980f56cc3 [mob][photos] Show contacts with no files shared too in contacts and all contacts section 2025-02-01 22:54:57 +05:30
Ashil
48169e9794 [mob][photos] Ask "open public album link in app" permission once (#4922)
## Description
1. Don't show the permission dialog if self-hosted ente
2. Show dialog only once
2025-02-01 18:53:53 +05:30
Ashil
14fbec6b94 [mob][photos] Bug fixes for contact-person linking feature (#4931) 2025-02-01 16:34:20 +05:30
Aman Raj Singh Mourya
a845642cfe [mob][photos] Minor fix 2025-02-01 15:01:30 +05:30
Ashil
4b7397c9bf [auth] Fix logout button not showing on lockscreen (#4924)
## Description
1. Logout button was hidden when user first opt for **Use without
backup** and then **Log in** due the `hasOptedForOfflineMode` been set
to true if we follow the above way , fixed by checking `isLoggedIn`
## Tests
2025-02-01 14:39:55 +05:30
ashilkn
bf19e07512 [mob][photos] Bump up to v0.9.90 2025-02-01 14:36:35 +05:30
ashilkn
e3540b7681 [mob][photos] Run flutter pub get 2025-02-01 14:33:39 +05:30
ashilkn
6ee6e7f217 [mob][photos] Resolve merge conflicts and merge main 2025-02-01 13:14:49 +05:30
ashilkn
cb4fcfdd25 [mob][photos] Reset _emailToPartialPersonDataMapCache after first entities sync (right after logging in) 2025-02-01 12:39:16 +05:30
Prateek Sunal
330a3b4dea chore: bump version 2025-02-01 04:21:55 +05:30
Prateek Sunal
bf1613d91d fix: store in pub magic metadata 2025-02-01 04:21:17 +05:30
Prateek Sunal
0f7445b219 chore: add TODO 2025-02-01 03:35:26 +05:30
Prateek Sunal
47914126e5 fix: add mechanism to show the stream details 2025-02-01 03:35:01 +05:30
Prateek Sunal
bc7400c0a2 fix: icons in backup status, make the buttons work, correct bitrate and codec in checking, correctly upload on start 2025-02-01 02:59:37 +05:30
ashilkn
c15a7909e8 [mob][photos] Minor change 2025-01-31 20:42:16 +05:30
Manav Rathi
5243515beb [web] Light mode WIP - Part x/x (#4927) 2025-01-31 20:16:07 +05:30
Manav Rathi
48db372251 Plan button 2025-01-31 20:11:52 +05:30
ashilkn
9671f4e3fc [mob][photos] Fix user avatar not updating after linking contact to face 2025-01-31 20:09:41 +05:30
Manav Rathi
e093a0de61 wf cleanup 2025-01-31 20:07:51 +05:30
ashilkn
4e7c97a45f [mob][photos] Chore 2025-01-31 19:44:09 +05:30
Manav Rathi
4fac219e52 Tweak 2025-01-31 18:37:27 +05:30
ashilkn
65ea4f755f [mob][photos] Fix bug when filtering list of contacts when searching on add participant page and possibly in link email screen as well 2025-01-31 18:37:07 +05:30
Manav Rathi
189f647ffe Conv 2025-01-31 18:34:47 +05:30
ashilkn
eed50f753b [mob][photos] Write a function that returns relevant emails, which will then be used as the base list to further filter suggestions in the 'Link Email' screen and the 'Add Participants to Album' screen.
The number of emails suggested in the 'Add Participants to Album' screen will now be higher than before, yet still useful.
2025-01-31 17:38:18 +05:30
laurenspriem
0ba76ebbf0 [mob][photos] Simplify 2025-01-31 17:28:55 +05:30
laurenspriem
78ae7c8595 [mob][photos] Increase month selection to 20 2025-01-31 17:20:21 +05:30
laurenspriem
45eff8edb3 [mob][photos] Add months 2025-01-31 17:13:38 +05:30
laurenspriem
0498fa644b [mob][photos] Null safety fix uploadedFileID 2025-01-31 17:10:14 +05:30
Eran Nave
6192ea8b3a Added icons for LinkedIn and keygen.sh 2025-01-31 11:55:42 +01:00
Aman Raj Singh Mourya
34b20573b5 [auth] fix logout button not showing on lockscreen 2025-01-31 16:10:20 +05:30
Manav Rathi
f39ac3529f [web] Light mode changes - Revert the dialog blur (#4923)
+ other WIP
2025-01-31 16:03:23 +05:30
Manav Rathi
0869421d9c Too strong too do always perhaps, need more thought 2025-01-31 15:58:00 +05:30
Manav Rathi
e2876d3d24 Search input 2025-01-31 15:58:00 +05:30
ashilkn
e0b9b27537 [mob][photos] Replace email with name if available on ShareCollectionPage 2025-01-31 15:40:41 +05:30
Manav Rathi
cecb7fd4f4 Solids 2025-01-31 15:23:06 +05:30
laurenspriem
68319ca725 [mob][photos] Update day string 2025-01-31 15:20:55 +05:30
laurenspriem
92a718ca0f [mob][photos] Return when limit 2025-01-31 15:17:24 +05:30
laurenspriem
e4e01cce9e [mob][photos] Add significant weeks 2025-01-31 15:14:25 +05:30
Aman Raj Singh Mourya
a77fe84ea4 [mob][photos] Ask the permission dialog once 2025-01-31 14:52:57 +05:30
Manav Rathi
8e3608c396 Conv 2025-01-31 14:52:01 +05:30
Aman Raj Singh Mourya
3f673d409a [mob][photos] Do not show "open public links in app" permission if self-hosted ente 2025-01-31 14:51:36 +05:30
Manav Rathi
b24b249352 s 2025-01-31 14:47:47 +05:30
Prateek Sunal
662cb8135e fix: cutoff logic for video player 2025-01-31 14:44:08 +05:30
Prateek Sunal
e7a53f87ca fix: disable it by default 2025-01-31 14:37:37 +05:30
Manav Rathi
5a8d45fa98 Subtler
Revert "Also for drawers"

This reverts commit 3a7914e1bf.
2025-01-31 14:36:32 +05:30
Manav Rathi
3a7914e1bf Also for drawers 2025-01-31 14:31:03 +05:30
Manav Rathi
6afce67d51 [web] Light mode WIP - Part x/x (#4921) 2025-01-31 14:30:42 +05:30
Manav Rathi
edcd916744 Cleanup 2025-01-31 14:10:11 +05:30
Manav Rathi
9fdc1c1baf LF 2025-01-31 14:08:44 +05:30
Manav Rathi
0b60603559 Fix duplicate backdrops 2025-01-31 13:56:06 +05:30
Manav Rathi
c080d16ae7 Prune 2025-01-31 13:38:41 +05:30
Manav Rathi
14a806c4ea sp => gap 2025-01-31 13:34:18 +05:30
Manav Rathi
a60f1ec213 Tweak 2025-01-31 12:48:32 +05:30
ashilkn
ba53da4a69 [mob][photos] Show user avatars in email section of save or edit person screen to match figma design 2025-01-31 12:45:28 +05:30
Manav Rathi
79b9b2f84e Tweak layout 2025-01-31 12:41:49 +05:30
Manav Rathi
17b2348fca plan card 2025-01-31 12:27:58 +05:30
Manav Rathi
6453c3d243 Tweak 2025-01-31 12:16:02 +05:30
Manav Rathi
0842edc82d Menu 2025-01-31 12:07:16 +05:30
Manav Rathi
ab9e1f4a3d Fix 2025-01-31 11:53:45 +05:30
Manav Rathi
533e20ad46 Notification 2025-01-31 11:50:05 +05:30
Manav Rathi
6d257f04b5 Do 2025-01-31 11:24:05 +05:30
Manav Rathi
f6ca34c6e9 Improve contrast of dialog contents 2025-01-31 11:15:58 +05:30
ashilkn
96e8b09555 [mob][photos] Chore 2025-01-31 10:52:28 +05:30
ashilkn
bdd7dccd74 [mob][photos] Chore 2025-01-31 10:47:11 +05:30
mngshm
1e55d61279 Removing code which doesn't make sense 2025-01-31 10:47:01 +05:30
Manav Rathi
70877b9103 Let it shine through 2025-01-31 10:43:09 +05:30
ashilkn
888a604633 [mob][photos] Update thumbnail of contacts in contacts section when linking or un-linking person from the contact 2025-01-31 10:39:38 +05:30
Manav Rathi
37172c8291 transluscent 2025-01-31 10:36:36 +05:30
Manav Rathi
beb09defca Use loading bar on photos 2025-01-31 10:29:55 +05:30
Manav Rathi
e23f7fd63e hook 2025-01-31 08:59:21 +05:30
Manav Rathi
93f4e9f2c0 [desktop] Fix ARM build (#4920)
Regression introduced yesterday -
d37675cc57
2025-01-31 08:45:40 +05:30
Manav Rathi
495c950386 [desktop] Fix ARM build
Regression introduced yesterday - d37675cc57
2025-01-31 08:43:00 +05:30
Manav Rathi
8d29e837cd [web] Match mobile behaviour for archived files in all (#4919)
Fixes https://github.com/ente-io/ente/issues/4893,
https://github.com/ente-io/ente/discussions/4000
Related https://github.com/ente-io/ente/discussions/3047
2025-01-31 07:13:30 +05:30
Prateek Sunal
226830acaa chore: bump version 2025-01-31 03:48:37 +05:30
Prateek Sunal
96a18d9f2b Merge branch 'main' into mobile-preview-video 2025-01-31 03:48:20 +05:30
Prateek Sunal
548955a803 fix: add to queue based on cutoff date 2025-01-31 03:45:55 +05:30
Prateek Sunal
f7896d5a82 fix: only show size for internal user 2025-01-31 03:16:33 +05:30
Prateek Sunal
18ca154578 fix: preview video state & similar controls 2025-01-31 02:59:59 +05:30
Prateek Sunal
d625816eb3 fix: update code for backup status 2025-01-30 22:12:29 +05:30
Prateek Sunal
094e08c387 fix: show preview status 2025-01-30 21:52:20 +05:30
Manav Rathi
f7c8a563a9 [web] Match mobile behaviour for archived files in all 2025-01-30 19:57:14 +05:30
ashilkn
00c43b10ea [mob][photos] Use contact's face as thumbnail if linked to a person in contacts section and search results that come up when searching 2025-01-30 19:33:38 +05:30
ashilkn
bcaafe7e33 [mob][photos] Remove unused widget 2025-01-30 19:08:09 +05:30
Neeraj
a754fe740f [mob] Reduce noise from logs (#4914)
## Description

## Tests
2025-01-30 18:23:48 +05:30
laurenspriem
26020c2e99 [mob][photos] todo 2025-01-30 17:52:01 +05:30
ashilkn
9e4c3d826a [mob][photos] Add remoteID of person linked to the email in email-to-person-data cache 2025-01-30 17:09:08 +05:30
ashilkn
da582a2436 [mob][photos] Await on _resetEmailToNameCache so that PeopleChangedEvent is fired only after cache is updated. Else there is chance that UI is rebuild on PeopleChangedEvent with stale state of EmailToNameCahce 2025-01-30 16:50:03 +05:30
ashilkn
208e4cbbab [mob][photos] Chore 2025-01-30 16:37:17 +05:30
laurenspriem
fbcba9903e [mob][photos] todo 2025-01-30 16:15:57 +05:30
ashilkn
d37af17445 Revert "[mob][photos] Move Contacts section from search tab to shared tab"
This reverts commit 628f195c0e.
2025-01-30 16:11:29 +05:30
ashilkn
d8b995c3d6 Revert "[mob][photos] Refactor"
This reverts commit cf977a7fa1.
2025-01-30 16:10:50 +05:30
Manav Rathi
58d5374910 [web] Routine dependency updates (#4913)
yarn workspaces info 2>&1 | sed '1d' | sed '$d' | jq '.[] | values |
.location' | xargs -o -n 1 -I % sh -c 'cd % && npx npm-check-updates
--interactive'
2025-01-30 16:10:07 +05:30
ashilkn
90db26c07b Revert "[mob][photos] Reload Contacts and AllContacts section on necessary update events"
This reverts commit 11d080f721.
2025-01-30 16:08:43 +05:30
Neeraj Gupta
48de9850e5 [mob] Lint 2025-01-30 16:03:04 +05:30
Manav Rathi
c4d6323a36 More 2025-01-30 16:00:44 +05:30
Neeraj Gupta
bc6ede54f9 [mob] Reduce noise from logs 2025-01-30 15:59:42 +05:30
laurenspriem
0c92ed96a6 [mob][photos] Lower clip threshold 2025-01-30 15:58:51 +05:30
Manav Rathi
20c6f15a0f Fin 2025-01-30 15:49:12 +05:30
Manav Rathi
8407816d14 MUI deprecations 2025-01-30 15:46:23 +05:30
Manav Rathi
369999e0aa Fix MUI deprecations 2025-01-30 15:20:00 +05:30
laurenspriem
9295908dc5 [mob][photos] comment 2025-01-30 14:47:44 +05:30
ashilkn
b2a21084da [mob][photos] Remove hidden or ignored people from person selection screens (Reassign me & Link contact to person) 2025-01-30 14:38:14 +05:30
laurenspriem
95a27397d3 [mob][photos] small correction 2025-01-30 14:32:31 +05:30
laurenspriem
d9c1a21b0c [mob][photos] simplify 2025-01-30 14:25:00 +05:30
laurenspriem
821965308e [mob][photos] Increase photo multiyear photo selection if needed 2025-01-30 14:16:58 +05:30
laurenspriem
22bec8eee7 [mob][photos] Simpler multi-year filtering 2025-01-30 14:06:55 +05:30
Neeraj
e77998fd71 [mob] Fix bad translation (#4911)
## Description

## Tests
2025-01-30 13:57:01 +05:30
Manav Rathi
b6ae571b0b [web] Routine dependency updates
yarn workspaces info 2>&1 | sed '1d' | sed '$d' | jq '.[] | values | .location' | xargs -o -n 1 -I % sh -c 'cd % && npx npm-check-updates --interactive'
2025-01-30 13:51:00 +05:30
Manav Rathi
b3d8072a38 [desktop] Replace ImageMagick with vips (#4912)
This has already been done, this PR is just final cleanup.
2025-01-30 13:45:21 +05:30
Manav Rathi
892f130580 [desktop] Replace ImageMagick with vips
This has already been done, this PR is just final cleanup.
2025-01-30 13:37:36 +05:30
Neeraj Gupta
b25e5a9443 [mob] Fix bad translation 2025-01-30 13:37:21 +05:30
Manav Rathi
55994e472a [desktop] Handle missing assigned clusters gracefully (#4910) 2025-01-30 12:53:04 +05:30
Manav Rathi
9c23c03f23 [desktop] Handle missing assigned clusters gracefully 2025-01-30 12:46:02 +05:30
Manav Rathi
7dda0ecf81 [web] Light mode WIP - Part x/x (#4909) 2025-01-30 12:41:36 +05:30
Manav Rathi
09bfca7aa4 lf 2025-01-30 12:38:44 +05:30
Neeraj
7c3fe5d57c [auth][mob] Fix 2FA recovery flow (#4908)
## Description

Resolves https://github.com/ente-io/ente/issues/3935

## Tests
2025-01-30 12:01:10 +05:30
Manav Rathi
08c4842f20 Stop duplicating comments 2025-01-30 11:58:01 +05:30
Manav Rathi
aea5f78765 Lift it up for dark mode 2025-01-30 11:58:01 +05:30
Manav Rathi
2bd36b0795 Improve vis 2025-01-30 11:58:01 +05:30
Manav Rathi
13860afbc2 Tweak 2025-01-30 11:58:01 +05:30
Manav Rathi
a7a21e66a7 Style the focus and activation 2025-01-30 11:58:01 +05:30
Manav Rathi
f0e4678307 Improve accessibility and keyboard access 2025-01-30 11:58:01 +05:30
Neeraj Gupta
782ef5eeb0 [auth] Fix 2fa recovery flow 2025-01-30 11:55:07 +05:30
Neeraj Gupta
7fc7d365ad [mob] Fix color 2025-01-30 11:41:18 +05:30
Neeraj Gupta
f98be148dc [mob] Fix recovery flow 2025-01-30 11:41:11 +05:30
Manav Rathi
09c29362af [desktop] Fix download path during install (#4907) 2025-01-30 11:40:21 +05:30
Manav Rathi
bed645044b [desktop] Fix download path during install 2025-01-30 11:38:43 +05:30
Neeraj
07618b8041 [mob] Interface for ML DB + refactor (#4898)
## Description

## Tests
2025-01-30 11:01:51 +05:30
Manav Rathi
7e0dc22abe [desktop] im => vips (#4906)
More cleanup is pending, once we give this nightly a go.
2025-01-30 08:22:27 +05:30
Manav Rathi
d37675cc57 [desktop] im => vips
More cleanup is pending, once we give this nightly a go.
2025-01-30 08:20:11 +05:30
mngshm
c5aaed4361 chore[broken mods]: Modifications for Storage Limits 2025-01-29 19:04:52 +05:30
Manav Rathi
1ac0903561 [desktop] Routine dependency updates (#4900) 2025-01-29 17:43:39 +05:30
Manav Rathi
adffe6362a [desktop] Routine dependency updates 2025-01-29 17:41:54 +05:30
Neeraj Gupta
2cade6f271 [mob] Refactor 2025-01-29 17:13:21 +05:30
Neeraj Gupta
ac08d5b37d [mob] Fix lint 2025-01-29 17:13:12 +05:30
Manav Rathi
9d1cc2a014 [desktop] Don't assume a particular position for the open URL arg (#4899)
Ref: https://github.com/electron/electron/issues/20322
2025-01-29 17:12:51 +05:30
Manav Rathi
167807c758 [desktop] Don't assume a particular position for the open URL arg
Ref: https://github.com/electron/electron/issues/20322
2025-01-29 17:03:14 +05:30
Neeraj Gupta
ebd4b89f34 [mob] Refactor 2025-01-29 16:36:06 +05:30
Manav Rathi
6217c3a8f5 [web] Storage card light mode (#4897)
Part of WIP lm updates
2025-01-29 16:27:49 +05:30
Laurens Priem
4d307ded5e [mob][photos] Bump for internal release again (#4896)
## Description

bump for internal release
2025-01-29 16:23:46 +05:30
laurenspriem
6e7ced0ecc [mob][photos] Bump for internal release 2025-01-29 16:21:11 +05:30
Manav Rathi
2dad8f6db0 both 2025-01-29 16:19:46 +05:30
Laurens Priem
9b729fb170 [mob][photos] Bump (#4895)
## Description

Bump version for internal release
2025-01-29 16:17:47 +05:30
laurenspriem
7598351211 [mob][photos] Bump 2025-01-29 16:14:08 +05:30
Neeraj Gupta
657949d109 [mob] Perf improvement 2025-01-29 16:10:42 +05:30
Manav Rathi
1d118b07f9 Extract 2025-01-29 16:05:18 +05:30
Neeraj Gupta
a0bb50fc37 [mob] Performance improvement 2025-01-29 15:57:28 +05:30
laurenspriem
29e77245d7 [mob][photos] Filter for multiple years 2025-01-29 15:57:22 +05:30
Manav Rathi
a0a001e8e7 individual cards 2025-01-29 15:56:08 +05:30
Prateek Sunal
d6c58bc9ca fix: add state for preview updates 2025-01-29 15:54:18 +05:30
Laurens Priem
65ed594574 Person issue logs (#4894)
## Description

Logs
2025-01-29 15:52:59 +05:30
Neeraj
f3952fad49 [auth] Update custom-icons.json (#4892)
I moved World Cube Association entry to the proper alphabetical place
and added the "slug" line because icon is showing blank and I think that
could be the reason.

If there's other common issues with blank SVG icons I would love to
check it, because I've not touch the icon code and is showing in red for
closing `</g>` but is showing fine in the viewer.

Sorry about this.
Regards
2025-01-29 15:36:59 +05:30
Neeraj Gupta
09b88e5bab refactor 2025-01-29 15:33:46 +05:30
Alfred0
bfdd111dc1 Update custom-icons.json
I move World Cube Association entry to the proper alphabetical place and added the slug line because icon is showing blank and I think that could be the reason
2025-01-29 10:51:58 +01:00
Manav Rathi
a2166308d2 wip 2025-01-29 15:20:16 +05:30
Neeraj Gupta
29f4bbb0de Merge remote-tracking branch 'origin/main' into db_interface 2025-01-29 15:08:19 +05:30
Manav Rathi
f235da8a05 t 2025-01-29 14:54:51 +05:30
Manav Rathi
cae38e22e3 tweak 2025-01-29 14:34:27 +05:30
Manav Rathi
c4702cdc22 mq 2025-01-29 14:18:37 +05:30
laurenspriem
05fc91576a [mob][photos] More logs 2025-01-29 14:02:35 +05:30
Neeraj Gupta
c64af87e33 [mob] Refactor 2025-01-29 13:52:12 +05:30
laurenspriem
14f13d9dde [mob][photos] Better logging of person issues 2025-01-29 13:48:39 +05:30
Manav Rathi
6d7210cc69 t 2025-01-29 12:58:45 +05:30
laurenspriem
1ff4f7d0bb [mob][photos] prompt 2025-01-29 12:57:48 +05:30
laurenspriem
ba0ac8ab08 [mob][photos] clip prompt 2025-01-29 12:48:59 +05:30
Manav Rathi
8de32ca12d tweak 2025-01-29 12:48:43 +05:30
Manav Rathi
bd13a2373a nf tweak 2025-01-29 12:41:38 +05:30
ashilkn
ab5f0e7de4 [mob][photos] Replace contact's email with name if linked to a person in all screen related to collaborative albums created by the account owner 2025-01-29 12:10:22 +05:30
laurenspriem
cd190f21d1 [mob][photos] Prioritize named faces 2025-01-29 11:50:51 +05:30
ashilkn
544a124318 [mob][photos] Fix UX issue: Bottom inset overlapping with UI 2025-01-29 11:37:42 +05:30
mngshm
284fc41c65 add: migration scripts for storage table 2025-01-29 11:09:58 +05:30
Neeraj
6134baea55 [mob] Handle 401/404 failure during individual multipart upload (#4890)
## Description

## Tests
2025-01-29 10:49:14 +05:30
Neeraj Gupta
5cabc406af [mob] Handle 401/404 failure during individual multipart upload 2025-01-29 10:42:02 +05:30
Manav Rathi
86704252e0 [web] More wip vips notes (#4889) 2025-01-29 10:38:22 +05:30
Manav Rathi
481d3e3700 Note 2025-01-29 10:33:35 +05:30
Manav Rathi
dcd920cbb4 wip patch 2025-01-29 09:40:35 +05:30
Manav Rathi
efa6d0289d Mention the conclusion after experimenting with alternatives 2025-01-29 08:09:30 +05:30
Prateek Sunal
f4d7bbae34 fix: enable video streaming for internal user 2025-01-28 17:26:56 +05:30
Prateek Sunal
c4f5265ff3 fix: only play preview for non-local video & when streaming is enabled 2025-01-28 17:25:57 +05:30
Prateek Sunal
7e1038a0f6 fix: add conditions for compression 2025-01-28 17:23:33 +05:30
Manav Rathi
3a7e0c23ac [web] More notes around adding vips (#4885) 2025-01-28 17:06:43 +05:30
Manav Rathi
cd93cf1be6 Cleanup 2025-01-28 17:02:40 +05:30
Prateek Sunal
0a3e1087ef fix: only upload preview if video streaming enabled 2025-01-28 16:59:01 +05:30
Prateek Sunal
2345265e19 chore: update locals & project 2025-01-28 16:56:36 +05:30
Prateek Sunal
6468fe9637 feat: add video streaming setting 2025-01-28 16:56:17 +05:30
Manav Rathi
8e653912cd x64 variant 2025-01-28 16:51:51 +05:30
Manav Rathi
80f64b2f8c t2 2025-01-28 16:51:51 +05:30
Manav Rathi
b022d0292f Take 1 2025-01-28 16:51:51 +05:30
Manav Rathi
d12aad2817 The musl variant seems to still link to the c lib dynamically
Sure there'd be a way to resolve this, but for now revert to the normal variant

ldd bin/vips
	/lib/ld-musl-aarch64.so.1 (0xffffa9868000)
	libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xffffa96a9000)
	libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0xffffa9684000)
	libc.so => /lib/ld-musl-aarch64.so.1 (0xffffa9868000)
2025-01-28 16:51:51 +05:30
Manav Rathi
55281b7e32 thumb 2025-01-28 16:51:51 +05:30
Manav Rathi
a155855b45 Note 2025-01-28 16:51:51 +05:30
Manav Rathi
81206c0e36 Patch 2025-01-28 16:51:51 +05:30
Manav Rathi
d0738f0988 Nope 2025-01-28 16:51:51 +05:30
Manav Rathi
4d65e3b233 Try with libvips-packaging
https://github.com/kleisauke/libvips-packaging/

Found via this comment:

> The build script at
> https://github.com/kleisauke/libvips-packaging/blob/main/build/lin.sh can be
> used as a reference to compile libvips and its dependencies as a single,
> statically-linked shared library.
>
> https://github.com/libvips/libvips/discussions/3426#discussioncomment-5507520
2025-01-28 16:51:51 +05:30
Manav Rathi
a6f2eae418 static more 2025-01-28 16:51:51 +05:30
Manav Rathi
84e16057b6 Trying with everything disabled 2025-01-28 16:51:51 +05:30
Manav Rathi
b91ee793bf static lib 2025-01-28 16:51:51 +05:30
laurenspriem
0059f1817b [mob][photos] Add todo 2025-01-28 16:47:50 +05:30
laurenspriem
dc401f6f72 [mob][photos] Sort 2025-01-28 16:36:16 +05:30
laurenspriem
69025f7ebf [mob][photos] Increase threshold 2025-01-28 16:27:31 +05:30
ashilkn
6176ec6cb9 [mob][photos] Revert back to using figma_squircle v0.5.3 from pub.dev since we've reverted to flutter v3.24.x 2025-01-28 13:36:36 +05:30
Neeraj Gupta
6bdc1f5d65 [mob] Add generic type for fileID 2025-01-28 13:30:24 +05:30
ashilkn
f5ee666a52 [mob][photos] Auto generated changes 2025-01-28 13:27:37 +05:30
ashilkn
fc89b9bfc1 [mob][photos] Bump up to v0.9.86 2025-01-28 13:25:41 +05:30
ashilkn
2071cbc61b Merge branch 'main' into mobile-preview-video 2025-01-28 13:24:09 +05:30
Prateek Sunal
e06bfd0724 Merge branch 'main' into mobile-preview-video 2025-01-28 12:58:54 +05:30
laurenspriem
e50ab7ca84 [mob][photos] First iteration of file selection 2025-01-28 10:43:58 +05:30
laurenspriem
a575e5f3c8 [mob][photos] Functions to get embeddings of specific files 2025-01-28 10:43:22 +05:30
Neeraj Gupta
69661b0d30 [mob] Put clip queries in same db class 2025-01-27 16:27:20 +05:30
Prateek Sunal
69ddb6fb2c Merge branch 'main' into mobile-preview-video 2025-01-27 13:52:46 +05:30
Prateek Sunal
6aa3733111 Update pubspec.yaml 2025-01-26 13:27:58 +05:30
Prateek Sunal
9e3d412e99 fix: use sdk 34 2025-01-26 03:03:41 +05:30
Prateek Sunal
858de20726 chore: bump version 2025-01-25 23:21:19 +05:30
Prateek Sunal
453f23ffba Merge remote-tracking branch 'origin/main' into mobile-preview-video 2025-01-25 23:20:42 +05:30
Prateek Sunal
17c2bd24e4 fix: HDR to SDR conversion 2025-01-25 23:19:19 +05:30
Neeraj Gupta
771d12bd9b [mob] Define interface for ML DB 2025-01-25 15:16:01 +05:30
Prateek Sunal
edb5e901e4 fix: use ffmpeg 2025-01-22 02:03:06 +05:30
Neeraj Gupta
3cf050c2e8 [mob] Bump version 2025-01-18 15:45:49 +05:30
Prateek Sunal
3d89d852a0 Merge remote-tracking branch 'origin/main' into mobile-preview-video 2025-01-18 04:22:25 +05:30
Prateek Sunal
815848450c fix: turn rotate off and re-encode to fix iOS issue 2025-01-18 04:20:50 +05:30
Prateek Sunal
15446d3d98 Merge remote-tracking branch 'origin/main' into mobile-preview-video 2025-01-17 01:03:24 +05:30
Neeraj Gupta
0de1b344ad Merge branch 'main' into mobile-preview-video 2025-01-15 11:55:36 +05:30
Prateek Sunal
882850e3d5 fix: null check issue 2025-01-14 17:59:19 +05:30
Prateek Sunal
cb9083677f Merge branch 'main' into mobile-preview-video 2025-01-14 17:42:26 +05:30
Prateek Sunal
c302f1ba2a fix: remove unwanted key 2025-01-14 17:26:53 +05:30
Prateek Sunal
167ed91a01 Merge remote-tracking branch 'origin/main' into mobile-preview-video 2025-01-13 13:36:59 +05:30
Prateek Sunal
b595272713 fix: check isUploading & only upload for internal user 2025-01-13 13:36:43 +05:30
Prateek Sunal
6e258490fe fix: append to a set if already compressing 2025-01-13 05:49:48 +05:30
Prateek Sunal
ca118c397b fix: match collection id to "Camera" 2025-01-13 05:40:29 +05:30
Prateek Sunal
04f860c97a feat: upgrade package to support bitrate in video compress 2025-01-10 01:52:03 +05:30
Prateek Sunal
021cde5b7e Merge remote-tracking branch 'origin/main' into mobile-preview-video 2025-01-08 12:02:55 +05:30
Prateek Sunal
ca08f39a4e fix: add custom bitrate, framerate for preview compress 2025-01-08 02:25:47 +05:30
Prateek Sunal
05ee252be8 chore: bump versions 2025-01-08 02:25:33 +05:30
Prateek Sunal
6c7a409c35 Merge remote-tracking branch 'origin/main' into mobile-preview-video 2025-01-08 01:40:29 +05:30
Neeraj Gupta
acc367d522 Lint fix 2024-12-20 16:24:32 +05:30
Neeraj Gupta
1de19e7a3e [mob] Bump version 2024-12-20 15:44:57 +05:30
Neeraj Gupta
1f122c79f7 [mob] Switch to medium quality 2024-12-20 15:44:16 +05:30
Neeraj Gupta
7a99377dc9 [mob] Fix null pointer in playlist cache 2024-12-20 11:35:51 +05:30
Neeraj Gupta
50f4cb8e13 Bump version 2024-12-19 12:24:12 +05:30
Neeraj Gupta
ff01477021 Show size in toast 2024-12-19 12:23:50 +05:30
Neeraj Gupta
6c4c0a4ed9 Merge branch 'main' into mobile-preview-video 2024-12-19 12:10:09 +05:30
Neeraj Gupta
eba6429e99 [mob] use unique prefix for each preview generation 2024-12-18 16:53:30 +05:30
Neeraj Gupta
a197851fe9 generated strings 2024-12-18 16:40:36 +05:30
Neeraj Gupta
d359d750c4 [mob] Show progress toast 2024-12-18 16:40:26 +05:30
Neeraj Gupta
1115bf7b56 Merge remote-tracking branch 'origin/main' into mobile-preview-video 2024-12-18 15:42:07 +05:30
Prateek Sunal
5dba461481 fix: use object id for cache video and playlist keys 2024-12-15 00:36:34 +05:30
Prateek Sunal
f9df92212a feat: cache playlist and video 2024-12-12 03:00:57 +05:30
Prateek Sunal
da38726f40 fix: cache preview file 2024-12-10 01:43:05 +05:30
Neeraj Gupta
f7b89b7126 Use cached playlist in debugMode 2024-12-08 16:27:52 +05:30
Neeraj Gupta
f19f1b0c68 [mob] Log video compression progress 2024-12-05 15:40:20 +05:30
Neeraj Gupta
1a3716f649 Merge branch 'main' into mobile-preview-video 2024-12-05 10:47:01 +05:30
Prateek Sunal
ffeb9da0d6 fix(preview): cache previewed list, use native player by default 2024-12-03 00:11:18 +05:30
Prateek Sunal
3d96e4bd94 fix: revert source of chewie and video_player 2024-11-29 19:45:34 +05:30
Prateek Sunal
bf19aa61d7 Merge remote-tracking branch 'origin/main' into mobile-preview-video 2024-11-29 16:08:44 +05:30
Prateek Sunal
9aa49a7067 fix: remove submodules 2024-11-29 16:08:19 +05:30
Prateek Sunal
a299dbcd6b chore: bump lock 2024-11-29 13:17:01 +05:30
Prateek Sunal
3a50c45dde fix: init media kit video_player only when fg 2024-11-29 13:16:49 +05:30
Prateek Sunal
d84edcf85c fix: only use media_kit for iOS 2024-11-28 22:27:23 +05:30
Prateek Sunal
7193a61a11 Merge remote-tracking branch 'origin/main' into mobile-preview-video 2024-11-28 22:25:20 +05:30
Prateek Sunal
03bfd854df chore: bump packages 2024-11-28 22:22:59 +05:30
Prateek Sunal
d8490322d9 fix: update for iOS 2024-11-28 22:22:33 +05:30
Prateek Sunal
13da082cda fix: check files db if preview exist 2024-11-28 21:32:26 +05:30
Prateek Sunal
f7fc50f2e6 fix: don't show error 2024-11-28 15:09:37 +05:30
Neeraj Gupta
fe91f3ee9b Merge branch 'mobile-preview-video' of https://github.com/ente-io/auth into mobile-preview-video 2024-11-28 14:52:51 +05:30
Neeraj Gupta
7bc688d18b Merge branch 'main' into mobile-preview-video 2024-11-25 09:58:24 +05:30
Prateek Sunal
426cd70c31 refactor: simplify error handling and remove unused imports in preview video components 2024-11-25 02:24:40 +05:30
Prateek Sunal
1fa3d87369 fix: show toast about video is playing 2024-11-25 02:24:32 +05:30
Prateek Sunal
8152159583 Merge remote-tracking branch 'origin/main' into mobile-preview-video 2024-11-25 00:05:51 +05:30
Prateek Sunal
68ac9cbe26 fix: remove unwanted code 2024-11-19 13:42:18 +05:30
Prateek Sunal
01b7a01dc5 Merge remote-tracking branch 'origin/main' into mobile-preview-video 2024-11-15 02:02:51 +05:30
Prateek Sunal
bbfa447e42 fix: source preview file as videoplayer's input 2024-11-11 23:55:33 +05:30
Prateek Sunal
c83bd41dae Merge remote-tracking branch 'origin/main' into mobile-preview-video 2024-11-11 22:01:30 +05:30
Neeraj Gupta
223b22ef46 [mob] Add method to get preview video url 2024-11-08 16:32:30 +05:30
Neeraj Gupta
982b4a4244 [mob] Sync fd early 2024-11-08 16:22:43 +05:30
Neeraj Gupta
3a09d50972 Merge branch 'main' into mobile-preview-video 2024-11-07 17:52:08 +05:30
Neeraj Gupta
9898baddbb [mob] Update preview code to use latest api 2024-10-01 22:33:31 +05:30
Neeraj Gupta
520d4e4f26 [mob] Fix file getter 2024-10-01 21:24:12 +05:30
Neeraj Gupta
ba04e20aeb erge branch 'main' into mobile-preview-video 2024-09-30 16:04:38 +05:30
Neeraj Gupta
672c209140 Merge branch 'main' into mobile-preview-video 2024-09-04 17:37:24 +05:30
Neeraj Gupta
f15c9ec4d2 Merge branch 'main' into mobile-preview-video 2024-08-28 14:45:34 +05:30
Prateek Sunal
5c760f8384 fix: chunk and upload video code 2024-08-15 00:36:29 +05:30
Prateek Sunal
f1b7deb706 Merge branch 'mobile-preview-video' of https://github.com/ente-io/ente into mobile-preview-video 2024-08-13 04:38:33 +05:30
Prateek Sunal
b7e60297a0 fix: support for 3.24 as well as add button to cache preview 2024-08-13 04:36:01 +05:30
Prateek Sunal
4456797e90 chore: update to full gpl ffmpeg kit 2024-08-13 02:59:45 +05:30
Prateek Sunal
0e5942446d Merge remote-tracking branch 'origin/clip_face_v2' into mobile-preview-video 2024-08-13 02:24:59 +05:30
Prateek Sunal
6918987ffe Merge remote-tracking branch 'origin/main' into mobile-preview-video 2024-08-05 21:27:46 +05:30
Prateek Sunal
9130e86460 feat(mobile): add preview video store 2024-08-05 03:57:16 +05:30
Prateek Sunal
b2d2f0d76d feat(mobile): init preview video branch 2024-07-26 19:52:12 +05:30
563 changed files with 20506 additions and 12932 deletions

View File

@@ -54,3 +54,12 @@ jobs:
packageName: io.ente.auth
releaseFiles: auth/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
track: internal
- name: Notify Discord
uses: sarisia/actions-status-discord@v1
with:
webhook: ${{ secrets.DISCORD_INTERNAL_RELEASE_WEBHOOK }}
nodetail: true
title: "🏆 Internal release available for Auth"
description: "[Download](https://play.google.com/store/apps/details?id=io.ente.auth)"
color: 0x800080

View File

@@ -40,7 +40,7 @@ jobs:
- name: Build PlayStore AAB
run: |
flutter build appbundle --release --flavor playstore
flutter build appbundle --dart-define=cronetHttpNoPlay=true --release --flavor playstore
env:
SIGNING_KEY_PATH: "/home/runner/work/_temp/keystore/ente_photos_key.jks"
SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS_PHOTOS }}
@@ -54,3 +54,12 @@ jobs:
packageName: io.ente.photos
releaseFiles: mobile/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
track: internal
- name: Notify Discord
uses: sarisia/actions-status-discord@v1
with:
webhook: ${{ secrets.DISCORD_INTERNAL_RELEASE_WEBHOOK }}
nodetail: true
title: "🏆 Internal release available for Photos"
description: "[Download](https://play.google.com/store/apps/details?id=io.ente.photos)"
color: 0x00ff00

View File

@@ -45,7 +45,7 @@ jobs:
- name: Build independent APK
run: |
flutter build apk --release --flavor independent
flutter build apk --dart-define=cronetHttpNoPlay=true --release --flavor independent
mv build/app/outputs/flutter-apk/app-independent-release.apk build/app/outputs/flutter-apk/ente-${{ github.ref_name }}.apk
env:
SIGNING_KEY_PATH: "/home/runner/work/_temp/keystore/ente_photos_key.jks"

View File

@@ -1,27 +1,24 @@
name: "Publish ghcr (server)"
on:
# Run manually, providing it the commit.
#
# To obtain the commit from the currently deployed museum, do:
# curl -s https://api.ente.io/ping | jq -r '.id'
#
# See server/docs/publish.md for more details.
# Run automatically on 15th of every month, at 05:00 UTC.
schedule:
- cron: '0 5 15 * *'
# Run manually if needed to publish out of schedule.
workflow_dispatch:
inputs:
commit:
description: "Commit to publish the image from"
type: string
required: true
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Determine commit from prod museum
run: |
echo "museum_commit=$(curl -s https://api.ente.io/ping | jq -r .id)" >> $GITHUB_ENV
- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ inputs.commit }}
ref: ${{ env.museum_commit }}
- name: Build and push
uses: mr-smithers-excellent/docker-build-push@v6
@@ -34,8 +31,8 @@ jobs:
enableBuildKit: true
multiPlatform: true
platform: linux/amd64,linux/arm64
buildArgs: GIT_COMMIT=${{ inputs.commit }}
tags: ${{ inputs.commit }}, latest
buildArgs: GIT_COMMIT=${{ env.museum_commit }}
tags: ${{ env.museum_commit }}, latest
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -21,6 +21,11 @@
"title": "airtm",
"hex": "000000"
},
{
"title": "AJ Bell",
"slug": "aj_bell",
"hex": "c41230"
},
{
"title": "aliyun",
"altNames": [
@@ -30,9 +35,18 @@
{
"title": "Amazon"
},
{
"title": "Ankama",
"slug": "ankama"
},
{
"title": "Anycoin Direct",
"slug": "anycoindirect"
},
{
"title": "Aruba",
"slug": "aruba",
"hex": "ef8a33"
},
{
"title": "AscendEX"
@@ -347,6 +361,14 @@
{
"title": "Estateguru"
},
{
"title": "EVEOnline",
"slug": "eve_online",
"altNames": [
"EVE Online"
],
"hex": "858585"
},
{
"title": "Fastmail"
},
@@ -492,6 +514,12 @@
{
"title": "Kagi"
},
{
"title": "Keygen",
"altNames": [
"keygen.sh"
]
},
{
"title": "Kick"
},
@@ -749,6 +777,11 @@
"altNames": [
"欧易"
]
},
{
"title": "OnShape",
"slug": "onshape",
"hex": "7abb5e"
},
{
"title": "Parqet",
@@ -846,6 +879,11 @@
{
"title": "RealMe",
"slug": "realme"
},
{
"title": "RealVNC",
"slug": "realvnc",
"hex": "488aec"
},
{
"title": "Registro br",
@@ -890,6 +928,10 @@
{
"title": "Samsung"
},
{
"title": "Seafile",
"slug": "seafile"
},
{
"title": "Sendgrid"
},
@@ -1105,13 +1147,6 @@
"title": "WARGAMING.NET",
"slug": "wargamingnet"
},
{
"title": "World Cube Association",
"altNames": [
"WCA",
"worldcubeassociation"
]
},
{
"title": "Wealthfront"
},
@@ -1140,6 +1175,14 @@
"Work OS"
]
},
{
"title": "World Cube Association",
"slug": "wca",
"altNames": [
"WCA",
"worldcubeassociation"
]
},
{
"title": "WYZE"
},

View File

@@ -0,0 +1,7 @@
<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1507 1556" width="1507" height="1556">
<title>logo_grey-svg</title>
<style>
.s0 { fill: #c41230 }
</style>
<path id="Layer" class="s0" d="m759.6 651c10.6 63.6 7.5 126.3-6.8 185.3-0.6-3.5-0.8-7-1.5-10.6-51.7-311.8-346.3-522.7-657.7-470.8-32.4 5.3-63.6 13.5-93.6 23.9 62.4-54.7 140.3-93.4 228.3-108.1 251.6-41.9 489.5 128.4 531.3 380.3zm84.2 340c-48.7 59.8-107.3 106.4-171.5 140 2.8-3.3 5.7-6.4 8.4-9.7 238.7-292.4 195.6-723.2-96.4-962.3-30.4-24.8-62.2-46.4-95.3-65.2 98.4 12.9 194.5 52.4 276.9 119.9 236 193.2 270.9 541.2 77.9 777.3zm409.3-532.7c66.8 402.8-204.2 783.4-605.6 852.1 313.4-230.6 489-625.2 420.9-1035.7-16.2-97.3-45.1-189.3-84.7-274.7 138.4 110.2 238.1 269.9 269.4 458.3zm241.5 84.5c78.6 473.9-241.4 921.9-714.8 1000.6-195.5 32.6-386.6-3.2-549.2-89.5 98.5 11.2 200.2 9.2 302.8-7.9 537.8-89.4 917.1-559.8 908.4-1089.5 23.9 58.8 41.9 121 52.8 186.3z"/>
</svg>

After

Width:  |  Height:  |  Size: 943 B

View File

@@ -0,0 +1,5 @@
<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 720" width="720" height="720">
<title>ankama</title>
<path class="s0" d="m572.3 253.3c-0.3-1.4-0.5-3-1.1-4.4-15.1-46-59.7-76.2-107.9-71.5-31.2 3-55.6 18.9-73.4 44.7-3.8 5.7-7.1 12-10.1 18.4-9.4 19.5-19.5 38.7-24.7 59.7-0.5 1.6-1.1 3.5-1.9 4.9-2.5 4.6-5.5 6.3-10.1 4.1-11.7-5.7-23.8-5.2-36.1-4.4-20.3 1.1-37.9-5.7-52.9-19.5-36.1-33.1-35.3-91 1.9-123 26.8-23.3 43.3-52.1 49.3-86.8 3-16.5 3.3-33.4 0-49.9-0.5-2.7-0.8-5.5-1.4-8.7 7.4-1.4 14.3 0 20.8 2.2 42.8 12.4 69.3 40.6 81.6 82.7 0.5 2.2 1.1 4.4 1.6 6.8 0.8 3 2.7 4.9 5.7 5.5 3.3 0.5 6.3-0.5 7.9-3.5 3-6.3 5.7-12.7 8.2-19.2 3.3-9.7 3.8-10.5 14.3-10.6 58.3-0.8 111.7 15.4 159.4 49 60.5 42.9 98.4 101.4 115.7 173.4 0.8 3.5 0.8 7.6 0.5 11.6-4.6 68-26.8 129.6-68.8 183.5-49 63.1-112.4 104.4-190.7 121.4-72.6 15.8-141.7 4.9-207.1-30.1-1.4-0.8-2.7-1.6-3.8-2.5-0.3 0-0.5-0.8-1.6-2.2 8.7 3 17 5.5 24.7 8.6 13.9 5.7 28.5 8.7 43.6 8.6 14.3 0 28.2 0.8 42.5 0 63.9-3.8 119.5-27.4 166.2-70.7 23.6-21.9 32.8-50.7 30.7-82.4-1.9-32.3-16.5-58.6-42.2-78.3-18.9-14.6-32-33.1-38-56.4-4.1-15.8-4.6-32-0.8-48.2 5.7-24.7 27.7-41.7 52.3-40.6 17 0.8 29.6 9 39.5 22.5 1.4 1.9 2.7 4.1 4.1 6.3 0.5 0 0.8-0.5 1.4-0.8l0.8 0.3v-0.5zm-263.5-55.1c-14.7 0-26.3 12.4-26.3 27.7 0 15.3 11.6 27.4 26.6 27.4 15 0 26-12.4 26-27.1 0-14.7-12-27.9-26.3-27.9v-0.2z"/>
<path class="s0" d="m168.2 314.5c7.4 1.6 14.7 3.3 22.5 4.9 10.9 2.2 14.3 6.8 12 18.1-1.6 8.2-3 16.2-4.9 24.1-0.8 3.5 0 5.7 2.5 8.2 22.8 23.6 50.1 38.4 83.8 43.6-2.2-1.4-3-2.2-4.1-2.7-19.5-10.1-27.7-25.2-25.2-46.6 1.1-9.8 0-19.2-6-27.4-3.8-5.5-9-9.7-13.9-14.3-1.6-1.6-3.8-2.5-6-4.1 5.2-3.3 10.5-3.3 15.4-3 7.4 0.3 14.7 1.4 22.2 3 11.6 2.5 21.7 8.2 30.4 16.2 6.5 6 12.4 12.4 18.7 18.4 13.9 13.6 25.2 12.8 37.2-2.7 7.6-9.8 12.4-21.4 15.8-33.1 3.8-12.7 8.2-24.9 15.4-36.1 7.4-11.6 16.5-21.7 27.4-30.1 9.7-7.4 19.7-6.8 30.7-3.3v9.7c-1.1 27.1 5.2 52.6 19.5 75.9 1.1 1.9 2.2 4.1 3.5 6 4.1 6.3 3.3 12-0.5 18.1-5.5 8.7-13.5 13.2-23.8 13.5h-6.3c-12.7 0-23.3 8.2-26.8 20.6-3 10.9 1.9 23.3 11.7 29.6 10.9 6.8 24.1 5.7 33.4-3 10.1-9.8 16.5-21.7 18.9-35.7 0.3-1.9 0.8-4.1 1.1-6 17.3-0.3 39.8 16.6 48.2 37.2 10.1 24.1 6.3 46.6-10.1 68.8-0.8-5.2-1.4-9.4-2.2-12.8-2.2-9.7-8.6-15.7-18.1-17.7-6.8-1.6-9.8 0-13.6 5.7-1.9 3-3.5 6.3-5.2 9.7-2.5 4.9-4.6 9.8-7.1 14.6-13.6 27.1-34.9 45.8-63.2 55.6-27.1 9.7-55.2 13.2-83.5 10.1-16.5-1.6-29.3-10.5-39.8-23.6 1.9-1.4 3.3-2.7 4.9-3.8 7.4-5.5 12.8-12.7 16.6-20.8 1.1-2.2 1.6-4.9 1.9-7.4 0.5-5.2-2.7-9.4-7.6-9.8-4.6-0.5-8.7 2.5-10.1 7.6-0.8 3.3-1.1 6.5-2.5 9.7-3.8 7.1-9.7 12.8-16.5 17-7.4 4.4-14.6 3.8-20-1.4-5.5-5.5-6-11.7-1.9-19.7 0.3-0.5 0.5-1.4 1.4-3-2.5 1.1-4.1 1.4-5.5 2.2-17.7 10.6-25.8 31.5-19.2 51.5 18.7 56.7-6 119.5-54 151-3.3 2.2-7.1 4.1-11.6 6.8 0-3-0.5-5.2-0.5-7.4-2.5-57.8-30.1-98.9-82.4-122.8-32.8-14.7-53.7-39.5-62.1-74-12.4-50.1 13.9-102.2 61.2-122.8 1.9-0.8 4.1-1.4 7.6-2.7-15.1 28.8-18.7 57.2-9.4 86.8 5.5 17.3 14.7 32 29 45.5 0.3-12.4-0.8-23.6 7.6-33.4 2.7 6.3 5.5 12 8.2 17.7 4.9 10.9 12.7 19.5 23.3 24.9 12 6.3 24.1 6.8 36.5 1.1 8.6-3.8 15.8-9.4 22.2-16.2 8.6-9 8.6-24.9 0.3-35.7-5.5-7.1-8.6-14.7-7.4-23.6 1.9-15.4 15.1-26.8 32-28.2 4.6-0.3 9.4 0 13.6 0.5 4.1 0.8 8.2 2.5 12.7 3.3-3.5-3.8-7.9-6.5-12.7-8.2-8.2-2.7-16.6-3.3-25.2-1.6-14.7 3.3-24.9 16.2-26.3 33.4-0.5 6.3 0 12.8 1.1 19.2 3 16.5-0.8 30.4-13.2 42.8-1.9-1.6-3.8-2.7-5.7-4.4-43.9-37.6-69.6-84.6-75.6-142.2-10.1-95.9 42.5-184.9 130.9-223 28.5-12.4 46-33.8 53.4-63.9 0.3-1.4 0.8-2.7 1.9-3.8 1.9 10.1 1.4 20.3-1.1 30.1-6 24.1-19.5 42.8-41.4 55.3-21.4 12.4-38.4 29-51.5 50.1-2.5 4.1-2.7 7.1 0 10.9 2.7 3.5 5.2 7.6 7.6 11.6 4.4 7.4 3 13.9-4.1 18.9-6.3 4.4-13.2 8.2-19.5 12.7-1.6 1.1-3.5 3.3-3.8 5.2-1.6 18.7-0.5 36.9 5.5 55.3l1.4-0.3-0.2-0.2zm192.8 132c14.3 0 25.8-11.3 25.5-25.2 0-13.6-12-25.8-25.5-25.8-13.5 0-25.2 11.3-25.5 25.5 0 14.3 11.3 25.5 25.2 25.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path fill="#FF8300" fill-rule="evenodd" d="M12.1099561,17.3015551 C9.03598293,17.3015551 6.50849391,14.8423766 6.50849391,11.836714 C6.50849391,8.83105139 9.03598293,6.37187289 12.1099561,6.37187289 C15.1839292,6.37187289 17.7114182,8.83105139 17.7114182,11.836714 C17.7114182,14.8423766 15.1839292,17.3015551 12.1099561,17.3015551 L12.1099561,17.3015551 Z M12.1099561,2 C6.50849391,2 2,6.4401834 2,11.836714 C2,17.3015551 6.50849391,21.673428 12.1099561,21.673428 C14.4325135,21.673428 16.5501395,20.9220123 18.2579023,19.6241126 C19.28256,21.3318754 22.2199121,21.673428 22.2199121,21.673428 L22.2199121,11.836714 C22.2199121,6.4401834 17.7114182,2 12.1099561,2 L12.1099561,2 Z"/>
</svg>

After

Width:  |  Height:  |  Size: 901 B

View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="198.4" height="198.4" xml:space="preserve">
<path transform="translate(0, 60)" d="M 0,0 0,13.88 10.97,13.88 10.97,10.31 60.69,10.31 60.69,0 0,0 z M 65.84,0 99.22,58.09 132.6,0 120.7,0 C 120.7,0 100.5,34.91 99.22,37.16 97.92,34.91 77.75,0 77.75,0 L 65.84,0 z M 137.8,0 137.8,13.88 148.7,13.88 148.7,10.31 198.4,10.31 198.4,0 137.8,0 z M 0,19.12 0,29.47 60.69,29.47 60.69,19.12 0,19.12 z M 137.8,19.12 137.8,29.47 198.4,29.47 198.4,19.12 137.8,19.12 z M 0,34.66 0,48.59 60.69,48.59 60.69,38.25 10.97,38.25 10.97,34.66 0,34.66 z M 137.8,34.66 137.8,48.59 198.4,48.59 198.4,38.25 148.7,38.25 148.7,34.66 137.8,34.66 z M 42.19,69.72 C 41.32,69.72 40.71,69.89 40.41,70.19 40.1,70.49 39.97,71.03 39.97,71.84 L 39.97,76.56 C 39.97,77.38 40.1,77.93 40.41,78.22 40.71,78.52 41.32,78.66 42.19,78.66 L 48.72,78.66 C 49.59,78.66 50.19,78.52 50.5,78.22 50.8,77.93 50.97,77.38 50.97,76.56 L 50.97,71.84 C 50.97,71.03 50.8,70.49 50.5,70.19 50.19,69.89 49.59,69.72 48.72,69.72 L 42.19,69.72 z M 64.37,69.72 64.37,78.66 66.25,78.66 66.25,73.84 C 66.25,73.66 66.23,73.43 66.22,73.19 66.2,72.94 66.18,72.69 66.16,72.41 66.26,72.53 66.38,72.67 66.5,72.78 66.62,72.89 66.75,73.01 66.91,73.16 L 73.47,78.66 74.88,78.66 74.88,69.72 73.03,69.72 73.03,74.41 C 73.03,74.52 73.05,74.7 73.06,74.91 73.07,75.11 73.09,75.47 73.12,75.97 72.99,75.81 72.82,75.66 72.66,75.5 72.49,75.35 72.31,75.18 72.09,75 L 65.81,69.72 64.37,69.72 z M 88.53,69.72 88.53,78.66 97.31,78.66 97.31,77 90.59,77 90.59,69.72 88.53,69.72 z M 109.4,69.72 109.4,78.66 111.5,78.66 111.5,69.72 109.4,69.72 z M 125.1,69.72 125.1,78.66 127,78.66 127,73.84 C 127,73.66 127,73.43 126.9,73.19 126.9,72.94 126.9,72.69 126.9,72.41 127,72.53 127.1,72.67 127.2,72.78 127.3,72.89 127.5,73.01 127.6,73.16 L 134.2,78.66 135.6,78.66 135.6,69.72 133.8,69.72 133.8,74.41 C 133.8,74.52 133.8,74.7 133.8,74.91 133.8,75.11 133.8,75.47 133.8,75.97 133.7,75.81 133.6,75.66 133.4,75.5 133.2,75.35 133,75.18 132.8,75 L 126.5,69.72 125.1,69.72 z M 149.3,69.72 149.3,78.66 158.5,78.66 158.5,77 151.3,77 151.3,74.78 155.4,74.78 155.4,73.25 151.3,73.25 151.3,71.25 158.4,71.25 158.4,69.72 149.3,69.72 z M 42.03,71.31 48.87,71.31 48.87,77 42.03,77 42.03,71.31 z" /></svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,19 @@
<svg width="100%" height="100%" viewBox="0 0 113 113" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(1,0,0,1,-1298.97,-1016.72)">
<g transform="matrix(0.5,0,0,0.5,736.463,641.721)">
<g transform="matrix(0.834925,0,0,0.834925,161.667,288.323)">
<circle cx="1198.72" cy="777.527" r="44.914" style="fill:#000811;"/>
</g>
</g>
<g transform="matrix(0.5,0,0,0.5,736.463,641.721)">
<g transform="matrix(0.834925,0,0,0.834925,311.66,138.323)">
<circle cx="1198.72" cy="777.527" r="44.914" style="fill:#000811;"/>
</g>
</g>
<g transform="matrix(0.5,0,0,0.5,736.463,641.721)">
<g transform="matrix(1,0,0,1,281.792,137.715)">
<path d="M955.708,762.285C935.011,762.285 918.208,745.482 918.208,724.785C918.208,704.088 935.011,687.285 955.708,687.285C976.405,687.285 993.208,704.088 993.208,724.785C993.208,745.482 1010.01,762.285 1030.71,762.285C1051.4,762.285 1068.21,779.088 1068.21,799.785C1068.21,820.482 1051.4,837.285 1030.71,837.285C1010.01,837.285 993.208,820.482 993.208,799.785C993.208,779.088 976.405,762.285 955.708,762.285Z" style="fill:#000811;"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 33 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,13 @@
<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 180 120" width="180" height="120">
<title>seafile</title>
<defs>
<linearGradient id="g1" x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,114.369,-177.525,0,89.989,2.834)">
<stop offset="0" stop-color="#fad956"/>
<stop offset="1" stop-color="#ffa10f"/>
</linearGradient>
</defs>
<style>
.s0 { fill: url(#g1) }
</style>
<path class="s0" d="m1.2 52.8c0-3 2.4-5.4 5.4-5.4 1.4 0 2.7 0.6 3.6 1.5q0-0.7 0-1.4c0-9.9 8-17.9 17.9-17.9 2.5 0 4.9 0.5 7.1 1.5q0-0.8 0-1.5c0-14.8 12-26.8 26.8-26.8 14.7 0 26.6 11.9 26.8 26.6-4.8 4.2-8.7 9.6-11.2 15.7-4.8-3-10.4-4.8-16.5-4.8-12.4 0-23.2 7.1-28.3 17.8h-19.1-7.1c-3 0-5.4-2.4-5.4-5.3zm141.2-16c-6.6-6.7-15.8-10.8-25.9-10.8-18.5 0-33.8 13.7-36.3 31.5-4.5-6.1-11.8-10-20-10-13.8 0-25 11.2-25 25 0 4 0.9 7.8 2.6 11.2-8.7 1.7-15.1 8.5-15.1 16.5 0 9.4 8.8 17 19.7 17 4.7 0 9.1-1.5 12.6-4l40.2-39.5c4.4-4.1 10.3-6.6 16.8-6.6 13.6 0 24.7 10.9 25.1 24.4q0 0-0.1-0.1c0.2 4-1.8 8.1-5.7 10.3-5.3 3.1-12 1.4-15-3.7-2.9-5.1-1-11.7 4.4-14.8q1.9-1.1 3.9-1.4-1.8-0.4-3.6-0.4c-9.9 0-17.9 8-17.9 17.9 0 9.9 8 17.9 17.9 17.9q0.6 0 1.3-0.1l0.5-0.1h35.1v0.2c10.7-0.5 20.9-10.4 20.9-22.5 0-12.3-10.6-22.4-22.9-22.4q-0.1 0-0.1 0c-2 3.6-4.4 5.7-7.1 7.9 2.8-5.2 4.5-11.2 4.5-17.6-0.1-10.1-4.2-19.2-10.8-25.8z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -48,6 +48,7 @@
"nextTotpTitle": "التالي",
"deleteCodeTitle": "حذف الرمز؟",
"deleteCodeMessage": "هل أنت متأكد من أنك تريد حذف هذه الشيفرة؟ هذا الإجراء لا رجعة فيه.",
"trash": "سلة المهملات",
"viewLogsAction": "عرض السجلات",
"sendLogsDescription": "سوف يُرسل هذا السجلات لنا لمساعدتنا على تصحيح مشكلتك. بينما نتخذ الاحتياطات لضمان عدم تسجيل المعلومات الحساسة، نشجعك على رؤية هذه السجلات قبل مشاركتها.",
"preparingLogsTitle": "جارٍ إعداد السجلات...",
@@ -197,6 +198,8 @@
"enterDetailsManually": "أدخل التفاصيل يدوياً",
"edit": "تعديل",
"share": "مشاركة",
"shareCodes": "شارك الرموز",
"restore": "استعادة",
"copiedToClipboard": "تم النسخ إلى الحافظة",
"copiedNextToClipboard": "تم نسخ الرموز التالية إلى الحافظة",
"error": "خطأ",
@@ -248,6 +251,10 @@
"areYouSureYouWantToLogout": "هل أنت متأكد من أنك تريد تسجيل الخروج؟",
"yesLogout": "نعم، تسجيل الخروج",
"exit": "خروج",
"theme": "السمة",
"lightTheme": "فاتح",
"darkTheme": "داكن",
"systemTheme": "النظام",
"verifyingRecoveryKey": "التحقق من مفتاح الاسترداد...",
"recoveryKeyVerified": "تم التحقق من مفتاح الاسترداد",
"recoveryKeySuccessBody": "رائع! مفتاح الاسترداد الخاص بك صالح. شكرا لك على التحقق.\n\nيرجى تذكر الاحتفاظ بنسخة احتياطية من مفتاح الاسترداد بشكل آمن.",
@@ -318,6 +325,9 @@
}
}
},
"manualSort": "مخصّص",
"mostFrequentlyUsed": "مستخدم بكثرة",
"mostRecentlyUsed": "مستخدمة مؤخراً",
"activeSessions": "الجلسات النشطة",
"somethingWentWrongPleaseTryAgain": "حدث خطأ ما، يرجى المحاولة مرة أخرى",
"thisWillLogYouOutOfThisDevice": "سيؤدي هذا إلى تسجيل خروجك من هذا الجهاز!",
@@ -350,6 +360,7 @@
"sigInBackupReminder": "يرجى تصدير الرموز الخاصة بك للتأكد من أن لديك نسخة احتياطية يمكنك استعادتها منها.",
"offlineModeWarning": "لقد اخترت المضي قدما بدون نسخ احتياطية. يرجى أخذ نسخ احتياطية يدوية للتأكد من سلامة الرموز الخاصة بك.",
"showLargeIcons": "إظهار أيقونات كبيرة",
"compactMode": "الوضع المضغوط",
"shouldHideCode": "إخفاء الرموز",
"doubleTapToViewHiddenCode": "يمكنك النقر مرتين على أي عنصر لعرض الرمز",
"focusOnSearchBar": "التركيز على البحث عند بدء التطبيق",
@@ -468,5 +479,11 @@
"pinLock": "قفل رقم التعريف الشخصي",
"enterPin": "أدخل رقم التعريف الشخصي",
"setNewPin": "عين رقم تعريف شخصي جديد",
"importFailureDescNew": "تعذر إعراب الملف المنتقى."
"importFailureDescNew": "تعذر إعراب الملف المنتقى.",
"duplicateCodes": "رموز مكررة",
"noDuplicates": "✨ لا تكرارات",
"youveNoDuplicateCodesThatCanBeCleared": "ليس لديك رموز مكررة يمكن مسحها",
"deselectAll": "ألغِ تحديد الكل",
"selectAll": "حدد الكل",
"deleteDuplicates": "احذف التكرار"
}

View File

@@ -88,6 +88,8 @@
"useRecoveryKey": "Usa la clau de recuperació",
"incorrectPasswordTitle": "Contrasenya incorrecta",
"welcomeBack": "Benvingut de nou!",
"emailAlreadyRegistered": "El correu electrònic ja està registrat.",
"emailNotRegistered": "El correu electrònic no està registrat.",
"madeWithLoveAtPrefix": "fet amb ❤️ a ",
"supportDevs": "Subscriu-te a <bold-green>ente</bold-green> per donar-nos suport",
"supportDiscount": "Usa el codi de descompte \"AUTH\" per obtenir un 10% de descompte el primer any",
@@ -502,5 +504,13 @@
"deselectAll": "Desselecciona-ho tot",
"selectAll": "Seleccionar-ho tot",
"deleteDuplicates": "Elimina duplicats",
"plainHTML": "HTML pla"
"plainHTML": "HTML pla",
"tellUsWhatYouThink": "Digueu-nos què us sembla",
"dropReview": "Deixa una ressenya a l'App/Play Store",
"supportEnte": "Donar suport a <bold-green>ente</bold-green>",
"giveUsAStarOnGithub": "Dona'ns una estrella a Github",
"free5GB": "5 GB gratuïts a <bold-green>ente</bold-green> Photos",
"loginWithAuthAccount": "Inicieu sessió amb el vostre compte Auth",
"freeStorageOffer": "10% de descompte a <bold-green>ente</bold-green> photos",
"freeStorageOfferDescription": "Utilitzeu el codi \"AUTH\" per obtenir un 10% de descompte el primer any"
}

View File

@@ -88,6 +88,8 @@
"useRecoveryKey": "Wiederherstellungsschlüssel verwenden",
"incorrectPasswordTitle": "Falsches Passwort",
"welcomeBack": "Willkommen zurück!",
"emailAlreadyRegistered": "E-Mail ist bereits registriert.",
"emailNotRegistered": "E-Mail-Adresse nicht registriert.",
"madeWithLoveAtPrefix": "gemacht mit ❤️ bei ",
"supportDevs": "Bei <bold-green>ente</bold-green> registrieren, um das Projekt zu unterstützen",
"supportDiscount": "Benutzen Sie den Rabattcode \"AUTH\" für 10 % Rabatt im ersten Jahr",
@@ -255,6 +257,8 @@
"areYouSureYouWantToLogout": "Sind sie sicher, dass sie sich ausloggen möchten?",
"yesLogout": "Ja ausloggen",
"exit": "Schließen",
"theme": "Theme",
"systemTheme": "System",
"verifyingRecoveryKey": "Verifiziere Wiederherstellungsschlüssel...",
"recoveryKeyVerified": "Wiederherstellungsschlüssel verifiziert",
"recoveryKeySuccessBody": "Großartig! Ihr Wiederherstellungsschlüssel ist gültig. Vielen Dank für die Verifizierung.\n\nBitte denken sie daran, dass sie ihren Wiederherstellungsschlüssel sicher aufbewahren.",
@@ -325,6 +329,7 @@
}
}
},
"manualSort": "Benutzerdefiniert",
"activeSessions": "Aktive Sitzungen",
"somethingWentWrongPleaseTryAgain": "Ein Fehler ist aufgetreten, bitte versuche es erneut",
"thisWillLogYouOutOfThisDevice": "Dadurch wirst du von diesem Gerät abgemeldet!",
@@ -478,5 +483,9 @@
"setNewPin": "Neue PIN festlegen",
"importFailureDescNew": "Die ausgewählte Datei konnte nicht verarbeitet werden.",
"appLockNotEnabled": "App-Sperre nicht aktiviert",
"appLockNotEnabledDescription": "Bitte aktivieren Sie die App-Sperre über Security > App-Sperre"
"appLockNotEnabledDescription": "Bitte aktivieren Sie die App-Sperre über Security > App-Sperre",
"duplicateCodes": "Doppelte Codes",
"noDuplicates": "✨ Keine Duplikate",
"deselectAll": "Alle abwählen",
"selectAll": "Alles auswählen"
}

View File

@@ -504,5 +504,12 @@
"deselectAll": "Deseleccionar todo",
"selectAll": "Seleccionar todo",
"deleteDuplicates": "Eliminar duplicados",
"plainHTML": "HTML plano"
"plainHTML": "HTML plano",
"tellUsWhatYouThink": "Cuéntanos cuál es su opinión",
"dropReview": "Danos una reseña en la App/Play Store",
"supportEnte": "Apoya a <bold-green>ente</bold-green>",
"giveUsAStarOnGithub": "Danos una estrella en GitHub",
"free5GB": "5 GB gratis en <bold-green>ente</bold-green> Fotos",
"freeStorageOffer": "10% de descuento en <bold-green>ente</bold-green> fotos",
"freeStorageOfferDescription": "Usa el cupón \"AUTH\" para obtener un 10% de descuento en el primer año"
}

View File

@@ -504,5 +504,13 @@
"deselectAll": "Tout désélectionner",
"selectAll": "Tout sélectionner",
"deleteDuplicates": "Supprimer les doublons",
"plainHTML": "HTML Pur"
"plainHTML": "HTML Pur",
"tellUsWhatYouThink": "Dites-nous ce que vous pensez",
"dropReview": "Déposez un avis sur l'App/Play Store",
"supportEnte": "Soutenir <bold-green>Ente</bold-green>",
"giveUsAStarOnGithub": "Donnez-nous une étoile sur Github",
"free5GB": "5 Go gratuits sur <bold-green>Ente</bold-green> Photos",
"loginWithAuthAccount": "Connectez-vous avec votre compte Auth",
"freeStorageOffer": "10% de réduction sur <bold-green>Ente</bold-green> Photos",
"freeStorageOfferDescription": "Utilisez le code coupon \"AUTH\" pour obtenir 10% de réduction la première année"
}

View File

@@ -8,13 +8,13 @@
},
"onBoardingGetStarted": "प्रारंभ करें",
"setupFirstAccount": "अपना पहला अकाउंट सेटअप करें",
"importScanQrCode": "QR कोड स्कैन करें",
"importScanQrCode": "एक QR कोड स्कैन करें",
"qrCode": "QR कोड",
"importEnterSetupKey": "",
"importAccountPageTitle": "अकाउंट विवरण डालें",
"incorrectDetails": "ग़लत विवरण",
"pleaseVerifyDetails": "कृपया विवरण सत्यापित करें और पुनः प्रयास करें",
"codeIssuerHint": "ारीकर्ता",
"codeIssuerHint": "ारीकर्ता",
"codeSecretKeyHint": "सीक्रेट कुंजी",
"secret": "सीक्रेट",
"all": "सभी",
@@ -39,6 +39,10 @@
"pleaseLoginAgain": "कृपया फिर से लॉगिन करें",
"loggingOut": "लॉग आउट हो रहा है...",
"saveAction": "सेव करें",
"deleteCodeMessage": "क्या आप वाकई इस कोड को हटाना चाहते हैं? इस क्रिया को वापस नहीं किया जा सकता",
"trashCode": "?",
"trashCodeMessage": "क्या आप वाकई {account} के लिए कोड नष्ट करना चाहते हैं?",
"trash": "नष्ट करें",
"viewLogsAction": "लॉग देखें",
"preparingLogsTitle": "लॉग तैयार किये जा रहे हैं...",
"emailLogsTitle": "लॉग ईमेल करें",
@@ -50,6 +54,7 @@
}
}
},
"copyEmailAction": "ईमेल कॉपी करें",
"exportLogsAction": "लॉग एक्सपोर्ट करें",
"reportABug": "बग रिपोर्ट करें",
"reportBug": "बग रिपोर्ट करें",
@@ -79,5 +84,24 @@
"cancel": "रद्द करें",
"yes": "हाँ",
"no": "नहीं",
"settings": "सेटिंग"
"settings": "सेटिंग",
"pleaseTryAgain": "कृपया पुन: प्रयास करें",
"newUser": "एंटे में नए उपयोगकर्ता",
"delete": "हटाएं",
"enterYourPasswordHint": "अपना पासवर्ड दर्ज करें",
"forgotPassword": "पासवर्ड भूल गए",
"oops": "ओह",
"suggestFeatures": "विशेषताएं सुझाएं",
"faq": "अक्सर किये गए सवाल",
"somethingWentWrongMessage": "कुछ गड़बड़ हुई है, कृपया दोबारा प्रयास करें",
"leaveFamily": "परिवार छोड़ें",
"leaveFamilyMessage": "क्या आप सच में परिवार प्लान छोड़ना चाहते हैं?",
"inFamilyPlanMessage": "आप परिवार प्लान पर हैं!",
"hintForMobile": "कोड को संपादित करने या हटाने के लिए उसे लंबी देर तक दबाए।",
"hintForDesktop": "कोड को संपादित करने या हटाने के लिए उस पर राइट क्लिक करें।",
"scan": "स्कैन करें",
"scanACode": "कोड स्कैन करें",
"verify": "सत्यापित करें",
"verifyEmail": "ईमेल सत्यापित करें",
"twoFactorAuthTitle": "दो-चरणीय प्रमाणीकरण |"
}

View File

@@ -504,5 +504,13 @@
"deselectAll": "Összes kijelölés megszüntetése",
"selectAll": "Összes kijelölése",
"deleteDuplicates": "Ismétlődések törlése",
"plainHTML": "Sima HTML kód"
"plainHTML": "Sima HTML kód",
"tellUsWhatYouThink": "Mondja el mit gondol",
"dropReview": "Írjon véleményt az App/Play Store-ban",
"supportEnte": "Támogassa <bold-green>ente <bold-green>",
"giveUsAStarOnGithub": "Adj nekünk egy csillagot a Githubon",
"free5GB": "5GB ingyen <bold-green>ente <bold-green> Photos",
"loginWithAuthAccount": "Jelentkezzen be Auth fiókjával",
"freeStorageOffer": "10% kedvezmény on <bold-green>ente<bold-green> photos",
"freeStorageOfferDescription": "Használja az \"AUTH\" kódot, hogy 10% kedvezményt kapjon az első évben"
}

View File

@@ -88,6 +88,8 @@
"useRecoveryKey": "回復キーを使用",
"incorrectPasswordTitle": "パスワードが正しくありません",
"welcomeBack": "おかえりなさい!",
"emailAlreadyRegistered": "メールアドレスはすでに登録されています。",
"emailNotRegistered": "メールアドレスはまだ登録されていません。",
"madeWithLoveAtPrefix": "made with ❤️ at ",
"supportDevs": "プロジェクト支援のために <bold-green>ente</bold-green> に登録",
"supportDiscount": "クーポンコード \"AUTH\" の使用で初年度が 10% オフに",
@@ -258,6 +260,10 @@
"areYouSureYouWantToLogout": "本当にログアウトしてよろしいですか?",
"yesLogout": "はい、ログアウトします",
"exit": "やめる",
"theme": "テーマ",
"lightTheme": "ライト",
"darkTheme": "ダーク",
"systemTheme": "システム",
"verifyingRecoveryKey": "回復キーを確認中...",
"recoveryKeyVerified": "回復キーが確認されました",
"recoveryKeySuccessBody": "素晴らしい!回復キーは有効です。ご確認いただきありがとうございます。\n\n回復キーを安全にバックアップしておいてください。",
@@ -490,5 +496,21 @@
"appLockNotEnabled": "アプリロックが有効になっていません",
"appLockNotEnabledDescription": "セキュリティ > アプリロック からアプリロックを有効化してください",
"authToViewPasskey": "パスキーを見るには認証してください",
"appLockOfflineModeWarning": "バックアップなしで進むことを選択しました。アプリロックを忘れると、データにアクセスできなくなります。"
"appLockOfflineModeWarning": "バックアップなしで進むことを選択しました。アプリロックを忘れると、データにアクセスできなくなります。",
"duplicateCodes": "重複コード",
"noDuplicates": "✨ 重複なし",
"youveNoDuplicateCodesThatCanBeCleared": "削除できる重複コードはありません",
"deduplicateCodes": "重複コード",
"deselectAll": "すべての選択を解除",
"selectAll": "すべて選択",
"deleteDuplicates": "重複を削除",
"plainHTML": "Plain HTML",
"tellUsWhatYouThink": "ご意見をお聞かせください",
"dropReview": "App/Playストアにレビューを投稿する",
"supportEnte": "<bold-green>ente</bold-green>をサポートする",
"giveUsAStarOnGithub": "Githubで星をつける",
"free5GB": "<bold-green>ente</bold-green>フォトで5GB無料",
"loginWithAuthAccount": "認証アカウントでログイン",
"freeStorageOffer": "<bold-green>ente</bold-green>の写真が10%オフ",
"freeStorageOfferDescription": "クーポンコード \"AUTH\" の使用で初年度が10%オフになります"
}

View File

@@ -504,5 +504,6 @@
"deselectAll": "Naikinti visų pasirinkimą",
"selectAll": "Pasirinkti viską",
"deleteDuplicates": "Ištrinti dublikatus",
"plainHTML": "Grynasis HTML"
"plainHTML": "Grynasis HTML",
"freeStorageOfferDescription": "Naudokite kodą „AUTH“, kad gautumėte 10 % nuolaida pirmiesiems metams. "
}

View File

@@ -1 +1,28 @@
{}
{
"blog": "ബ്ലോഗ്",
"verifyPassword": "പാസ്‌വേഡ് സ്ഥിരീകരിക്കുക",
"recreatePassword": "പാസ്‌വേഡ് പുനഃസൃഷ്ടിക്കുക",
"incorrectPasswordTitle": "തെറ്റായ പാസ്‌വേഡ്",
"welcomeBack": "വീണ്ടും സ്വാഗതം!",
"emailAlreadyRegistered": "ഇമെയിൽ ഇതിനകം രജിസ്റ്റർ ചെയ്തിട്ടുണ്ട്.",
"emailNotRegistered": "ഇമെയിൽ രജിസ്റ്റർ ചെയ്തിട്ടില്ല.",
"changeEmail": "ഇമെയിൽ മാറ്റുക",
"changePassword": "പാസ്സ്‌വേർഡ് മാറ്റുക",
"ok": "ശരി",
"cancel": "റദ്ദാക്കുക",
"yes": "അതെ",
"no": "അല്ല",
"email": "ഇമെയിൽ",
"somethingWentWrongMessage": "എന്തോ കുഴപ്പമുണ്ടായി, ദയവായി വീണ്ടും ശ്രമിക്കുക",
"inFamilyPlanMessage": "നിങ്ങൾ ഒരു ഫാമിലി പ്ലാനിലാണ്!",
"scan": "സ്കാൻ ചെയ്യുക",
"scanACode": "കോഡ് സ്കാൻ ചെയ്യുക",
"verify": "പരിശോധിക്കുക",
"verifyEmail": "ഇമെയിൽ സ്ഥിരീകരിക്കുക",
"enterCodeHint": "നിങ്ങളുടെ ഓതന്റിക്കേറ്റർ ആപ്പിൽ നിന്നുള്ള 6 അക്ക കോഡ് നൽകുക",
"twoFactorAuthTitle": "ടു-ഫാക്ടർ ആധികാരികത",
"createNewAccount": "പുതിയ അക്കൗണ്ട് സൃഷ്ടിക്കുക",
"confirmPassword": "പാസ്വേഡ് സ്ഥിരീകരിക്കുക",
"language": "ഭാഷ",
"security": "സുരക്ഷ"
}

View File

@@ -504,5 +504,13 @@
"deselectAll": "Alles deselecteren",
"selectAll": "Alles selecteren",
"deleteDuplicates": "Dubbelen verwijderen",
"plainHTML": "Alleen HTML"
"plainHTML": "Alleen HTML",
"tellUsWhatYouThink": "Vertel ons wat je vindt",
"dropReview": "Laat een beoordeling achter in de App/Play Store",
"supportEnte": "Steun <bold-green>ente</bold-green>",
"giveUsAStarOnGithub": "Geef ons een ster op Github",
"free5GB": "5GB gratis op <bold-green>ente</bold-green> Photos",
"loginWithAuthAccount": "Log in met je Auth account",
"freeStorageOffer": "10% korting op <bold-green>ente</bold-green> photos",
"freeStorageOfferDescription": "Gebruik de code \"AUTH\" voor 10% korting op je eerste jaar"
}

View File

@@ -504,5 +504,13 @@
"deselectAll": "Odznacz wszystko",
"selectAll": "Zaznacz wszystko",
"deleteDuplicates": "Usuń duplikaty",
"plainHTML": "Zwykły HTML"
"plainHTML": "Zwykły HTML",
"tellUsWhatYouThink": "Wyraź swoją opinię",
"dropReview": "Napisz recenzję w App Store/Play Store",
"supportEnte": "Wesprzyj <bold-green>ente</bold-green>",
"giveUsAStarOnGithub": "Daj nam gwiazdkę na Githubie",
"free5GB": "5 GB za darmo na zdjęcia <bold-green>ente</bold-green>",
"loginWithAuthAccount": "Zaloguj się przy użyciu konta Auth",
"freeStorageOffer": "10% zniżki na zdjęcia <bold-green>ente</bold-green>",
"freeStorageOfferDescription": "Użyj kodu „AUTH”, aby uzyskać 10% zniżki na pierwszy rok"
}

View File

@@ -6,7 +6,7 @@
"@counterAppBarTitle": {
"description": "Text shown in the AppBar of the Counter Page"
},
"onBoardingBody": "Copie com segurança seus códigos 2FA",
"onBoardingBody": "Salve com segurança seus códigos 2FA",
"onBoardingGetStarted": "Introdução",
"setupFirstAccount": "Configure sua primeira conta",
"importScanQrCode": "Escanear QR code",
@@ -19,7 +19,7 @@
"pleaseVerifyDetails": "Verifique os detalhes e tente novamente",
"codeIssuerHint": "Emissor",
"codeSecretKeyHint": "Chave secreta",
"secret": "Segredo",
"secret": "Chave secreta",
"all": "Todos",
"notes": "Notas",
"notesLengthLimit": "Notas tem um limite de até {count} caracteres",
@@ -504,5 +504,13 @@
"deselectAll": "Deselecionar tudo",
"selectAll": "Selecionar tudo",
"deleteDuplicates": "Excluir duplicados",
"plainHTML": "HTML simples"
"plainHTML": "HTML simples",
"tellUsWhatYouThink": "Diga-nos o que pensa",
"dropReview": "Deixe uma avaliação na App/Play Store",
"supportEnte": "Apoie o <bold-green>ente.io</bold-green>",
"giveUsAStarOnGithub": "Dê-nos uma estrela no Github",
"free5GB": "5GB grátis no <bold-green>ente</bold-green> Photos",
"loginWithAuthAccount": "Registrar-se com sua conta Auth",
"freeStorageOffer": "10% de desconto no <bold-green>ente</bold-green> photos",
"freeStorageOfferDescription": "Use o cupom \"AUTH\" para obter 10% de desconto no primeiro ano"
}

View File

@@ -88,6 +88,8 @@
"useRecoveryKey": "Kurtarma anahtarını kullan",
"incorrectPasswordTitle": "Yanlış şifre",
"welcomeBack": "Tekrar hoş geldiniz!",
"emailAlreadyRegistered": "E-posta zaten kayıtlı.",
"emailNotRegistered": "E-posta kayıtlı değil.",
"madeWithLoveAtPrefix": "❤️ ile şurada yapılmıştır ",
"supportDevs": "Bu projeyi desteklemek için <bold-green>ente</bold-green> kanalına abone olun",
"supportDiscount": "İlk yılda %10 indirim için \"AUTH\" kupon kodunu kullanın",
@@ -333,6 +335,7 @@
}
},
"manualSort": "Özel",
"editOrder": "Sıralamayı düzenle",
"mostFrequentlyUsed": "Sık kullanılan",
"mostRecentlyUsed": "Son kullanılan",
"activeSessions": "Aktif oturumlar",
@@ -501,5 +504,6 @@
"deselectAll": "Tümünün seçimini kaldır",
"selectAll": "Tümünü seç",
"deleteDuplicates": "Yinelenenleri sil",
"plainHTML": "Sade HTML"
"plainHTML": "Sade HTML",
"supportEnte": "<bold-Green>Ente</bold-Green>'yi destekle"
}

View File

@@ -504,5 +504,13 @@
"deselectAll": "取消全选",
"selectAll": "全选",
"deleteDuplicates": "删除重复项",
"plainHTML": "Plain HTML"
"plainHTML": "Plain HTML",
"tellUsWhatYouThink": "告诉我们您的想法",
"dropReview": "在 App Store/Play 商店上发表评测",
"supportEnte": "支持 <bold-green>ente</bold-green>",
"giveUsAStarOnGithub": "在 Github 上给我们一个星标",
"free5GB": "<bold-green>ente</bold-green> Photos 上 5GB 可用空间",
"loginWithAuthAccount": "使用您的认证账户登录",
"freeStorageOffer": "购买 <bold-green>ente</bold-green> Photos 可享受 10% 优惠",
"freeStorageOfferDescription": "使用优惠码“AUTH”可享受首年 10% 折扣"
}

View File

@@ -877,6 +877,7 @@ class UserService {
"twoFactorType": twoFactorTypeToString(type),
},
);
await dialog.hide();
if (response.statusCode == 200) {
// ignore: unawaited_futures
Navigator.of(context).pushAndRemoveUntil(
@@ -974,6 +975,7 @@ class UserService {
"twoFactorType": twoFactorTypeToString(type),
},
);
await dialog.hide();
if (response.statusCode == 200) {
showShortToast(
context,

View File

@@ -6,7 +6,7 @@ import 'package:shared_preferences/shared_preferences.dart';
import 'package:window_manager/window_manager.dart';
class WindowListenerService {
static const double minWindowHeight = 320.0;
static const double minWindowHeight = 600.0;
static const double minWindowWidth = 800.0;
static const double maxWindowHeight = 8192.0;
static const double maxWindowWidth = 8192.0;

View File

@@ -33,8 +33,7 @@ class _LockScreenState extends State<LockScreen> with WidgetsBindingObserver {
int remainingTimeInSeconds = 0;
final _lockscreenSetting = LockScreenSettings.instance;
late Brightness _platformBrightness;
final bool hasOptedForOfflineMode =
Configuration.instance.hasOptedForOfflineMode();
final bool isLoggedIn = Configuration.instance.isLoggedIn();
@override
void initState() {
@@ -56,15 +55,15 @@ class _LockScreenState extends State<LockScreen> with WidgetsBindingObserver {
return Scaffold(
appBar: AppBar(
elevation: 0,
leading: hasOptedForOfflineMode
? const SizedBox.shrink()
: IconButton(
leading: isLoggedIn
? IconButton(
icon: const Icon(Icons.logout_outlined),
color: Theme.of(context).iconTheme.color,
onPressed: () {
_onLogoutTapped(context);
},
),
)
: const SizedBox.shrink(),
),
body: GestureDetector(
onTap: () {

View File

@@ -1,6 +1,7 @@
import 'package:ente_auth/l10n/l10n.dart';
import 'package:ente_auth/models/account/two_factor.dart';
import 'package:ente_auth/services/user_service.dart';
import 'package:ente_auth/theme/ente_theme.dart';
import 'package:ente_auth/utils/email_util.dart';
import 'package:flutter/material.dart';
@@ -97,7 +98,8 @@ class _TwoFactorRecoveryPageState extends State<TwoFactorRecoveryPage> {
style: TextStyle(
decoration: TextDecoration.underline,
fontSize: 12,
color: Colors.white.withOpacity(0.9),
color:
getEnteColorScheme(context).textBase.withOpacity(0.9),
),
),
),

View File

@@ -15,7 +15,7 @@ import (
"strings"
)
var AppVersion = "0.2.2"
var AppVersion = "0.2.3"
func main() {
cliConfigDir, err := GetCLIConfigDir()
@@ -50,18 +50,21 @@ func main() {
}
}
// Define a set of commands that do not require KeyHolder initialisation.
skipKeyHolderCommands := map[string]struct{}{"version": {}, "docs": {}, "help": {}}
// Define a set of commands that do not require KeyHolder or cli initialisation.
skipInitCommands := map[string]struct{}{"version": {}, "docs": {}, "help": {}}
var keyHolder *secrets.KeyHolder
// Only initialise KeyHolder if the command isn't in the skip list.
shouldInit := len(os.Args) > 1
if len(os.Args) > 1 {
if _, skip := skipKeyHolderCommands[os.Args[1]]; !skip {
keyHolder = secrets.NewKeyHolder(secrets.GetOrCreateClISecret())
if _, skip := skipInitCommands[os.Args[1]]; skip {
shouldInit = false
}
}
if shouldInit {
keyHolder = secrets.NewKeyHolder(secrets.GetOrCreateClISecret())
}
ctrl := pkg.ClICtrl{
Client: api.NewClient(api.Params{
Debug: viper.GetBool("log.http"),
@@ -71,16 +74,10 @@ func main() {
KeyHolder: keyHolder,
}
err = ctrl.Init()
if err != nil {
panic(err)
if len(os.Args) == 1 {
// If no arguments are passed, show help
os.Args = append(os.Args, "help")
}
defer func() {
if err := db.Close(); err != nil {
panic(err)
}
}()
if len(os.Args) == 2 && os.Args[1] == "docs" {
log.Println("Generating docs")
err = cmd.GenerateDocs()
@@ -89,9 +86,16 @@ func main() {
}
return
}
if len(os.Args) == 1 {
// If no arguments are passed, show help
os.Args = append(os.Args, "help")
if shouldInit {
err = ctrl.Init()
if err != nil {
panic(err)
}
defer func() {
if err := db.Close(); err != nil {
panic(err)
}
}()
}
if os.Args[1] == "version" && viper.GetString("endpoint.api") != constants.EnteApiUrl {
log.Printf("Custom endpoint: %s\n", viper.GetString("endpoint.api"))
@@ -120,10 +124,10 @@ func initConfig(cliConfigDir string) {
func GetCLIConfigDir() (string, error) {
var configDir = os.Getenv("ENTE_CLI_CONFIG_DIR")
if configDir == "" {
// for backward compatibility, check for ENTE_CLI_CONFIG_PATH
configDir = os.Getenv("ENTE_CLI_CONFIG_PATH")
}
if configDir == "" {
// for backward compatibility, check for ENTE_CLI_CONFIG_PATH
configDir = os.Getenv("ENTE_CLI_CONFIG_PATH")
}
if configDir != "" {
// remove trailing slash (for all OS)

6
desktop/.gitignore vendored
View File

@@ -21,5 +21,9 @@ out
# electron-builder
dist/
# We download it on demand, if needed for the particular OS/arch.
# Legacy, people who checked out main for a brief while in Jan 2025 may have
# this. Can be removed in the future.
build/magick*
# We download it on demand, if needed for the particular OS/arch.
build/vips*

View File

@@ -1,9 +1,15 @@
# CHANGELOG
## v1.7.9 (Unreleased)
## v1.7.10 (Unreleased)
- .
## v1.7.9
- Light mode.
- Faster and more stable thumbnail generation.
- Support `.supplemental-metadata` JSON files in Google Takeout.
## v1.7.8
- Parse description from image metadata.

View File

@@ -38,8 +38,8 @@
</branding>
<releases>
<release version="1.7.8" date="2025-01-13">
<url type="details">https://github.com/ente-io/photos-desktop/releases/tag/v1.7.8</url>
<release version="1.7" date="2025-01-13">
<url type="details">https://github.com/ente-io/photos-desktop/releases</url>
</release>
</releases>
</component>

View File

@@ -108,13 +108,13 @@ For video conversions and metadata extraction, we use ffmpeg. To bundle a
[ffmpeg-static](https://github.com/eugeneware/ffmpeg-static).
> There is a significant (~20x) speed difference between using the compiled
> ffmpeg binary and using the wasm one (that our renderer process already has).
> FFmpeg binary and using the Wasm one (that our renderer process already has).
> Which is why we bundle it to speed up operations on the desktop app.
On Linux and Windows, we use ImageMagick for thumbnail generation and JPEG
conversion of unpreviewable images. A static OS/architecture specific binary of
this is bundled in our extra resources (`build`) folder by `scripts/magick.sh`
and/or `scripts/beforeBuild.js`. See "[Note: ImageMagick]" for more details.
On Linux and Windows, we use `vips` for thumbnail generation and JPEG conversion
of unpreviewable images. A static OS/architecture specific binary of this is
bundled in our extra resources (`build`) folder by `scripts/vips.sh` and/or
`scripts/beforeBuild.js`. See "[Note: vips]" for more details.
On macOS, we use the `sips` CLI tool for these tasks, but that is already
available on the host machine, and is not bundled with our app.

View File

@@ -1,6 +1,6 @@
{
"name": "ente",
"version": "1.7.9-beta",
"version": "1.7.10-beta",
"private": true,
"description": "Desktop client for Ente Photos",
"repository": "github:ente-io/photos-desktop",
@@ -19,7 +19,7 @@
"postinstall": "electron-builder install-app-deps",
"lint": "yarn prettier --check --log-level warn . && yarn eslint && yarn tsc",
"lint-fix": "yarn prettier --write --log-level warn . && yarn eslint && yarn tsc",
"prepare": "node scripts/magick.js"
"prepare": "node scripts/vips.js"
},
"resolutions": {
"jackspeak": "2.1.1"
@@ -31,9 +31,9 @@
"clip-bpe-js": "^0.0.6",
"comlink": "^4.4.2",
"compare-versions": "^6.1.1",
"electron-log": "^5.2.4",
"electron-log": "^5.3.0",
"electron-store": "^8.2.0",
"electron-updater": "^6.4.0-alpha.3",
"electron-updater": "^6.4.0",
"ffmpeg-static": "^5.2.0",
"lru-cache": "^11.0.2",
"next-electron-server": "^1.0.0",
@@ -41,7 +41,7 @@
"onnxruntime-node": "^1.20.1"
},
"devDependencies": {
"@eslint/js": "^9.18.0",
"@eslint/js": "^9.19.0",
"@tsconfig/node20": "^20.1.4",
"@types/auto-launch": "^5.0.5",
"@types/eslint__js": "^8.42.3",
@@ -49,15 +49,15 @@
"ajv": "^8.17.1",
"concurrently": "^9.1.2",
"cross-env": "^7.0.3",
"electron": "^34.0.0",
"electron-builder": "^26.0.0-alpha.10",
"electron": "^34.1.1",
"electron-builder": "^26.0.0",
"eslint": "^9",
"prettier": "3.4.2",
"prettier-plugin-organize-imports": "^4.1.0",
"prettier-plugin-packagejson": "^2.5.8",
"shx": "^0.3.4",
"typescript": "^5.7.2",
"typescript-eslint": "^8.21.0"
"typescript-eslint": "^8.23.0"
},
"packageManager": "yarn@1.22.22",
"productName": "ente"

View File

@@ -3,8 +3,8 @@ const fsp = require("fs/promises");
/**
* This hook is invoked during the initial build (e.g. when triggered by "yarn
* build"), and importantly, on each rebuild for a different architecture during
* the build. We use it to ensure that the magick binary is for the current
* architecture being built. See "[Note: ImageMagick]" for more details.
* the build. We use it to ensure that the vips binary is for the current
* architecture being built. See "[Note: vips]" for more details.
*
* The documentation for this hook is at:
* https://www.electron.build/app-builder-lib.interface.configuration#beforebuild
@@ -22,8 +22,10 @@ const fsp = require("fs/promises");
* },
* arch: 'arm64'
*
* Note that we must not return falsey from this function, because
* > Resolving to false will skip dependencies install or rebuild.
* Note that we must not return falsey from this function, because:
*
* > Resolving to false will skip dependencies install or rebuild.
*
*/
module.exports = async (context) => {
const { appDir, platform, arch } = context;
@@ -35,14 +37,14 @@ module.exports = async (context) => {
// https://github.com/electron-userland/electron-builder/blob/master/packages/builder-util/src/arch.ts#L9
// https://nodejs.org/api/process.html#processarch
if (arch == process.arch) {
// `magick.js` would've already downloaded the file, nothing to do.
// `vips.js` would've already downloaded the file, nothing to do.
return true;
}
const download = async (downloadName, outputName) => {
const out = `${appDir}/build/${outputName}`;
console.log(`Downloading ${downloadName}`);
const downloadPath = `https://github.com/ente-io/ImageMagick/releases/download/2025-01-21/${downloadName}`;
const downloadPath = `https://github.com/ente-io/libvips-packaging/releases/download/v8.16.0/${downloadName}`;
return fetch(downloadPath)
.then((res) => res.blob())
.then((blob) => fsp.writeFile(out, blob.stream()))
@@ -51,13 +53,13 @@ module.exports = async (context) => {
switch (`${platform.nodeName}-${arch}`) {
case "linux-x64":
await download("magick-x86_64", "magick");
await download("vips-x64", "vips");
case "linux-arm64":
await download("magick-aarch64", "magick");
await download("vips-arm64", "vips");
case "win32-x64":
await download("magick-x64.exe", "magick.exe");
await download("vips-x86_64.exe", "vips.exe");
case "linux-arm64":
await download("magick-arm64.exe", "magick.exe");
await download("vips-aarch64.exe", "vips.exe");
}
return true;

View File

@@ -1,78 +0,0 @@
/**
* [Note: ImageMagick]
*
* We need static builds for Linux and Windows for both x64 and ARM. For this,
* we need a custom workflow because (as of writing):
*
* 1. Upstream doesn't publish ARM64 binaries for Linux
*
* 2. The Windows portable releases are not part of the artifacts attached to
* the upstream GitHub release.
*
* Our custom workflow is an adaption of the upstream release.yml - its goal is
* to have 4 standalone binaries - Linux x64, Linux ARM, Win x64, Win ARM -
* attached to a GitHub release from which we can pull them when building the
* desktop app.
*
* This is our custom workflow, which runs on a fork of upstream:
* https://github.com/ente-io/ImageMagick/commit/df895cce13d6a3f874a716c05ff2babeb33351b9
* (For reference, we also include a copy of it in this repo - `magick.yml`).
*
* The binaries it creates are available at
* https://github.com/ente-io/ImageMagick/releases/tag/2025-01-21.
*
* To integrate this ImageMagick binary, we need to modify two places:
*
* 1. This script, `magick.js`, runs during "yarn install" (it is set as the
* "prepare" step in our `package.json`). It downloads the relevant binary
* for the current OS/arch combination and places it in the `build` folder,
* allowing it to be used during development.
*
* 2. The sibling script, `beforeBuild.js`, runs during "yarn build" (it is set
* as the beforeBuild script in `electrons-builder.yml`). It downloads the
* relevant binary for the OS/arch combination being built.
*
* Note that `magick.js` would've already run once `beforeBuild.js` is run, but
* on our CI we prepare builds for multiple architectures in one go, so we need
* to unconditonally replace the binary with the relevant one for the current
* architecture being built (which might be different from the one we're running
* on). `beforeBuild.js` runs for each architecture being built.
*
* On macOS, we don't need ImageMagick since there we use the native `sips`.
*/
const fs = require("fs");
const fsp = require("fs/promises");
const main = () => {
switch (`${process.platform}-${process.arch}`) {
case "linux-x64":
return downloadIfNeeded("magick-x86_64", "magick");
case "linux-arm64":
return downloadIfNeeded("magick-aarch64", "magick");
case "win32-x64":
return downloadIfNeeded("magick-x64.exe", "magick.exe");
case "linux-arm64":
return downloadIfNeeded("magick-arm64.exe", "magick.exe");
}
};
const downloadIfNeeded = (downloadName, outputName) => {
const out = `build/${outputName}`;
try {
// Making the file executable is the last step, so if the file exists at
// this path and is executable, we assume it is the correct one.
fs.accessSync(out, fs.constants.X_OK);
return;
} catch {}
console.log(`Downloading ${downloadName}`);
const downloadPath = `https://github.com/ente-io/ImageMagick/releases/download/2025-01-21/${downloadName}`;
return fetch(downloadPath)
.then((res) => res.blob())
.then((blob) => fsp.writeFile(out, blob.stream()))
.then(() => fsp.chmod(out, "744"));
};
main();

View File

@@ -1,127 +0,0 @@
on:
workflow_dispatch:
push: # Push a tag to build and create a draft release
tags:
- "*"
name: binaries-for-ente
jobs:
create_magick_binary:
name: Create magick binary (Linux)
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-24.04, ubuntu-24.04-arm]
compiler: [gcc]
include:
- os: ubuntu-24.04
arch: x86_64
- os: ubuntu-24.04-arm
arch: aarch64
- compiler: gcc
cxx_compiler: g++
packages: gcc g++
steps:
- name: Install dependencies
run: |
set -e
export DEBIAN_FRONTEND=noninteractive
sudo apt update -y
sudo apt install -y autoconf curl fuse git kmod libbz2-dev libdjvulibre-dev libfontconfig-dev libfreetype6-dev libfribidi-dev libharfbuzz-dev liblcms-dev libopenexr-dev libopenjp2-7-dev libturbojpeg0-dev liblqr-dev libraqm-dev libtiff-dev libwebp-dev libx11-dev libxml2-dev liblzma-dev make software-properties-common wget ${{ matrix.packages }}
sudo add-apt-repository ppa:git-core/ppa -y
sudo apt install -y git
sudo add-apt-repository ppa:strukturag/libheif -y
sudo add-apt-repository ppa:strukturag/libde265 -y
sudo apt install libheif-dev -y
- name: Checkout
uses: actions/checkout@v4
# Avoid fatal: detected dubious ownership in repository at '/__w/ImageMagick/ImageMagick'
# Possible workaround: https://github.com/actions/runner/issues/2033#issuecomment-1598547465
- name: Flag current workspace as safe for git
run: git config --global --add safe.directory ${GITHUB_WORKSPACE}
- name: Download AppImage
run: |
set -e
sudo apt install -y file
mkdir -p out/app-image
cd out/app-image
wget -c https://github.com/$(wget -q https://github.com/probonopd/go-appimage/releases/expanded_assets/continuous -O - | grep "appimagetool-.*-${{ matrix.arch }}.AppImage" | head -n 1 | cut -d '"' -f 2)
chmod +x appimagetool-*.AppImage
- name: Build ImageMagick
env:
CFLAGS:
-Wno-deprecated-declarations -Wdeclaration-after-statement
-Wno-error=unused-variable
CC: ${{ matrix.compiler }}
CXX: ${{ matrix.cxx_compiler }}
run: |
set -e
./configure --with-quantum-depth=16 --without-magick-plus-plus --without-perl --without-x --disable-docs --prefix=/usr
make
make install DESTDIR=$(readlink -f out/appdir)
- name: Create ImageMagick AppImage
run: |
set -e
mkdir -p out/appdir/usr/share/applications/
cp app-image/imagemagick.desktop out/appdir/usr/share/applications/
mkdir -p out/appdir/usr/share/icons/hicolor/256x256/apps/
cp app-image/icon.png out/appdir/usr/share/icons/hicolor/256x256/apps/imagemagick.png
unset QTDIR
unset QT_PLUGIN_PATH
unset LD_LIBRARY_PATH
export VERSION=7
cd out
./app-image/appimagetool-*.AppImage --appimage-extract-and-run -s deploy appdir/usr/share/applications/*.desktop
chmod +x appdir/usr/lib/ld-linux-aarch64.so.1 || true
./app-image/appimagetool-*.AppImage --appimage-extract-and-run appdir
mkdir artifacts
cp ImageMagick*.AppImage artifacts/magick-${{ matrix.arch }}
- name: Upload ImageMagick AppImage
uses: actions/upload-artifact@v4
with:
name: magick-${{ matrix.arch }}
path: out/artifacts
- name: Create a draft GitHub release
uses: ncipollo/release-action@v1
with:
artifacts: "out/artifacts/*"
draft: true
allowUpdates: true
updateOnlyUnreleased: true
download_and_keep_windows_binaries:
name: Download magick binary (Windows)
runs-on: ubuntu-24.04
steps:
- name: Download
run: |
mkdir -p out/artifacts
curl -LO https://imagemagick.org/archive/binaries/ImageMagick-7.1.1-43-portable-Q16-x64.zip
unzip ImageMagick-7.1.1-43-portable-Q16-x64.zip
cp ImageMagick-7.1.1-43-portable-Q16-x64/magick.exe out/artifacts/magick-x64.exe
curl -LO https://imagemagick.org/archive/binaries/ImageMagick-7.1.1-43-portable-Q16-arm64.zip
unzip ImageMagick-7.1.1-43-portable-Q16-arm64.zip
cp ImageMagick-7.1.1-43-portable-Q16-arm64/magick.exe out/artifacts/magick-arm64.exe
- name: Upload ImageMagick exes
uses: actions/upload-artifact@v4
with:
name: magick-${{ matrix.arch }}
path: out/artifacts
- name: Create a draft GitHub release
uses: ncipollo/release-action@v1
with:
artifacts: "out/artifacts/*"
draft: true
allowUpdates: true
updateOnlyUnreleased: true

68
desktop/scripts/vips.js Executable file
View File

@@ -0,0 +1,68 @@
/**
* [Note: vips]
*
* For use within our Electron app we need static builds for Linux and Windows
* for both x64 and ARM. For this, we need a custom workflow because (as of
* writing) upstream doesn't publish these.
*
* This is our custom workflow, which runs on a fork of upstream:
* https://github.com/ente-io/libvips-packaging/commit/a298aff3e1f25f713508d31d0c3a55a4f828fdd3
*
* The binaries it creates are available at
* https://github.com/ente-io/libvips-packaging/releases/tag/v8.16.0
*
* To integrate this binary, we need to modify two places:
*
* 1. This script, `vips.js`, runs during "yarn install" (it is set as the
* "prepare" step in our `package.json`). It downloads the relevant binary
* for the current OS/arch combination and places it in the `build` folder,
* allowing it to be used during development.
*
* 2. The sibling script, `beforeBuild.js`, runs during "yarn build" (it is set
* as the beforeBuild script in `electrons-builder.yml`). It downloads the
* relevant binary for the OS/arch combination being built.
*
* Note that `vips.js` would've already run once `beforeBuild.js` is run, but on
* our CI we prepare builds for multiple architectures in one go, so we need to
* unconditonally replace the binary with the relevant one for the current
* architecture being built (which might be different from the one we're running
* on). `beforeBuild.js` runs for each architecture being built.
*
* On macOS, we don't need `vips` since there we use the native `sips`.
*/
const fs = require("fs");
const fsp = require("fs/promises");
const main = () => {
switch (`${process.platform}-${process.arch}`) {
case "linux-x64":
return downloadIfNeeded("vips-x64", "vips");
case "linux-arm64":
return downloadIfNeeded("vips-arm64", "vips");
case "win32-x64":
return downloadIfNeeded("vips-x86_64.exe", "vips.exe");
case "linux-arm64":
return downloadIfNeeded("vips-aarch64.exe", "vips.exe");
}
};
const downloadIfNeeded = (downloadName, outputName) => {
const out = `build/${outputName}`;
try {
// Making the file executable is the last step, so if the file exists at
// this path and is executable, we assume it is the correct one.
fs.accessSync(out, fs.constants.X_OK);
return;
} catch {}
console.log(`Downloading ${downloadName}`);
const downloadPath = `https://github.com/ente-io/libvips-packaging/releases/download/v8.16.0/${downloadName}`;
return fetch(downloadPath)
.then((res) => res.blob())
.then((blob) => fsp.writeFile(out, blob.stream()))
.then(() => fsp.chmod(out, "744"));
};
main();

View File

@@ -1,2 +0,0 @@
1.heic
1.jpeg

View File

@@ -1,18 +0,0 @@
FROM ubuntu:24.04
# https://github.com/libvips/libvips/blob/master/.github/workflows/ci.yml
RUN apt-get update -y && apt-get install -y \
meson pkg-config \
libarchive-dev libcfitsio-dev libcgif-dev \
libexif-dev libexpat1-dev libffi-dev \
libfftw3-dev libheif-dev libheif-plugin-aomenc \
libheif-plugin-x265 libhwy-dev libimagequant-dev \
libjpeg-dev libjxl-dev liblcms2-dev \
libmatio-dev libnifti-dev libopenexr-dev \
libopenjp2-7-dev libopenslide-dev libpango1.0-dev \
libpng-dev libpoppler-glib-dev librsvg2-dev \
libtiff5-dev libwebp-dev
RUN apt-get install -y git && git clone --depth 1 https://github.com/libvips/libvips
WORKDIR /libvips

View File

@@ -1,74 +0,0 @@
FROM debian:bullseye
# Don't care about layer size.
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc \
gcc-10 \
make \
pkg-config
# Don't care about layer size.
RUN apt-get install -y --no-install-recommends \
python3-minimal \
python3-pip \
python3-setuptools \
patchelf
RUN python3 -m pip \
--disable-pip-version-check \
--no-cache-dir \
install \
'staticx==0.12.0'
# Don't care about layer caching, because I'm only using docker for building.
RUN apt-get install -y --no-install-recommends \
ca-certificates \
curl \
g++ \
g++-10 \
libglib2.0-dev \
libexpat1-dev \
libjpeg-dev \
libpng-dev \
libimagequant-dev \
libexif-dev \
liborc-0.4-dev \
&& rm -rf /var/lib/apt/lists
# TODO: Vendored source to remove test/ and doc/ with patches to remove test/ from configure.
# This would also remove the need to install ca-certificates + curl.
# TODO: libspng build with meson, miniz to replace libpng-dev.
# https://github.com/randy408/libspng/blob/master/docs/build.md#meson
# Then, publish the final image somewhere.
WORKDIR /build
RUN curl -sL https://github.com/libvips/libvips/releases/download/v8.10.1/vips-8.10.1.tar.gz | \
tar -xz -f- --strip-components=1
# XXX: -static doesn't work here. I'm using staticx to make the final vips binary static.
# Could also try clang.
# TODO: webp support
RUN CFLAGS="-O2 -flto -pipe" CXXFLAGS="-O2 -flto -pipe" \
./configure \
--disable-deprecated \
--disable-shared \
--disable-static \
--disable-dependency-tracking \
--disable-gtk-doc
# This is the fastest easiest way I found to compile the
# CLI as fast as possible. You can probably get more optimal,
# but it'd be a lot harder wrestling autotools.
RUN cd libvips \
&& make -j"$(nproc)"
RUN cd tools \
&& make -j"$(nproc)" vips
RUN cd tools \
&& staticx vips /bin/vips \
&& strip -s /bin/vips
ENTRYPOINT ["/bin/vips"]
CMD ["--help"]

View File

@@ -1,38 +0,0 @@
FROM --platform=linux/arm64/v8 alpine:3.18
ARG VIPS_VERSION=8.14.5
ARG ALPINE_VERSION=3.18
# Environment variables
ENV VIPS_HOME=/usr/local/vips-${VIPS_VERSION}
ENV VIPS_BLOCK_UNTRUSTED=true \
LD_LIBRARY_PATH=$VIPS_HOME/lib \
PKG_CONFIG_PATH=$VIPS_HOME/lib/pkgconfig \
PATH=$PATH:$VIPS_HOME/bin \
WORKDIR=/usr/local/src
WORKDIR $WORKDIR
RUN apk add xz \
&& wget https://github.com/libvips/libvips/releases/download/v${VIPS_VERSION}/vips-${VIPS_VERSION}.tar.xz \
&& tar -xf vips-${VIPS_VERSION}.tar.xz \
&& cd vips-${VIPS_VERSION} \
&& apk add \
meson \
build-base \
vips-dev \
fftw-dev \
glib-dev \
expat-dev expat \
libjpeg-turbo-dev \
libheif-dev \
libspng-dev \
curl
RUN APK add curl-dev
RUN meson configure -Dintrospection=false -Dmodules=disabled -Dexamples=false -Dheif=disabled -Djpeg=disabled -Dopenjpeg=disabled -Ddeprecated=false -Dcplusplus=false --default-library=static --prefer-static --buildtype release
# RUN meson setup build-dir -Dintrospection=false -Dmodules=disabled -Dexamples=false --prefer-static --buildtype release \
# && cd build-dir \
# && meson compile \
# && meson install

View File

@@ -1,6 +0,0 @@
Experimenting with libvips.
```sh
docker build -t vips-test .
docker run -it --rm -v $(pwd):/w vips-test vips copy /w/1.heic /w/1.jpeg
```

View File

@@ -10,14 +10,15 @@
*/
import { nativeImage, shell } from "electron/common";
import type { WebContents } from "electron/main";
import {
BrowserWindow,
Menu,
Tray,
app,
dialog,
nativeTheme,
protocol,
type WebContents,
} from "electron/main";
import serveNextAt from "next-electron-server";
import { existsSync } from "node:fs";
@@ -95,10 +96,10 @@ const main = () => {
/**
* Handle an open URL request, but ensuring that we have a mainWindow.
*/
const handleOpenURLEnsuringWindow = (url: string) => {
const handleOpenEnteURLEnsuringWindow = (url: string) => {
log.info(`Attempting to handle request to open URL: ${url}`);
if (mainWindow) handleEnteLinks(mainWindow, url);
else setTimeout(() => handleOpenURLEnsuringWindow(url), 1000);
else setTimeout(() => handleOpenEnteURLEnsuringWindow(url), 1000);
};
app.on("second-instance", (_, argv: string[]) => {
@@ -109,9 +110,15 @@ const main = () => {
mainWindow.focus();
}
// On Windows and Linux, this is how we get deeplinks.
//
// See: registerForEnteLinks
const url = argv.pop();
if (url) handleOpenURLEnsuringWindow(url);
//
// Note that Chromium reserves the right to fudge with the order of the
// command line arguments, including inserting things in arbitrary
// places, so we need to go through the args to find the one that is
// pertinent to us (if any) instead of looking at a fixed position.
const url = argv.find((arg) => arg.startsWith("ente://app"));
if (url) handleOpenEnteURLEnsuringWindow(url);
});
// Emitted once, when Electron has finished initializing.
@@ -145,7 +152,7 @@ const main = () => {
void mainWindow.loadURL(rendererURL);
// Continue on with the rest of the startup sequence.
Menu.setApplicationMenu(await createApplicationMenu(mainWindow));
Menu.setApplicationMenu(createApplicationMenu(mainWindow));
setupTrayItem(mainWindow);
setupAutoUpdater(mainWindow);
@@ -170,7 +177,7 @@ const main = () => {
});
// On macOS, this is how we get deeplinks. See: registerForEnteLinks
app.on("open-url", (_, url) => handleOpenURLEnsuringWindow(url));
app.on("open-url", (_, url) => handleOpenEnteURLEnsuringWindow(url));
};
/**
@@ -272,7 +279,7 @@ const handleEnteLinks = (mainWindow: BrowserWindow, url: string) => {
// - the protocol we're using to serve/ our bundled web app
//
// use the same scheme ("ente://"), so the URL can directly be forwarded.
mainWindow.webContents.send("openURL", url);
mainWindow.webContents.send("openEnteURL", url);
};
/** Attach handlers to the (node) process. */
@@ -341,9 +348,41 @@ const createMainWindow = () => {
...(bounds ?? {}),
// Enforce a minimum size
...minimumWindowSize(),
// [Note: Customize the desktop title bar]
//
// 1. Remove the default title bar.
// 2. Reintroduce the title bar controls.
// 3. Show a custom title bar in the renderer.
//
// For step 3, we use `app-region: drag` to allow dragging the window by
// the title bar, and use the Window Controls Overlay CSS environment
// variables to determine its dimensions. Note that these overlay CSS
// environment vars are only available when titleBarOverlay is true, so
// unlike the tutorial which enables it only for Windows and Linux, we
// do it (Step 2) unconditionally (i.e., on macOS too).
//
// https://www.electronjs.org/docs/latest/tutorial/custom-title-bar#create-a-custom-title-bar
//
// Note that by default on Windows, the color of the WCO title bar
// overlay (three buttons - minimize, maximize, close - on the top
// right) is static, and unlike Linux, doesn't adapt to the theme /
// content. Explicitly choosing a dark background, while it won't work
// always (if the user's theme is light), is better than picking a light
// background since the main image viewer is always dark.
titleBarStyle: "hidden",
titleBarOverlay:
process.platform == "win32"
? { color: "black", symbolColor: "#cdcdcd" }
: true,
// The color to show in the window until the web content gets loaded.
// See: https://www.electronjs.org/docs/latest/api/browser-window#setting-the-backgroundcolor-property
backgroundColor: "black",
// https://www.electronjs.org/docs/latest/api/browser-window#setting-the-backgroundcolor-property
//
// To avoid a flash, we want to use the same background color as the
// theme of their choice. Unless the user has modified their preference
// to not follow the system, we can deduce it from the current OS theme.
//
// See: https://www.electronjs.org/docs/latest/tutorial/dark-mode
backgroundColor: nativeTheme.shouldUseDarkColors ? "black" : "white",
// We'll show it conditionally depending on `wasAutoLaunched` later.
show: false,
});

View File

@@ -24,6 +24,7 @@ import {
updateAndRestart,
updateOnNextRestart,
} from "./services/app-update";
import autoLauncher from "./services/auto-launcher";
import {
openDirectory,
openLogDirectory,
@@ -117,6 +118,10 @@ export const attachIPCHandlers = () => {
setLastShownChangelogVersion(version),
);
ipcMain.handle("isAutoLaunchEnabled", () => autoLauncher.isEnabled());
ipcMain.handle("toggleAutoLaunch", () => autoLauncher.toggleAutoLaunch());
// - App update
ipcMain.on("updateAndRestart", () => updateAndRestart());

View File

@@ -7,17 +7,14 @@ import {
} from "electron";
import { allowWindowClose } from "../main";
import { forceCheckForAppUpdates } from "./services/app-update";
import autoLauncher from "./services/auto-launcher";
import { openLogDirectory } from "./services/dir";
import { userPreferences } from "./stores/user-preferences";
/** Create and return the entries in the app's main menu bar */
export const createApplicationMenu = async (mainWindow: BrowserWindow) => {
export const createApplicationMenu = (mainWindow: BrowserWindow) => {
// The state of checkboxes
//
// Whenever the menu is redrawn the current value of these variables is used
// to set the checked state for the various settings checkboxes.
let isAutoLaunchEnabled = await autoLauncher.isEnabled();
let shouldHideDockIcon = !!userPreferences.get("hideDockIcon");
const macOSOnly = (options: MenuItemConstructorOptions[]) =>
@@ -25,16 +22,6 @@ export const createApplicationMenu = async (mainWindow: BrowserWindow) => {
const handleCheckForUpdates = () => forceCheckForAppUpdates(mainWindow);
const handleViewChangelog = () =>
void shell.openExternal(
"https://github.com/ente-io/ente/blob/main/desktop/CHANGELOG.md",
);
const toggleAutoLaunch = () => {
void autoLauncher.toggleAutoLaunch();
isAutoLaunchEnabled = !isAutoLaunchEnabled;
};
const toggleHideDockIcon = () => {
// Persist
userPreferences.set("hideDockIcon", !shouldHideDockIcon);
@@ -45,13 +32,6 @@ export const createApplicationMenu = async (mainWindow: BrowserWindow) => {
const handleHelp = () =>
void shell.openExternal("https://help.ente.io/photos/");
const handleSupport = () =>
void shell.openExternal("mailto:support@ente.io");
const handleBlog = () => void shell.openExternal("https://ente.io/blog/");
const handleViewLogs = () => void openLogDirectory();
return Menu.buildFromTemplate([
{
label: "Ente Photos",
@@ -67,31 +47,21 @@ export const createApplicationMenu = async (mainWindow: BrowserWindow) => {
label: "Check for Updates...",
click: handleCheckForUpdates,
},
{
label: "View Changelog",
click: handleViewChangelog,
},
{ type: "separator" },
{
label: "Preferences",
submenu: [
{
label: "Open Ente on Startup",
type: "checkbox",
checked: isAutoLaunchEnabled,
click: toggleAutoLaunch,
},
...macOSOnly([
...macOSOnly([
{
label: "Preferences",
submenu: [
{
label: "Hide Dock Icon",
type: "checkbox",
checked: shouldHideDockIcon,
click: toggleHideDockIcon,
},
]),
],
},
],
},
]),
{ type: "separator" },
...macOSOnly([
@@ -169,20 +139,6 @@ export const createApplicationMenu = async (mainWindow: BrowserWindow) => {
label: "Ente Help",
click: handleHelp,
},
{ type: "separator" },
{
label: "Support",
click: handleSupport,
},
{
label: "Product Updates",
click: handleBlog,
},
{ type: "separator" },
{
label: "View Logs",
click: handleViewLogs,
},
],
},
]);
@@ -194,7 +150,6 @@ export const createApplicationMenu = async (mainWindow: BrowserWindow) => {
*/
export const createTrayContextMenu = (mainWindow: BrowserWindow) => {
const handleOpen = () => {
mainWindow.maximize();
mainWindow.show();
};

View File

@@ -9,7 +9,7 @@ import {
makeTempFilePath,
} from "../utils/temp";
/* Ditto in the web app's code (used by the WASM FFmpeg invocation). */
/* Ditto in the web app's code (used by the Wasm FFmpeg invocation). */
const ffmpegPathPlaceholder = "FFMPEG";
const inputPathPlaceholder = "INPUT";
const outputPathPlaceholder = "OUTPUT";
@@ -19,7 +19,7 @@ const outputPathPlaceholder = "OUTPUT";
*
* [Note: FFmpeg in Electron]
*
* There is a wasm build of FFmpeg, but that is currently 10-20 times slower
* There is a Wasm build of FFmpeg, but that is currently 10-20 times slower
* that the native build. That is slow enough to be unusable for our purposes.
* https://ffmpegwasm.netlify.app/docs/performance
*

View File

@@ -14,7 +14,6 @@ export const convertToJPEG = async (imageData: Uint8Array) => {
const inputFilePath = await makeTempFilePath();
const outputFilePath = await makeTempFilePath("jpeg");
// Construct the command first, it may throw NotAvailable on win32.
const command = convertToJPEGCommand(inputFilePath, outputFilePath);
try {
@@ -45,14 +44,7 @@ const convertToJPEGCommand = (
case "linux":
case "win32":
return [
imageMagickPath(),
"convert",
inputFilePath,
"-quality",
"100%",
outputFilePath,
];
return [vipsPath(), "copy", inputFilePath, outputFilePath];
default:
throw new Error("Not available on the current OS/arch");
@@ -60,12 +52,12 @@ const convertToJPEGCommand = (
};
/**
* Path to the magick executable bundled with our app on Linux and Windows.
* Path to the vips executable bundled with our app on Linux and Windows.
*/
const imageMagickPath = () =>
const vipsPath = () =>
path.join(
isDev ? "build" : process.resourcesPath,
process.platform == "win32" ? "magick.exe" : "magick",
process.platform == "win32" ? "vips.exe" : "vips",
);
export const generateImageThumbnail = async (
@@ -139,19 +131,11 @@ const generateImageThumbnailCommand = (
case "linux":
case "win32":
return [
imageMagickPath(),
"convert",
vipsPath(),
"thumbnail",
inputFilePath,
"-define",
`jpeg:size=${2 * maxDimension}x${2 * maxDimension}`,
"-auto-orient",
"-thumbnail",
`${maxDimension}x${maxDimension}`,
"-unsharp",
"0x.5",
"-quality",
`${quality}`,
outputFilePath,
`${outputFilePath}[Q=${quality}]`,
`${maxDimension}`,
];
default:

View File

@@ -20,7 +20,7 @@ let _child: UtilityProcess | undefined;
* [Note: ML IPC]
*
* The primary reason for doing ML tasks in the Node.js layer is so that we can
* use the binary ONNX runtime, which is 10-20x faster than the WASM one that
* use the binary ONNX runtime, which is 10-20x faster than the Wasm one that
* can be used directly on the web layer.
*
* For this to work, the main and renderer process need to communicate with each

View File

@@ -56,8 +56,6 @@ export const execAsync = async (command: string | string[]) => {
const startTime = Date.now();
const result = await execAsync_(escapedCommand);
log.debug(() => `${escapedCommand} (${Date.now() - startTime} ms)`);
// TODO(MR): Temp for debugging in nightlies; Remove before release.
log.info(`${escapedCommand} (${Date.now() - startTime} ms)`);
return result;
};

View File

@@ -122,14 +122,18 @@ const lastShownChangelogVersion = () =>
const setLastShownChangelogVersion = (version: number) =>
ipcRenderer.invoke("setLastShownChangelogVersion", version);
const isAutoLaunchEnabled = () => ipcRenderer.invoke("isAutoLaunchEnabled");
const toggleAutoLaunch = () => ipcRenderer.invoke("toggleAutoLaunch");
const onMainWindowFocus = (cb: (() => void) | undefined) => {
ipcRenderer.removeAllListeners("mainWindowFocus");
if (cb) ipcRenderer.on("mainWindowFocus", cb);
};
const onOpenURL = (cb: ((url: string) => void) | undefined) => {
ipcRenderer.removeAllListeners("openURL");
if (cb) ipcRenderer.on("openURL", (_, url: string) => cb(url));
const onOpenEnteURL = (cb: ((url: string) => void) | undefined) => {
ipcRenderer.removeAllListeners("openEnteURL");
if (cb) ipcRenderer.on("openEnteURL", (_, url: string) => cb(url));
};
// - App update
@@ -347,8 +351,10 @@ contextBridge.exposeInMainWorld("electron", {
saveMasterKeyB64,
lastShownChangelogVersion,
setLastShownChangelogVersion,
isAutoLaunchEnabled,
toggleAutoLaunch,
onMainWindowFocus,
onOpenURL,
onOpenEnteURL,
// - App update

View File

@@ -177,10 +177,10 @@
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.9.1.tgz#4a97e85e982099d6c7ee8410aacb55adaa576f06"
integrity sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==
"@eslint/js@^9.18.0":
version "9.18.0"
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.18.0.tgz#3356f85d18ed3627ab107790b53caf7e1e3d1e84"
integrity sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==
"@eslint/js@^9.19.0":
version "9.19.0"
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.19.0.tgz#51dbb140ed6b49d05adc0b171c41e1a8713b7789"
integrity sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==
"@eslint/object-schema@^2.1.4":
version "2.1.4"
@@ -417,85 +417,85 @@
dependencies:
"@types/node" "*"
"@typescript-eslint/eslint-plugin@8.21.0":
version "8.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.21.0.tgz#395014a75112ecdb81142b866ab6bb62e3be0f2a"
integrity sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==
"@typescript-eslint/eslint-plugin@8.23.0":
version "8.23.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.23.0.tgz#7745f4e3e4a7ae5f6f73fefcd856fd6a074189b7"
integrity sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==
dependencies:
"@eslint-community/regexpp" "^4.10.0"
"@typescript-eslint/scope-manager" "8.21.0"
"@typescript-eslint/type-utils" "8.21.0"
"@typescript-eslint/utils" "8.21.0"
"@typescript-eslint/visitor-keys" "8.21.0"
"@typescript-eslint/scope-manager" "8.23.0"
"@typescript-eslint/type-utils" "8.23.0"
"@typescript-eslint/utils" "8.23.0"
"@typescript-eslint/visitor-keys" "8.23.0"
graphemer "^1.4.0"
ignore "^5.3.1"
natural-compare "^1.4.0"
ts-api-utils "^2.0.0"
ts-api-utils "^2.0.1"
"@typescript-eslint/parser@8.21.0":
version "8.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.21.0.tgz#312c638aaba4f640d45bfde7c6795a9d75deb088"
integrity sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==
"@typescript-eslint/parser@8.23.0":
version "8.23.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.23.0.tgz#57acb3b65fce48d12b70d119436e145842a30081"
integrity sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==
dependencies:
"@typescript-eslint/scope-manager" "8.21.0"
"@typescript-eslint/types" "8.21.0"
"@typescript-eslint/typescript-estree" "8.21.0"
"@typescript-eslint/visitor-keys" "8.21.0"
"@typescript-eslint/scope-manager" "8.23.0"
"@typescript-eslint/types" "8.23.0"
"@typescript-eslint/typescript-estree" "8.23.0"
"@typescript-eslint/visitor-keys" "8.23.0"
debug "^4.3.4"
"@typescript-eslint/scope-manager@8.21.0":
version "8.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz#d08d94e2a34b4ccdcc975543c25bb62917437500"
integrity sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==
"@typescript-eslint/scope-manager@8.23.0":
version "8.23.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.23.0.tgz#ee3bb7546421ca924b9b7a8b62a77d388193ddec"
integrity sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==
dependencies:
"@typescript-eslint/types" "8.21.0"
"@typescript-eslint/visitor-keys" "8.21.0"
"@typescript-eslint/types" "8.23.0"
"@typescript-eslint/visitor-keys" "8.23.0"
"@typescript-eslint/type-utils@8.21.0":
version "8.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.21.0.tgz#2e69d1a93cdbedc73fe694cd6ae4dfedd00430a0"
integrity sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==
"@typescript-eslint/type-utils@8.23.0":
version "8.23.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.23.0.tgz#271e1eecece072d92679dfda5ccfceac3faa9f76"
integrity sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==
dependencies:
"@typescript-eslint/typescript-estree" "8.21.0"
"@typescript-eslint/utils" "8.21.0"
"@typescript-eslint/typescript-estree" "8.23.0"
"@typescript-eslint/utils" "8.23.0"
debug "^4.3.4"
ts-api-utils "^2.0.0"
ts-api-utils "^2.0.1"
"@typescript-eslint/types@8.21.0":
version "8.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.21.0.tgz#58f30aec8db8212fd886835dc5969cdf47cb29f5"
integrity sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==
"@typescript-eslint/types@8.23.0":
version "8.23.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.23.0.tgz#3355f6bcc5ebab77ef6dcbbd1113ec0a683a234a"
integrity sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==
"@typescript-eslint/typescript-estree@8.21.0":
version "8.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz#5ce71acdbed3b97b959f6168afba5a03c88f69a9"
integrity sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==
"@typescript-eslint/typescript-estree@8.23.0":
version "8.23.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.23.0.tgz#f633ef08efa656e386bc44b045ffcf9537cc6924"
integrity sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==
dependencies:
"@typescript-eslint/types" "8.21.0"
"@typescript-eslint/visitor-keys" "8.21.0"
"@typescript-eslint/types" "8.23.0"
"@typescript-eslint/visitor-keys" "8.23.0"
debug "^4.3.4"
fast-glob "^3.3.2"
is-glob "^4.0.3"
minimatch "^9.0.4"
semver "^7.6.0"
ts-api-utils "^2.0.0"
ts-api-utils "^2.0.1"
"@typescript-eslint/utils@8.21.0":
version "8.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.21.0.tgz#bc4874fbc30feb3298b926e3b03d94570b3999c5"
integrity sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==
"@typescript-eslint/utils@8.23.0":
version "8.23.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.23.0.tgz#b269cbdc77129fd6e0e600b168b5ef740a625554"
integrity sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
"@typescript-eslint/scope-manager" "8.21.0"
"@typescript-eslint/types" "8.21.0"
"@typescript-eslint/typescript-estree" "8.21.0"
"@typescript-eslint/scope-manager" "8.23.0"
"@typescript-eslint/types" "8.23.0"
"@typescript-eslint/typescript-estree" "8.23.0"
"@typescript-eslint/visitor-keys@8.21.0":
version "8.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz#a89744c4cdc83b5c761eb5878befe6c33d1481b2"
integrity sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==
"@typescript-eslint/visitor-keys@8.23.0":
version "8.23.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.23.0.tgz#40405fd26a61d23f5f4c2ed0f016a47074781df8"
integrity sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==
dependencies:
"@typescript-eslint/types" "8.21.0"
"@typescript-eslint/types" "8.23.0"
eslint-visitor-keys "^4.2.0"
"@xmldom/xmldom@^0.8.8":
@@ -609,10 +609,10 @@ app-builder-bin@5.0.0-alpha.12:
resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz#2daf82f8badc698e0adcc95ba36af4ff0650dc80"
integrity sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==
app-builder-lib@26.0.0-alpha.10:
version "26.0.0-alpha.10"
resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-26.0.0-alpha.10.tgz#3eb3f64ffa5e995595ad61497c5e7a0c2d64b817"
integrity sha512-9K3MulGK7j+En4KjH3aq7AzDqe8nn35x7O9l5kwl16nWFdBthcdy1IKsx9CgjMSF+eTNctOZlXwnYiPiGzY+GQ==
app-builder-lib@26.0.0:
version "26.0.0"
resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-26.0.0.tgz#726b8b2c058f04f854aba70c7245d48454905980"
integrity sha512-vZTt6Nc401IHBHISqspcO9tUF80ddOP5ehh2B4goLefM+zdT75CvuQUuqz7yzRgW16pHLqCvKMws0FbJQfLB5w==
dependencies:
"@develar/schema-utils" "~2.6.5"
"@electron/asar" "3.2.18"
@@ -625,15 +625,15 @@ app-builder-lib@26.0.0-alpha.10:
"@types/fs-extra" "9.0.13"
async-exit-hook "^2.0.1"
bluebird-lst "^1.0.9"
builder-util "26.0.0-alpha.10"
builder-util-runtime "9.3.0-alpha.0"
builder-util "26.0.0"
builder-util-runtime "9.3.0"
chromium-pickle-js "^0.2.0"
config-file-ts "0.2.8-rc1"
debug "^4.3.4"
dotenv "^16.4.5"
dotenv-expand "^11.0.6"
ejs "^3.1.8"
electron-publish "26.0.0-alpha.10"
electron-publish "26.0.0"
fs-extra "^10.1.0"
hosted-git-info "^4.1.0"
is-ci "^3.0.0"
@@ -784,24 +784,24 @@ buffer@^5.1.0, buffer@^5.5.0:
base64-js "^1.3.1"
ieee754 "^1.1.13"
builder-util-runtime@9.3.0-alpha.0:
version "9.3.0-alpha.0"
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.3.0-alpha.0.tgz#c4639ae24a74d2e0f4eb324100af3040300bae62"
integrity sha512-EriE6Uf15niqdkyjBOS09OrXlhEV0HKhnATlI9n63vCoisnvvRTQNgoR2MV9vnBmNGhavBPZXPWPItv4QMDVfw==
builder-util-runtime@9.3.0:
version "9.3.0"
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.3.0.tgz#58d97c279bb8626a10d779e1cf22fea0eb25f5e8"
integrity sha512-wR81YIybr41JITLSltwtTsZXkgTwcpBol7LGOyB5A8fKCcZaYLDWgUqDwmsjhlgADD6sGD5ieyzS/5wbL2l/qQ==
dependencies:
debug "^4.3.4"
sax "^1.2.4"
builder-util@26.0.0-alpha.10:
version "26.0.0-alpha.10"
resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-26.0.0-alpha.10.tgz#f445a530c28da6e3650b93e92263c06c6f89a2cc"
integrity sha512-RMVOAgdd+tzwpyF5C8gx9KjzwdUvkUEubpsHTvb2JwlQnBcyBc6hyVCU2gt2MivQCLbjCOEgsUX1/zHrWDqGfg==
builder-util@26.0.0:
version "26.0.0"
resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-26.0.0.tgz#e5bc122f3e9e94fa2e3afd2e837e81ce9f177359"
integrity sha512-iLN4R0UAzSz4MxPmz+6vnXMqaY5BMd2FSNlM9f7eHSRYqZrsoTHCSrd7W4Kr4qFIdUxLlRz3X2npATapXzomIg==
dependencies:
"7zip-bin" "~5.2.0"
"@types/debug" "^4.1.6"
app-builder-bin "5.0.0-alpha.12"
bluebird-lst "^1.0.9"
builder-util-runtime "9.3.0-alpha.0"
builder-util-runtime "9.3.0"
chalk "^4.1.2"
cross-spawn "^7.0.6"
debug "^4.3.4"
@@ -1178,14 +1178,14 @@ dir-compare@^4.2.0:
minimatch "^3.0.5"
p-limit "^3.1.0 "
dmg-builder@26.0.0-alpha.10:
version "26.0.0-alpha.10"
resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-26.0.0-alpha.10.tgz#d4d908922005a0c852d0919a7dd0b8f77d3c4bd0"
integrity sha512-RWzCNLLu4dGIvBf8kBzjF/zI5aMOSA149S1V2NgAA4La8f8ghdJAm/DI5crSb2zDijFLyTNmUGTtvU6eHgiZyQ==
dmg-builder@26.0.0:
version "26.0.0"
resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-26.0.0.tgz#6dc81be31f7ffe9f8a5fc77ce7f83eba33ae9aa7"
integrity sha512-NyyTgm1U56ytpFvuGjj63PYug3v+oYYbPc8e08EiHP6G4TvMwYabmSzFtanfoO1iI7xOljpW/fW7SNCHHElsfw==
dependencies:
app-builder-lib "26.0.0-alpha.10"
builder-util "26.0.0-alpha.10"
builder-util-runtime "9.3.0-alpha.0"
app-builder-lib "26.0.0"
builder-util "26.0.0"
builder-util-runtime "9.3.0"
fs-extra "^10.1.0"
iconv-lite "^0.6.2"
js-yaml "^4.1.0"
@@ -1232,35 +1232,35 @@ ejs@^3.1.8:
dependencies:
jake "^10.8.5"
electron-builder@^26.0.0-alpha.10:
version "26.0.0-alpha.10"
resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-26.0.0-alpha.10.tgz#6f629f5f1f3340286af71cabd12d94edc53f15ea"
integrity sha512-QTitqOlP5aZ/8zhnxqjRb6BxSR7Kvwv07PoBGeIXADwSPHQhKhZ+S+GRFzUSYQrMTTJLGzUHbnAes6fZ3uThEA==
electron-builder@^26.0.0:
version "26.0.0"
resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-26.0.0.tgz#f5c03b049e3e9b0d3da7737f93bf1a830d1f17bb"
integrity sha512-R1ZNTCtwjApiELkE4LTNIF6UkV+FMgyDIjILlsVvFak8Jr60cI9gu4q3lVALYzGBcFyzHKn2RPp6j0gl5kuVow==
dependencies:
app-builder-lib "26.0.0-alpha.10"
builder-util "26.0.0-alpha.10"
builder-util-runtime "9.3.0-alpha.0"
app-builder-lib "26.0.0"
builder-util "26.0.0"
builder-util-runtime "9.3.0"
chalk "^4.1.2"
dmg-builder "26.0.0-alpha.10"
dmg-builder "26.0.0"
fs-extra "^10.1.0"
is-ci "^3.0.0"
lazy-val "^1.0.5"
simple-update-notifier "2.0.0"
yargs "^17.6.2"
electron-log@^5.2.4:
version "5.2.4"
resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.2.4.tgz#6b488d9db80aa3c6f3dc39bcd635fc9d1f79c8af"
integrity sha512-iX12WXc5XAaKeHg2QpiFjVwL+S1NVHPFd3V5RXtCmKhpAzXsVQnR3UEc0LovM6p6NkUQxDWnkdkaam9FNUVmCA==
electron-log@^5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.3.0.tgz#503a911983db09156965595a7ee9a39f2d9d6384"
integrity sha512-ILgbh2k9IKbSaN8NAbQriVteEhmkdLo/e4J1dg+JIBTFzXS/kO8zNRZBh/4YPwIT/zeyxF1jP6Xz8GLsPE2IBQ==
electron-publish@26.0.0-alpha.10:
version "26.0.0-alpha.10"
resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-26.0.0-alpha.10.tgz#16ac95acca2d796ca00c7a90ca27ebf31855f284"
integrity sha512-yUkCJD7MLN57d6PJ8PMcBCR35xytA+jHyrOiS/H0hlmTOWq1sXN+tIBylX4h0dD/C6mn75/y5eE156Pe2nccPw==
electron-publish@26.0.0:
version "26.0.0"
resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-26.0.0.tgz#f37b9babe62885c2ee552af2817bf2048b566637"
integrity sha512-0MOeYp1IRDj+jdkWluEVMer8fpc/htwWJZdGQUMbbbhgMnX8AvDdwHuR0UdaPFLDJ076E9YHd2urkeFyLm7PUQ==
dependencies:
"@types/fs-extra" "^9.0.11"
builder-util "26.0.0-alpha.10"
builder-util-runtime "9.3.0-alpha.0"
builder-util "26.0.0"
builder-util-runtime "9.3.0"
chalk "^4.1.2"
form-data "^4.0.0"
fs-extra "^10.1.0"
@@ -1275,12 +1275,12 @@ electron-store@^8.2.0:
conf "^10.2.0"
type-fest "^2.17.0"
electron-updater@^6.4.0-alpha.3:
version "6.4.0-alpha.3"
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.4.0-alpha.3.tgz#4c33647c79f7ea1bcd184aac8a0b15d5a2b37cf1"
integrity sha512-pqbEqfKVly49UO3QhnRnzghK75BW6v6ZrpW/2vs+ZVVxHmrdwEl1bTjJFQl1LSIBABpBEwT5W9uwf3cKfrD+Bg==
electron-updater@^6.4.0:
version "6.4.0"
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.4.0.tgz#f413e5d1cb4fadde451eb7daa585ddb6332e2409"
integrity sha512-E2fqL3GrVaXGZm2w95s4kJuPIF633pi5GhEy1/ReOHjDW9h/C0mZ1LXcLq0LsyQ4vyVj9UsdRb4E+Zy/d7RKUw==
dependencies:
builder-util-runtime "9.3.0-alpha.0"
builder-util-runtime "9.3.0"
fs-extra "^10.1.0"
js-yaml "^4.1.0"
lazy-val "^1.0.5"
@@ -1289,10 +1289,10 @@ electron-updater@^6.4.0-alpha.3:
semver "^7.6.3"
tiny-typed-emitter "^2.1.0"
electron@^34.0.0:
version "34.0.0"
resolved "https://registry.yarnpkg.com/electron/-/electron-34.0.0.tgz#30ccedbc02d2f036868b8278960fd0e438ec0e52"
integrity sha512-fpaPb0lifoUJ6UJa4Lk8/0B2Ku/xDZWdc1Gkj67jbygTCrvSon0qquju6Ltx1Kz23GRqqlIHXiy9EvrjpY7/Wg==
electron@^34.1.1:
version "34.1.1"
resolved "https://registry.yarnpkg.com/electron/-/electron-34.1.1.tgz#1fc766e406401834fedb9747c4ca58671d9a1e46"
integrity sha512-1aDYk9Gsv1/fFeClMrxWGoVMl7uCUgl1pe26BiTnLXmAoqEXCa3f3sCKFWV+cuDzUjQGAZcpkWhGYTgWUSQrLA==
dependencies:
"@electron/get" "^2.0.0"
"@types/node" "^20.9.0"
@@ -3202,10 +3202,10 @@ truncate-utf8-bytes@^1.0.0:
dependencies:
utf8-byte-length "^1.0.1"
ts-api-utils@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.0.tgz#b9d7d5f7ec9f736f4d0f09758b8607979044a900"
integrity sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==
ts-api-utils@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.1.tgz#660729385b625b939aaa58054f45c058f33f10cd"
integrity sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==
tslib@^2.1.0, tslib@^2.6.2:
version "2.7.0"
@@ -3234,14 +3234,14 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
typescript-eslint@^8.21.0:
version "8.21.0"
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.21.0.tgz#78bdb83a6d771f0312b128297d84a3111885fd08"
integrity sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw==
typescript-eslint@^8.23.0:
version "8.23.0"
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.23.0.tgz#796deb48f040146b68fcc8cb07db68b87219a8d2"
integrity sha512-/LBRo3HrXr5LxmrdYSOCvoAMm7p2jNizNfbIpCgvG4HMsnoprRUOce/+8VJ9BDYWW68rqIENE/haVLWPeFZBVQ==
dependencies:
"@typescript-eslint/eslint-plugin" "8.21.0"
"@typescript-eslint/parser" "8.21.0"
"@typescript-eslint/utils" "8.21.0"
"@typescript-eslint/eslint-plugin" "8.23.0"
"@typescript-eslint/parser" "8.23.0"
"@typescript-eslint/utils" "8.23.0"
typescript@^5.4.3:
version "5.5.4"

View File

@@ -138,6 +138,10 @@ export const sidebar = [
text: "Machine Learning",
link: "/photos/faq/machine-learning",
},
{
text: "Video Streaming",
link: "/photos/faq/video-streaming",
},
],
},
{

View File

@@ -0,0 +1,63 @@
---
title: Video Streaming FAQ
description:
Frequently asked questions about Ente's Video Streaming feature
---
# Video Streaming
> [!NOTE]
>
> Video streaming is available in beta on mobile apps starting v0.9.98.
### How to enable video streaming?
- Open Settings -> General -> Advanced
- Switch on the toggle for `Video streaming`
### What happens when I enable video streaming?
Enabling video streaming will start processing videos captured in the last 30
days, generating streams for each. Both local and remote videos will be
processed, so this may consume bandwidth for downloading of remote files and
uploading of the generated streams.
### How can I view video streams?
Settings -> Backup > Backup status will show details regarding the processing
status for videos. Processed videos will have a green play button next to them.
You can open these videos by tapping on them.
Processed videos will show a `Play stream` button, clicking which will load and
play the stream.
Clicking on the `Info` icon within the original video will show details
about the generated stream.
### What is a stream?
Stream is an encrypted HLS file with an `.m3u8` playlist that helps play a video
with support for seeking **without** downloading the full file.
Currently it converts videos into `720p` with `2mbps` bitrate in `H.264` format.
The generated stream is single blob (encrypted with AES) while the playlist file
(`.m3u8`) is another blob (encrypted using XChaCha20).
We cannot read the contents, duration or the number of chunks within the
generated stream.
### Will streams consume space in my storage?
While this feature is in beta, we will not count the storage consumed by your
streams against your storage quota. This may change in the future. If it does,
we will provide an option to opt-in to one of the following:
1. Original videos only
2. Compressed streams only
3. Both
### Something doesn't seem right, what to do?
As video streaming is still in beta, some things might not work correctly.
Please create a thread within the `#feedback` channel on
[Discord](https://discord.com/channels/948937918347608085/1121126215995113552)
or reach out to [support@ente.io](mailto:support@ente.io).

View File

@@ -43,6 +43,10 @@ need to disable this "Optimize battery usage" mode in the system settings for
Ente if you wish for Ente to automatically back up your photos in the
background.
On Android versions 15 and later, if an app is in private space and the private
space is locked, Android doesnt allow the app to run any background processes.
As a result, background sync will not work.
### Desktop
In addition to our mobile apps, the background sync also works on our desktop

View File

@@ -20,23 +20,25 @@ the logs just make the process a bit faster and easier.
- Select for the option to _Report a Bug_.
- Tap on _Report a bug_.
## Desktop and Web
- Open settings (click on the three horizontal lines button located at the top
left corner of the screen).
- Click on the _Help_ option towards the bottom of settings.
- Click on _View logs_. This will show you the location of the logs on your
system (desktop), or download them from the browser onto your computer (web).
- Go back to settings.
- Click on _Support_. This will open your email client where you can attach the
logs in the email and describe the issue.
## Desktop
- Click on _Help_ menu at the top of your screen, and select the _View logs_
option.
- Open settings (click on the three horizontal lines button located at the top
left corner of the screen).
- Click on _Support_. This will open your email client where you can attach the
logs in the email and describe the issue.
On the desktop app, you can also directly view the logs on your computer at the
following locations:
## Web
- Open settings (click on the three horizontal lines button located at the top
left corner of the screen).
- Click on _Debug Logs_ towards the bottom of settings.
- Click on _Download logs_
- Click on _Support_. This will open your email client where you can attach the
logs in the email and describe the issue.
- macOS: `~/Library/Logs/ente/ente.log`
- Linux: `~/.config/ente/logs/ente.log`
- Windows: `%USERPROFILE%\AppData\Roaming\ente\logs\ente.log`
## Send email manually

View File

@@ -22,6 +22,10 @@ interface Subscription {
originalTransactionID: string;
expiryTime: number;
userID: string;
attributes: {
customerID: string;
stripeAccountCountry: string;
};
}
interface UserDataResponse {
@@ -40,6 +44,10 @@ interface FormValues {
transactionId: string;
expiryTime: string | Date | null;
userId: string;
attributes: {
customerID: string;
stripeAccountCountry: string;
};
}
const UpdateSubscription: React.FC<UpdateSubscriptionProps> = ({
@@ -53,6 +61,10 @@ const UpdateSubscription: React.FC<UpdateSubscriptionProps> = ({
transactionId: "",
expiryTime: "",
userId: "",
attributes: {
"customerID": "",
"stripeAccountCountry": ""
},
});
const [isDatePickerOpen, setIsDatePickerOpen] = useState(false);
@@ -95,6 +107,10 @@ const UpdateSubscription: React.FC<UpdateSubscriptionProps> = ({
"",
expiryTime: expiryTime,
userId: userDataResponse.subscription.userID || "",
attributes: {
customerID: userDataResponse.subscription.attributes.customerID || "",
stripeAccountCountry: userDataResponse.subscription.attributes.stripeAccountCountry || ""
}
});
} catch (error) {
console.error("Error fetching data:", error);
@@ -156,6 +172,10 @@ const UpdateSubscription: React.FC<UpdateSubscriptionProps> = ({
productId: values.productId,
paymentProvider: values.provider,
transactionId: values.transactionId,
attributes: {
customerID: values.attributes.customerID,
stripeAccountCountry: values.attributes.stripeAccountCountry
}
};
try {

View File

@@ -2,3 +2,5 @@
# To ensure that stack traces is unambiguous
# https://developer.android.com/studio/build/shrink-code#decode-stack-trace
-keepattributes LineNumberTable,SourceFile
-keep class org.chromium.net.** { *; }

View File

@@ -12,6 +12,11 @@ allprojects {
url "${project(':background_fetch').projectDir}/libs"
}
}
ext {
compileSdkVersion = 34
targetSdkVersion = 34
appCompatVersion = "1.7.0"
}
}
rootProject.buildDir = '../build'

View File

@@ -1,4 +1,3 @@
org.gradle.jvmargs=-Xmx4608m
android.enableR8=true
android.useAndroidX=true
android.enableJetifier=true

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 922 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 645 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 527 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 750 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 744 B

View File

@@ -6,16 +6,19 @@ PODS:
- connectivity_plus (0.0.1):
- Flutter
- FlutterMacOS
- cupertino_http (0.0.1):
- Flutter
- FlutterMacOS
- dart_ui_isolate (0.0.1):
- Flutter
- device_info_plus (0.0.1):
- Flutter
- ffmpeg-kit-ios-min (6.0)
- ffmpeg_kit_flutter_min (6.0.3):
- ffmpeg_kit_flutter_min/min (= 6.0.3)
- ffmpeg-kit-ios-full-gpl (6.0)
- ffmpeg_kit_flutter_full_gpl (6.0.3):
- ffmpeg_kit_flutter_full_gpl/full-gpl (= 6.0.3)
- Flutter
- ffmpeg_kit_flutter_min/min (6.0.3):
- ffmpeg-kit-ios-min (= 6.0)
- ffmpeg_kit_flutter_full_gpl/full-gpl (6.0.3):
- ffmpeg-kit-ios-full-gpl (= 6.0)
- Flutter
- file_saver (0.0.1):
- Flutter
@@ -35,9 +38,9 @@ PODS:
- FirebaseCoreInternal (~> 11.0)
- GoogleUtilities/Environment (~> 8.0)
- GoogleUtilities/Logger (~> 8.0)
- FirebaseCoreInternal (11.3.0):
- FirebaseCoreInternal (11.6.0):
- "GoogleUtilities/NSData+zlib (~> 8.0)"
- FirebaseInstallations (11.3.0):
- FirebaseInstallations (11.4.0):
- FirebaseCore (~> 11.0)
- GoogleUtilities/Environment (~> 8.0)
- GoogleUtilities/UserDefaults (~> 8.0)
@@ -158,6 +161,8 @@ PODS:
- nanopb/encode (3.30910.0)
- native_video_player (1.0.0):
- Flutter
- objective_c (0.0.1):
- Flutter
- onnxruntime (0.0.1):
- Flutter
- onnxruntime-objc (= 1.18.0)
@@ -186,9 +191,9 @@ PODS:
- Flutter
- screen_brightness_ios (0.1.0):
- Flutter
- SDWebImage (5.19.7):
- SDWebImage/Core (= 5.19.7)
- SDWebImage/Core (5.19.7)
- SDWebImage (5.20.0):
- SDWebImage/Core (= 5.20.0)
- SDWebImage/Core (5.20.0)
- SDWebImageWebPCoder (0.14.6):
- libwebp (~> 1.0)
- SDWebImage/Core (~> 5.17)
@@ -247,9 +252,10 @@ DEPENDENCIES:
- background_fetch (from `.symlinks/plugins/background_fetch/ios`)
- battery_info (from `.symlinks/plugins/battery_info/ios`)
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/darwin`)
- cupertino_http (from `.symlinks/plugins/cupertino_http/darwin`)
- dart_ui_isolate (from `.symlinks/plugins/dart_ui_isolate/ios`)
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
- ffmpeg_kit_flutter_min (from `.symlinks/plugins/ffmpeg_kit_flutter_min/ios`)
- ffmpeg_kit_flutter_full_gpl (from `.symlinks/plugins/ffmpeg_kit_flutter_full_gpl/ios`)
- file_saver (from `.symlinks/plugins/file_saver/ios`)
- firebase_core (from `.symlinks/plugins/firebase_core/ios`)
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
@@ -278,6 +284,7 @@ DEPENDENCIES:
- motionphoto (from `.symlinks/plugins/motionphoto/ios`)
- move_to_background (from `.symlinks/plugins/move_to_background/ios`)
- native_video_player (from `.symlinks/plugins/native_video_player/ios`)
- objective_c (from `.symlinks/plugins/objective_c/ios`)
- onnxruntime (from `.symlinks/plugins/onnxruntime/ios`)
- open_mail_app (from `.symlinks/plugins/open_mail_app/ios`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
@@ -303,7 +310,7 @@ DEPENDENCIES:
SPEC REPOS:
trunk:
- ffmpeg-kit-ios-min
- ffmpeg-kit-ios-full-gpl
- Firebase
- FirebaseCore
- FirebaseCoreInternal
@@ -331,12 +338,14 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/battery_info/ios"
connectivity_plus:
:path: ".symlinks/plugins/connectivity_plus/darwin"
cupertino_http:
:path: ".symlinks/plugins/cupertino_http/darwin"
dart_ui_isolate:
:path: ".symlinks/plugins/dart_ui_isolate/ios"
device_info_plus:
:path: ".symlinks/plugins/device_info_plus/ios"
ffmpeg_kit_flutter_min:
:path: ".symlinks/plugins/ffmpeg_kit_flutter_min/ios"
ffmpeg_kit_flutter_full_gpl:
:path: ".symlinks/plugins/ffmpeg_kit_flutter_full_gpl/ios"
file_saver:
:path: ".symlinks/plugins/file_saver/ios"
firebase_core:
@@ -393,6 +402,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/move_to_background/ios"
native_video_player:
:path: ".symlinks/plugins/native_video_player/ios"
objective_c:
:path: ".symlinks/plugins/objective_c/ios"
onnxruntime:
:path: ".symlinks/plugins/onnxruntime/ios"
open_mail_app:
@@ -439,82 +450,84 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/wakelock_plus/ios"
SPEC CHECKSUMS:
background_fetch: 39f11371c0dce04b001c4bfd5e782bcccb0a85e2
battery_info: 09f5c9ee65394f2291c8c6227bedff345b8a730c
connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db
dart_ui_isolate: d5bcda83ca4b04f129d70eb90110b7a567aece14
device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6
ffmpeg-kit-ios-min: 4e9a088f4ee9629435960b9d68e54848975f1931
ffmpeg_kit_flutter_min: 5eff47f4965bf9d1150e98961eb6129f5ae3f28c
file_saver: 503e386464dbe118f630e17b4c2e1190fa0cf808
background_fetch: 94b36ee293e82972852dba8ede1fbcd3bd3d9d57
battery_info: a06b00c06a39bc94c92beebf600f1810cb6c8c87
connectivity_plus: 3f6c9057f4cd64198dc826edfb0542892f825343
cupertino_http: 94ac07f5ff090b8effa6c5e2c47871d48ab7c86c
dart_ui_isolate: 46f6714abe6891313267153ef6f9748d8ecfcab1
device_info_plus: 335f3ce08d2e174b9fdc3db3db0f4e3b1f66bd89
ffmpeg-kit-ios-full-gpl: 80adc341962e55ef709e36baa8ed9a70cf4ea62b
ffmpeg_kit_flutter_full_gpl: ce18b888487c05c46ed252cd2e7956812f2e3bd1
file_saver: 6cdbcddd690cb02b0c1a0c225b37cd805c2bf8b6
Firebase: 98e6bf5278170668a7983e12971a66b2cd57fc8c
firebase_core: 2bedc3136ec7c7b8561c6123ed0239387b53f2af
firebase_messaging: 15d114e1a41fc31e4fbabcd48d765a19eec94a38
firebase_core: 085320ddfaacb80d1a96eac3a87857afcc150db1
firebase_messaging: d398edc15fe825f832836e74f6ac61e8cd2f3ad3
FirebaseCore: a282032ae9295c795714ded2ec9c522fc237f8da
FirebaseCoreInternal: ac26d09a70c730e497936430af4e60fb0c68ec4e
FirebaseInstallations: 58cf94dabf1e2bb2fa87725a9be5c2249171cda0
FirebaseCoreInternal: d98ab91e2d80a56d7b246856a8885443b302c0c2
FirebaseInstallations: 6ef4a1c7eb2a61ee1f74727d7f6ce2e72acf1414
FirebaseMessaging: c9ec7b90c399c7a6100297e9d16f8a27fc7f7152
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
flutter_email_sender: 02d7443217d8c41483223627972bfdc09f74276b
flutter_image_compress: 5a5e9aee05b6553048b8df1c3bc456d0afaac433
flutter_inappwebview_ios: 6f63631e2c62a7c350263b13fa5427aedefe81d4
flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086
flutter_native_splash: edf599c81f74d093a4daf8e17bd7a018854bc778
flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be
flutter_sodium: c84426b4de738514b5b66cfdeb8a06634e72fe0b
fluttertoast: e9a18c7be5413da53898f660530c56f35edfba9c
flutter_email_sender: cd533cdc7ea5eda6fabb2c7f78521c71207778a4
flutter_image_compress: 4b058288a81f76e5e80340af37c709abafff34c4
flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99
flutter_local_notifications: ad39620c743ea4c15127860f4b5641649a988100
flutter_native_splash: 35ddbc7228eafcb3969dcc5f1fbbe27c1145a4f0
flutter_secure_storage: 2c2ff13db9e0a5647389bff88b0ecac56e3f3418
flutter_sodium: 152647449ba89a157fd48d7e293dcd6d29c6ab0e
fluttertoast: 76fea30fcf04176325f6864c87306927bd7d2038
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d
home_widget: 0434835a4c9a75704264feff6be17ea40e0f0d57
image_editor_common: d6f6644ae4a6de80481e89fe6d0a8c49e30b4b43
image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1
in_app_purchase_storekit: 8c3b0b3eb1b0f04efbff401c3de6266d4258d433
integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573
home_widget: f169fc41fd807b4d46ab6615dc44d62adbf9f64f
image_editor_common: 3de87e7c4804f4ae24c8f8a998362b98c105cac1
image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a
in_app_purchase_storekit: e126ef1b89e4a9fdf07e28f005f82632b4609437
integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e
libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009
local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3
local_auth_ios: 5046a18c018dd973247a0564496c8898dbb5adf9
local_auth_darwin: 553ce4f9b16d3fdfeafce9cf042e7c9f77c1c391
local_auth_ios: f7a1841beef3151d140a967c2e46f30637cdf451
Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d
maps_launcher: 2e5b6a2d664ec6c27f82ffa81b74228d770ab203
media_extension: 6d30dc1431ebaa63f43c397c37917b1a0a597a4c
media_kit_libs_ios_video: a5fe24bc7875ccd6378a0978c13185e1344651c1
media_kit_native_event_loop: e6b2ab20cf0746eb1c33be961fcf79667304fa2a
media_kit_video: 5da63f157170e5bf303bf85453b7ef6971218a2e
motion_sensors: 03f55b7c637a7e365a0b5f9697a449f9059d5d91
motionphoto: d4a432b8c8f22fb3ad966258597c0103c9c5ff16
move_to_background: 39a5b79b26d577b0372cbe8a8c55e7aa9fcd3a2d
maps_launcher: edf829809ba9e894d70e569bab11c16352dedb45
media_extension: a1fec16ee9c8241a6aef9613578ebf097d6c5e64
media_kit_libs_ios_video: 5a18affdb97d1f5d466dc79988b13eff6c5e2854
media_kit_native_event_loop: 5fba1a849a6c87a34985f1e178a0de5bd444a0cf
media_kit_video: 1746e198cb697d1ffb734b1d05ec429d1fcd1474
motion_sensors: 741e702c17467b9569a92165dda8d4d88c6167f1
motionphoto: 584b43031ead3060225cdff08fa49818879801d2
move_to_background: 155f7bfbd34d43ad847cb630d2d2d87c17199710
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
native_video_player: d12af78a1a4a8cf09775a5177d5b392def6fd23c
onnxruntime: e7c2ae44385191eaad5ae64c935a72debaddc997
native_video_player: b65c58951ede2f93d103a25366bdebca95081265
objective_c: 89e720c30d716b036faf9c9684022048eee1eee2
onnxruntime: f9b296392c96c42882be020a59dbeac6310d81b2
onnxruntime-c: a909204639a1f035f575127ac406f781ac797c9c
onnxruntime-objc: b6fab0f1787aa6f7190c2013f03037df4718bd8b
open_mail_app: 794172f6a22cd16319d3ddaf45e945b2f74952b0
open_mail_app: 06d5a4162866388a92b1df3deb96e56be20cf45c
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
photo_manager: ff695c7a1dd5bc379974953a2b5c0a293f7c4c8a
privacy_screen: 1a131c052ceb3c3659934b003b0d397c2381a24e
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
photo_manager: d2fbcc0f2d82458700ee6256a15018210a81d413
privacy_screen: 3159a541f5d3a31bea916cfd4e58f9dc722b3fd4
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
receive_sharing_intent: df9c334dc9feadcbd3266e5cb49c8443405e1c9f
screen_brightness_ios: 715ca807df953bf676d339f11464e438143ee625
SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3
receive_sharing_intent: f6a12b7e8f7ed745f61c982de8a65de88db44a44
screen_brightness_ios: 5ed898fa50fa82a26171c086ca5e28228f932576
SDWebImage: 73c6079366fea25fa4bb9640d5fb58f0893facd8
SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380
Sentry: f8374b5415bc38dfb5645941b3ae31230fbeae57
sentry_flutter: 0eb93e5279eb41e2392212afe1ccd2fecb4f8cbe
share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
sqflite_darwin: a553b1fd6fe66f53bbb0fe5b4f5bab93f08d7a13
sentry_flutter: 0a211008f52553ba5dd81ceb71f48d78f0f1f6ab
share_plus: 011d6fb4f9d2576b83179a3a5c5e323202cdabcf
shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
sqflite_darwin: 44bb54cc302bff1fbe5752293aba1820b157cf1c
sqlite3: 0bb0e6389d824e40296f531b858a2a0b71c0d2fb
sqlite3_flutter_libs: c00457ebd31e59fa6bb830380ddba24d44fbcd3b
system_info_plus: 5393c8da281d899950d751713575fbf91c7709aa
sqlite3_flutter_libs: 9379996d65aa23dcda7585a5b58766cebe0aa042
system_info_plus: 555ce7047fbbf29154726db942ae785c29211740
Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e
ua_client_hints: 46bb5817a868f9e397c0ba7e3f2f5c5d90c35156
uni_links: d97da20c7701486ba192624d99bffaaffcfc298a
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3
video_thumbnail: c4e2a3c539e247d4de13cd545344fd2d26ffafd1
volume_controller: 531ddf792994285c9b17f9d8a7e4dcdd29b3eae9
wakelock_plus: 8b09852c8876491e4b6d179e17dfe2a0b5f60d47
ua_client_hints: 0b48eae1134283f5b131ee0871fa878377f07a01
uni_links: ed8c961e47ed9ce42b6d91e1de8049e38a4b3152
url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b
video_thumbnail: b637e0ad5f588ca9945f6e2c927f73a69a661140
volume_controller: ca1cde542ee70fad77d388f82e9616488110942b
wakelock_plus: 04623e3f525556020ebd4034310f20fe7fda8b49
PODFILE CHECKSUM: 20e086e6008977d43a3d40260f3f9bffcac748dd

View File

@@ -16,7 +16,7 @@
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
DA6BE5E826B3BC8600656280 /* (null) in Resources */ = {isa = PBXBuildFile; };
DA6BE5E826B3BC8600656280 /* BuildFile in Resources */ = {isa = PBXBuildFile; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
@@ -230,7 +230,7 @@
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
DA6BE5E826B3BC8600656280 /* (null) in Resources */,
DA6BE5E826B3BC8600656280 /* BuildFile in Resources */,
277218A0270F596900FFE3CC /* GoogleService-Info.plist in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -292,6 +292,7 @@
"${BUILT_PRODUCTS_DIR}/background_fetch/background_fetch.framework",
"${BUILT_PRODUCTS_DIR}/battery_info/battery_info.framework",
"${BUILT_PRODUCTS_DIR}/connectivity_plus/connectivity_plus.framework",
"${BUILT_PRODUCTS_DIR}/cupertino_http/cupertino_http.framework",
"${BUILT_PRODUCTS_DIR}/dart_ui_isolate/dart_ui_isolate.framework",
"${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework",
"${BUILT_PRODUCTS_DIR}/file_saver/file_saver.framework",
@@ -321,6 +322,7 @@
"${BUILT_PRODUCTS_DIR}/move_to_background/move_to_background.framework",
"${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework",
"${BUILT_PRODUCTS_DIR}/native_video_player/native_video_player.framework",
"${BUILT_PRODUCTS_DIR}/objective_c/objective_c.framework",
"${BUILT_PRODUCTS_DIR}/open_mail_app/open_mail_app.framework",
"${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework",
"${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework",
@@ -342,14 +344,14 @@
"${BUILT_PRODUCTS_DIR}/video_thumbnail/video_thumbnail.framework",
"${BUILT_PRODUCTS_DIR}/volume_controller/volume_controller.framework",
"${BUILT_PRODUCTS_DIR}/wakelock_plus/wakelock_plus.framework",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-min/ffmpegkit.framework/ffmpegkit",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-min/libavcodec.framework/libavcodec",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-min/libavdevice.framework/libavdevice",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-min/libavfilter.framework/libavfilter",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-min/libavformat.framework/libavformat",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-min/libavutil.framework/libavutil",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-min/libswresample.framework/libswresample",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-min/libswscale.framework/libswscale",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-full-gpl/ffmpegkit.framework/ffmpegkit",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-full-gpl/libavcodec.framework/libavcodec",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-full-gpl/libavdevice.framework/libavdevice",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-full-gpl/libavfilter.framework/libavfilter",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-full-gpl/libavformat.framework/libavformat",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-full-gpl/libavutil.framework/libavutil",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-full-gpl/libswresample.framework/libswresample",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-full-gpl/libswscale.framework/libswscale",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/media_kit_libs_ios_video/Ass.framework/Ass",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/media_kit_libs_ios_video/Avcodec.framework/Avcodec",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/media_kit_libs_ios_video/Avfilter.framework/Avfilter",
@@ -387,6 +389,7 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/background_fetch.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/battery_info.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/connectivity_plus.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/cupertino_http.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/dart_ui_isolate.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info_plus.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/file_saver.framework",
@@ -416,6 +419,7 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/move_to_background.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/native_video_player.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/objective_c.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/open_mail_app.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/package_info_plus.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_foundation.framework",

View File

@@ -18,6 +18,7 @@ import 'package:photos/core/error-reporting/tunneled_transport.dart';
import "package:photos/core/errors.dart";
import 'package:photos/models/typedefs.dart';
import "package:photos/utils/device_info.dart";
import "package:photos/utils/ram_check_util.dart";
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart';
@@ -205,6 +206,12 @@ class SuperLogging {
}),
);
unawaited(
checkDeviceTotalRAM().then((ram) {
if (ram != null) $.info("Device RAM: ${ram}MB");
}),
);
if (appConfig.body == null) return;
if (enable && sentryIsEnabled) {
@@ -236,7 +243,7 @@ class SuperLogging {
}
static _shouldSkipSentry(Object error) {
if (error is DioError) {
if (error is DioException) {
return true;
}
final bool result = error is StorageLimitExceededError ||

View File

@@ -1,6 +1,7 @@
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:native_dio_adapter/native_dio_adapter.dart';
import 'package:package_info_plus/package_info_plus.dart';
import "package:photos/core/configuration.dart";
import "package:photos/core/event_bus.dart";
@@ -8,18 +9,17 @@ import 'package:photos/core/network/ente_interceptor.dart';
import "package:photos/events/endpoint_updated_event.dart";
import "package:ua_client_hints/ua_client_hints.dart";
int kConnectTimeout = 15000;
class NetworkClient {
late Dio _dio;
late Dio _enteDio;
static const kConnectTimeout = 15;
Future<void> init(PackageInfo packageInfo) async {
final String ua = await userAgent();
final endpoint = Configuration.instance.getHttpEndpoint();
_dio = Dio(
BaseOptions(
connectTimeout: kConnectTimeout,
connectTimeout: const Duration(seconds: kConnectTimeout),
headers: {
HttpHeaders.userAgentHeader: ua,
'X-Client-Version': packageInfo.version,
@@ -30,7 +30,7 @@ class NetworkClient {
_enteDio = Dio(
BaseOptions(
baseUrl: endpoint,
connectTimeout: kConnectTimeout,
connectTimeout: const Duration(seconds: kConnectTimeout),
headers: {
HttpHeaders.userAgentHeader: ua,
'X-Client-Version': packageInfo.version,
@@ -38,6 +38,10 @@ class NetworkClient {
},
),
);
_dio.httpClientAdapter = NativeAdapter();
_enteDio.httpClientAdapter = NativeAdapter();
_setupInterceptors(endpoint);
Bus.instance.on<EndpointUpdatedEvent>().listen((event) {

View File

@@ -251,20 +251,20 @@ class CollectionsDB {
Map<String, dynamic> _getRowForCollection(Collection collection) {
final row = <String, dynamic>{};
row[columnID] = collection.id;
row[columnOwner] = collection.owner!.toJson();
row[columnOwner] = collection.owner.toJson();
row[columnEncryptedKey] = collection.encryptedKey;
row[columnKeyDecryptionNonce] = collection.keyDecryptionNonce;
row[columnName] = collection.name;
row[columnEncryptedName] = collection.encryptedName;
row[columnNameDecryptionNonce] = collection.nameDecryptionNonce;
row[columnType] = Collection.typeToString(collection.type);
row[columnType] = typeToString(collection.type);
row[columnEncryptedPath] = collection.attributes.encryptedPath;
row[columnPathDecryptionNonce] = collection.attributes.pathDecryptionNonce;
row[columnVersion] = collection.attributes.version;
row[columnSharees] =
json.encode(collection.sharees?.map((x) => x?.toMap()).toList());
json.encode(collection.sharees.map((x) => x.toMap()).toList());
row[columnPublicURLs] =
json.encode(collection.publicURLs?.map((x) => x?.toMap()).toList());
json.encode(collection.publicURLs.map((x) => x.toMap()).toList());
row[columnUpdationTime] = collection.updationTime;
if (collection.isDeleted) {
row[columnIsDeleted] = _sqlBoolTrue;
@@ -290,7 +290,7 @@ class CollectionsDB {
row[columnName],
row[columnEncryptedName],
row[columnNameDecryptionNonce],
Collection.typeFromString(row[columnType]),
typeFromString(row[columnType]),
CollectionAttributes(
encryptedPath: row[columnEncryptedPath],
pathDecryptionNonce: row[columnPathDecryptionNonce],

View File

@@ -1730,6 +1730,26 @@ class FilesDB {
);
}
Future<List<EnteFile>> getAllFilesAfterDate({
required FileType fileType,
required DateTime beginDate,
required int userID,
}) async {
final db = await instance.sqliteAsyncDB;
final results = await db.getAll(
'''
SELECT * FROM $filesTable
WHERE $columnFileType = ?
AND $columnCreationTime > ?
AND $columnUploadedFileID != -1
AND $columnOwnerID = $userID
ORDER BY $columnCreationTime DESC
''',
[getInt(fileType), beginDate.microsecondsSinceEpoch],
);
return convertToFiles(results);
}
Future<List<EnteFile>> getAllFilesFromDB(
Set<int> collectionsToIgnore, {
bool dedupeByUploadId = true,

118
mobile/lib/db/ml/base.dart Normal file
View File

@@ -0,0 +1,118 @@
import "dart:typed_data";
import "package:photos/models/ml/clip.dart";
import "package:photos/models/ml/face/face.dart";
import "package:photos/models/ml/vector.dart";
import "package:photos/services/machine_learning/face_ml/face_clustering/face_db_info_for_clustering.dart";
abstract class IMLDataDB<T> {
Future<void> bulkInsertFaces(List<Face> faces);
Future<void> updateFaceIdToClusterId(Map<String, String> faceIDToClusterID);
Future<Map<int, int>> faceIndexedFileIds({int minimumMlVersion});
Future<int> getFaceIndexedFileCount({int minimumMlVersion});
Future<Map<String, int>> clusterIdToFaceCount();
Future<Set<String>> getPersonIgnoredClusters(String personID);
Future<Set<String>> getPersonClusterIDs(String personID);
Future<Set<String>> getPersonsClusterIDs(List<String> personID);
Future<void> clearTable();
Future<Iterable<Uint8List>> getFaceEmbeddingsForCluster(
String clusterID, {
int? limit,
});
Future<Map<String, Iterable<Uint8List>>> getFaceEmbeddingsForClusters(
Iterable<String> clusterIDs, {
int? limit,
});
Future<Face?> getCoverFaceForPerson({
required T recentFileID,
String? personID,
String? avatarFaceId,
String? clusterID,
});
Future<List<Face>?> getFacesForGivenFileID(T fileUploadID);
Future<Map<String, Iterable<String>>> getClusterToFaceIDs(
Set<String> clusterIDs,
);
Future<String?> getClusterIDForFaceID(String faceID);
Future<Map<String, Iterable<String>>> getAllClusterIdToFaceIDs();
Future<Iterable<String>> getFaceIDsForCluster(String clusterID);
Future<Map<String, Map<String, Set<String>>>> getPersonToClusterIdToFaceIds();
Future<Map<String, Set<String>>> getClusterIdToFaceIdsForPerson(
String personID,
);
Future<Set<String>> getFaceIDsForPerson(String personID);
Future<Iterable<double>> getBlurValuesForCluster(String clusterID);
Future<Map<String, String?>> getFaceIdsToClusterIds(Iterable<String> faceIds);
Future<Map<T, Set<String>>> getFileIdToClusterIds();
Future<void> forceUpdateClusterIds(Map<String, String> faceIDToClusterID);
Future<void> removeFaceIdToClusterId(Map<String, String> faceIDToClusterID);
Future<void> removePerson(String personID);
Future<List<FaceDbInfoForClustering>> getFaceInfoForClustering({
int maxFaces,
int offset,
int batchSize,
});
Future<Map<String, Uint8List>> getFaceEmbeddingMapForFaces(
Iterable<String> faceIDs,
);
Future<int> getTotalFaceCount();
Future<int> getErroredFaceCount();
Future<Set<T>> getErroredFileIDs();
Future<void> deleteFaceIndexForFiles(List<T> fileIDs);
Future<int> getClusteredOrFacelessFileCount();
Future<double> getClusteredToIndexableFilesRatio();
Future<int> getUnclusteredFaceCount();
Future<void> assignClusterToPerson({
required String personID,
required String clusterID,
});
Future<void> bulkAssignClusterToPersonID(
Map<String, String> clusterToPersonID,
);
Future<void> captureNotPersonFeedback({
required String personID,
required String clusterID,
});
Future<void> bulkCaptureNotPersonFeedback(
Map<String, String> clusterToPersonID,
);
Future<void> removeNotPersonFeedback({
required String personID,
required String clusterID,
});
Future<void> removeClusterToPerson({
required String personID,
required String clusterID,
});
Future<Map<T, Set<String>>> getFileIdToClusterIDSet(String personID);
Future<Map<T, Set<String>>> getFileIdToClusterIDSetForCluster(
Set<String> clusterIDs,
);
Future<void> clusterSummaryUpdate(Map<String, (Uint8List, int)> summary);
Future<void> deleteClusterSummary(String clusterID);
Future<Map<String, (Uint8List, int)>> getAllClusterSummary([
int? minClusterSize,
]);
Future<Map<String, (Uint8List, int)>> getClusterToClusterSummary(
Iterable<String> clusterIDs,
);
Future<Map<String, String>> getClusterIDToPersonID();
Future<void> dropClustersAndPersonTable({bool faces});
Future<void> dropFacesFeedbackTables();
Future<List<T>> getFileIDsOfPersonID(String personID);
Future<List<T>> getFileIDsOfClusterID(String clusterID);
Future<Set<T>> getAllFileIDsOfFaceIDsNotInAnyCluster();
Future<Set<T>> getAllFilesAssociatedWithAllClusters({
List<String>? exceptClusters,
});
Future<List<EmbeddingVector>> getAllClipVectors();
Future<Map<int, int>> clipIndexedFileWithVersion();
Future<Map<int, EmbeddingVector>> getClipVectorsForFileIDs(
Iterable<int> fileIDs,
);
Future<int> getClipIndexedFileCount({int minimumMlVersion});
Future<void> putClip(List<ClipEmbedding> embeddings);
Future<void> deleteClipEmbeddings(List<T> fileIDs);
Future<void> deleteClipIndexes();
}

View File

@@ -1,100 +0,0 @@
import "dart:typed_data";
import "package:logging/logging.dart";
import "package:photos/core/event_bus.dart";
import "package:photos/db/ml/db.dart";
import "package:photos/db/ml/db_fields.dart";
import "package:photos/events/embedding_updated_event.dart";
import "package:photos/models/ml/clip.dart";
import "package:photos/models/ml/ml_versions.dart";
import "package:photos/models/ml/vector.dart";
extension ClipDB on MLDataDB {
Future<List<EmbeddingVector>> getAllClipVectors() async {
Logger("ClipDB").info("reading all embeddings from DB");
final db = await MLDataDB.instance.asyncDB;
final results = await db.getAll('SELECT * FROM $clipTable');
return _convertToVectors(results);
}
// Get indexed FileIDs
Future<Map<int, int>> clipIndexedFileWithVersion() async {
final db = await MLDataDB.instance.asyncDB;
final maps = await db
.getAll('SELECT $fileIDColumn , $mlVersionColumn FROM $clipTable');
final Map<int, int> result = {};
for (final map in maps) {
result[map[fileIDColumn] as int] = map[mlVersionColumn] as int;
}
return result;
}
Future<int> getClipIndexedFileCount({
int minimumMlVersion = clipMlVersion,
}) async {
final db = await MLDataDB.instance.asyncDB;
final String query =
'SELECT COUNT(DISTINCT $fileIDColumn) as count FROM $clipTable WHERE $mlVersionColumn >= $minimumMlVersion';
final List<Map<String, dynamic>> maps = await db.getAll(query);
return maps.first['count'] as int;
}
Future<void> put(ClipEmbedding embedding) async {
final db = await MLDataDB.instance.asyncDB;
await db.execute(
'INSERT OR REPLACE INTO $clipTable ($fileIDColumn, $embeddingColumn, $mlVersionColumn) VALUES (?, ?, ?)',
_getRowFromEmbedding(embedding),
);
Bus.instance.fire(EmbeddingUpdatedEvent());
}
Future<void> putMany(List<ClipEmbedding> embeddings) async {
if (embeddings.isEmpty) return;
final db = await MLDataDB.instance.asyncDB;
final inputs = embeddings.map((e) => _getRowFromEmbedding(e)).toList();
await db.executeBatch(
'INSERT OR REPLACE INTO $clipTable ($fileIDColumn, $embeddingColumn, $mlVersionColumn) values(?, ?, ?)',
inputs,
);
Bus.instance.fire(EmbeddingUpdatedEvent());
}
Future<void> deleteClipEmbeddings(List<int> fileIDs) async {
final db = await MLDataDB.instance.asyncDB;
await db.execute(
'DELETE FROM $clipTable WHERE $fileIDColumn IN (${fileIDs.join(", ")})',
);
Bus.instance.fire(EmbeddingUpdatedEvent());
}
Future<void> deleteClipIndexes() async {
final db = await MLDataDB.instance.asyncDB;
await db.execute('DELETE FROM $clipTable');
Bus.instance.fire(EmbeddingUpdatedEvent());
}
List<EmbeddingVector> _convertToVectors(List<Map<String, dynamic>> results) {
final List<EmbeddingVector> embeddings = [];
for (final result in results) {
final embedding = _getVectorFromRow(result);
if (embedding.isEmpty) continue;
embeddings.add(embedding);
}
return embeddings;
}
EmbeddingVector _getVectorFromRow(Map<String, dynamic> row) {
final fileID = row[fileIDColumn] as int;
final bytes = row[embeddingColumn] as Uint8List;
final list = Float32List.view(bytes.buffer);
return EmbeddingVector(fileID: fileID, embedding: list);
}
List<Object?> _getRowFromEmbedding(ClipEmbedding embedding) {
return [
embedding.fileID,
Float32List.fromList(embedding.embedding).buffer.asUint8List(),
embedding.version,
];
}
}

View File

@@ -6,11 +6,16 @@ import "package:flutter/foundation.dart";
import 'package:logging/logging.dart';
import 'package:path/path.dart' show join;
import 'package:path_provider/path_provider.dart';
import "package:photos/core/event_bus.dart";
import "package:photos/db/ml/base.dart";
import 'package:photos/db/ml/db_fields.dart';
import "package:photos/db/ml/db_model_mappers.dart";
import "package:photos/events/embedding_updated_event.dart";
import "package:photos/extensions/stop_watch.dart";
import "package:photos/models/ml/clip.dart";
import "package:photos/models/ml/face/face.dart";
import "package:photos/models/ml/ml_versions.dart";
import "package:photos/models/ml/vector.dart";
import "package:photos/services/machine_learning/face_ml/face_clustering/face_db_info_for_clustering.dart";
import 'package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart';
import "package:photos/services/machine_learning/ml_result.dart";
@@ -28,7 +33,7 @@ import 'package:sqlite_async/sqlite_async.dart';
///
/// [clipTable] - Stores the embeddings of the CLIP model
/// [fileDataTable] - Stores data about the files that are already processed by the ML models
class MLDataDB {
class MLDataDB extends IMLDataDB<int> {
static final Logger _logger = Logger("MLDataDB");
static const _databaseName = "ente.ml.db";
@@ -108,6 +113,7 @@ class MLDataDB {
// bulkInsertFaces inserts the faces in the database in batches of 1000.
// This is done to avoid the error "too many SQL variables" when inserting
// a large number of faces.
@override
Future<void> bulkInsertFaces(List<Face> faces) async {
final db = await instance.asyncDB;
const batchSize = 500;
@@ -143,6 +149,7 @@ class MLDataDB {
}
}
@override
Future<void> updateFaceIdToClusterId(
Map<String, String> faceIDToClusterID,
) async {
@@ -166,6 +173,7 @@ class MLDataDB {
}
/// Returns a map of fileID to the indexed ML version
@override
Future<Map<int, int>> faceIndexedFileIds({
int minimumMlVersion = faceMlVersion,
}) async {
@@ -183,6 +191,7 @@ class MLDataDB {
return result;
}
@override
Future<int> getFaceIndexedFileCount({
int minimumMlVersion = faceMlVersion,
}) async {
@@ -193,6 +202,7 @@ class MLDataDB {
return maps.first['count'] as int;
}
@override
Future<Map<String, int>> clusterIdToFaceCount() async {
final db = await instance.asyncDB;
final List<Map<String, dynamic>> maps = await db.getAll(
@@ -205,6 +215,7 @@ class MLDataDB {
return result;
}
@override
Future<Set<String>> getPersonIgnoredClusters(String personID) async {
final db = await instance.asyncDB;
// find out clusterIds that are assigned to other persons using the clusters table
@@ -223,6 +234,7 @@ class MLDataDB {
return ignoredClusterIDs.union(rejectClusterIDs);
}
@override
Future<Set<String>> getPersonClusterIDs(String personID) async {
final db = await instance.asyncDB;
final List<Map<String, dynamic>> maps = await db.getAll(
@@ -232,6 +244,7 @@ class MLDataDB {
return maps.map((e) => e[clusterIDColumn] as String).toSet();
}
@override
Future<Set<String>> getPersonsClusterIDs(List<String> personID) async {
final db = await instance.asyncDB;
final inParam = personID.map((e) => "'$e'").join(',');
@@ -241,6 +254,7 @@ class MLDataDB {
return maps.map((e) => e[clusterIDColumn] as String).toSet();
}
@override
Future<void> clearTable() async {
final db = await instance.asyncDB;
@@ -253,6 +267,7 @@ class MLDataDB {
await db.execute(deleteFileDataTable);
}
@override
Future<Iterable<Uint8List>> getFaceEmbeddingsForCluster(
String clusterID, {
int? limit,
@@ -265,6 +280,7 @@ class MLDataDB {
return maps.map((e) => e[embeddingColumn] as Uint8List);
}
@override
Future<Map<String, Iterable<Uint8List>>> getFaceEmbeddingsForClusters(
Iterable<String> clusterIDs, {
int? limit,
@@ -297,6 +313,7 @@ class MLDataDB {
return result;
}
@override
Future<Face?> getCoverFaceForPerson({
required int recentFileID,
String? personID,
@@ -325,11 +342,6 @@ class MLDataDB {
);
final clusterIDs =
clusterRows.map((e) => e[clusterIDColumn] as String).toList();
// final List<Map<String, dynamic>> faceMaps = await db.getAll(
// 'SELECT * FROM $facesTable where '
// '$faceIDColumn in (SELECT $faceIDColumn from $faceClustersTable where $clusterIDColumn IN (${clusterIDs.join(",")}))'
// 'AND $fileIDColumn in (${fileId.join(",")}) AND $faceScore > $kMinimumQualityFaceScore ORDER BY $faceScore DESC',
// );
final List<Map<String, dynamic>> faceMaps = await db.getAll(
'''
@@ -340,10 +352,9 @@ class MLDataDB {
WHERE $clusterIDColumn IN (${List.filled(clusterIDs.length, '?').join(',')})
)
AND $fileIDColumn IN (${List.filled(fileId.length, '?').join(',')})
AND $faceScore > ?
ORDER BY $faceScore DESC
''',
[...clusterIDs, ...fileId, kMinimumQualityFaceScore],
[...clusterIDs, ...fileId],
);
if (faceMaps.isNotEmpty) {
if (avatarFileId != null) {
@@ -384,6 +395,7 @@ class MLDataDB {
return null;
}
@override
Future<List<Face>?> getFacesForGivenFileID(int fileUploadID) async {
final db = await instance.asyncDB;
const String query = '''
@@ -400,6 +412,29 @@ class MLDataDB {
return maps.map((e) => mapRowToFace(e)).toList();
}
Future<Map<int, List<Face>>> getFacesForFileIDs(
Iterable<int> fileUploadIDs,
) async {
final db = await instance.asyncDB;
final List<Map<String, dynamic>> maps = await db.getAll(
'''
SELECT * FROM $facesTable
WHERE $fileIDColumn IN (${fileUploadIDs.map((id) => "'$id'").join(",")})
''',
);
if (maps.isEmpty) {
return {};
}
final result = <int, List<Face>>{};
for (final map in maps) {
final face = mapRowToFace(map);
final fileID = map[fileIDColumn] as int;
result.putIfAbsent(fileID, () => <Face>[]).add(face);
}
return result;
}
@override
Future<Map<String, Iterable<String>>> getClusterToFaceIDs(
Set<String> clusterIDs,
) async {
@@ -423,6 +458,7 @@ class MLDataDB {
return result;
}
@override
Future<String?> getClusterIDForFaceID(String faceID) async {
final db = await instance.asyncDB;
final List<Map<String, dynamic>> maps = await db.getAll(
@@ -435,6 +471,7 @@ class MLDataDB {
return maps.first[clusterIDColumn] as String;
}
@override
Future<Map<String, Iterable<String>>> getAllClusterIdToFaceIDs() async {
final db = await instance.asyncDB;
final Map<String, List<String>> result = {};
@@ -449,6 +486,7 @@ class MLDataDB {
return result;
}
@override
Future<Iterable<String>> getFaceIDsForCluster(String clusterID) async {
final db = await instance.asyncDB;
final List<Map<String, dynamic>> maps = await db.getAll(
@@ -460,6 +498,7 @@ class MLDataDB {
}
// Get Map of personID to Map of clusterID to faceIDs
@override
Future<Map<String, Map<String, Set<String>>>>
getPersonToClusterIdToFaceIds() async {
final db = await instance.asyncDB;
@@ -480,6 +519,23 @@ class MLDataDB {
return result;
}
Future<Map<String, String>> getFaceIdToPersonIdForFaces(
Iterable<String> faceIDs,
) async {
final db = await instance.asyncDB;
final List<Map<String, dynamic>> maps = await db.getAll(
'SELECT $faceIDColumn, $personIdColumn FROM $clusterPersonTable '
'INNER JOIN $faceClustersTable ON $clusterPersonTable.$clusterIDColumn = $faceClustersTable.$clusterIDColumn '
'WHERE $faceIDColumn IN (${faceIDs.map((id) => "'$id'").join(",")})',
);
final Map<String, String> result = {};
for (final map in maps) {
result[map[faceIDColumn] as String] = map[personIdColumn] as String;
}
return result;
}
@override
Future<Map<String, Set<String>>> getClusterIdToFaceIdsForPerson(
String personID,
) async {
@@ -499,6 +555,7 @@ class MLDataDB {
return result;
}
@override
Future<Set<String>> getFaceIDsForPerson(String personID) async {
final db = await instance.asyncDB;
final faceIdsResult = await db.getAll(
@@ -510,6 +567,7 @@ class MLDataDB {
return faceIdsResult.map((e) => e[faceIDColumn] as String).toSet();
}
@override
Future<Iterable<double>> getBlurValuesForCluster(String clusterID) async {
final db = await instance.asyncDB;
const String query = '''
@@ -530,6 +588,7 @@ class MLDataDB {
return maps.map((e) => e[faceBlur] as double).toSet();
}
@override
Future<Map<String, String?>> getFaceIdsToClusterIds(
Iterable<String> faceIds,
) async {
@@ -544,6 +603,7 @@ class MLDataDB {
return result;
}
@override
Future<Map<int, Set<String>>> getFileIdToClusterIds() async {
final Map<int, Set<String>> result = {};
final db = await instance.asyncDB;
@@ -554,12 +614,13 @@ class MLDataDB {
for (final map in maps) {
final clusterID = map[clusterIDColumn] as String;
final faceID = map[faceIDColumn] as String;
final fileID = getFileIdFromFaceId(faceID);
final fileID = getFileIdFromFaceId<int>(faceID);
result[fileID] = (result[fileID] ?? {})..add(clusterID);
}
return result;
}
@override
Future<void> forceUpdateClusterIds(
Map<String, String> faceIDToClusterID,
) async {
@@ -575,6 +636,7 @@ class MLDataDB {
await db.executeBatch(sql, parameterSets);
}
@override
Future<void> removeFaceIdToClusterId(
Map<String, String> faceIDToClusterID,
) async {
@@ -588,6 +650,7 @@ class MLDataDB {
await db.executeBatch(sql, parameterSets);
}
@override
Future<void> removePerson(String personID) async {
final db = await instance.asyncDB;
@@ -613,6 +676,7 @@ class MLDataDB {
});
}
@override
Future<List<FaceDbInfoForClustering>> getFaceInfoForClustering({
int maxFaces = 20000,
int offset = 0,
@@ -668,6 +732,7 @@ class MLDataDB {
}
}
@override
Future<Map<String, Uint8List>> getFaceEmbeddingMapForFaces(
Iterable<String> faceIDs,
) async {
@@ -706,6 +771,7 @@ class MLDataDB {
return result;
}
@override
Future<int> getTotalFaceCount() async {
final db = await instance.asyncDB;
final List<Map<String, dynamic>> maps = await db.getAll(
@@ -714,6 +780,7 @@ class MLDataDB {
return maps.first['count'] as int;
}
@override
Future<int> getErroredFaceCount() async {
final db = await instance.asyncDB;
final List<Map<String, dynamic>> maps = await db.getAll(
@@ -722,6 +789,7 @@ class MLDataDB {
return maps.first['count'] as int;
}
@override
Future<Set<int>> getErroredFileIDs() async {
final db = await instance.asyncDB;
final List<Map<String, dynamic>> maps = await db.getAll(
@@ -730,6 +798,7 @@ class MLDataDB {
return maps.map((e) => e[fileIDColumn] as int).toSet();
}
@override
Future<void> deleteFaceIndexForFiles(List<int> fileIDs) async {
final db = await instance.asyncDB;
final String sql = '''
@@ -738,6 +807,7 @@ class MLDataDB {
await db.execute(sql);
}
@override
Future<int> getClusteredOrFacelessFileCount() async {
final db = await instance.asyncDB;
final List<Map<String, dynamic>> clustered = await db.getAll(
@@ -745,7 +815,7 @@ class MLDataDB {
);
final Set<int> clusteredFileIDs = {};
for (final map in clustered) {
final int fileID = getFileIdFromFaceId(map[faceIDColumn] as String);
final int fileID = getFileIdFromFaceId<int>(map[faceIDColumn] as String);
clusteredFileIDs.add(fileID);
}
@@ -768,6 +838,7 @@ class MLDataDB {
return clusteredFileIDs.length + trulyFacelessFiles.length;
}
@override
Future<double> getClusteredToIndexableFilesRatio() async {
final int indexableFiles = (await getIndexableFileIDs()).length;
final int clusteredFiles = await getClusteredOrFacelessFileCount();
@@ -775,6 +846,7 @@ class MLDataDB {
return clusteredFiles / indexableFiles;
}
@override
Future<int> getUnclusteredFaceCount() async {
final db = await instance.asyncDB;
const String query = '''
@@ -791,6 +863,7 @@ class MLDataDB {
/// WARNING: Only use this method if the person has just been created.
/// Otherwise, use [ClusterFeedbackService.instance.addClusterToExistingPerson] instead.
@override
Future<void> assignClusterToPerson({
required String personID,
required String clusterID,
@@ -803,6 +876,7 @@ class MLDataDB {
await db.execute(sql, [personID, clusterID]);
}
@override
Future<void> bulkAssignClusterToPersonID(
Map<String, String> clusterToPersonID,
) async {
@@ -816,6 +890,7 @@ class MLDataDB {
await db.executeBatch(sql, parameterSets);
}
@override
Future<void> captureNotPersonFeedback({
required String personID,
required String clusterID,
@@ -828,6 +903,7 @@ class MLDataDB {
await db.execute(sql, [personID, clusterID]);
}
@override
Future<void> bulkCaptureNotPersonFeedback(
Map<String, String> clusterToPersonID,
) async {
@@ -842,6 +918,7 @@ class MLDataDB {
await db.executeBatch(sql, parameterSets);
}
@override
Future<void> removeNotPersonFeedback({
required String personID,
required String clusterID,
@@ -854,6 +931,7 @@ class MLDataDB {
await db.execute(sql, [personID, clusterID]);
}
@override
Future<void> removeClusterToPerson({
required String personID,
required String clusterID,
@@ -867,6 +945,7 @@ class MLDataDB {
}
// for a given personID, return a map of clusterID to fileIDs using join query
@override
Future<Map<int, Set<String>>> getFileIdToClusterIDSet(String personID) {
final db = instance.asyncDB;
return db.then((db) async {
@@ -881,13 +960,14 @@ class MLDataDB {
for (final map in maps) {
final clusterID = map[clusterIDColumn] as String;
final String faceID = map[faceIDColumn] as String;
final fileID = getFileIdFromFaceId(faceID);
final fileID = getFileIdFromFaceId<int>(faceID);
result[fileID] = (result[fileID] ?? {})..add(clusterID);
}
return result;
});
}
@override
Future<Map<int, Set<String>>> getFileIdToClusterIDSetForCluster(
Set<String> clusterIDs,
) {
@@ -905,13 +985,14 @@ class MLDataDB {
for (final map in maps) {
final clusterID = map[clusterIDColumn] as String;
final faceID = map[faceIDColumn] as String;
final fileID = getFileIdFromFaceId(faceID);
final fileID = getFileIdFromFaceId<int>(faceID);
result[fileID] = (result[fileID] ?? {})..add(clusterID);
}
return result;
});
}
@override
Future<void> clusterSummaryUpdate(
Map<String, (Uint8List, int)> summary,
) async {
@@ -937,6 +1018,7 @@ class MLDataDB {
await db.executeBatch(sql, parameterSets);
}
@override
Future<void> deleteClusterSummary(String clusterID) async {
final db = await instance.asyncDB;
const String sqlDelete =
@@ -945,6 +1027,7 @@ class MLDataDB {
}
/// Returns a map of clusterID to (avg embedding, count)
@override
Future<Map<String, (Uint8List, int)>> getAllClusterSummary([
int? minClusterSize,
]) async {
@@ -962,6 +1045,7 @@ class MLDataDB {
return result;
}
@override
Future<Map<String, (Uint8List, int)>> getClusterToClusterSummary(
Iterable<String> clusterIDs,
) async {
@@ -982,6 +1066,7 @@ class MLDataDB {
return result;
}
@override
Future<Map<String, String>> getClusterIDToPersonID() async {
final db = await instance.asyncDB;
final List<Map<String, dynamic>> maps = await db.getAll(
@@ -995,6 +1080,7 @@ class MLDataDB {
}
/// WARNING: This will delete ALL data in the database! Only use this for debug/testing purposes!
@override
Future<void> dropClustersAndPersonTable({bool faces = false}) async {
try {
final db = await instance.asyncDB;
@@ -1022,6 +1108,7 @@ class MLDataDB {
}
/// WARNING: This will delete ALL data in the tables! Only use this for debug/testing purposes!
@override
Future<void> dropFacesFeedbackTables() async {
try {
final db = await instance.asyncDB;
@@ -1038,6 +1125,7 @@ class MLDataDB {
}
}
@override
Future<List<int>> getFileIDsOfPersonID(String personID) async {
final db = await instance.asyncDB;
final result = await db.getAll(
@@ -1054,6 +1142,7 @@ class MLDataDB {
return [for (final row in result) row[fileIDColumn]];
}
@override
Future<List<int>> getFileIDsOfClusterID(String clusterID) async {
final db = await instance.asyncDB;
final result = await db.getAll(
@@ -1069,6 +1158,7 @@ class MLDataDB {
return [for (final row in result) row[fileIDColumn]];
}
@override
Future<Set<int>> getAllFileIDsOfFaceIDsNotInAnyCluster() async {
final db = await instance.asyncDB;
final result = await db.getAll(
@@ -1082,6 +1172,7 @@ class MLDataDB {
return <int>{for (final row in result) row[fileIDColumn]};
}
@override
Future<Set<int>> getAllFilesAssociatedWithAllClusters({
List<String>? exceptClusters,
}) async {
@@ -1096,4 +1187,112 @@ class MLDataDB {
return <int>{for (final row in result) row[fileIDColumn]};
}
@override
Future<List<EmbeddingVector>> getAllClipVectors() async {
Logger("ClipDB").info("reading all embeddings from DB");
final db = await instance.asyncDB;
final results = await db.getAll('SELECT * FROM $clipTable');
return _convertToVectors(results);
}
@override
Future<Map<int, EmbeddingVector>> getClipVectorsForFileIDs(
Iterable<int> fileIDs,
) async {
final db = await MLDataDB.instance.asyncDB;
final results = await db.getAll(
'SELECT * FROM $clipTable WHERE $fileIDColumn IN (${fileIDs.join(", ")})',
);
final Map<int, EmbeddingVector> embeddings = {};
for (final result in results) {
final embedding = _getVectorFromRow(result);
embeddings[embedding.fileID] = embedding;
}
return embeddings;
}
// Get indexed FileIDs
@override
Future<Map<int, int>> clipIndexedFileWithVersion() async {
final db = await instance.asyncDB;
final maps = await db
.getAll('SELECT $fileIDColumn , $mlVersionColumn FROM $clipTable');
final Map<int, int> result = {};
for (final map in maps) {
result[map[fileIDColumn] as int] = map[mlVersionColumn] as int;
}
return result;
}
@override
Future<int> getClipIndexedFileCount({
int minimumMlVersion = clipMlVersion,
}) async {
final db = await instance.asyncDB;
final String query =
'SELECT COUNT(DISTINCT $fileIDColumn) as count FROM $clipTable WHERE $mlVersionColumn >= $minimumMlVersion';
final List<Map<String, dynamic>> maps = await db.getAll(query);
return maps.first['count'] as int;
}
@override
Future<void> putClip(List<ClipEmbedding> embeddings) async {
if (embeddings.isEmpty) return;
final db = await instance.asyncDB;
if (embeddings.length == 1) {
await db.execute(
'INSERT OR REPLACE INTO $clipTable ($fileIDColumn, $embeddingColumn, $mlVersionColumn) VALUES (?, ?, ?)',
_getRowFromEmbedding(embeddings.first),
);
} else {
final inputs = embeddings.map((e) => _getRowFromEmbedding(e)).toList();
await db.executeBatch(
'INSERT OR REPLACE INTO $clipTable ($fileIDColumn, $embeddingColumn, $mlVersionColumn) values(?, ?, ?)',
inputs,
);
}
Bus.instance.fire(EmbeddingUpdatedEvent());
}
@override
Future<void> deleteClipEmbeddings(List<int> fileIDs) async {
final db = await instance.asyncDB;
await db.execute(
'DELETE FROM $clipTable WHERE $fileIDColumn IN (${fileIDs.join(", ")})',
);
Bus.instance.fire(EmbeddingUpdatedEvent());
}
@override
Future<void> deleteClipIndexes() async {
final db = await instance.asyncDB;
await db.execute('DELETE FROM $clipTable');
Bus.instance.fire(EmbeddingUpdatedEvent());
}
List<EmbeddingVector> _convertToVectors(List<Map<String, dynamic>> results) {
final List<EmbeddingVector> embeddings = [];
for (final result in results) {
final embedding = _getVectorFromRow(result);
if (embedding.isEmpty) continue;
embeddings.add(embedding);
}
return embeddings;
}
EmbeddingVector _getVectorFromRow(Map<String, dynamic> row) {
final fileID = row[fileIDColumn] as int;
final bytes = row[embeddingColumn] as Uint8List;
final list = Float32List.view(bytes.buffer);
return EmbeddingVector(fileID: fileID, embedding: list);
}
List<Object?> _getRowFromEmbedding(ClipEmbedding embedding) {
return [
embedding.fileID,
Float32List.fromList(embedding.embedding).buffer.asUint8List(),
embedding.version,
];
}
}

View File

@@ -3,6 +3,7 @@ import 'package:photos/services/machine_learning/face_ml/face_filtering/face_fil
const facesTable = 'faces';
const fileIDColumn = 'file_id';
const objectIdColumn = 'obj_id';
const faceIDColumn = 'face_id';
const faceDetectionColumn = 'detection';
const embeddingColumn = 'embedding';
@@ -114,7 +115,7 @@ CREATE TABLE IF NOT EXISTS $fileDataTable (
user_id INTEGER NOT NULL,
type TEXT NOT NULL,
size INTEGER NOT NULL,
obj_id TEXT,
$objectIdColumn TEXT,
obj_nonce TEXT,
updated_at INTEGER NOT NULL,
PRIMARY KEY ($fileIDColumn, type)

View File

@@ -26,6 +26,22 @@ extension FileDataTable on MLDataDB {
);
}
Future<Map<int, PreviewInfo>> getFileIDsVidPreview() async {
final db = await MLDataDB.instance.asyncDB;
final res = await db.execute(
"SELECT $fileIDColumn, $objectIdColumn, size FROM $fileDataTable WHERE type='vid_preview'",
);
return res.asMap().map(
(i, e) => MapEntry(
e[fileIDColumn] as int,
PreviewInfo(
objectId: e[objectIdColumn] as String,
objectSize: e['size'] as int,
),
),
);
}
Future<Set<int>> getFileIDsWithFDData() async {
final db = await MLDataDB.instance.asyncDB;
final res = await db.execute('SELECT $fileIDColumn FROM $fileDataTable');

View File

@@ -322,22 +322,20 @@ class _AddContactPage extends State<AddContactPage> {
final int ownerID = Configuration.instance.getUserID()!;
existingEmails.add(Configuration.instance.getEmail()!);
for (final c in CollectionsService.instance.getActiveCollections()) {
if (c.owner?.id == ownerID) {
for (final User? u in c.sharees ?? []) {
if (u != null &&
u.id != null &&
if (c.owner.id == ownerID) {
for (final User u in c.sharees) {
if (u.id != null &&
u.email.isNotEmpty &&
!existingEmails.contains(u.email)) {
existingEmails.add(u.email);
suggestedUsers.add(u);
}
}
} else if (c.owner != null &&
c.owner!.id != null &&
c.owner!.email.isNotEmpty &&
!existingEmails.contains(c.owner!.email)) {
existingEmails.add(c.owner!.email);
suggestedUsers.add(c.owner!);
} else if (c.owner.id != null &&
c.owner.email.isNotEmpty &&
!existingEmails.contains(c.owner.email)) {
existingEmails.add(c.owner.email);
suggestedUsers.add(c.owner);
}
}
final cachedUserDetails = UserService.instance.getCachedUserDetails();

View File

@@ -0,0 +1,10 @@
import "dart:collection";
import "package:photos/events/event.dart";
import "package:photos/models/preview/preview_item.dart";
class PreviewUpdatedEvent extends Event {
final LinkedHashMap<int, PreviewItem> items;
PreviewUpdatedEvent(this.items);
}

View File

@@ -0,0 +1,5 @@
import "package:photos/events/event.dart";
// todo: consider removing this once we opt for riverpod or similar state management
// solution
class VideoStreamingChanged extends Event {}

View File

@@ -4,6 +4,11 @@ import "package:photos/services/machine_learning/face_ml/person/person_service.d
extension UserExtension on User {
//Some initial users have name in name field.
String? get displayName =>
PersonService.instance.emailToNameMapCache[email] ??
PersonService.instance.emailToPartialPersonDataMapCache[email]
?[PersonService.kNameKey] ??
((name?.isEmpty ?? true) ? null : name);
String? get linkedPersonID =>
PersonService.instance.emailToPartialPersonDataMapCache[email]
?[PersonService.kPersonIDKey];
}

View File

@@ -12,7 +12,7 @@ class CastGateway {
);
return response.data["publicKey"];
} catch (e) {
if (e is DioError && e.response != null) {
if (e is DioException && e.response != null) {
if (e.response!.statusCode == 404) {
return null;
} else if (e.response!.statusCode == 403) {

View File

@@ -32,7 +32,7 @@ class EntityGateway {
},
);
return EntityKey.fromMap(response.data);
} on DioError catch (e) {
} on DioException catch (e) {
if (e.response != null && (e.response!.statusCode ?? 0) == 404) {
throw EntityKeyNotFound();
} else {

View File

@@ -41,14 +41,12 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("مفتاح الاسترداد غير صحيح"),
"invalidEmailAddress": MessageLookupByLibrary.simpleMessage(
"عنوان البريد الإلكتروني غير صالح"),
"link": MessageLookupByLibrary.simpleMessage("Link"),
"linkEmail": MessageLookupByLibrary.simpleMessage("Link email"),
"noEnteAccountExclamation":
MessageLookupByLibrary.simpleMessage("No Ente account!"),
"noRecoveryKey":
MessageLookupByLibrary.simpleMessage("ما من مفتاح استرداد؟"),
"noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage(
"لا يمكن فك تشفير بياناتك دون كلمة المرور أو مفتاح الاسترداد بسبب طبيعة بروتوكول التشفير الخاص بنا من النهاية إلى النهاية"),
"orPickFromYourContacts":
MessageLookupByLibrary.simpleMessage("or pick from your contacts"),
"recoverButton": MessageLookupByLibrary.simpleMessage("استرداد"),
"recoverySuccessful":
MessageLookupByLibrary.simpleMessage("نجح الاسترداد!"),

View File

@@ -156,8 +156,6 @@ class MessageLookup extends MessageLookupByLibrary {
"kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage(
"Калі ласка, дапамажыце нам з гэтай інфармацыяй"),
"lightTheme": MessageLookupByLibrary.simpleMessage("Светлая"),
"link": MessageLookupByLibrary.simpleMessage("Link"),
"linkEmail": MessageLookupByLibrary.simpleMessage("Link email"),
"lockscreen": MessageLookupByLibrary.simpleMessage("Экран блакіроўкі"),
"logInLabel": MessageLookupByLibrary.simpleMessage("Увайсці"),
"loginTerms": MessageLookupByLibrary.simpleMessage(
@@ -170,8 +168,6 @@ class MessageLookup extends MessageLookupByLibrary {
"never": MessageLookupByLibrary.simpleMessage("Ніколі"),
"noDuplicates":
MessageLookupByLibrary.simpleMessage("✨ Няма дублікатаў"),
"noEnteAccountExclamation":
MessageLookupByLibrary.simpleMessage("No Ente account!"),
"noRecoveryKey":
MessageLookupByLibrary.simpleMessage("Няма ключа аднаўлення?"),
"noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage(
@@ -179,6 +175,8 @@ class MessageLookup extends MessageLookupByLibrary {
"notifications": MessageLookupByLibrary.simpleMessage("Апавяшчэнні"),
"ok": MessageLookupByLibrary.simpleMessage("Добра"),
"oops": MessageLookupByLibrary.simpleMessage("Вой"),
"orPickFromYourContacts":
MessageLookupByLibrary.simpleMessage("or pick from your contacts"),
"password": MessageLookupByLibrary.simpleMessage("Пароль"),
"passwordChangedSuccessfully":
MessageLookupByLibrary.simpleMessage("Пароль паспяхова зменены"),

View File

@@ -22,9 +22,7 @@ class MessageLookup extends MessageLookupByLibrary {
final messages = _notInlinedMessages(_notInlinedMessages);
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
"link": MessageLookupByLibrary.simpleMessage("Link"),
"linkEmail": MessageLookupByLibrary.simpleMessage("Link email"),
"noEnteAccountExclamation":
MessageLookupByLibrary.simpleMessage("No Ente account!")
"orPickFromYourContacts":
MessageLookupByLibrary.simpleMessage("or pick from your contacts")
};
}

View File

@@ -22,9 +22,7 @@ class MessageLookup extends MessageLookupByLibrary {
final messages = _notInlinedMessages(_notInlinedMessages);
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
"link": MessageLookupByLibrary.simpleMessage("Link"),
"linkEmail": MessageLookupByLibrary.simpleMessage("Link email"),
"noEnteAccountExclamation":
MessageLookupByLibrary.simpleMessage("No Ente account!")
"orPickFromYourContacts":
MessageLookupByLibrary.simpleMessage("or pick from your contacts")
};
}

View File

@@ -27,9 +27,7 @@ class MessageLookup extends MessageLookupByLibrary {
"checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage(
"Zkontrolujte prosím svou doručenou poštu (a spam) pro dokončení ověření"),
"incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage(""),
"link": MessageLookupByLibrary.simpleMessage("Link"),
"linkEmail": MessageLookupByLibrary.simpleMessage("Link email"),
"noEnteAccountExclamation":
MessageLookupByLibrary.simpleMessage("No Ente account!")
"orPickFromYourContacts":
MessageLookupByLibrary.simpleMessage("or pick from your contacts")
};
}

View File

@@ -20,31 +20,83 @@ typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'da';
static String m3(count, formattedCount) =>
static String m3(user) =>
"${user} vil ikke kunne tilføje flere billeder til dette album\n\nDe vil stadig kunne fjerne eksisterende billeder tilføjet af dem";
static String m4(storageAmountInGB) =>
"${storageAmountInGB} GB hver gang nogen tilmelder sig et betalt abonnement og anvender din kode";
static String m5(count, formattedCount) =>
"${Intl.plural(count, zero: 'ingen minder', one: '${formattedCount} minde', other: '${formattedCount} minder')}";
static String m4(count) => "${count} valgt";
static String m0(passwordStrengthValue) =>
"Kodeordets styrke: ${passwordStrengthValue}";
static String m5(verificationID) =>
static String m6(count) => "${count} valgt";
static String m7(verificationID) =>
"Hey, kan du bekræfte, at dette er dit ente.io verifikation ID: ${verificationID}";
static String m1(storageAmountInGB) => "${storageAmountInGB} GB";
static String m8(storageAmountInGB) => "De får også ${storageAmountInGB} GB";
static String m2(email) =>
"Vi har sendt en email til <green>${email}</green>";
final messages = _notInlinedMessages(_notInlinedMessages);
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
"accountWelcomeBack":
MessageLookupByLibrary.simpleMessage("Velkommen tilbage!"),
"ackPasswordLostWarning": MessageLookupByLibrary.simpleMessage(
"Jeg forstår at hvis jeg mister min adgangskode kan jeg miste mine data, da mine data er <underline>end-to-end krypteret</underline>."),
"activeSessions":
MessageLookupByLibrary.simpleMessage("Aktive sessioner"),
"addMore": MessageLookupByLibrary.simpleMessage("Tilføj flere"),
"addOnPageSubtitle":
MessageLookupByLibrary.simpleMessage("Oplysninger om tilføjelser"),
"addedAs": MessageLookupByLibrary.simpleMessage("Tilføjet som"),
"addingToFavorites":
MessageLookupByLibrary.simpleMessage("Tilføjer til favoritter..."),
"advancedSettings": MessageLookupByLibrary.simpleMessage("Avanceret"),
"after1Day": MessageLookupByLibrary.simpleMessage("Efter 1 dag"),
"after1Hour": MessageLookupByLibrary.simpleMessage("Efter 1 time"),
"after1Month": MessageLookupByLibrary.simpleMessage("Efter 1 måned"),
"after1Week": MessageLookupByLibrary.simpleMessage("Efter 1 uge"),
"after1Year": MessageLookupByLibrary.simpleMessage("Efter 1 år"),
"albumOwner": MessageLookupByLibrary.simpleMessage("Ejer"),
"allowDownloads":
MessageLookupByLibrary.simpleMessage("Tillad downloads"),
"askDeleteReason": MessageLookupByLibrary.simpleMessage(
"Hvad er hovedårsagen til, at du sletter din konto?"),
"backedUpFolders":
MessageLookupByLibrary.simpleMessage("Sikkerhedskopierede mapper"),
"backupStatusDescription": MessageLookupByLibrary.simpleMessage(
"Elementer, der er blevet sikkerhedskopieret, vil blive vist her"),
"canNotOpenBody": MessageLookupByLibrary.simpleMessage(
"Beklager, dette album kan ikke åbnes i appen."),
"canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage(
"Kan kun fjerne filer ejet af dig"),
"cancel": MessageLookupByLibrary.simpleMessage("Annuller"),
"cannotAddMorePhotosAfterBecomingViewer": m3,
"cannotDeleteSharedFiles":
MessageLookupByLibrary.simpleMessage("Kan ikke slette delte filer"),
"changeEmail":
MessageLookupByLibrary.simpleMessage("Skift email adresse"),
"changePasswordTitle":
MessageLookupByLibrary.simpleMessage("Skift adgangskode"),
"checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage(
"Tjek venligst din indbakke (og spam) for at færdiggøre verificeringen"),
"clearIndexes": MessageLookupByLibrary.simpleMessage("Ryd indekser"),
"collectPhotos":
MessageLookupByLibrary.simpleMessage("Indsaml billeder"),
"confirmAccountDeletion":
MessageLookupByLibrary.simpleMessage("Bekræft Sletning Af Konto"),
"confirmPassword":
MessageLookupByLibrary.simpleMessage("Bekræft adgangskode"),
"contactSupport":
MessageLookupByLibrary.simpleMessage("Kontakt support"),
"continueLabel": MessageLookupByLibrary.simpleMessage("Fortsæt"),
"copypasteThisCodentoYourAuthenticatorApp":
MessageLookupByLibrary.simpleMessage(
"Kopiér denne kode\ntil din autentificeringsapp"),
@@ -53,11 +105,15 @@ class MessageLookup extends MessageLookupByLibrary {
"createAccount": MessageLookupByLibrary.simpleMessage("Opret konto"),
"createNewAccount":
MessageLookupByLibrary.simpleMessage("Opret en ny konto"),
"creatingLink":
MessageLookupByLibrary.simpleMessage("Opretter link..."),
"decrypting": MessageLookupByLibrary.simpleMessage("Dekrypterer..."),
"deleteAccount": MessageLookupByLibrary.simpleMessage("Slet konto"),
"deleteAccountFeedbackPrompt": MessageLookupByLibrary.simpleMessage(
"Vi er kede af at du forlader os. Forklar venligst hvorfor, så vi kan forbedre os."),
"deleteAccountPermanentlyButton":
MessageLookupByLibrary.simpleMessage("Slet konto permanent"),
"deleteAlbum": MessageLookupByLibrary.simpleMessage("Slet album"),
"deleteEmailRequest": MessageLookupByLibrary.simpleMessage(
"Send venligst en email til <warning>account-deletion@ente.io</warning> fra din registrerede email adresse."),
"deleteReason1": MessageLookupByLibrary.simpleMessage(
@@ -68,14 +124,50 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Min grund er ikke angivet"),
"deleteRequestSLAText": MessageLookupByLibrary.simpleMessage(
"Din anmodning vil blive behandlet inden for 72 timer."),
"deleteSharedAlbum":
MessageLookupByLibrary.simpleMessage("Slet delt album?"),
"details": MessageLookupByLibrary.simpleMessage("Detaljer"),
"developerSettingsWarning": MessageLookupByLibrary.simpleMessage(
"Er du sikker på, at du vil ændre udviklerindstillingerne?"),
"disableDownloadWarningTitle":
MessageLookupByLibrary.simpleMessage("Bemærk venligst"),
"discover_food": MessageLookupByLibrary.simpleMessage("Mad"),
"discover_identity": MessageLookupByLibrary.simpleMessage("Identitet"),
"discover_memes": MessageLookupByLibrary.simpleMessage("Memes"),
"discover_notes": MessageLookupByLibrary.simpleMessage("Noter"),
"discover_pets": MessageLookupByLibrary.simpleMessage("Kæledyr"),
"discover_screenshots":
MessageLookupByLibrary.simpleMessage("Skærmbilleder"),
"discover_selfies": MessageLookupByLibrary.simpleMessage("Selfier"),
"discover_sunset": MessageLookupByLibrary.simpleMessage("Solnedgang"),
"discover_wallpapers":
MessageLookupByLibrary.simpleMessage("Baggrundsbilleder"),
"eligible": MessageLookupByLibrary.simpleMessage("kvalificeret"),
"email": MessageLookupByLibrary.simpleMessage("Email"),
"emailAlreadyRegistered": MessageLookupByLibrary.simpleMessage(
"E-mail er allerede registreret."),
"emailNotRegistered":
MessageLookupByLibrary.simpleMessage("E-mail er ikke registreret."),
"encryption": MessageLookupByLibrary.simpleMessage("Kryptering"),
"encryptionKeys":
MessageLookupByLibrary.simpleMessage("Krypteringsnøgler"),
"enterEmail":
MessageLookupByLibrary.simpleMessage("Indtast email adresse"),
"enterNewPasswordToEncrypt": MessageLookupByLibrary.simpleMessage(
"Indtast en ny adgangskode vi kan bruge til at kryptere dine data"),
"enterPassword":
MessageLookupByLibrary.simpleMessage("Indtast adgangskode"),
"enterPasswordToEncrypt": MessageLookupByLibrary.simpleMessage(
"Indtast en adgangskode vi kan bruge til at kryptere dine data"),
"enterPin": MessageLookupByLibrary.simpleMessage("Indtast PIN"),
"enterValidEmail": MessageLookupByLibrary.simpleMessage(
"Indtast venligst en gyldig email adresse."),
"enterYourEmailAddress":
MessageLookupByLibrary.simpleMessage("Indtast din email adresse"),
"enterYourPassword":
MessageLookupByLibrary.simpleMessage("Indtast adgangskode"),
"enterYourRecoveryKey": MessageLookupByLibrary.simpleMessage(
"Indtast din gendannelsesnøgle"),
"familyPlanPortalTitle":
MessageLookupByLibrary.simpleMessage("Familie"),
"feedback": MessageLookupByLibrary.simpleMessage("Feedback"),
@@ -85,59 +177,177 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Find folk hurtigt ved navn"),
"forgotPassword":
MessageLookupByLibrary.simpleMessage("Glemt adgangskode"),
"freeStorageOnReferralSuccess": m4,
"freeUpDeviceSpace":
MessageLookupByLibrary.simpleMessage("Frigør enhedsplads"),
"freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage(
"Spar plads på din enhed ved at rydde filer, der allerede er sikkerhedskopieret."),
"generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage(
"Genererer krypteringsnøgler..."),
"help": MessageLookupByLibrary.simpleMessage("Hjælp"),
"howItWorks":
MessageLookupByLibrary.simpleMessage("Sådan fungerer det"),
"incorrectPasswordTitle":
MessageLookupByLibrary.simpleMessage("Forkert adgangskode"),
"incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage(
"Den gendannelsesnøgle du indtastede er forkert"),
"incorrectRecoveryKeyTitle":
MessageLookupByLibrary.simpleMessage("Forkert gendannelsesnøgle"),
"indexedItems":
MessageLookupByLibrary.simpleMessage("Indekserede elementer"),
"insecureDevice": MessageLookupByLibrary.simpleMessage("Usikker enhed"),
"invalidEmailAddress":
MessageLookupByLibrary.simpleMessage("Ugyldig email adresse"),
"invite": MessageLookupByLibrary.simpleMessage("Inviter"),
"inviteYourFriends":
MessageLookupByLibrary.simpleMessage("Inviter dine venner"),
"itemsWillBeRemovedFromAlbum": MessageLookupByLibrary.simpleMessage(
"Valgte elementer vil blive fjernet fra dette album"),
"keepPhotos": MessageLookupByLibrary.simpleMessage("Behold billeder"),
"kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage(
"Hjælp os venligst med disse oplysninger"),
"link": MessageLookupByLibrary.simpleMessage("Link"),
"linkEmail": MessageLookupByLibrary.simpleMessage("Link email"),
"linkEnabled": MessageLookupByLibrary.simpleMessage("Aktiveret"),
"linkExpired": MessageLookupByLibrary.simpleMessage("Udløbet"),
"linkNeverExpires": MessageLookupByLibrary.simpleMessage("Aldrig"),
"loadingModel":
MessageLookupByLibrary.simpleMessage("Downloader modeller..."),
"lockButtonLabel": MessageLookupByLibrary.simpleMessage("Lås"),
"logInLabel": MessageLookupByLibrary.simpleMessage("Log ind"),
"loggingOut": MessageLookupByLibrary.simpleMessage("Logger ud..."),
"longPressAnEmailToVerifyEndToEndEncryption":
MessageLookupByLibrary.simpleMessage(
"Langt tryk på en e-mail for at bekræfte slutningen af krypteringen."),
"machineLearning": MessageLookupByLibrary.simpleMessage("Maskinlæring"),
"magicSearch": MessageLookupByLibrary.simpleMessage("Magisk søgning"),
"manage": MessageLookupByLibrary.simpleMessage("Administrér"),
"memoryCount": m3,
"manageDeviceStorageDesc": MessageLookupByLibrary.simpleMessage(
"Gennemgå og ryd lokal cache-lagring."),
"memoryCount": m5,
"mlConsent":
MessageLookupByLibrary.simpleMessage("Aktiver maskinlæring"),
"mlConsentPrivacy": MessageLookupByLibrary.simpleMessage(
"Klik her for flere detaljer om denne funktion i vores privatlivspolitik"),
"mlConsentTitle":
MessageLookupByLibrary.simpleMessage("Aktiver maskinlæring?"),
"mlIndexingDescription": MessageLookupByLibrary.simpleMessage(
"Bemærk venligst, at maskinindlæring vil resultere i en højere båndbredde og batteriforbrug, indtil alle elementer er indekseret. Overvej at bruge desktop app til hurtigere indeksering, vil alle resultater blive synkroniseret automatisk."),
"moments": MessageLookupByLibrary.simpleMessage("Øjeblikke"),
"never": MessageLookupByLibrary.simpleMessage("Aldrig"),
"newAlbum": MessageLookupByLibrary.simpleMessage("Nyt album"),
"next": MessageLookupByLibrary.simpleMessage("Næste"),
"noEnteAccountExclamation":
MessageLookupByLibrary.simpleMessage("No Ente account!"),
"noRecoveryKey":
MessageLookupByLibrary.simpleMessage("Ingen gendannelsesnøgle?"),
"ok": MessageLookupByLibrary.simpleMessage("Ok"),
"oops": MessageLookupByLibrary.simpleMessage("Ups"),
"oopsSomethingWentWrong":
MessageLookupByLibrary.simpleMessage("Ups, noget gik galt"),
"orPickFromYourContacts":
MessageLookupByLibrary.simpleMessage("or pick from your contacts"),
"password": MessageLookupByLibrary.simpleMessage("Adgangskode"),
"passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage(
"Adgangskoden er blevet ændret"),
"passwordStrength": m0,
"passwordWarning": MessageLookupByLibrary.simpleMessage(
"Vi gemmer ikke denne adgangskode, så hvis du glemmer den <underline>kan vi ikke dekryptere dine data</underline>"),
"pendingItems":
MessageLookupByLibrary.simpleMessage("Afventende elementer"),
"peopleUsingYourCode": MessageLookupByLibrary.simpleMessage(
"Personer, der bruger din kode"),
"pleaseContactSupportAndWeWillBeHappyToHelp":
MessageLookupByLibrary.simpleMessage(
"Kontakt support@ente.io og vi vil være glade for at hjælpe!"),
"pleaseWait": MessageLookupByLibrary.simpleMessage("Vent venligst..."),
"privacyPolicyTitle":
MessageLookupByLibrary.simpleMessage("Privatlivspolitik"),
"recoverButton": MessageLookupByLibrary.simpleMessage("Gendan"),
"referralStep2": MessageLookupByLibrary.simpleMessage(
"2. De tilmelder sig en betalt plan"),
"removeFromAlbum":
MessageLookupByLibrary.simpleMessage("Fjern fra album"),
"removeFromAlbumTitle":
MessageLookupByLibrary.simpleMessage("Fjern fra album?"),
"removeLink": MessageLookupByLibrary.simpleMessage("Fjern link"),
"removeParticipant":
MessageLookupByLibrary.simpleMessage("Fjern deltager"),
"removeWithQuestionMark":
MessageLookupByLibrary.simpleMessage("Fjern?"),
"removingFromFavorites":
MessageLookupByLibrary.simpleMessage("Fjerner fra favoritter..."),
"renameFile": MessageLookupByLibrary.simpleMessage("Omdøb fil"),
"resendEmail": MessageLookupByLibrary.simpleMessage("Send email igen"),
"resetPasswordTitle":
MessageLookupByLibrary.simpleMessage("Nulstil adgangskode"),
"retry": MessageLookupByLibrary.simpleMessage("Prøv igen"),
"scanThisBarcodeWithnyourAuthenticatorApp":
MessageLookupByLibrary.simpleMessage(
"Skan denne QR-kode med godkendelses-appen"),
"searchHint1":
MessageLookupByLibrary.simpleMessage("Hurtig, søgning på enheden"),
"selectAll": MessageLookupByLibrary.simpleMessage("Vælg alle"),
"selectFoldersForBackup": MessageLookupByLibrary.simpleMessage(
"Vælg mapper til sikkerhedskopiering"),
"selectReason": MessageLookupByLibrary.simpleMessage("Vælg årsag"),
"selectedPhotos": m4,
"selectedFoldersWillBeEncryptedAndBackedUp":
MessageLookupByLibrary.simpleMessage(
"Valgte mapper vil blive krypteret og sikkerhedskopieret"),
"selectedPhotos": m6,
"sendEmail": MessageLookupByLibrary.simpleMessage("Send email"),
"shareTextConfirmOthersVerificationID": m5,
"sendLink": MessageLookupByLibrary.simpleMessage("Send link"),
"setPasswordTitle":
MessageLookupByLibrary.simpleMessage("Angiv adgangskode"),
"shareTextConfirmOthersVerificationID": m7,
"showMemories": MessageLookupByLibrary.simpleMessage("Vis minder"),
"signUpTerms": MessageLookupByLibrary.simpleMessage(
"Jeg er enig i <u-terms>betingelser for brug</u-terms> og <u-policy>privatlivspolitik</u-policy>"),
"skip": MessageLookupByLibrary.simpleMessage("Spring over"),
"somethingWentWrongPleaseTryAgain":
MessageLookupByLibrary.simpleMessage(
"Noget gik galt, prøv venligst igen"),
"sorryCouldNotAddToFavorites": MessageLookupByLibrary.simpleMessage(
"Beklager, kunne ikke føje til favoritter!"),
"sorryCouldNotRemoveFromFavorites":
MessageLookupByLibrary.simpleMessage(
"Beklager, kunne ikke fjernes fra favoritter!"),
"sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease":
MessageLookupByLibrary.simpleMessage(
"Beklager, vi kunne ikke generere sikre krypteringsnøgler på denne enhed.\n\nForsøg venligst at oprette en konto fra en anden enhed."),
"status": MessageLookupByLibrary.simpleMessage("Status"),
"storageInGB": m1,
"strongStrength": MessageLookupByLibrary.simpleMessage("Stærkt"),
"subscribe": MessageLookupByLibrary.simpleMessage("Abonner"),
"subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage(
"Du skal have et aktivt betalt abonnement for at aktivere deling."),
"tapToEnterCode":
MessageLookupByLibrary.simpleMessage("Tryk for at indtaste kode"),
"terminateSession":
MessageLookupByLibrary.simpleMessage("Afslut session?"),
"termsOfServicesTitle":
MessageLookupByLibrary.simpleMessage("Betingelser"),
"theyAlsoGetXGb": m8,
"thisDevice": MessageLookupByLibrary.simpleMessage("Denne enhed"),
"thisWillLogYouOutOfTheFollowingDevice":
MessageLookupByLibrary.simpleMessage(
"Dette vil logge dig ud af følgende enhed:"),
"thisWillLogYouOutOfThisDevice": MessageLookupByLibrary.simpleMessage(
"Dette vil logge dig ud af denne enhed!"),
"toResetVerifyEmail": MessageLookupByLibrary.simpleMessage(
"For at nulstille din adgangskode, bekræft venligst din email adresse."),
"unavailableReferralCode": MessageLookupByLibrary.simpleMessage(
"Beklager, denne kode er ikke tilgængelig."),
"unselectAll": MessageLookupByLibrary.simpleMessage("Fravælg alle"),
"updatingFolderSelection":
MessageLookupByLibrary.simpleMessage("Opdaterer mappevalg..."),
"verify": MessageLookupByLibrary.simpleMessage("Bekræft"),
"viewAddOnButton":
MessageLookupByLibrary.simpleMessage("Vis tilføjelser"),
"waitingForWifi":
MessageLookupByLibrary.simpleMessage("Venter på Wi-fi..."),
"weHaveSendEmailTo": m2,
"weakStrength": MessageLookupByLibrary.simpleMessage("Svagt"),
"welcomeBack":
MessageLookupByLibrary.simpleMessage("Velkommen tilbage!"),
"yesRemove": MessageLookupByLibrary.simpleMessage("Ja, fjern"),
"you": MessageLookupByLibrary.simpleMessage("Dig"),
"yourAccountHasBeenDeleted":
MessageLookupByLibrary.simpleMessage("Din konto er blevet slettet")
};

View File

@@ -20,37 +20,37 @@ typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'de';
static String m6(count) =>
static String m9(count) =>
"${Intl.plural(count, one: 'Teilnehmer', other: 'Teilnehmer')} hinzufügen";
static String m7(count) =>
static String m10(count) =>
"${Intl.plural(count, one: 'Element hinzufügen', other: 'Elemente hinzufügen')}";
static String m8(storageAmount, endDate) =>
static String m11(storageAmount, endDate) =>
"Dein ${storageAmount} Add-on ist gültig bis ${endDate}";
static String m9(count) =>
static String m12(count) =>
"${Intl.plural(count, one: 'Betrachter', other: 'Betrachter')} hinzufügen";
static String m10(emailOrName) => "Von ${emailOrName} hinzugefügt";
static String m13(emailOrName) => "Von ${emailOrName} hinzugefügt";
static String m11(albumName) => "Erfolgreich zu ${albumName} hinzugefügt";
static String m14(albumName) => "Erfolgreich zu ${albumName} hinzugefügt";
static String m12(count) =>
static String m15(count) =>
"${Intl.plural(count, zero: 'Keine Teilnehmer', one: '1 Teilnehmer', other: '${count} Teilnehmer')}";
static String m13(versionValue) => "Version: ${versionValue}";
static String m16(versionValue) => "Version: ${versionValue}";
static String m14(freeAmount, storageUnit) =>
static String m17(freeAmount, storageUnit) =>
"${freeAmount} ${storageUnit} frei";
static String m15(paymentProvider) =>
static String m18(paymentProvider) =>
"Bitte kündige dein aktuelles Abo über ${paymentProvider} zuerst";
static String m16(user) =>
static String m3(user) =>
"Der Nutzer \"${user}\" wird keine weiteren Fotos zum Album hinzufügen können.\n\nJedoch kann er weiterhin vorhandene Bilder, welche durch ihn hinzugefügt worden sind, wieder entfernen";
static String m17(isFamilyMember, storageAmountInGb) =>
static String m19(isFamilyMember, storageAmountInGb) =>
"${Intl.select(isFamilyMember, {
'true':
'Deine Familiengruppe hat bereits ${storageAmountInGb} GB erhalten',
@@ -58,181 +58,181 @@ class MessageLookup extends MessageLookupByLibrary {
'other': 'Du hast bereits ${storageAmountInGb} GB erhalten!',
})}";
static String m18(albumName) =>
static String m20(albumName) =>
"Kollaborativer Link für ${albumName} erstellt";
static String m19(count) =>
static String m21(count) =>
"${Intl.plural(count, zero: '0 Mitarbeiter hinzugefügt', one: '1 Mitarbeiter hinzugefügt', other: '${count} Mitarbeiter hinzugefügt')}";
static String m20(email, numOfDays) =>
static String m22(email, numOfDays) =>
"Du bist dabei, ${email} als vertrauenswürdigen Kontakt hinzuzufügen. Die Person wird in der Lage sein, dein Konto wiederherzustellen, wenn du für ${numOfDays} Tage abwesend bist.";
static String m21(familyAdminEmail) =>
static String m23(familyAdminEmail) =>
"Bitte kontaktiere <green>${familyAdminEmail}</green> um dein Abo zu verwalten";
static String m22(provider) =>
static String m24(provider) =>
"Bitte kontaktiere uns über support@ente.io, um dein ${provider} Abo zu verwalten.";
static String m23(endpoint) => "Verbunden mit ${endpoint}";
static String m25(endpoint) => "Verbunden mit ${endpoint}";
static String m24(count) =>
static String m26(count) =>
"${Intl.plural(count, one: 'Lösche ${count} Element', other: 'Lösche ${count} Elemente')}";
static String m25(currentlyDeleting, totalCount) =>
static String m27(currentlyDeleting, totalCount) =>
"Lösche ${currentlyDeleting} / ${totalCount}";
static String m26(albumName) =>
static String m28(albumName) =>
"Der öffentliche Link zum Zugriff auf \"${albumName}\" wird entfernt.";
static String m27(supportEmail) =>
static String m29(supportEmail) =>
"Bitte sende eine E-Mail an ${supportEmail} von deiner registrierten E-Mail-Adresse";
static String m28(count, storageSaved) =>
static String m30(count, storageSaved) =>
"Du hast ${Intl.plural(count, one: '${count} duplizierte Datei', other: '${count} dupliziere Dateien')} gelöscht und (${storageSaved}!) freigegeben";
static String m29(count, formattedSize) =>
static String m31(count, formattedSize) =>
"${count} Dateien, ${formattedSize} jede";
static String m30(newEmail) => "E-Mail-Adresse geändert zu ${newEmail}";
static String m32(newEmail) => "E-Mail-Adresse geändert zu ${newEmail}";
static String m31(email) =>
static String m33(email) =>
"${email} hat kein Ente-Konto.\n\nSende eine Einladung, um Fotos zu teilen.";
static String m32(text) => "Zusätzliche Fotos für ${text} gefunden";
static String m34(text) => "Zusätzliche Fotos für ${text} gefunden";
static String m33(count, formattedNumber) =>
static String m35(count, formattedNumber) =>
"${Intl.plural(count, one: '1 Datei', other: '${formattedNumber} Dateien')} auf diesem Gerät wurde(n) sicher gespeichert";
static String m34(count, formattedNumber) =>
static String m36(count, formattedNumber) =>
"${Intl.plural(count, one: '1 Datei', other: '${formattedNumber} Dateien')} in diesem Album wurde(n) sicher gespeichert";
static String m35(storageAmountInGB) =>
static String m4(storageAmountInGB) =>
"${storageAmountInGB} GB jedes Mal, wenn sich jemand mit deinem Code für einen bezahlten Tarif anmeldet";
static String m36(endDate) => "Kostenlose Demo verfügbar bis zum ${endDate}";
static String m37(endDate) => "Kostenlose Demo verfügbar bis zum ${endDate}";
static String m37(count) =>
static String m38(count) =>
"Du kannst immernoch über Ente ${Intl.plural(count, one: 'darauf', other: 'auf sie')} zugreifen, solange du ein aktives Abo hast";
static String m38(sizeInMBorGB) => "${sizeInMBorGB} freigeben";
static String m39(sizeInMBorGB) => "${sizeInMBorGB} freigeben";
static String m39(count, formattedSize) =>
static String m40(count, formattedSize) =>
"${Intl.plural(count, one: 'Es kann vom Gerät gelöscht werden, um ${formattedSize} freizugeben', other: 'Sie können vom Gerät gelöscht werden, um ${formattedSize} freizugeben')}";
static String m40(currentlyProcessing, totalCount) =>
static String m41(currentlyProcessing, totalCount) =>
"Verarbeite ${currentlyProcessing} / ${totalCount}";
static String m41(count) =>
static String m42(count) =>
"${Intl.plural(count, one: '${count} Objekt', other: '${count} Objekte')}";
static String m42(email) =>
static String m43(email) =>
"${email} hat dich eingeladen, ein vertrauenswürdiger Kontakt zu werden";
static String m43(expiryTime) => "Link läuft am ${expiryTime} ab";
static String m44(expiryTime) => "Link läuft am ${expiryTime} ab";
static String m3(count, formattedCount) =>
static String m5(count, formattedCount) =>
"${Intl.plural(count, zero: 'keine Erinnerungsstücke', one: '${formattedCount} Erinnerung', other: '${formattedCount} Erinnerungsstücke')}";
static String m44(count) =>
static String m45(count) =>
"${Intl.plural(count, one: 'Element verschieben', other: 'Elemente verschieben')}";
static String m45(albumName) => "Erfolgreich zu ${albumName} hinzugefügt";
static String m46(albumName) => "Erfolgreich zu ${albumName} hinzugefügt";
static String m46(personName) => "Keine Vorschläge für ${personName}";
static String m47(personName) => "Keine Vorschläge für ${personName}";
static String m47(name) => "Nicht ${name}?";
static String m48(name) => "Nicht ${name}?";
static String m48(familyAdminEmail) =>
static String m49(familyAdminEmail) =>
"Bitte wende Dich an ${familyAdminEmail}, um den Code zu ändern.";
static String m0(passwordStrengthValue) =>
"Passwortstärke: ${passwordStrengthValue}";
static String m49(providerName) =>
static String m50(providerName) =>
"Bitte kontaktiere den Support von ${providerName}, falls etwas abgebucht wurde";
static String m50(count) =>
static String m51(count) =>
"${Intl.plural(count, zero: '0 Fotos', one: '1 Foto', other: '${count} Fotos')}";
static String m51(endDate) =>
static String m52(endDate) =>
"Kostenlose Testversion gültig bis ${endDate}.\nDu kannst anschließend ein bezahltes Paket auswählen.";
static String m52(toEmail) => "Bitte sende uns eine E-Mail an ${toEmail}";
static String m53(toEmail) => "Bitte sende uns eine E-Mail an ${toEmail}";
static String m53(toEmail) => "Bitte sende die Protokolle an ${toEmail}";
static String m54(toEmail) => "Bitte sende die Protokolle an ${toEmail}";
static String m54(folderName) => "Verarbeite ${folderName}...";
static String m55(folderName) => "Verarbeite ${folderName}...";
static String m55(storeName) => "Bewerte uns auf ${storeName}";
static String m56(storeName) => "Bewerte uns auf ${storeName}";
static String m56(days, email) =>
static String m57(days, email) =>
"Du kannst nach ${days} Tagen auf das Konto zugreifen. Eine Benachrichtigung wird an ${email} versendet.";
static String m57(email) =>
static String m58(email) =>
"Du kannst jetzt das Konto von ${email} wiederherstellen, indem du ein neues Passwort setzt.";
static String m58(email) =>
static String m59(email) =>
"${email} versucht, dein Konto wiederherzustellen.";
static String m59(storageInGB) =>
static String m60(storageInGB) =>
"3. Ihr beide erhaltet ${storageInGB} GB* kostenlos";
static String m60(userEmail) =>
static String m61(userEmail) =>
"${userEmail} wird aus diesem geteilten Album entfernt\n\nAlle von ihnen hinzugefügte Fotos werden ebenfalls aus dem Album entfernt";
static String m61(endDate) => "Erneuert am ${endDate}";
static String m62(endDate) => "Erneuert am ${endDate}";
static String m62(count) =>
static String m63(count) =>
"${Intl.plural(count, one: '${count} Ergebnis gefunden', other: '${count} Ergebnisse gefunden')}";
static String m63(snapshotLength, searchLength) =>
static String m64(snapshotLength, searchLength) =>
"Abschnittslänge stimmt nicht überein: ${snapshotLength} != ${searchLength}";
static String m4(count) => "${count} ausgewählt";
static String m6(count) => "${count} ausgewählt";
static String m64(count, yourCount) =>
static String m65(count, yourCount) =>
"${count} ausgewählt (${yourCount} von Ihnen)";
static String m65(verificationID) =>
static String m66(verificationID) =>
"Hier ist meine Verifizierungs-ID: ${verificationID} für ente.io.";
static String m5(verificationID) =>
static String m7(verificationID) =>
"Hey, kannst du bestätigen, dass dies deine ente.io Verifizierungs-ID ist: ${verificationID}";
static String m66(referralCode, referralStorageInGB) =>
static String m67(referralCode, referralStorageInGB) =>
"Ente Weiterempfehlungs-Code: ${referralCode} \n\nEinlösen unter Einstellungen → Allgemein → Weiterempfehlungen, um ${referralStorageInGB} GB kostenlos zu erhalten, sobald Sie einen kostenpflichtigen Tarif abgeschlossen haben\n\nhttps://ente.io";
static String m67(numberOfPeople) =>
static String m68(numberOfPeople) =>
"${Intl.plural(numberOfPeople, zero: 'Teile mit bestimmten Personen', one: 'Teilen mit 1 Person', other: 'Teilen mit ${numberOfPeople} Personen')}";
static String m68(emailIDs) => "Geteilt mit ${emailIDs}";
static String m69(fileType) =>
"Dieses ${fileType} wird von deinem Gerät gelöscht.";
static String m69(emailIDs) => "Geteilt mit ${emailIDs}";
static String m70(fileType) =>
"Dieses ${fileType} wird von deinem Gerät gelöscht.";
static String m71(fileType) =>
"Diese Datei ist sowohl in Ente als auch auf deinem Gerät.";
static String m71(fileType) => "Diese Datei wird von Ente gelöscht.";
static String m72(fileType) => "Diese Datei wird von Ente gelöscht.";
static String m1(storageAmountInGB) => "${storageAmountInGB} GB";
static String m72(
static String m73(
usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) =>
"${usedAmount} ${usedStorageUnit} von ${totalAmount} ${totalStorageUnit} verwendet";
static String m73(id) =>
static String m74(id) =>
"Dein ${id} ist bereits mit einem anderen Ente-Konto verknüpft.\nWenn du deine ${id} mit diesem Konto verwenden möchtest, kontaktiere bitte unseren Support";
static String m74(endDate) => "Dein Abo endet am ${endDate}";
static String m75(endDate) => "Dein Abo endet am ${endDate}";
static String m75(completed, total) =>
static String m76(completed, total) =>
"${completed}/${total} Erinnerungsstücke gesichert";
static String m76(ignoreReason) =>
static String m77(ignoreReason) =>
"Zum Hochladen tippen, Hochladen wird derzeit ignoriert, da ${ignoreReason}";
static String m77(storageAmountInGB) =>
static String m8(storageAmountInGB) =>
"Diese erhalten auch ${storageAmountInGB} GB";
static String m78(email) => "Dies ist ${email}s Verifizierungs-ID";
@@ -291,11 +291,11 @@ class MessageLookup extends MessageLookupByLibrary {
"Neue E-Mail-Adresse hinzufügen"),
"addCollaborator":
MessageLookupByLibrary.simpleMessage("Bearbeiter hinzufügen"),
"addCollaborators": m6,
"addCollaborators": m9,
"addFiles": MessageLookupByLibrary.simpleMessage("Dateien hinzufügen"),
"addFromDevice":
MessageLookupByLibrary.simpleMessage("Vom Gerät hinzufügen"),
"addItem": m7,
"addItem": m10,
"addLocation": MessageLookupByLibrary.simpleMessage("Ort hinzufügen"),
"addLocationButton": MessageLookupByLibrary.simpleMessage("Hinzufügen"),
"addMore": MessageLookupByLibrary.simpleMessage("Mehr hinzufügen"),
@@ -307,7 +307,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Neue Person hinzufügen"),
"addOnPageSubtitle":
MessageLookupByLibrary.simpleMessage("Details der Add-ons"),
"addOnValidTill": m8,
"addOnValidTill": m11,
"addOns": MessageLookupByLibrary.simpleMessage("Add-ons"),
"addPhotos": MessageLookupByLibrary.simpleMessage("Fotos hinzufügen"),
"addSelected":
@@ -320,12 +320,12 @@ class MessageLookup extends MessageLookupByLibrary {
"addTrustedContact": MessageLookupByLibrary.simpleMessage(
"Vertrauenswürdigen Kontakt hinzufügen"),
"addViewer": MessageLookupByLibrary.simpleMessage("Album teilen"),
"addViewers": m9,
"addViewers": m12,
"addYourPhotosNow":
MessageLookupByLibrary.simpleMessage("Füge deine Foto jetzt hinzu"),
"addedAs": MessageLookupByLibrary.simpleMessage("Hinzugefügt als"),
"addedBy": m10,
"addedSuccessfullyTo": m11,
"addedBy": m13,
"addedSuccessfullyTo": m14,
"addingToFavorites": MessageLookupByLibrary.simpleMessage(
"Wird zu Favoriten hinzugefügt..."),
"advanced": MessageLookupByLibrary.simpleMessage("Erweitert"),
@@ -336,7 +336,7 @@ class MessageLookup extends MessageLookupByLibrary {
"after1Week": MessageLookupByLibrary.simpleMessage("Nach 1 Woche"),
"after1Year": MessageLookupByLibrary.simpleMessage("Nach 1 Jahr"),
"albumOwner": MessageLookupByLibrary.simpleMessage("Besitzer"),
"albumParticipantsCount": m12,
"albumParticipantsCount": m15,
"albumTitle": MessageLookupByLibrary.simpleMessage("Albumtitel"),
"albumUpdated":
MessageLookupByLibrary.simpleMessage("Album aktualisiert"),
@@ -386,7 +386,7 @@ class MessageLookup extends MessageLookupByLibrary {
"appLock": MessageLookupByLibrary.simpleMessage("App-Sperre"),
"appLockDescriptions": MessageLookupByLibrary.simpleMessage(
"Wähle zwischen dem Standard-Sperrbildschirm deines Gerätes und einem eigenen Sperrbildschirm mit PIN oder Passwort."),
"appVersion": m13,
"appVersion": m16,
"appleId": MessageLookupByLibrary.simpleMessage("Apple ID"),
"apply": MessageLookupByLibrary.simpleMessage("Anwenden"),
"applyCodeTitle": MessageLookupByLibrary.simpleMessage("Code nutzen"),
@@ -470,7 +470,7 @@ class MessageLookup extends MessageLookupByLibrary {
"autoPairDesc": MessageLookupByLibrary.simpleMessage(
"Automatisches Verbinden funktioniert nur mit Geräten, die Chromecast unterstützen."),
"available": MessageLookupByLibrary.simpleMessage("Verfügbar"),
"availableStorageSpace": m14,
"availableStorageSpace": m17,
"backedUpFolders":
MessageLookupByLibrary.simpleMessage("Gesicherte Ordner"),
"backup": MessageLookupByLibrary.simpleMessage("Backup"),
@@ -510,10 +510,10 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Wiederherstellung abbrechen"),
"cancelAccountRecoveryBody": MessageLookupByLibrary.simpleMessage(
"Bist du sicher, dass du die Wiederherstellung abbrechen möchtest?"),
"cancelOtherSubscription": m15,
"cancelOtherSubscription": m18,
"cancelSubscription":
MessageLookupByLibrary.simpleMessage("Abonnement kündigen"),
"cannotAddMorePhotosAfterBecomingViewer": m16,
"cannotAddMorePhotosAfterBecomingViewer": m3,
"cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage(
"Konnte geteilte Dateien nicht löschen"),
"castAlbum": MessageLookupByLibrary.simpleMessage("Album übertragen"),
@@ -564,7 +564,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Freien Speicher einlösen"),
"claimMore": MessageLookupByLibrary.simpleMessage("Mehr einlösen!"),
"claimed": MessageLookupByLibrary.simpleMessage("Eingelöst"),
"claimedStorageSoFar": m17,
"claimedStorageSoFar": m19,
"cleanUncategorized":
MessageLookupByLibrary.simpleMessage("Unkategorisiert leeren"),
"cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage(
@@ -593,12 +593,12 @@ class MessageLookup extends MessageLookupByLibrary {
"Erstelle einen Link, mit dem andere Fotos in dem geteilten Album sehen und selbst welche hinzufügen können - ohne dass sie die ein Ente-Konto oder die App benötigen. Ideal um gemeinsam Fotos von Events zu sammeln."),
"collaborativeLink":
MessageLookupByLibrary.simpleMessage("Gemeinschaftlicher Link"),
"collaborativeLinkCreatedFor": m18,
"collaborativeLinkCreatedFor": m20,
"collaborator": MessageLookupByLibrary.simpleMessage("Bearbeiter"),
"collaboratorsCanAddPhotosAndVideosToTheSharedAlbum":
MessageLookupByLibrary.simpleMessage(
"Bearbeiter können Fotos & Videos zu dem geteilten Album hinzufügen."),
"collaboratorsSuccessfullyAdded": m19,
"collaboratorsSuccessfullyAdded": m21,
"collageLayout": MessageLookupByLibrary.simpleMessage("Layout"),
"collageSaved": MessageLookupByLibrary.simpleMessage(
"Collage in Galerie gespeichert"),
@@ -615,7 +615,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Bist du sicher, dass du die Zwei-Faktor-Authentifizierung (2FA) deaktivieren willst?"),
"confirmAccountDeletion":
MessageLookupByLibrary.simpleMessage("Kontolöschung bestätigen"),
"confirmAddingTrustedContact": m20,
"confirmAddingTrustedContact": m22,
"confirmDeletePrompt": MessageLookupByLibrary.simpleMessage(
"Ja, ich möchte dieses Konto und alle enthaltenen Daten über alle Apps hinweg endgültig löschen."),
"confirmPassword":
@@ -628,10 +628,10 @@ class MessageLookup extends MessageLookupByLibrary {
"Bestätige deinen Wiederherstellungsschlüssel"),
"connectToDevice":
MessageLookupByLibrary.simpleMessage("Mit Gerät verbinden"),
"contactFamilyAdmin": m21,
"contactFamilyAdmin": m23,
"contactSupport":
MessageLookupByLibrary.simpleMessage("Support kontaktieren"),
"contactToManageSubscription": m22,
"contactToManageSubscription": m24,
"contacts": MessageLookupByLibrary.simpleMessage("Kontakte"),
"contents": MessageLookupByLibrary.simpleMessage("Inhalte"),
"continueLabel": MessageLookupByLibrary.simpleMessage("Weiter"),
@@ -679,7 +679,7 @@ class MessageLookup extends MessageLookupByLibrary {
"currentlyRunning":
MessageLookupByLibrary.simpleMessage("läuft gerade"),
"custom": MessageLookupByLibrary.simpleMessage("Benutzerdefiniert"),
"customEndpoint": m23,
"customEndpoint": m25,
"darkTheme": MessageLookupByLibrary.simpleMessage("Dunkel"),
"dayToday": MessageLookupByLibrary.simpleMessage("Heute"),
"dayYesterday": MessageLookupByLibrary.simpleMessage("Gestern"),
@@ -717,11 +717,11 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Vom Gerät löschen"),
"deleteFromEnte":
MessageLookupByLibrary.simpleMessage("Von Ente löschen"),
"deleteItemCount": m24,
"deleteItemCount": m26,
"deleteLocation":
MessageLookupByLibrary.simpleMessage("Standort löschen"),
"deletePhotos": MessageLookupByLibrary.simpleMessage("Fotos löschen"),
"deleteProgress": m25,
"deleteProgress": m27,
"deleteReason1": MessageLookupByLibrary.simpleMessage(
"Es fehlt eine zentrale Funktion, die ich benötige"),
"deleteReason2": MessageLookupByLibrary.simpleMessage(
@@ -759,7 +759,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Zuschauer können weiterhin Screenshots oder mit anderen externen Programmen Kopien der Bilder machen."),
"disableDownloadWarningTitle":
MessageLookupByLibrary.simpleMessage("Bitte beachten Sie:"),
"disableLinkMessage": m26,
"disableLinkMessage": m28,
"disableTwofactor": MessageLookupByLibrary.simpleMessage(
"Zweiten Faktor (2FA) deaktivieren"),
"disablingTwofactorAuthentication":
@@ -802,9 +802,9 @@ class MessageLookup extends MessageLookupByLibrary {
"Herunterladen fehlgeschlagen"),
"downloading":
MessageLookupByLibrary.simpleMessage("Wird heruntergeladen..."),
"dropSupportEmail": m27,
"duplicateFileCountWithStorageSaved": m28,
"duplicateItemsGroup": m29,
"dropSupportEmail": m29,
"duplicateFileCountWithStorageSaved": m30,
"duplicateItemsGroup": m31,
"edit": MessageLookupByLibrary.simpleMessage("Bearbeiten"),
"editLocation":
MessageLookupByLibrary.simpleMessage("Standort bearbeiten"),
@@ -820,8 +820,8 @@ class MessageLookup extends MessageLookupByLibrary {
"email": MessageLookupByLibrary.simpleMessage("E-Mail"),
"emailAlreadyRegistered": MessageLookupByLibrary.simpleMessage(
"E-Mail ist bereits registriert."),
"emailChangedTo": m30,
"emailNoEnteAccount": m31,
"emailChangedTo": m32,
"emailNoEnteAccount": m33,
"emailNotRegistered":
MessageLookupByLibrary.simpleMessage("E-Mail nicht registriert."),
"emailVerificationToggle":
@@ -906,7 +906,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Daten exportieren"),
"extraPhotosFound":
MessageLookupByLibrary.simpleMessage("Zusätzliche Fotos gefunden"),
"extraPhotosFoundFor": m32,
"extraPhotosFoundFor": m34,
"faceNotClusteredYet": MessageLookupByLibrary.simpleMessage(
"Gesicht ist noch nicht gruppiert, bitte komm später zurück"),
"faceRecognition":
@@ -956,8 +956,8 @@ class MessageLookup extends MessageLookupByLibrary {
"fileTypes": MessageLookupByLibrary.simpleMessage("Dateitypen"),
"fileTypesAndNames":
MessageLookupByLibrary.simpleMessage("Dateitypen und -namen"),
"filesBackedUpFromDevice": m33,
"filesBackedUpInAlbum": m34,
"filesBackedUpFromDevice": m35,
"filesBackedUpInAlbum": m36,
"filesDeleted":
MessageLookupByLibrary.simpleMessage("Dateien gelöscht"),
"filesSavedToGallery": MessageLookupByLibrary.simpleMessage(
@@ -975,28 +975,28 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Gesichter gefunden"),
"freeStorageClaimed": MessageLookupByLibrary.simpleMessage(
"Kostenlos hinzugefügter Speicherplatz"),
"freeStorageOnReferralSuccess": m35,
"freeStorageOnReferralSuccess": m4,
"freeStorageUsable": MessageLookupByLibrary.simpleMessage(
"Freier Speicherplatz nutzbar"),
"freeTrial":
MessageLookupByLibrary.simpleMessage("Kostenlose Testphase"),
"freeTrialValidTill": m36,
"freeUpAccessPostDelete": m37,
"freeUpAmount": m38,
"freeTrialValidTill": m37,
"freeUpAccessPostDelete": m38,
"freeUpAmount": m39,
"freeUpDeviceSpace":
MessageLookupByLibrary.simpleMessage("Gerätespeicher freiräumen"),
"freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage(
"Spare Speicherplatz auf deinem Gerät, indem du Dateien löschst, die bereits gesichert wurden."),
"freeUpSpace":
MessageLookupByLibrary.simpleMessage("Speicherplatz freigeben"),
"freeUpSpaceSaving": m39,
"freeUpSpaceSaving": m40,
"gallery": MessageLookupByLibrary.simpleMessage("Galerie"),
"galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage(
"Bis zu 1000 Erinnerungsstücke angezeigt in der Galerie"),
"general": MessageLookupByLibrary.simpleMessage("Allgemein"),
"generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage(
"Generierung von Verschlüsselungscodes..."),
"genericProgress": m40,
"genericProgress": m41,
"goToSettings":
MessageLookupByLibrary.simpleMessage("Zu den Einstellungen"),
"googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"),
@@ -1082,7 +1082,7 @@ class MessageLookup extends MessageLookupByLibrary {
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome":
MessageLookupByLibrary.simpleMessage(
"Etwas ist schiefgelaufen. Bitte versuche es später noch einmal. Sollte der Fehler weiter bestehen, kontaktiere unser Supportteam."),
"itemCount": m41,
"itemCount": m42,
"itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion":
MessageLookupByLibrary.simpleMessage(
"Elemente zeigen die Anzahl der Tage bis zum dauerhaften Löschen an"),
@@ -1113,7 +1113,7 @@ class MessageLookup extends MessageLookupByLibrary {
"legacy": MessageLookupByLibrary.simpleMessage("Digitales Erbe"),
"legacyAccounts":
MessageLookupByLibrary.simpleMessage("Digital geerbte Konten"),
"legacyInvite": m42,
"legacyInvite": m43,
"legacyPageDesc": MessageLookupByLibrary.simpleMessage(
"Das digitale Erbe erlaubt vertrauenswürdigen Kontakten den Zugriff auf dein Konto in deiner Abwesenheit."),
"legacyPageDesc2": MessageLookupByLibrary.simpleMessage(
@@ -1124,10 +1124,9 @@ class MessageLookup extends MessageLookupByLibrary {
"linkCopiedToClipboard": MessageLookupByLibrary.simpleMessage(
"Link in Zwischenablage kopiert"),
"linkDeviceLimit": MessageLookupByLibrary.simpleMessage("Geräte-Limit"),
"linkEmail": MessageLookupByLibrary.simpleMessage("Link email"),
"linkEnabled": MessageLookupByLibrary.simpleMessage("Aktiviert"),
"linkExpired": MessageLookupByLibrary.simpleMessage("Abgelaufen"),
"linkExpiresOn": m43,
"linkExpiresOn": m44,
"linkExpiry":
MessageLookupByLibrary.simpleMessage("Ablaufdatum des Links"),
"linkHasExpired":
@@ -1218,7 +1217,7 @@ class MessageLookup extends MessageLookupByLibrary {
"maps": MessageLookupByLibrary.simpleMessage("Karten"),
"mastodon": MessageLookupByLibrary.simpleMessage("Mastodon"),
"matrix": MessageLookupByLibrary.simpleMessage("Matrix"),
"memoryCount": m3,
"memoryCount": m5,
"merchandise": MessageLookupByLibrary.simpleMessage("Merchandise"),
"mergeWithExisting": MessageLookupByLibrary.simpleMessage(
"Mit vorhandenem zusammenführen"),
@@ -1248,12 +1247,12 @@ class MessageLookup extends MessageLookupByLibrary {
"moreDetails": MessageLookupByLibrary.simpleMessage("Weitere Details"),
"mostRecent": MessageLookupByLibrary.simpleMessage("Neuste"),
"mostRelevant": MessageLookupByLibrary.simpleMessage("Nach Relevanz"),
"moveItem": m44,
"moveItem": m45,
"moveToAlbum":
MessageLookupByLibrary.simpleMessage("Zum Album verschieben"),
"moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage(
"Zu verstecktem Album verschieben"),
"movedSuccessfullyTo": m45,
"movedSuccessfullyTo": m46,
"movedToTrash": MessageLookupByLibrary.simpleMessage(
"In den Papierkorb verschoben"),
"movingFilesToAlbum": MessageLookupByLibrary.simpleMessage(
@@ -1282,7 +1281,7 @@ class MessageLookup extends MessageLookupByLibrary {
"noDuplicates":
MessageLookupByLibrary.simpleMessage("✨ Keine Duplikate"),
"noEnteAccountExclamation":
MessageLookupByLibrary.simpleMessage("No Ente account!"),
MessageLookupByLibrary.simpleMessage("Kein Ente-Konto!"),
"noExifData": MessageLookupByLibrary.simpleMessage("Keine Exif-Daten"),
"noFacesFound":
MessageLookupByLibrary.simpleMessage("Keine Gesichter gefunden"),
@@ -1306,10 +1305,10 @@ class MessageLookup extends MessageLookupByLibrary {
"noResults": MessageLookupByLibrary.simpleMessage("Keine Ergebnisse"),
"noResultsFound":
MessageLookupByLibrary.simpleMessage("Keine Ergebnisse gefunden"),
"noSuggestionsForPerson": m46,
"noSuggestionsForPerson": m47,
"noSystemLockFound":
MessageLookupByLibrary.simpleMessage("Keine Systemsperre gefunden"),
"notPersonLabel": m47,
"notPersonLabel": m48,
"nothingSharedWithYouYet":
MessageLookupByLibrary.simpleMessage("Noch nichts mit Dir geteilt"),
"nothingToSeeHere": MessageLookupByLibrary.simpleMessage(
@@ -1320,7 +1319,7 @@ class MessageLookup extends MessageLookupByLibrary {
"onDevice": MessageLookupByLibrary.simpleMessage("Auf dem Gerät"),
"onEnte": MessageLookupByLibrary.simpleMessage(
"Auf <branding>ente</branding>"),
"onlyFamilyAdminCanChangeCode": m48,
"onlyFamilyAdminCanChangeCode": m49,
"onlyThem": MessageLookupByLibrary.simpleMessage("Nur diese"),
"oops": MessageLookupByLibrary.simpleMessage("Hoppla"),
"oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage(
@@ -1343,6 +1342,8 @@ class MessageLookup extends MessageLookupByLibrary {
"Oder mit existierenden zusammenführen"),
"orPickAnExistingOne": MessageLookupByLibrary.simpleMessage(
"Oder eine vorherige auswählen"),
"orPickFromYourContacts":
MessageLookupByLibrary.simpleMessage("or pick from your contacts"),
"pair": MessageLookupByLibrary.simpleMessage("Koppeln"),
"pairWithPin":
MessageLookupByLibrary.simpleMessage("Mit PIN verbinden"),
@@ -1368,7 +1369,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Zahlung fehlgeschlagen"),
"paymentFailedMessage": MessageLookupByLibrary.simpleMessage(
"Leider ist deine Zahlung fehlgeschlagen. Wende dich an unseren Support und wir helfen dir weiter!"),
"paymentFailedTalkToProvider": m49,
"paymentFailedTalkToProvider": m50,
"pendingItems":
MessageLookupByLibrary.simpleMessage("Ausstehende Elemente"),
"pendingSync":
@@ -1392,14 +1393,14 @@ class MessageLookup extends MessageLookupByLibrary {
"photosAddedByYouWillBeRemovedFromTheAlbum":
MessageLookupByLibrary.simpleMessage(
"Von dir hinzugefügte Fotos werden vom Album entfernt"),
"photosCount": m50,
"photosCount": m51,
"pickCenterPoint":
MessageLookupByLibrary.simpleMessage("Mittelpunkt auswählen"),
"pinAlbum": MessageLookupByLibrary.simpleMessage("Album anheften"),
"pinLock": MessageLookupByLibrary.simpleMessage("PIN-Sperre"),
"playOnTv": MessageLookupByLibrary.simpleMessage(
"Album auf dem Fernseher wiedergeben"),
"playStoreFreeTrialValidTill": m51,
"playStoreFreeTrialValidTill": m52,
"playstoreSubscription":
MessageLookupByLibrary.simpleMessage("PlayStore Abo"),
"pleaseCheckYourInternetConnectionAndTryAgain":
@@ -1411,14 +1412,14 @@ class MessageLookup extends MessageLookupByLibrary {
"pleaseContactSupportIfTheProblemPersists":
MessageLookupByLibrary.simpleMessage(
"Bitte wenden Sie sich an den Support, falls das Problem weiterhin besteht"),
"pleaseEmailUsAt": m52,
"pleaseEmailUsAt": m53,
"pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage(
"Bitte erteile die nötigen Berechtigungen"),
"pleaseLoginAgain":
MessageLookupByLibrary.simpleMessage("Bitte logge dich erneut ein"),
"pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage(
"Bitte wähle die zu entfernenden schnellen Links"),
"pleaseSendTheLogsTo": m53,
"pleaseSendTheLogsTo": m54,
"pleaseTryAgain":
MessageLookupByLibrary.simpleMessage("Bitte versuche es erneut"),
"pleaseVerifyTheCodeYouHaveEntered":
@@ -1447,7 +1448,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Privates Teilen"),
"proceed": MessageLookupByLibrary.simpleMessage("Fortfahren"),
"processed": MessageLookupByLibrary.simpleMessage("Verarbeitet"),
"processingImport": m54,
"processingImport": m55,
"publicLinkCreated":
MessageLookupByLibrary.simpleMessage("Öffentlicher Link erstellt"),
"publicLinkEnabled":
@@ -1457,7 +1458,7 @@ class MessageLookup extends MessageLookupByLibrary {
"raiseTicket": MessageLookupByLibrary.simpleMessage("Ticket erstellen"),
"rateTheApp": MessageLookupByLibrary.simpleMessage("App bewerten"),
"rateUs": MessageLookupByLibrary.simpleMessage("Bewerte uns"),
"rateUsOnStore": m55,
"rateUsOnStore": m56,
"recover": MessageLookupByLibrary.simpleMessage("Wiederherstellen"),
"recoverAccount":
MessageLookupByLibrary.simpleMessage("Konto wiederherstellen"),
@@ -1467,7 +1468,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Konto wiederherstellen"),
"recoveryInitiated":
MessageLookupByLibrary.simpleMessage("Wiederherstellung gestartet"),
"recoveryInitiatedDesc": m56,
"recoveryInitiatedDesc": m57,
"recoveryKey": MessageLookupByLibrary.simpleMessage(
"Wiederherstellungs-Schlüssel"),
"recoveryKeyCopiedToClipboard": MessageLookupByLibrary.simpleMessage(
@@ -1482,12 +1483,12 @@ class MessageLookup extends MessageLookupByLibrary {
"Wiederherstellungs-Schlüssel überprüft"),
"recoveryKeyVerifyReason": MessageLookupByLibrary.simpleMessage(
"Dein Wiederherstellungsschlüssel ist die einzige Möglichkeit, auf deine Fotos zuzugreifen, solltest du dein Passwort vergessen. Du findest ihn unter Einstellungen > Konto.\n\nBitte gib deinen Wiederherstellungsschlüssel hier ein, um sicherzugehen, dass du ihn korrekt gesichert hast."),
"recoveryReady": m57,
"recoveryReady": m58,
"recoverySuccessful": MessageLookupByLibrary.simpleMessage(
"Wiederherstellung erfolgreich!"),
"recoveryWarning": MessageLookupByLibrary.simpleMessage(
"Ein vertrauenswürdiger Kontakt versucht, auf dein Konto zuzugreifen"),
"recoveryWarningBody": m58,
"recoveryWarningBody": m59,
"recreatePasswordBody": MessageLookupByLibrary.simpleMessage(
"Das aktuelle Gerät ist nicht leistungsfähig genug, um dein Passwort zu verifizieren, aber wir können es neu erstellen, damit es auf allen Geräten funktioniert.\n\nBitte melde dich mit deinem Wiederherstellungs-Schlüssel an und erstelle dein Passwort neu (Wenn du willst, kannst du dasselbe erneut verwenden)."),
"recreatePasswordTitle":
@@ -1503,7 +1504,7 @@ class MessageLookup extends MessageLookupByLibrary {
"1. Gib diesen Code an deine Freunde"),
"referralStep2": MessageLookupByLibrary.simpleMessage(
"2. Sie schließen ein bezahltes Abo ab"),
"referralStep3": m59,
"referralStep3": m60,
"referrals": MessageLookupByLibrary.simpleMessage("Weiterempfehlungen"),
"referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage(
"Einlösungen sind derzeit pausiert"),
@@ -1535,7 +1536,7 @@ class MessageLookup extends MessageLookupByLibrary {
"removeLink": MessageLookupByLibrary.simpleMessage("Link entfernen"),
"removeParticipant":
MessageLookupByLibrary.simpleMessage("Teilnehmer entfernen"),
"removeParticipantBody": m60,
"removeParticipantBody": m61,
"removePersonLabel":
MessageLookupByLibrary.simpleMessage("Personenetikett entfernen"),
"removePublicLink":
@@ -1555,7 +1556,7 @@ class MessageLookup extends MessageLookupByLibrary {
"renameFile": MessageLookupByLibrary.simpleMessage("Datei umbenennen"),
"renewSubscription":
MessageLookupByLibrary.simpleMessage("Abonnement erneuern"),
"renewsOn": m61,
"renewsOn": m62,
"reportABug": MessageLookupByLibrary.simpleMessage("Fehler melden"),
"reportBug": MessageLookupByLibrary.simpleMessage("Fehler melden"),
"resendEmail":
@@ -1634,8 +1635,8 @@ class MessageLookup extends MessageLookupByLibrary {
"Laden Sie Personen ein, damit Sie geteilte Fotos hier einsehen können"),
"searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage(
"Personen werden hier angezeigt, sobald Verarbeitung und Synchronisierung abgeschlossen sind"),
"searchResultCount": m62,
"searchSectionsLengthMismatch": m63,
"searchResultCount": m63,
"searchSectionsLengthMismatch": m64,
"security": MessageLookupByLibrary.simpleMessage("Sicherheit"),
"seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage(
"Öffentliche Album-Links in der App ansehen"),
@@ -1669,8 +1670,8 @@ class MessageLookup extends MessageLookupByLibrary {
"selectedItemsWillBeDeletedFromAllAlbumsAndMoved":
MessageLookupByLibrary.simpleMessage(
"Ausgewählte Elemente werden aus allen Alben gelöscht und in den Papierkorb verschoben."),
"selectedPhotos": m4,
"selectedPhotosWithYours": m64,
"selectedPhotos": m6,
"selectedPhotosWithYours": m65,
"send": MessageLookupByLibrary.simpleMessage("Absenden"),
"sendEmail": MessageLookupByLibrary.simpleMessage("E-Mail senden"),
"sendInvite": MessageLookupByLibrary.simpleMessage("Einladung senden"),
@@ -1700,16 +1701,16 @@ class MessageLookup extends MessageLookupByLibrary {
"shareAnAlbumNow":
MessageLookupByLibrary.simpleMessage("Teile jetzt ein Album"),
"shareLink": MessageLookupByLibrary.simpleMessage("Link teilen"),
"shareMyVerificationID": m65,
"shareMyVerificationID": m66,
"shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage(
"Teile mit ausgewählten Personen"),
"shareTextConfirmOthersVerificationID": m5,
"shareTextConfirmOthersVerificationID": m7,
"shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage(
"Hol dir Ente, damit wir ganz einfach Fotos und Videos in Originalqualität teilen können\n\nhttps://ente.io"),
"shareTextReferralCode": m66,
"shareTextReferralCode": m67,
"shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage(
"Mit Nicht-Ente-Benutzern teilen"),
"shareWithPeopleSectionTitle": m67,
"shareWithPeopleSectionTitle": m68,
"shareYourFirstAlbum":
MessageLookupByLibrary.simpleMessage("Teile dein erstes Album"),
"sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage(
@@ -1720,7 +1721,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Neue geteilte Fotos"),
"sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage(
"Erhalte Benachrichtigungen, wenn jemand ein Foto zu einem gemeinsam genutzten Album hinzufügt, dem du angehörst"),
"sharedWith": m68,
"sharedWith": m69,
"sharedWithMe": MessageLookupByLibrary.simpleMessage("Mit mir geteilt"),
"sharedWithYou":
MessageLookupByLibrary.simpleMessage("Mit dir geteilt"),
@@ -1736,11 +1737,11 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Andere Geräte abmelden"),
"signUpTerms": MessageLookupByLibrary.simpleMessage(
"Ich stimme den <u-terms>Nutzungsbedingungen</u-terms> und der <u-policy>Datenschutzerklärung</u-policy> zu"),
"singleFileDeleteFromDevice": m69,
"singleFileDeleteFromDevice": m70,
"singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage(
"Es wird aus allen Alben gelöscht."),
"singleFileInBothLocalAndRemote": m70,
"singleFileInRemoteOnly": m71,
"singleFileInBothLocalAndRemote": m71,
"singleFileInRemoteOnly": m72,
"skip": MessageLookupByLibrary.simpleMessage("Überspringen"),
"social": MessageLookupByLibrary.simpleMessage("Social Media"),
"someItemsAreInBothEnteAndYourDevice":
@@ -1792,10 +1793,10 @@ class MessageLookup extends MessageLookupByLibrary {
"storageInGB": m1,
"storageLimitExceeded": MessageLookupByLibrary.simpleMessage(
"Speichergrenze überschritten"),
"storageUsageInfo": m72,
"storageUsageInfo": m73,
"strongStrength": MessageLookupByLibrary.simpleMessage("Stark"),
"subAlreadyLinkedErrMessage": m73,
"subWillBeCancelledOn": m74,
"subAlreadyLinkedErrMessage": m74,
"subWillBeCancelledOn": m75,
"subscribe": MessageLookupByLibrary.simpleMessage("Abonnieren"),
"subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage(
"Du benötigst ein aktives, bezahltes Abonnement, um das Teilen zu aktivieren."),
@@ -1812,7 +1813,7 @@ class MessageLookup extends MessageLookupByLibrary {
"suggestFeatures":
MessageLookupByLibrary.simpleMessage("Verbesserung vorschlagen"),
"support": MessageLookupByLibrary.simpleMessage("Support"),
"syncProgress": m75,
"syncProgress": m76,
"syncStopped":
MessageLookupByLibrary.simpleMessage("Synchronisierung angehalten"),
"syncing": MessageLookupByLibrary.simpleMessage("Synchronisiere …"),
@@ -1825,7 +1826,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Zum Entsperren antippen"),
"tapToUpload":
MessageLookupByLibrary.simpleMessage("Zum Hochladen antippen"),
"tapToUploadIsIgnoredDue": m76,
"tapToUploadIsIgnoredDue": m77,
"tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage(
"Etwas ist schiefgelaufen. Bitte versuche es später noch einmal. Sollte der Fehler weiter bestehen, kontaktiere unser Supportteam."),
"terminate": MessageLookupByLibrary.simpleMessage("Beenden"),
@@ -1849,7 +1850,7 @@ class MessageLookup extends MessageLookupByLibrary {
"theseItemsWillBeDeletedFromYourDevice":
MessageLookupByLibrary.simpleMessage(
"Diese Elemente werden von deinem Gerät gelöscht."),
"theyAlsoGetXGb": m77,
"theyAlsoGetXGb": m8,
"theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage(
"Sie werden aus allen Alben gelöscht."),
"thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage(

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