Compare commits

...

352 Commits

Author SHA1 Message Date
Manav Rathi
511fb8de6a photosd-v1.7.4 (#3127) 2024-09-04 18:39:42 +05:30
Manav Rathi
fd36ede27b photosd-v1.7.4 2024-09-04 18:36:53 +05:30
Ashil
a904263ed5 [mob][photos] Consider sample aspect ratio or pixel aspect ratio when parsing width and height of video used for calculating aspect ratio (#3126)
## Description

Most videos have a [Pixel aspect
ratio](https://en.wikipedia.org/wiki/Pixel_aspect_ratio#:~:text=The%20aspect%20ratio%20of%20the%20pixels%20themselves%20is%20known%20as,PAR%20%3D%20DAR%20%2F%20SAR)
of 1:1. For the ones that do not have a PAR of 1:1, just using height
and width from exif to calculate the aspect ratio of the video won't
work. In such cases, `sample_aspect_ratio` should be considered.

## Tests

Tested and working without bugs.
2024-09-04 18:04:21 +05:30
ashilkn
02aae58e71 [mob][photos] Consider sample aspect ratio or pixel aspect ratio when parsing width and height of video used for calculating aspect ratio 2024-09-04 17:54:21 +05:30
Manav Rathi
7495b6c2c4 [desktop] Add What's New (2) (#3125) 2024-09-04 15:38:25 +05:30
Manav Rathi
aa1e2188fb [desktop] Add What's New (2) 2024-09-04 15:30:43 +05:30
Manav Rathi
8c3c401efb [server] Increase expiry time for free subscriptions (#3124)
## Description
For existing users, the expiry time is random date in future: Tuesday,
July 2, 2120
## Tests
Locally, made the change to show expiry time for free plan and verified
that
- for existing account, new expiry time was shown.
 - For new account, the expiry time was 100 years from now.
2024-09-04 13:14:21 +05:30
Neeraj Gupta
5cd37a02c7 [server] Bump up expiry_time for free plan 2024-09-04 13:05:36 +05:30
Manav Rathi
2bb1670428 [desktop] Clustering - Incorporate low quality face heuristics (#3123) 2024-09-04 12:43:45 +05:30
Manav Rathi
485e8444fe Inc 2024-09-04 12:31:02 +05:30
Manav Rathi
5395ca5caf UI 3 2024-09-04 12:18:55 +05:30
Neeraj Gupta
c416819f0a [server] Increase duration of free trial 2024-09-04 12:18:06 +05:30
Neeraj Gupta
0a1e062caf [mob] Bump version 2024-09-04 11:59:34 +05:30
Neeraj Gupta
85230b5123 [mob] Pop only when there's screen in stack 2024-09-04 11:59:34 +05:30
Neeraj Gupta
a33cff7406 [mob] Fix icon 2024-09-04 11:59:34 +05:30
Neeraj Gupta
006cddccd9 [mob] Add change log 2024-09-04 11:59:34 +05:30
Neeraj Gupta
67867cc127 [mob] Remove noisy log 2024-09-04 11:59:34 +05:30
Neeraj Gupta
f0bb00f977 [mob] Show backup status for internal users 2024-09-04 11:59:34 +05:30
Neeraj Gupta
54290886ea [mob] iOS build changes 2024-09-04 11:59:34 +05:30
Manav Rathi
816b26475a UI 2 2024-09-04 11:06:20 +05:30
Manav Rathi
46d7d4e587 UI 1 2024-09-04 11:00:35 +05:30
Manav Rathi
263f94418d Filter during enumeration 2024-09-04 10:57:38 +05:30
Manav Rathi
f990863bb2 Retain that info 2024-09-04 10:44:32 +05:30
Manav Rathi
d91cd53375 Ren 2024-09-04 10:37:37 +05:30
Manav Rathi
6a9fdd6c77 sw 2024-09-04 10:36:27 +05:30
Manav Rathi
f1185fcade Add low quality face condition 2024-09-04 10:33:16 +05:30
Laurens Priem
0cef11266a Clip vector (#3117)
## Description

Use SIMD for magic search
2024-09-04 03:51:14 +02:00
Laurens Priem
653fc1880f [mob][photos] Log index status of user (#3118)
## Description

Log ML index status, so in future issues we won't have to ask the user.
2024-09-04 03:50:42 +02:00
laurenspriem
cbf84922bb [mob][photos] Log index status of user 2024-09-03 21:53:19 +02:00
laurenspriem
0cad88f1ab [mob][photos] Remove duplicate code 2024-09-03 21:07:13 +02:00
laurenspriem
1b7f8ff648 [mob][photos] Less ambiguous naming 2024-09-03 21:04:30 +02:00
laurenspriem
7097cb335d [mob][photos] Improve magic search speed using simd 2024-09-03 18:48:16 +02:00
laurenspriem
877c660ba9 [mob][photos] Remove unused cosine distance functions 2024-09-03 18:34:08 +02:00
Neeraj Gupta
04f6461cb5 [mob] Bump version v0.9.34 2024-09-03 21:23:28 +05:30
Neeraj Gupta
6566973f3e [mob] Gracefully handle dup mapping 2024-09-03 21:23:28 +05:30
ashilkn
8e014ae7c6 [mob][photos][auth] Fix lockscreen not automatically appearing on opening app
This does not fix the root cause, this is just a workaround. The root cause is somewhere in didChangeAppLifecycleState in app_lock.dart
2024-09-03 21:07:26 +05:30
Neeraj Gupta
929c706fc0 [mob][photos] Fix video player issues (#3110) 2024-09-03 21:07:11 +05:30
Laurens Priem
debf52ee88 Ml logging (#3112)
## Description

- Regular logging now shows in user logs
- Cleaned up logging around ML indexing
- Refactored all isolates services into single interface
- Try converting to jpg on all failed decoding for ML on Android


## Tested

Tested in debug mode on my pixel 8 phone.
2024-09-03 17:36:55 +02:00
Vishnu Mohandas
d993430c01 Fix Triple-T filenames (#3114)
Import recommendations from https://github.com/ente-io/ente/pull/3107.
2024-09-03 17:51:18 +05:30
vishnukvmd
f337b835d0 Fix Triple-T filenames 2024-09-03 17:47:57 +05:30
Manav Rathi
f8c44feab8 [desktop] Clustering WIP - Part x/x (#3113) 2024-09-03 17:40:54 +05:30
Manav Rathi
0329c40265 Tweak 2024-09-03 17:36:21 +05:30
Neeraj Gupta
e58c48aa70 [auth] bump target sdk version (#3102) 2024-09-03 17:23:42 +05:30
Manav Rathi
96ee1e3ed2 Sync with mobile 2024-09-03 17:21:35 +05:30
Prateek Sunal
60b66b5e7f revert: build gradle signing config 2024-09-03 17:18:23 +05:30
laurenspriem
13f1309857 [mob][photos] Logging 2024-09-03 13:36:48 +02:00
laurenspriem
4ee96637de [mob][photos] logs 2024-09-03 13:27:30 +02:00
laurenspriem
dae8fbc9b5 [mob][photos] Redundant logging 2024-09-03 13:25:08 +02:00
laurenspriem
4abd131b8a [mob][photos] Remove redundant logging 2024-09-03 13:21:50 +02:00
laurenspriem
ed3b27475e [mob][photos] Try converting any unsupported format on Android 2024-09-03 13:13:56 +02:00
laurenspriem
9dadb92d8d [mob][photos] Last logging todos 2024-09-03 12:49:45 +02:00
Johannes7k75
7d0ae17ddd Update README.md (#3023)
## Description

Changes the name of the docker image that gets build.

## Tests
2024-09-03 15:55:48 +05:30
ashilkn
fe8600d569 [mob][photos] Fix: Null check operator used on a null value 2024-09-03 15:42:01 +05:30
laurenspriem
1433903fac [mob][photos] Remove redundant testing code 2024-09-03 12:06:24 +02:00
laurenspriem
ab636232ff [mob][photos] Cleaner logging 2024-09-03 12:04:35 +02:00
Manav Rathi
76f3a523c1 Prune 2024-09-03 15:31:55 +05:30
Manav Rathi
b53197d948 [desktop] Speed up dot product (#3109)
Use the Float32Array variant, and let the JS JIT take it from there.

Makes the magic search (except first one) and clustering at least 2x
faster (first magic search is not as fast as it does the conversion,
rest are).

Some test numbers.

```
[main] [info] 5399 embeddings 29 million ops 11 seconds      normal
[main] [info] 5399 embeddings 29 million ops  8 seconds      float32
[main] [info] 5399 embeddings 29 million ops  8 seconds      float32 with loop unrolling
[main] [info] 5399 embeddings 29 million ops  4 seconds      simsimd
[rndr] [info] 5399 embeddings 29 million ops 12 seconds      normal
[rndr] [info] 5399 embeddings 29 million ops  7 seconds      float32
[rndr] [info] 5399 embeddings 29 million ops  7 seconds      float32 with loop unrolling
[rndr] [info] 5399 embeddings 29 million ops  7 seconds      wasm simd
```
2024-09-03 15:24:53 +05:30
Manav Rathi
38f58ae5f9 Lint fix 2024-09-03 15:17:46 +05:30
Manav Rathi
875fd10b50 Tweak 2024-09-03 15:13:47 +05:30
Manav Rathi
041aaea0b9 Use F32 variant everywhere 2024-09-03 15:05:51 +05:30
Manav Rathi
e2c0501e3d Clean up 2024-09-03 14:57:05 +05:30
Manav Rathi
d841ae5a60 Clear cache only on new index generation 2024-09-03 14:49:38 +05:30
Manav Rathi
5e65001e37 Float32 opt for clip 2024-09-03 14:14:00 +05:30
laurenspriem
e70656b5a3 [mob][photos] documentation 2024-09-03 10:20:08 +02:00
Manav Rathi
b30705fa31 Use
For an example datasat with 4700 eligible images, this halved the time.
2024-09-03 13:46:51 +05:30
ashilkn
26c6078693 [mob][photos] Avoid PathNotFoundException on disposing native video widget 2024-09-03 13:33:49 +05:30
Manav Rathi
9a68c48456 Add a Float32Array variant
Some test numbers

[main] [info] 5399 embeddings 29 million ops 11 seconds      normal
[main] [info] 5399 embeddings 29 million ops  8 seconds      float32
[main] [info] 5399 embeddings 29 million ops  8 seconds      float32 with loop unrolling
[main] [info] 5399 embeddings 29 million ops  4 seconds      simsimd
[rndr] [info] 5399 embeddings 29 million ops 12 seconds      normal
[rndr] [info] 5399 embeddings 29 million ops  7 seconds      float32
[rndr] [info] 5399 embeddings 29 million ops  7 seconds      float32 with loop unrolling
[rndr] [info] 5399 embeddings 29 million ops  7 seconds      wasm simd
2024-09-03 13:28:44 +05:30
laurenspriem
2828fdf2c6 [mob][photos] Minor change 2024-09-02 18:36:31 +02:00
laurenspriem
b598729f28 [mob][photos] Simplify face clustering isolate service 2024-09-02 18:33:29 +02:00
Manav Rathi
86d3067713 [desktop] Fix early exit threshold (#3103) 2024-09-02 21:56:37 +05:30
Manav Rathi
38e5b4da82 [desktop] Fix early exit threshold 2024-09-02 21:53:21 +05:30
laurenspriem
e1288bfd61 [mob][photos] Simplify MLIndexingIsolate 2024-09-02 18:12:11 +02:00
Prateek Sunal
cde45111f6 chore: update taget sdk version 2024-09-02 21:10:16 +05:30
laurenspriem
947bd57b99 [mob][photos] Small changes 2024-09-02 17:16:48 +02:00
Manav Rathi
e800d048f2 [desktop] Clustering WIP - Part x/x (#3101) 2024-09-02 20:40:42 +05:30
laurenspriem
a788313974 [mob][photos] Extra isolate response check using nanoID 2024-09-02 17:06:43 +02:00
Manav Rathi
3d2492a045 Prevent form reset on scroll 2024-09-02 20:34:07 +05:30
laurenspriem
9fe76eb527 [mob][photos] Use isolate abstraction on MLComputer 2024-09-02 16:56:04 +02:00
Manav Rathi
6fabb39788 Memoize options form
Doesn't prevent it from getting recreated though
2024-09-02 20:12:39 +05:30
Manav Rathi
c403f4f3a1 Fix the same overwriting bug again 2024-09-02 19:55:30 +05:30
Manav Rathi
5f6ae20f96 Log 2024-09-02 19:49:40 +05:30
Manav Rathi
b879cbed32 First render 2024-09-02 19:39:22 +05:30
Manav Rathi
602aa74bd9 Fix batch sizes 2024-09-02 19:27:04 +05:30
Manav Rathi
9db616e965 Move out to prevent extra renders 2024-09-02 19:20:08 +05:30
laurenspriem
163c8161fc [mob][photos] Isolate base mvp 2024-09-02 15:44:24 +02:00
Manav Rathi
2619059f58 Fix 2024-09-02 19:12:01 +05:30
Manav Rathi
9e7033ce54 Simplify 2024-09-02 18:58:11 +05:30
Manav Rathi
bc653494aa Deterministic 2024-09-02 18:55:12 +05:30
Manav Rathi
bb84a609a0 Fix indexing 2024-09-02 18:36:57 +05:30
Manav Rathi
53b1b162b2 Lookback 2024-09-02 18:16:43 +05:30
Manav Rathi
70e56d748a And only for clusters 2024-09-02 17:45:09 +05:30
Manav Rathi
9428a13f7a Opt 2024-09-02 17:42:54 +05:30
Manav Rathi
81ded2b247 Show progress 2024-09-02 17:37:36 +05:30
Manav Rathi
1d2eed2b46 [server] Gracefully handle auth key exist err (#3098)
## Description

## Tests
Tested locally
Lint also works fine locally.
2024-09-02 17:15:52 +05:30
Manav Rathi
a55a70266b Impl 2024-09-02 17:15:03 +05:30
Neeraj Gupta
fd4d8ea2e8 [mob] Bump version v0.9.33 (#3099)
## Description

## Tests
2024-09-02 17:09:27 +05:30
Neeraj Gupta
4e4e865497 [mob] Bump version v0.9.33 2024-09-02 17:09:07 +05:30
Manav Rathi
3cef7ff545 Progress 2024-09-02 17:08:58 +05:30
Neeraj Gupta
6e07067d94 [mob][photos] Add option to enable or disable looping of videos (#3059)
https://github.com/user-attachments/assets/e6635b09-d0d2-4f7e-b75f-513899c996ad
2024-09-02 17:07:47 +05:30
github-actions[bot]
509596ff76 [mobile] New translations (#3095)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-app)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2024-09-02 17:06:36 +05:30
Tanguy
aa4bb92a8f [auth] Fix & add icons (#3097)
- Add colored Amazon icon
- Fix some icons visibility by adding `mix-blend-mode:difference`
- Restore the actual Kraken logo (the previous one was the mobile app
icon)

<!--- Describe your changes in detail -->

## Type of Change

<!--- Put an `x` in all the boxes that apply: -->

- [x] 🖼️ New icon
- [ ]  New feature (non-breaking change which adds functionality)
- [x] 🛠️ Bug fix (non-breaking change which fixes an issue)
- [ ]  Breaking change (fix or feature that would cause existing
functionality to change)
- [ ] 🧹 Code refactor
- [ ]  Build configuration change
- [ ] 📝 Documentation
- [ ] 🗑️ Chore
2024-09-02 17:06:09 +05:30
Ashil
0dd3f7ef46 [mob][photos] Trigger send logs on scale gesture (#3096)
## Description

If stuck in some screens like the "Grant permission" and "Loading local
photos" screen, there is no way to send logs.
Now, if a scale gesture is detected in any of these screens, logs can be
sent.
2024-09-02 17:05:26 +05:30
Neeraj Gupta
a54237e8e2 [server] Gracefully handle auth key exist err 2024-09-02 17:04:04 +05:30
ashilkn
104d98b765 [mob][photos] Cancel timer after use 2024-09-02 16:50:41 +05:30
ashilkn
75448d5e5a [mob][photos] Add gesture interaction on grant permission screen and local photo sync screen to send logs 2024-09-02 16:48:23 +05:30
Manav Rathi
371dcf8ab9 More params 2024-09-02 16:47:49 +05:30
laurenspriem
da316fdcfd [mob][photos] refactor 2024-09-02 12:45:30 +02:00
laurenspriem
ba083fff70 [mob][photos] exception handlign works in isolate 2024-09-02 12:45:08 +02:00
Manav Rathi
30d5fedb11 sort by photo date 2024-09-02 15:57:18 +05:30
Neeraj Gupta
187a149716 [mob] Show total memory count to upload 2024-09-02 15:46:21 +05:30
Neeraj Gupta
28e691122f [mob] Fix translations 2024-09-02 15:46:21 +05:30
Neeraj Gupta
5fef369e91 [mob] Surface backup status 2024-09-02 15:46:21 +05:30
laurenspriem
dcac233296 [mob][photos] refactor 2024-09-02 11:50:06 +02:00
laurenspriem
b90a719972 [mob][photos] Cleaner indication of isolate logging 2024-09-02 11:24:57 +02:00
ashilkn
d42d8965e6 [mob][photos] Resolve merge conflicts and merge main 2024-09-02 14:52:22 +05:30
ashilkn
ab86c5129e [mob][photos] Refactor 2024-09-02 14:46:52 +05:30
Manav Rathi
5b0c32084a [desktop] Clustering WIP - Part x/x (#3093)
- Prefer existing clusters when adding
- Add min threshold
2024-09-02 14:08:27 +05:30
Manav Rathi
c0ad778c90 Add min threshold 2024-09-02 13:56:00 +05:30
Manav Rathi
a6359f0756 Prefer existing clusters when adding 2024-09-02 13:44:30 +05:30
Louis Lam
7500fdd380 Request focus on the search box when clicked the search icon 2024-09-02 12:16:25 +05:30
Tanguy
0fc0a00f47 Add Battle.net icon 2024-09-02 12:15:29 +05:30
Tanguy
05bcfdc16e Fix TCPShield icon 2024-09-02 12:15:29 +05:30
Tanguy
dca50a4e45 Refactor 2024-09-02 12:15:29 +05:30
Tanguy
e16fa2dc31 Fix typo 2024-09-02 12:15:29 +05:30
Tanguy
dc120a06ca Refactor 2024-09-02 12:15:29 +05:30
Tanguy
05cf33ffb2 Remove unnecessary hex fields 2024-09-02 12:15:29 +05:30
Tanguy
0a7a8e49fe Reorder alphabetically 2024-09-02 12:15:29 +05:30
Tanguy
a1742f71e0 Fix typo 2024-09-02 12:15:29 +05:30
Tanguy
b1e727f269 Refactor 2024-09-02 12:15:29 +05:30
Tanguy
dbde6abc8c Refactor and clean code 2024-09-02 12:15:29 +05:30
Tanguy
a13256cf39 Remove unnecessary slug fields 2024-09-02 12:15:29 +05:30
Tanguy
1197e11f58 Remove unnecessary slug fields 2024-09-02 12:15:29 +05:30
Crowdin Bot
743fc4aa41 New Crowdin translations by GitHub Action 2024-09-02 12:14:55 +05:30
Crowdin Bot
71644e255d New Crowdin translations by GitHub Action 2024-09-02 12:14:24 +05:30
Manav Rathi
7f32b99284 [web] New translations (#3089)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2024-09-02 08:28:14 +05:30
Crowdin Bot
746aa4cb96 New Crowdin translations by GitHub Action 2024-09-02 00:32:36 +00:00
laurenspriem
d40dc06171 [mob][photos] MVP logs working in isolate 2024-09-01 22:53:24 +02:00
Neeraj Gupta
7354f69dc3 [auth][perf] Avoid redundant totp computation 2024-09-01 19:43:37 +05:30
Neeraj Gupta
815dd6b4b6 [auth][perf] Cache timer progress widget 2024-09-01 19:43:37 +05:30
Neeraj Gupta
33c843e5d8 [auth][perf] Reduce redundant painting 2024-09-01 19:43:37 +05:30
Manav Rathi
2473c4109e [desktop] Fix flakiness in reading zip files (#3079) 2024-08-31 18:50:16 +05:30
Manav Rathi
171a8670a4 Balance ref counts 2024-08-31 18:28:40 +05:30
Manav Rathi
027e3425bb Gracefully handle aborts 2024-08-31 18:18:02 +05:30
Manav Rathi
138dcf3d2a Simplify 2024-08-31 17:58:35 +05:30
Manav Rathi
8231964023 [desktop] Fix flakiness in reading zip files
I'm not sure what was the issue in the existing code, but I happened to chance
on a setup that reproduced the flakiness that some customers have reported (that
reading the zips sometimes fails). There wasn't anything specific in the setup -
I was reading a 50 MB zip file, a file which I'd read multiple times before,
except this time it seemed to invariably result in failures during read.

Replacing the node stream to web stream conversion with this new approach fixes
the flakiness, at least in the reproducible scenario that I was encountering.
2024-08-31 17:18:03 +05:30
Manav Rathi
e9a8a97982 [web] New translations (#3073)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2024-08-31 15:51:42 +05:30
Crowdin Bot
7dece286ec New Crowdin translations by GitHub Action 2024-08-31 10:18:47 +00:00
Manav Rathi
dc32172d8c [web] Make it more apparent what the create albums button does (#3076)
Change title of the button from "New album" to "Create albums" to
indicate that it can be used to preserve albums.

See: https://github.com/ente-io/ente/issues/3067
2024-08-31 15:48:00 +05:30
Manav Rathi
22c5485b3b [web] Make it more apparent what the create albums button does
Change title of the button from "New album" to "Create albums" to indicate that
it can be used to preserve albums.

See: https://github.com/ente-io/ente/issues/3067
2024-08-31 15:43:18 +05:30
Manav Rathi
73894ade73 [desktop] Clustering WIP - Part x/x (#3074) 2024-08-31 13:45:02 +05:30
Manav Rathi
7a7c8c02de Remove debug code 2024-08-31 13:39:37 +05:30
Manav Rathi
72dc526724 Form tweaks 2024-08-31 13:38:44 +05:30
Manav Rathi
7a48b32bd5 More counts 2024-08-31 13:01:06 +05:30
Manav Rathi
db58520afe Without ID 2024-08-31 12:36:51 +05:30
Manav Rathi
1ec9dfea7f Equal sized buttons 2024-08-31 12:21:25 +05:30
Manav Rathi
e36f081d96 Cleanup 2024-08-31 11:42:11 +05:30
Manav Rathi
cfcd41fc7e Cleanup 2024-08-31 11:26:48 +05:30
Manav Rathi
60cac291ff Cleanup 2024-08-31 11:13:23 +05:30
Manav Rathi
c3cfb7ae2f Clean up 2024-08-31 11:11:18 +05:30
Manav Rathi
067ba8ea85 Fix form rerendering
The item renderer should not be defined inline otherwise it will get re-created
each time the parent component (list) gets rerendered.

https://github.com/bvaughn/react-window/issues/413#issuecomment-597876562
2024-08-31 10:38:38 +05:30
Manav Rathi
14a4398a14 Restructure to avoid unnecessary rerenders 2024-08-31 09:45:43 +05:30
Manav Rathi
ff759c31b2 [web] Indicate that hash comparision is also used in the detail message (#3072)
Context: https://github.com/ente-io/ente/discussions/3070
2024-08-31 09:30:06 +05:30
Manav Rathi
854198f215 [web] Indicate that hash comparision is also used in the detail message
Context: https://github.com/ente-io/ente/discussions/3070
2024-08-31 09:25:17 +05:30
Manav Rathi
6fcfa3d984 Live photo changelog (#3071)
https://github.com/ente-io/ente/pull/2865
2024-08-31 07:24:23 +05:30
Manav Rathi
1e1ef7f94b Live photo changelog
https://github.com/ente-io/ente/pull/2865
2024-08-31 07:22:48 +05:30
Manav Rathi
b47f627508 [desktop] Clustering WIP - Part x/x (#3061) 2024-08-30 21:21:25 +05:30
Manav Rathi
0da8f45084 Fix form reset 2024-08-30 21:09:42 +05:30
Manav Rathi
c147ec1067 Ensure nums
There's a better way, just debugging code for now
2024-08-30 21:00:13 +05:30
ashilkn
e4149fa55e [mob][photos] Chore 2024-08-30 19:59:05 +05:30
Manav Rathi
ccb0e5278d Minscore 2024-08-30 19:58:55 +05:30
ashilkn
cb83f3592b [mob][photos] Use custom icon for 'loop video off' button 2024-08-30 19:48:29 +05:30
Manav Rathi
342af990f6 [desktop] Clustering WIP - Part x/x (#3058) 2024-08-30 19:16:20 +05:30
Manav Rathi
737e46a90e Use correct type 2024-08-30 19:15:04 +05:30
Manav Rathi
b7e67d4e2a Lint fix 2024-08-30 19:11:51 +05:30
Manav Rathi
4dc9ed6438 Don't overwrite submitting state 2024-08-30 19:02:12 +05:30
ashilkn
e1f2a7dcf7 [mob][photos] Improve play pause button in video player 2024-08-30 18:50:48 +05:30
ashilkn
70ad285e09 [mob][photos] Extract strings 2024-08-30 18:21:36 +05:30
ashilkn
d2459016f1 [mob][photos] Change copy 2024-08-30 18:19:11 +05:30
ashilkn
c6ec5cf645 [mob][photos] Fix state issue with video loop toggle button 2024-08-30 18:14:08 +05:30
Manav Rathi
1881dde11f Fix aliasing 2024-08-30 18:13:10 +05:30
Manav Rathi
b06bd19bc9 Unclustered 2024-08-30 18:09:09 +05:30
Manav Rathi
b93a591401 Rem params 2024-08-30 17:58:47 +05:30
Manav Rathi
7ff9dd5a57 LF 2024-08-30 17:48:29 +05:30
Manav Rathi
96397c24b4 Fin 2024-08-30 17:36:01 +05:30
laurenspriem
a9bc6502cb [mob][photos] proper logging in ML indexing isolate 2024-08-30 13:58:46 +02:00
Manav Rathi
4f4eb773fc Clean 2024-08-30 17:24:49 +05:30
Manav Rathi
48e00a0ecc Linear 2024-08-30 17:05:16 +05:30
ashilkn
f8593255ac [mob][photos] Fix most of the seekbar issues when turning off looping videos 2024-08-30 16:59:26 +05:30
Manav Rathi
598d5aab10 propagate 2024-08-30 16:47:07 +05:30
ashilkn
26cb81a720 [mob][photos] almost fully functional toggle for toggling video loop 2024-08-30 16:21:36 +05:30
Manav Rathi
20c742d43d form 2 2024-08-30 16:19:16 +05:30
laurenspriem
1b1f54feb0 [mob][photos] Actual logging in cluster isolate 2024-08-30 12:22:58 +02:00
Neeraj Gupta
6da1f892ce Bump version 2024-08-30 15:44:00 +05:30
Neeraj Gupta
e243a914e9 [mob] Show backup status on status_bar tap 2024-08-30 15:44:00 +05:30
Neeraj Gupta
df3ba86977 Update build file 2024-08-30 15:44:00 +05:30
laurenspriem
91646a809b [mob][photos] Actual logging in ML Computer 2024-08-30 12:07:06 +02:00
Vishnu Mohandas
2db170a3ae Add FAQ about shared item organization (#3052) 2024-08-30 15:23:51 +05:30
vishnukvmd
d9ca47914d Add FAQ about shared item organization 2024-08-30 15:23:26 +05:30
Manav Rathi
657f27822c form 1 2024-08-30 15:21:28 +05:30
Manav Rathi
ed3d8b984e Scrollable header 2024-08-30 15:09:53 +05:30
Neeraj Gupta
ed1970b6d8 [docs] Add troubleshooting guide for auth 2024-08-30 14:52:27 +05:30
Manav Rathi
d374960c35 Tweak the debugging panel 2024-08-30 13:21:14 +05:30
Neeraj Gupta
3feac9f0b4 [mob] Bump version v0.9.31 2024-08-30 13:16:52 +05:30
ashilkn
dc6fde9f77 [mob][photos] Fix: audio not playing on iOS when in silent mode 2024-08-30 13:06:55 +05:30
Neeraj Gupta
be3a709335 [server] Use nanoId as reqID 2024-08-30 09:16:43 +05:30
Manav Rathi
883bdcd845 [desktop] Clustering WIP - Part x/x (#3040) 2024-08-29 21:03:09 +05:30
Manav Rathi
d5a1187e13 Prep 2024-08-29 20:52:13 +05:30
ashilkn
d413ed2de0 [mob][auth] Update flutter version in github workflows 2024-08-29 20:46:24 +05:30
ashilkn
ac0ae00015 [mob][auth] Update flutter submodule to v3.24.1 2024-08-29 20:46:24 +05:30
Prateek Sunal
325871f7c5 fix(backup): attach reason of error, use ListView.builder, use upload instead of forceUpload 2024-08-29 20:45:51 +05:30
Prateek Sunal
5662661326 fix(backup-status): limit folder name to single line 2024-08-29 20:45:51 +05:30
Prateek Sunal
864b5514be feat(backup): introduce backup status screen 2024-08-29 20:45:51 +05:30
Prateek Sunal
2044d3eb6b chore: add translation keys 2024-08-29 20:45:51 +05:30
Prateek Sunal
577b262418 fix: change sentence case for android debug builds 2024-08-29 20:45:51 +05:30
Manav Rathi
d6c7ab0735 Inline 2024-08-29 20:18:31 +05:30
Manav Rathi
15884597b4 uc 2024-08-29 20:03:06 +05:30
Manav Rathi
4fd32155dc Worker 2024-08-29 19:55:05 +05:30
Manav Rathi
c9acda1b6d Show direction 2024-08-29 19:47:16 +05:30
Manav Rathi
29b5830e19 Print scores 2024-08-29 19:31:24 +05:30
Manav Rathi
3d95212023 Preview 2024-08-29 19:22:55 +05:30
Manav Rathi
2179b193d2 Preview 2024-08-29 19:15:34 +05:30
Manav Rathi
89a5a9f42f Prune 2024-08-29 18:42:17 +05:30
Manav Rathi
cd69e00451 Batch 2024-08-29 18:27:44 +05:30
Tanguy
fc66c3e689 Add Upstox icon 2024-08-29 18:10:19 +05:30
Manav Rathi
67ea0cfe73 Debugging code 2024-08-29 18:07:37 +05:30
Manav Rathi
406ac81684 [server] Gracefully handle deleted users (#3035)
## Description

## Tests
2024-08-29 18:06:44 +05:30
Manav Rathi
c1f16a5b6a [web] Make web app's log handling consistent with how desktop app does it (#3034) 2024-08-29 18:04:02 +05:30
Neeraj Gupta
236d24c79b [server] Gracefully handle deleted users 2024-08-29 18:01:06 +05:30
Manav Rathi
b55cf7c0d8 Update 2024-08-29 17:51:48 +05:30
Manav Rathi
87d6105159 Remove leftover migration code 2024-08-29 17:51:03 +05:30
Manav Rathi
194f07d48e Fix style lint issue 2024-08-29 17:50:09 +05:30
araghon007
0c48f53ab1 Remove X.com custom icon 2024-08-29 17:43:41 +05:30
Manav Rathi
6aba9064a7 [web] Make web app's log handling consistent with how desktop app does it 2024-08-29 17:36:40 +05:30
Manav Rathi
a2f87c8bd5 [web] Clear cached thumbnails if the source file is edited (#3032)
This still doesn't clear the cached React component, but now at least
the thumbnail would be refreshed on the next refresh of the page.
2024-08-29 17:32:49 +05:30
Manav Rathi
67361113af Help the linter move on 2024-08-29 17:28:11 +05:30
Aaron Torres
3d2a66023d Add RippleMatch icon 2024-08-29 17:22:47 +05:30
Manav Rathi
d99e405f10 [web] Clear cached thumbnails if the source file is edited 2024-08-29 17:16:10 +05:30
ashilkn
d5a8f234f8 [mob][photos] fix: creating a new album from hidden section is not hidden by default 2024-08-29 16:47:37 +05:30
Laurens Priem
018bd8a767 Ml fixesv148 (#3028)
## Description

- Don't process ML on mobile for large files
- ML user developer options to clear local data
2024-08-29 11:52:13 +02:00
Manav Rathi
e1e92d944a [desktop] Cluster WIP - Switch to HDBSCAN (#3024) 2024-08-29 08:17:04 +05:30
Manav Rathi
5dd1720b88 lf 2024-08-29 08:13:56 +05:30
Manav Rathi
e84903d2dd Switch 2024-08-29 08:01:43 +05:30
Manav Rathi
ca1a292fb2 Prep to try the hdbscan 2024-08-29 07:27:01 +05:30
Manav Rathi
62ba1f0f75 [desktop] Add CHANGELOG entry for Intel macOS fix (#3022)
Also tweak the github action again.
2024-08-28 20:40:22 +05:30
Manav Rathi
5ca3ca5289 Add CHANGELOG entry 2024-08-28 20:38:28 +05:30
Manav Rathi
ac5d37a9e3 Not helping, this is just causing it to run twice 2024-08-28 20:38:25 +05:30
Manav Rathi
23732dd087 [desktop] Cluster WIP - Part x/x (#3021) 2024-08-28 20:18:14 +05:30
Manav Rathi
5aae59cdda Add limits 2024-08-28 20:10:23 +05:30
Manav Rathi
3563c20997 Add limits 2024-08-28 20:04:59 +05:30
Manav Rathi
14ac034c0b Provide both options 2024-08-28 19:45:47 +05:30
Manav Rathi
cd5e40a1f5 Vars 2024-08-28 17:44:04 +05:30
Manav Rathi
72cc188efe Incorporate blur 2024-08-28 17:39:09 +05:30
Manav Rathi
2d50da84c8 Show blur 2024-08-28 17:29:52 +05:30
laurenspriem
dd6f88a1cd [mob][photos] Move 2024-08-28 13:49:07 +02:00
laurenspriem
ac5d9d99f1 [mob][photos] ML user developer options 2024-08-28 13:46:58 +02:00
Vishnu Mohandas
5ff595b268 Update string (#3018) 2024-08-28 16:39:23 +05:30
vishnukvmd
3cebd975a8 Update string 2024-08-28 16:38:56 +05:30
Manav Rathi
dac0dfb8f9 Set cgroups 2024-08-28 16:29:17 +05:30
Manav Rathi
77cf819ab4 Indicate cluster 2024-08-28 16:18:57 +05:30
Manav Rathi
760b1f3f85 Neighbours 2024-08-28 15:14:58 +05:30
laurenspriem
db8e203c36 [mob][photos] Always log basic info on empty result 2024-08-28 11:21:50 +02:00
laurenspriem
1e9a014ce7 [mob][photos] Minor cleanup 2024-08-28 11:12:22 +02:00
laurenspriem
e1ce353069 [mob][photos] Don't process large files on mobile 2024-08-28 11:08:18 +02:00
Vishnu Mohandas
2d97aa2e59 [docs] Tweaks to the Google import steps (#3014)
This is how it looks. It is getting a bit too long, so not 100%
satisfied with this.

<img width="703" alt="Screenshot 2024-08-28 at 13 56 25"
src="https://github.com/user-attachments/assets/bf8d0e56-baa2-4a8b-80a1-de40e8896108">
2024-08-28 14:00:14 +05:30
Manav Rathi
584ce6d416 [docs] Tweaks to the Google import steps 2024-08-28 13:57:22 +05:30
laurenspriem
61c1847d75 [mob][photos] Move 2024-08-28 10:19:39 +02:00
Manav Rathi
b922d135c5 [docs] Add a intro to backup FAQ since this question keeps coming up (#3013)
e.g. https://github.com/ente-io/ente/discussions/3009
2024-08-28 13:34:56 +05:30
Manav Rathi
aedf659144 Link 2024-08-28 13:31:50 +05:30
Manav Rathi
ca3ec5e94c pretty 2024-08-28 13:30:02 +05:30
Manav Rathi
e605d4c0df [docs] Add a intro to backup FAQ since this question keeps coming up
e.g. https://github.com/ente-io/ente/discussions/3009
2024-08-28 13:28:45 +05:30
Tanguy
74377a93d8 Fix #2018 2024-08-28 13:17:01 +05:30
Manav Rathi
d9d286d94e [desktop] Cluster debugging page (#3012) 2024-08-28 13:13:02 +05:30
Manav Rathi
8e87ebd50b Inline 2024-08-28 12:14:03 +05:30
Manav Rathi
87750805ae Inline 2024-08-28 11:44:29 +05:30
Manav Rathi
9908cf5a29 Debug code 2024-08-28 10:48:10 +05:30
Manav Rathi
0657b16002 Debugging page 2024-08-28 10:09:19 +05:30
Manav Rathi
703ba3ef6e [desktop] Clustering WIP - Part x/x (#3003) 2024-08-27 20:04:21 +05:30
Manav Rathi
3a64b675bb [server] Minor copy change (#3002)
## Description

## Tests
2024-08-27 20:03:25 +05:30
Manav Rathi
cfe9178301 Experiment to try and reduce the latency 2024-08-27 20:00:38 +05:30
Neeraj Gupta
b3d94e9bcf [server] Minor copy change 2024-08-27 19:51:28 +05:30
Manav Rathi
8aac4bf55f Fix 2024-08-27 19:50:39 +05:30
Manav Rathi
ca9c244182 Split 2024-08-27 19:27:31 +05:30
Manav Rathi
c4f81f55d1 Fix 2024-08-27 19:18:30 +05:30
Manav Rathi
8397ed52ce Tweaks 2024-08-27 19:14:34 +05:30
Manav Rathi
92859aa748 Doc 2024-08-27 18:44:51 +05:30
Manav Rathi
1fcc425779 Integrate 2024-08-27 18:31:07 +05:30
Manav Rathi
52bfe0310a Algo 2024-08-27 18:28:52 +05:30
Manav Rathi
1a9a36cb4c Scaffold 2024-08-27 18:18:09 +05:30
Manav Rathi
3f12ff2830 Opt 2024-08-27 18:18:09 +05:30
Manav Rathi
15ba2dd297 Start working on clustering again 2024-08-27 18:18:09 +05:30
Neeraj Gupta
b9dd371676 [mob] bump version 2024-08-27 18:14:57 +05:30
Neeraj Gupta
0f47842b5f [mob] generated files 2024-08-27 18:14:57 +05:30
Manav Rathi
49895a7d7f [web] Show ML option only on desktop (#2997)
This had been accidentally left enabled on web. The ML wouldn't run,
just the option was being shown.
2024-08-27 18:09:50 +05:30
Manav Rathi
520d893fd2 Show ML option only on desktop 2024-08-27 18:05:36 +05:30
Neeraj Gupta
e25d439b9b [server] Update validation for storage bonus 2024-08-27 16:30:04 +05:30
Neeraj Gupta
7103477598 [server] Reduce filedata delete worker count to 1 2024-08-27 16:30:04 +05:30
Neeraj Gupta
b0379e8945 [mob] Fix missing magic search 2024-08-27 16:24:03 +05:30
Crowdin Bot
4649561886 New Crowdin translations by GitHub Action 2024-08-27 16:21:21 +05:30
Laurens Priem
1cfb83ab02 Tiny cleanup (#2986)
## Description

Nothing worth mentioning really.
2024-08-27 12:34:55 +02:00
Laurens Priem
b7eb130a63 Merge branch 'main' into tiny_cleanup 2024-08-27 12:34:48 +02:00
Neeraj Gupta
c2a5f85a02 [mob] Skip untranslated strings 2024-08-27 16:02:33 +05:30
Neeraj Gupta
b9f8f55a30 [mob] Upgrade crowdin config 2024-08-27 15:59:07 +05:30
Neeraj Gupta
5e05e50049 [mob] Fix lint 2024-08-27 15:48:25 +05:30
Neeraj Gupta
cba69a84d3 [mob] Skip exporting untranslated strings for store listing 2024-08-27 15:40:27 +05:30
laurenspriem
8044bd75df [mob][photos] stop annoying analyzer emphasis 2024-08-27 12:09:51 +02:00
laurenspriem
9b82ba22a3 [mob][photos] Remove last tflite remnants 2024-08-27 11:41:59 +02:00
Neeraj Gupta
ac3061a232 Revert "[mob]Remove dst from crowdin template"
This reverts commit 4278e9c474.
2024-08-27 14:42:20 +05:30
Neeraj Gupta
4278e9c474 [mob]Remove dst from crowdin template 2024-08-27 14:35:04 +05:30
Ashil
3be95042a3 [mob][photos] update flutter version in README.md (#2978) 2024-08-27 14:18:30 +05:30
ashilkn
b1f3b440f7 [mob][photos] changes in pubspec.lock 2024-08-27 14:18:17 +05:30
ashilkn
55b4ce8326 [mob][photos] Update flutter version in github workflows 2024-08-27 14:09:27 +05:30
ashilkn
6c5dd38dbf [mob][photos] Update flutter version to 3.24.1 in README.md 2024-08-27 14:06:50 +05:30
Laurens Priem
3f9f554b4c ML file download logs (#2979)
## Description

More logging regarding download/obtaining file for ML indexing
2024-08-27 10:33:29 +02:00
Crowdin Bot
2450dcf4c2 New Crowdin translations by GitHub Action 2024-08-27 13:57:19 +05:30
laurenspriem
7718da93a5 [mob][photos] Logs 2024-08-27 10:23:15 +02:00
ashilkn
ef01223d9d [mob][photos] update flutter version in README.md 2024-08-27 13:49:28 +05:30
laurenspriem
d299f94518 [mob][photos] More logs 2024-08-27 10:11:12 +02:00
laurenspriem
375260d701 [mob][photos] Better logging for image retrieval 2024-08-27 10:05:31 +02:00
Manav Rathi
dc49a59111 [desktop] Specify an action version (#2977)
Apparently, specifying something after the @ is necessary. Without this,
the action stopped working.

Updates https://github.com/ente-io/ente/pull/2976.
2024-08-27 13:21:01 +05:30
Manav Rathi
13dea41c97 [desktop] Specify an action version
Apparently, specifying something after the @ is necessary. Without this, the
action stopped working.
2024-08-27 12:54:55 +05:30
Manav Rathi
3e4f8e7041 [desktop] Use latest version of our updated fork of the electron-builder action (#2976)
So that it refs this commit

eff78a1d33
2024-08-27 12:45:06 +05:30
Manav Rathi
f3860a077e [desktop] Use latest version of our updated fork of the electron-builder action
So that it refs this commit
eff78a1d33
2024-08-27 12:44:33 +05:30
Manav Rathi
cee429abdb Update the docs around ffmpeg on Intel macOS (#2974) 2024-08-27 12:40:28 +05:30
Manav Rathi
80b86189d0 Update the docs around ffmpeg on Intel macOS 2024-08-27 12:39:51 +05:30
Neeraj Gupta
4ecc64e478 [server] Handle case when no entry exists in trash 2024-08-27 12:35:24 +05:30
Manav Rathi
46e1552f1e [server] Cache count improvement (#2972)
## Description
This does not handle the case where the server might get multiple
request for same user to get the count, and the file count is not cached
yet.

## Tests
2024-08-27 12:15:09 +05:30
Manav Rathi
34183aab64 [desktop] Fix broken nightly builds due to ajv (#2971)
I'm not sure why it started happening now. Earlier I thought it was
because of this - https://github.com/ente-io/ente/pull/2969 - but that
was a red-herring (I think!), instead this likely got triggered because
of

eff78a1d33.

This change fixed the issue locally, will see if it works on CI too.

Workaround from:
https://github.com/ajv-validator/ajv/issues/2443#issuecomment-2147026958
2024-08-27 12:04:29 +05:30
Neeraj Gupta
e32facf3e6 [server] Refresh fileCount only if trash or usage changed 2024-08-27 12:01:00 +05:30
Manav Rathi
571d721925 [desktop] Fix broken nightly builds due to ajv
I'm not sure why it started happening now. Earlier I thought it was because of
this - https://github.com/ente-io/ente/pull/2969 - but that was a red-herring (I
think!), instead this likely got triggered because of
eff78a1d33.

This change fixed the issue locally, will see if it works on CI too.

Workaround from:
https://github.com/ajv-validator/ajv/issues/2443#issuecomment-2147026958
2024-08-27 12:00:40 +05:30
Manav Rathi
f1e91ab11a [server] Allow adding bonus storage (#2970)
## Description

## Tests
2024-08-27 11:44:00 +05:30
Neeraj Gupta
a5b289d290 [server] Allow 200,1TB, & 2TB 2024-08-27 11:36:26 +05:30
Neeraj Gupta
0925f7f0a2 [server] Allow adding support bonus 2024-08-27 11:32:48 +05:30
Neeraj Gupta
bf7f1d43c0 [server] Update endpoint 2024-08-27 11:26:59 +05:30
Neeraj Gupta
e0eda79a91 [server] Refactor 2024-08-27 11:20:27 +05:30
Neeraj Gupta
9334540e1e [server] Rename 2024-08-27 11:14:34 +05:30
Neeraj Gupta
f67516f696 [server] Remove duplicate code 2024-08-27 10:56:56 +05:30
Manav Rathi
5663378bf2 [desktop] Fix macOS universal binaries (#2969)
The previous approach worked, but we ran into some other issues

    Uncaught Exception:
    Error: Cannot find module 'ajv/dist/compile/codegen'
    Require stack:
-
/Applications/ente.app/Contents/Resources/app.asar/node_modules/ajv-formats/dist/limit.js

As an alternative, try to use the yarn equivalent(-ish).
2024-08-27 10:52:49 +05:30
Manav Rathi
45c4d1c623 [server] Remove unused endpoint (#2968)
## Description

## Tests
2024-08-27 10:51:47 +05:30
Manav Rathi
7129b2822b [desktop] Fix macOS universal binaries
The previous approach worked, but we ran into some other issues

    Uncaught Exception:
    Error: Cannot find module 'ajv/dist/compile/codegen'
    Require stack:
    - /Applications/ente.app/Contents/Resources/app.asar/node_modules/ajv-formats/dist/limit.js

As an alternative, try to use the yarn equivalent(-ish).
2024-08-27 10:50:51 +05:30
Neeraj Gupta
65497862ea [server] Remove unused endpoint 2024-08-27 10:48:56 +05:30
Manav Rathi
e2c3b625db [server] Log slow replication upload (#2966)
## Description

## Tests
2024-08-27 10:07:40 +05:30
Manav Rathi
acfbcf1cf4 [desktop] Fix action (#2967)
Fix for https://github.com/ente-io/ente/pull/2965
2024-08-27 10:03:27 +05:30
Manav Rathi
c1327fd8aa [desktop] Fix action
Fix for https://github.com/ente-io/ente/pull/2965
2024-08-27 10:02:45 +05:30
Neeraj Gupta
706bb12273 [server] Log slow replication 2024-08-27 10:00:06 +05:30
Manav Rathi
323f027a9d [desktop] Create ffmpeg universal binaries for macOS (#2965)
Tested locally, still need to run it as a GitHub action to verify that
it is working as intended.

Refs:
-
https://www.npmjs.com/package/ffmpeg-static#electron--other-cross-platform-packaging-tools
- https://github.com/eugeneware/ffmpeg-static/issues/35
- https://github.com/eugeneware/ffmpeg-static/issues/136
2024-08-27 09:57:35 +05:30
Manav Rathi
248d8e09a9 [desktop] Create ffmpeg universal binaries for macOS
Tested locally, still need to run it as a GitHub action to verify that it is
working as intended.

Refs:
- https://www.npmjs.com/package/ffmpeg-static#electron--other-cross-platform-packaging-tools
- https://github.com/eugeneware/ffmpeg-static/issues/35
- https://github.com/eugeneware/ffmpeg-static/issues/136
2024-08-27 09:54:30 +05:30
Manav Rathi
716b1be234 [meta] Run PRs lint checks for pull requests from external forks (#2959)
Currently, for PRs opened by external contributors, the various lint
checks don't run (sometimes causing code that fails basic lint checks to
be committed to main).

<img width="796" alt="Screenshot 2024-08-26 at 21 56 01"
src="https://github.com/user-attachments/assets/d7607c65-1849-4ec3-ae0e-011161015fce">

From my current understanding (I find the docs around this confusing -
I'm not sure about this), we need to instead use "pull_request". Refs:

*
https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#pull_request
*
https://securitylab.github.com/resources/github-actions-preventing-pwn-requests/

Note that even then, we will need a manual step to approve running the
lints for first time contributors. Which is fine, at least we'll see the
option, unlike right now where they just can't be run until the code
hits main.

<img width="542" alt="Screenshot 2024-08-26 at 21 56 17"
src="https://github.com/user-attachments/assets/d5281a04-c6f8-4bd6-b368-b4bd99b943ef">
2024-08-27 08:06:53 +05:30
Neeraj Gupta
8f5f1a22ee [auth] Fix Aegis import without group 2024-08-27 05:16:05 +05:30
Vishnu Mohandas
f9b740b683 Update docs (#2961) 2024-08-26 22:33:28 +05:30
vishnukvmd
2f0cef6ab9 [docs] Add FAQ 2024-08-26 22:32:44 +05:30
Manav Rathi
8813b0cf1c [meta] Run PRs lint checks for pull requests from external forks
Currently, for PRs opened by external contributors, the various lint checks
don't run (sometimes causing code that fails basic lint checks to be committed
to main).

From my current understanding (I find the docs around this confusing), we need
to instead use the "pull_request" target. Refs:

* https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#pull_request
* https://securitylab.github.com/resources/github-actions-preventing-pwn-requests/

Note that even then, we will need a manual step to approve running the lints for
first time contributors. Which is fine, at least we'll see the option, unlike
right now where they just can't be run until the code hits main.
2024-08-26 21:50:04 +05:30
vishnukvmd
fd4026f27a [doc] Update information about lost password + recovery key 2024-08-26 21:43:25 +05:30
303 changed files with 16485 additions and 5147 deletions

View File

@@ -1,15 +1,14 @@
name: "Lint (auth)"
on:
# Run on every push to a branch other than main that changes auth/
push:
branches-ignore: [main]
# Run on every pull request (open or push to it) that changes auth/
pull_request:
paths:
- "auth/**"
- ".github/workflows/auth-lint.yml"
env:
FLUTTER_VERSION: "3.24.0"
FLUTTER_VERSION: "3.24.1"
jobs:
lint:

View File

@@ -29,7 +29,7 @@ on:
- "auth-v*"
env:
FLUTTER_VERSION: "3.24.0"
FLUTTER_VERSION: "3.24.1"
jobs:
build-ubuntu:

View File

@@ -1,9 +1,8 @@
name: "Lint (desktop)"
on:
# Run on every push to a branch other than main that changes desktop/
push:
branches-ignore: [main]
# Run on every pull request (open or push to it) that changes desktop/
pull_request:
paths:
- "desktop/**"
- ".github/workflows/desktop-lint.yml"

View File

@@ -4,9 +4,8 @@ name: "Verify build (docs)"
# succeeding before we merge the PR into main.
on:
# Run on every push to a branch other than main that changes docs/
push:
branches-ignore: [main]
# Run on every pull request (open or push to it) that changes docs/
pull_request:
paths:
- "docs/**"
- ".github/workflows/docs-verify-build.yml"

View File

@@ -1,9 +1,8 @@
name: "Lint (staff)"
on:
# Run on every push to a branch other than main that changes infra/staff/
push:
branches-ignore: [main]
# Run on every pull request (open or push to it) that changes infra/staff/
pull_request:
paths:
- "infra/staff/**"
- ".github/workflows/infra-deploy-staff.yml"

View File

@@ -26,7 +26,6 @@ jobs:
download_translations: true
localization_branch_name: translations/mobile
create_pull_request: true
skip_untranslated_strings: true
pull_request_title: "[mobile] New translations"
pull_request_body: "New translations from [Crowdin](https://crowdin.com/project/ente-photos-app)"
pull_request_base_branch_name: "main"

View File

@@ -4,7 +4,7 @@ on:
workflow_dispatch: # Allow manually running the action
env:
FLUTTER_VERSION: "3.22.2"
FLUTTER_VERSION: "3.24.1"
jobs:
build:

View File

@@ -1,16 +1,15 @@
name: "Lint (mobile)"
on:
# Run on every push to a branch other than main that changes mobile/
push:
branches-ignore: [main, f-droid]
# Run on every pull request (open or push to it) that changes mobile/
pull_request:
paths:
- "mobile/**"
- ".github/workflows/mobile-lint.yml"
env:
FLUTTER_VERSION: "3.22.2"
FLUTTER_VERSION: "3.24.1"
jobs:
lint:

View File

@@ -9,7 +9,7 @@ on:
- "photos-v*"
env:
FLUTTER_VERSION: "3.22.2"
FLUTTER_VERSION: "3.24.1"
jobs:
build:

View File

@@ -1,9 +1,8 @@
name: "Lint (server)"
on:
# Run on every push to a branch other than main that changes server/
push:
branches-ignore: [main]
# Run on every pull request (open or push to it) that changes server/
pull_request:
paths:
- "server/**"
- ".github/workflows/server-lint.yml"

View File

@@ -1,9 +1,8 @@
name: "Lint (web)"
on:
# Run on every push to a branch other than main that changes web/
push:
branches-ignore: [main]
# Run on every pull request (open or push to it) that changes web/
pull_request:
paths:
- "web/**"
- ".github/workflows/web-lint.yml"

View File

@@ -57,7 +57,7 @@ android {
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion 21
targetSdkVersion 33
targetSdkVersion 34
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@@ -1 +1 @@
Auth is a FOSS authenticator app that provides end-to-end encrypted backups for your 2FA secrets.
Auth is a FOSS authenticator app that provides end-to-end encrypted backups for your 2FA secrets.

View File

@@ -17,6 +17,9 @@
"title": "airtm",
"hex": "000000"
},
{
"title": "Amazon"
},
{
"title": "Anycoin Direct",
"slug": "anycoindirect"
@@ -24,6 +27,27 @@
{
"title": "AscendEX"
},
{
"title": "Battle.net",
"slug": "battlenet",
"altNames": [
"Battle net",
"Blizzard"
]
},
{
"title": "Bethesda",
"altNames": [
"Bethesda Softworks"
]
},
{
"title": "BinanceUS",
"slug": "binance_us",
"altNames": [
"Binance US"
]
},
{
"title": "Bitfinex"
},
@@ -31,12 +55,12 @@
"title": "bitget"
},
{
"titile":"bitget wallet",
"slug":"bitget_wallet"
"title": "bitget wallet",
"slug": "bitget_wallet"
},
{
"title": "Bitmart",
"hex":"000000"
"hex": "000000"
},
{
"title": "BitMEX"
@@ -51,8 +75,7 @@
"title": "Bitstamp"
},
{
"title": "Bitvavo",
"hex": "0051FF"
"title": "Bitvavo"
},
{
"title": "Bitwarden"
@@ -70,27 +93,24 @@
"blockchain.com",
"blockchain.com Wallet",
"blockchain.com Exchange"
],
"slug": "blockchain"
]
},
{
"title": "BorgBase",
"altNames": [
"borg"
],
"slug": "BorgBase"
]
},
{
"title": "Booking",
"slug": "booking",
"altNames":[
"altNames": [
"Booking.com"
]
},
{
"title": "Brave Creators",
"slug": "brave_creators",
"altNames":[
"altNames": [
"Brave",
"Brave Rewards",
"Brave Browser"
@@ -110,15 +130,11 @@
"slug": "cih",
"hex": "D14633"
},
{
"title": "Cloudflare"
},
{
"title": "CloudAMQP"
},
{
"title": "ConfigCat",
"slug": "configcat"
"title": "Cloudflare"
},
{
"title": "CoinDCX"
@@ -128,8 +144,7 @@
},
{
"title": "Control D",
"slug": "controld",
"hex": "5FD800"
"slug": "controld"
},
{
"title": "Crowdpear"
@@ -139,7 +154,6 @@
"slug": "crypto",
"altNames": [
"crypto",
"Crypto.com",
"Crypto com"
]
},
@@ -147,8 +161,7 @@
"title": "DCS",
"altNames": [
"Digital Combat Simulator"
],
"slug": "dcs"
]
},
{
"title": "DEGIRO"
@@ -173,16 +186,22 @@
"slug": "dusnet"
},
{
"title":"ecitizen kenya",
"slug":"ecitizen_kenya"
"title": "ecitizen kenya",
"slug": "ecitizen_kenya"
},
{
"title": "ecloud",
"altNames": [
"Murena"
]
},
{
"title": "ente",
"hex": "1DB954"
},
{
"title": "enom"
},
"title": "enom"
},
{
"title": "Epic Games",
"slug": "epic_games",
@@ -218,10 +237,10 @@
},
{
"title": "Gosuslugi",
"slug": "Gosuslugi",
"altNames": [
"Госуслуги"
],
"slug": "Gosuslugi"
]
},
{
"title": "Habbo"
@@ -240,16 +259,13 @@
"title": "HuggingFace",
"altNames": [
"Hugging Face"
],
"slug": "huggingface"
]
},
{
"title": "IceDrive",
"slug": "Icedrive"
"title": "IceDrive"
},
{
"titile": "Infomaniak",
"slug": "infomaniak"
"title": "Infomaniak"
},
{
"title": "ING"
@@ -270,8 +286,7 @@
"hex": "000000"
},
{
"title": "IVPN",
"slug": "IVPN"
"title": "IVPN"
},
{
"title": "Jagex",
@@ -281,8 +296,7 @@
"title": "Kagi"
},
{
"title": "Kick",
"hex": "53FC19"
"title": "Kick"
},
{
"title": "Kite"
@@ -295,15 +309,13 @@
"color": "00CC00"
},
{
"title": "Kraken",
"hex": "5848D5"
"title": "Kraken"
},
{
"title": "Kronos"
},
{
"title": "KuCoin",
"hex": "01BC8D"
"title": "KuCoin"
},
{
"title": "La Poste",
@@ -333,7 +345,6 @@
"mathstodon",
"fosstodon"
],
"slug": "mastodon",
"hex": "6364FF"
},
{
@@ -364,13 +375,6 @@
{
"title": "Mozilla"
},
{
"title": "Murena",
"altNames": [
"eCloud"
],
"slug": "ecloud"
},
{
"title": "MyFRITZ!Net",
"slug": "myfritz",
@@ -406,6 +410,12 @@
{
"title": "NextDNS"
},
{
"title": "Newton",
"altNames": [
"Newton Crypto"
]
},
{
"title": "ngrok",
"hex": "858585"
@@ -420,8 +430,7 @@
"title": "Notion"
},
{
"title": "NuCommunity",
"slug": "nucommunity"
"title": "NuCommunity"
},
{
"title": "NVIDIA"
@@ -430,16 +439,17 @@
"title": "Odido"
},
{
"titile": "OpenObserve",
"title": "OpenObserve",
"slug": "open_observe",
"altNames":[
"altNames": [
"openobserve.ai",
"openobserve ai"
]
},
{
"title": "okx",
"hex": "000000" },
"hex": "000000"
},
{
"title": "Parsec"
},
@@ -447,16 +457,13 @@
"title": "PayPal"
},
{
"title": "pCloud",
"slug": "pCloud"
"title": "pCloud"
},
{
"title": "Peerberry",
"hex": "03E5A5"
"title": "Peerberry"
},
{
"title": "Pingvin Share",
"hex": "485099"
"title": "Pingvin Share"
},
{
"title": "Plutus",
@@ -466,12 +473,10 @@
"title": "Poloniex"
},
{
"title": "Porkbun",
"hex": "F27777"
"title": "Porkbun"
},
{
"title": "PostNL",
"color": "EF8300"
"title": "PostNL"
},
{
"title": "Privacy Guides",
@@ -495,7 +500,6 @@
"title": "Registro br",
"slug": "registro_br",
"altNames": [
"Registro br",
"registrobr",
"Registro.br"
]
@@ -507,13 +511,15 @@
"title": "Revolt",
"hex": "858585"
},
{
"title": "RippleMatch"
},
{
"title": "Rockstar Games",
"slug": "rockstar_games"
},
{
"title": "RuneMate",
"hex": "2ECC71"
"title": "RuneMate"
},
{
"title": "Rust Language Forum",
@@ -529,6 +535,9 @@
{
"title": "service-bw"
},
{
"title": "Shakepay"
},
{
"title": "SimpleLogin"
},
@@ -551,16 +560,14 @@
]
},
{
"title": "SMTP2GO",
"slug": "smtp2go"
"title": "SMTP2GO"
},
{
"title": "Snapchat"
},
{
"title": "Standard Notes",
"slug": "standardnotes",
"hex": "2173E6"
"slug": "standardnotes"
},
{
"title": "Surfshark"
@@ -570,9 +577,7 @@
"slug": "synology_dsm"
},
{
"title": "TCPShield",
"slug": "tcpshield",
"hex": "FFFFFF"
"title": "TCPShield"
},
{
"title": "Techlore",
@@ -596,9 +601,7 @@
"title": "TorGuard"
},
{
"title": "Trading 212",
"slug": "trading212",
"hex": "4BA4DE"
"title": "Trading 212"
},
{
"title": "TradingView"
@@ -635,13 +638,16 @@
"hex": "858585"
},
{
"title": "Uphold",
"slug": "uphold",
"hex": "6FE68A"
"title": "Uphold"
},
{
"titile": "Vikunja",
"slug": "vikunja"
"title": "Upstox"
},
{
"title": "Vikunja"
},
{
"title": "Wealthfront"
},
{
"title": "Wealthsimple"
@@ -656,74 +662,30 @@
{
"title": "Wise"
},
{
"title": "WYZE",
"slug": "wyze"
},
{
"title": "WorkOS",
"slug": "workos",
"altNames": [
"Work OS"
]
},
{
"title": "X",
"altNames": [
"twitter"
],
"slug": "x"
"title": "WYZE"
},
{
"title": "yahoo"
},
{
"title": "Yandex",
"altNames": [
"Ya",
"Яндекс"
],
"slug": "Yandex"
},
{
"title": "yahoo"
]
},
{
"title": "YNAB",
"altNames": [
"You Need A Budget"
],
"slug": "ynab",
"hex": "3B5EDA"
},
{
"title": "Shakepay",
"slug": "shakepay"
},
{
"title": "Newton",
"altNames": ["Newton Crypto"],
"slug": "newton"
},
{
"title": "T-Mobile ID",
"altNames": [
"T-Mobile"
],
"slug": "t-mobile"
},
{
"title": "Wealthfront",
"slug": "wealthfront"
},
{
"title": "BinanceUS",
"altNames": [
"Binance US"
],
"slug": "binance_us"
},
{
"title": "Bethesda Softworks",
"altNames": ["Bethesda"],
"slug": "bethesda"
]
}
]
}
}

View File

@@ -0,0 +1,6 @@
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M442.375 441.562C390.672 479.687 315.75 500 251.25 500C160.625 500 79.344 466.562 17.7346 410.89C13.0471 406.515 17.2346 400.547 23.0471 403.953C89.5315 442.656 171.875 465.937 256.656 465.937C317.884 465.655 378.451 453.272 434.875 429.5C443.625 425.781 450.969 435.218 442.375 441.562ZM463.875 416.968C457.313 408.531 420.188 412.984 403.563 414.937C398.485 415.562 397.719 411.14 402.281 407.968C431.969 387.187 480.313 393.172 485.969 400.156C491.625 407.14 484.5 455.781 456.75 478.968C452.485 482.531 448.422 480.64 450.5 475.906C456.75 460.343 470.719 425.437 464.094 416.968" fill="#FF9900"/>
<g style="mix-blend-mode:difference">
<path fill-rule="evenodd" clip-rule="evenodd" d="M287.969 216.625C287.969 243.063 288.641 265.109 275.281 288.578C264.344 307.641 247.156 319.406 228.328 319.406C202.281 319.406 187.016 299.563 187.016 270.266C187.016 212.453 238.828 201.938 287.984 201.938L287.969 216.625ZM356.422 382C351.938 386.016 345.453 386.297 340.391 383.625C317.891 364.922 313.766 356.234 301.453 338.391C264.234 376.359 237.797 387.719 189.609 387.719C132.453 387.719 88.0781 352.5 88.0781 281.984C88.0781 226.922 117.844 189.422 160.422 171.094C197.25 154.875 248.703 152.031 288 147.656V139.062C288 122.938 289.25 103.844 279.719 89.9219C271.516 77.4219 255.656 72.2656 241.641 72.2656C215.781 72.2656 192.781 85.5469 187.156 113.016C186.016 119.266 181.531 125.141 175.328 125.422L109.375 118.047C103.844 116.797 97.6563 112.328 99.2656 103.984C114.5 24.0625 186.641 0 251.156 0C284.172 0 327.313 8.78125 353.344 33.7812C386.359 64.6094 383.219 105.734 383.219 150.5V256.25C383.219 288.031 396.391 301.953 408.797 319.141C413.094 325.391 414.047 332.578 408.516 337.172C391.003 351.98 373.669 366.997 356.516 382.219L356.422 382.031" fill="white"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,10 @@
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_181_130)">
<path d="M394.583 172.833C331.25 143.583 240.292 125 154.708 131.917C159 103.583 169.583 83.8334 186.958 79.6667C210.875 73.9376 236.958 89.6667 261.833 118.292C278.125 120.417 297.458 124.125 310.896 127.229C265.562 41.9375 204.75 -5.87495 158.479 11.7709C123.312 25.1876 105.292 73.6459 107.479 138.729C61.6457 148.479 25.9166 165.813 3.04156 190.708C1.8749 192.063 -0.729272 195.438 0.187395 197.063C0.895728 198.271 3.22906 196.896 4.22906 196.229C30.7707 177.688 64.7291 167.625 108.958 161.313C115.271 230.75 144.646 318.813 193.437 389.479C166.771 399.938 144.354 400.646 132.062 387.667C115.146 369.833 115.729 339.375 128.104 303.5C121.802 288.106 116.192 272.437 111.292 256.542C60.0624 338.5 49.0832 415.083 87.4791 446.333C116.687 470.083 167.625 461.438 222.937 427.042C254.292 461.875 287.167 484.125 320.167 491.5C321.917 491.813 326.146 492.396 327.083 490.792C327.792 489.542 325.417 488.208 324.354 487.688C295.021 474 269.354 449.604 241.771 414.458C298.75 374.271 360.333 304.813 397.125 227.208C419.542 245.125 431.292 264.146 426.25 281.271C419.25 304.833 392.604 319.604 355.354 326.792C345.157 339.931 334.397 352.624 323.104 364.833C419.646 368.167 491.437 339.417 499.312 290.563C505.271 253.354 472.333 213.563 414.875 182.854C429.375 138.292 432.208 98.6876 422.083 66.4376C421.479 64.7709 419.875 60.8126 418 60.8126C416.583 60.8126 416.604 63.5209 416.687 64.7084C419.5 96.9376 411.208 131.375 394.562 172.833H394.583ZM216.812 378.438C175.979 312.917 152.437 235.75 152.604 157.729C229.729 155.146 308.312 173.313 375.812 212.458C339.5 280.563 284.458 339.542 216.792 378.417L216.812 378.438Z" fill="#148EFF"/>
</g>
<defs>
<clipPath id="clip0_181_130">
<rect width="500" height="500" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -1,3 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 430.964 500">
<path d="m156.633 323.503-6.557 16.51h12.996l-6.439-16.51Zm38.498-171.881v-48.197c0-7.683-3.53-11.231-10.894-11.231h-11.986v70.676h11.986c7.364 0 10.894-3.564 10.894-11.23v-.018ZM391.791 0H39.138C10.524 0 0 10.541 0 39.138V384.21l.42 9.027c.64 6.255.791 12.307 6.591 19.165 2.11 1.765 4.28 3.458 6.505 5.078l8.961 4.169 173.646 72.743c9.027 4.119 12.777 5.75 19.333 5.598h.05c6.557.135 10.306-1.479 19.335-5.598l173.645-72.743 8.961-4.169 6.505-5.077c5.8-6.893 5.934-12.945 6.591-19.165.293-3.001.433-6.014.42-9.029V39.155c0-28.614-10.558-39.138-39.138-39.138h-.033V0h-.001ZM237.447 66.441h29.168v191.715h-29.168V66.44v.001Zm1.966 238.403h16.98v57.999h-16.004v-33.32l-14.829 22.695h-.337l-14.743-22.527v33.151h-15.752v-57.999h16.979l13.837 22.477 13.835-22.477h.034v.001ZM143.083 66.44h45.778c23.704 0 35.438 11.768 35.438 35.607v50.938c0 23.822-11.717 35.607-35.438 35.607h-16.61v69.582h-29.168V66.439v.001Zm-79.501 0h64.875v26.561H92.75v54.216h34.346v26.562H92.75v57.798h36.262v26.562h-65.43V66.44Zm55.763 288.635c-6.136 5.044-14.676 8.944-25.183 8.944-18.073 0-31.572-12.439-31.572-30.008v-.168c0-16.896 13.247-30.177 31.235-30.177 10.205 0 17.401 3.143 23.536 8.457l-9.447 11.347c-4.153-3.48-8.289-5.464-14.005-5.464-8.372 0-14.828 7.027-14.828 15.921v.168c-.466 8.938 6.806 16.366 15.752 16.088 3.901 0 6.893-.84 9.281-2.403v-7.028H92.683v-11.769h26.68v26.11l-.018-.018Zm29.672-50.635h15.5l24.679 58.419h-17.231l-4.236-10.373h-22.393l-4.154 10.373h-16.894l24.678-58.419h.052-.001Zm65.128 155.186-81.736-28.108h166.955l-85.218 28.109-.001-.001Zm99.978-96.75h-47.072v-57.999h46.652v13.667h-30.732v8.793h27.857v12.693h-27.857v9.195h31.169v13.668-.034l-.017.017Zm-32.06-138.677V100.398c0-23.822 11.717-35.607 35.438-35.607h14.172c23.704 0 35.169 11.517 35.169 35.338V139.3H338.23v-37.523c0-7.682-3.564-11.23-10.894-11.23h-4.91c-7.615 0-11.178 3.564-11.178 11.23V222.82c0 7.682 3.563 11.23 11.178 11.23h5.465c7.363 0 10.893-3.565 10.893-11.23v-43.256h28.614v44.634c0 23.822-11.718 35.624-35.439 35.624h-14.458c-23.704 0-35.438-11.768-35.438-35.623Zm86.831 120.772c0 11.853-9.364 18.88-23.452 18.88-10.289 0-20.056-3.228-27.185-9.616l8.944-10.709a29.76 29.76 0 0 0 18.795 6.944c4.321 0 6.641-1.48 6.641-3.985v-.168c0-2.404-1.9-3.732-9.784-5.548-12.357-2.824-21.889-6.304-21.889-18.241v-.168c0-10.793 8.541-18.576 22.477-18.576 9.868 0 17.568 2.656 23.872 7.699l-8.036 11.349c-5.295-3.733-11.095-5.717-16.256-5.717-3.901 0-5.8 1.648-5.8 3.733v.167c0 2.656 1.983 3.817 10.036 5.633 13.331 2.908 21.637 7.195 21.637 18.071v.252Z"/>
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
<g style="mix-blend-mode:difference">
<path d="M191.633 323.503L185.076 340.013H198.072L191.633 323.503ZM230.131 151.622V103.425C230.131 95.742 226.601 92.194 219.237 92.194H207.251V162.87H219.237C226.601 162.87 230.131 159.306 230.131 151.64V151.622ZM426.791 0H74.138C45.524 0 35 10.541 35 39.138V384.21L35.42 393.237C36.06 399.492 36.211 405.544 42.011 412.402C44.121 414.167 46.291 415.86 48.516 417.48L57.477 421.649L231.123 494.392C240.15 498.511 243.9 500.142 250.456 499.99H250.506C257.063 500.125 260.812 498.511 269.841 494.392L443.486 421.649L452.447 417.48L458.952 412.403C464.752 405.51 464.886 399.458 465.543 393.238C465.836 390.237 465.976 387.224 465.963 384.209V39.155C465.963 10.541 455.405 0.017 426.825 0.017H426.792V0H426.791ZM272.447 66.441H301.615V258.156H272.447V66.441ZM274.413 304.844H291.393V362.843H275.389V329.523L260.56 352.218H260.223L245.48 329.691V362.842H229.728V304.843H246.707L260.544 327.32L274.379 304.843H274.413V304.844ZM178.083 66.44H223.861C247.565 66.44 259.299 78.208 259.299 102.047V152.985C259.299 176.807 247.582 188.592 223.861 188.592H207.251V258.174H178.083V66.44ZM98.582 66.44H163.457V93.001H127.75V147.217H162.096V173.779H127.75V231.577H164.012V258.139H98.582V66.44ZM154.345 355.075C148.209 360.119 139.669 364.019 129.162 364.019C111.089 364.019 97.59 351.58 97.59 334.011V333.843C97.59 316.947 110.837 303.666 128.825 303.666C139.03 303.666 146.226 306.809 152.361 312.123L142.914 323.47C138.761 319.99 134.625 318.006 128.909 318.006C120.537 318.006 114.081 325.033 114.081 333.927V334.095C113.615 343.033 120.887 350.461 129.833 350.183C133.734 350.183 136.726 349.343 139.114 347.78V340.752H127.683V328.983H154.363V355.093L154.345 355.075ZM184.017 304.44H199.517L224.196 362.859H206.965L202.729 352.486H180.336L176.182 362.859H159.288L183.966 304.44H184.018H184.017ZM249.145 459.626L167.409 431.518H334.364L249.146 459.627L249.145 459.626ZM349.123 362.876H302.051V304.877H348.703V318.544H317.971V327.337H345.828V340.03H317.971V349.225H349.14V362.893V362.859L349.123 362.876ZM317.063 224.199V100.398C317.063 76.576 328.78 64.791 352.501 64.791H366.673C390.377 64.791 401.842 76.308 401.842 100.129V139.3H373.23V101.777C373.23 94.095 369.666 90.547 362.336 90.547H357.426C349.811 90.547 346.248 94.111 346.248 101.777V222.82C346.248 230.502 349.811 234.05 357.426 234.05H362.891C370.254 234.05 373.784 230.485 373.784 222.82V179.564H402.398V224.198C402.398 248.02 390.68 259.822 366.959 259.822H352.501C328.797 259.822 317.063 248.054 317.063 224.199ZM403.894 344.971C403.894 356.824 394.53 363.851 380.442 363.851C370.153 363.851 360.386 360.623 353.257 354.235L362.201 343.526C367.475 347.944 374.117 350.397 380.996 350.47C385.317 350.47 387.637 348.99 387.637 346.485V346.317C387.637 343.913 385.737 342.585 377.853 340.769C365.496 337.945 355.964 334.465 355.964 322.528V322.36C355.964 311.567 364.505 303.784 378.441 303.784C388.309 303.784 396.009 306.44 402.313 311.483L394.277 322.832C388.982 319.099 383.182 317.115 378.021 317.115C374.12 317.115 372.221 318.763 372.221 320.848V321.015C372.221 323.671 374.204 324.832 382.257 326.648C395.588 329.556 403.894 333.843 403.894 344.719V344.971Z" fill="white"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -1,18 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
<defs>
<linearGradient id="a" x1=".425" x2="0" y1=".821" y2="0">
<stop stop-color="#F4AAFF" stop-opacity="0"/>
<stop offset="1" stop-color="#F000FB" stop-opacity=".4"/>
</linearGradient>
<linearGradient id="b" x1=".365" x2="0" y1=".566" y2="-.048">
<stop stop-color="#F7D2FE" stop-opacity="0"/>
<stop offset="1" stop-color="#F7D2FE"/>
</linearGradient>
</defs>
<g stroke="null">
<rect width="500" height="500" fill="#7132F5" rx="64"/>
<rect width="500" height="500" fill="url(#a)" fill-opacity=".64" rx="64"/>
<rect width="500" height="500" fill="url(#b)" fill-opacity=".4" rx="64"/>
<path fill="#fff" fill-rule="evenodd" d="M110.63 269.996v60.347c0 11.113 8.888 20.106 19.818 20.106 10.94 0 19.87-8.993 19.87-20.106v-60.347c0-11.129 8.842-20.137 19.828-20.137 10.948 0 19.829 9.008 19.829 20.137v60.347c0 11.113 8.887 20.106 19.827 20.106 10.98 0 19.864-8.993 19.864-20.106v-60.347c0-11.129 8.88-20.137 19.823-20.137 10.991 0 19.878 9.008 19.878 20.137v60.347c0 11.113 8.885 20.106 19.813 20.106 10.941 0 19.829-8.993 19.829-20.106v-60.347c0-11.129 8.883-20.137 19.87-20.137 10.945 0 19.828 9.008 19.828 20.137v60.347c0 11.113 8.888 20.106 19.86 20.106 10.944 0 19.828-8.993 19.828-20.106v-60.347c0-77.78-62.194-140.848-138.906-140.848-76.706 0-138.858 63.067-138.858 140.848z" clip-rule="evenodd"/>
</g>
</svg>
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M233.918 53.5499C277.36 50.6259 321.637 59.3977 360.485 79.0302C418.129 107.435 464.077 158.395 485.38 218.546C494.987 245.279 500 273.266 500 301.67V406.516C500 410.693 500 415.287 499.165 419.465C496.658 429.907 489.14 439.515 479.114 444.11C472.013 447.451 464.077 447.869 456.976 446.616C441.103 443.692 428.571 428.654 428.571 412.364C428.571 379.782 428.571 347.201 428.571 314.619C428.989 305.43 428.989 295.405 423.977 287.468C416.04 272.43 395.99 265.329 380.535 271.595C367.168 276.19 357.561 289.974 357.143 304.176C357.143 337.176 357.143 370.175 357.143 403.174C357.143 409.44 357.561 415.705 355.472 421.553C352.13 433.249 342.523 442.439 330.827 445.78C315.372 449.958 297.828 443.274 290.309 429.072C284.879 420.718 285.297 410.275 285.714 400.668C285.714 367.668 285.714 335.087 285.714 302.088C285.297 285.379 271.512 270.342 255.221 268.253C244.361 266.582 233.083 270.342 225.146 277.861C218.045 284.544 214.286 294.151 214.286 303.759V399.414C214.286 407.351 215.121 415.705 212.197 423.224C207.602 437.009 193.818 447.033 179.198 446.616C164.16 447.451 149.541 437.009 144.946 423.224C142.439 416.123 142.857 409.022 142.857 401.503C142.857 368.504 142.857 335.505 142.857 302.506C142.857 286.215 129.908 271.177 114.035 268.253C99.4152 265.329 83.5422 272.43 76.0234 285.797C73.0994 291.227 71.4286 297.493 71.4286 303.759V411.11C71.4286 421.553 66.8337 431.996 58.8972 438.679C46.7836 449.122 27.1512 449.957 14.6199 440.35C5.43024 434.084 0 423.224 0 411.946V303.341C0 262.405 10.4428 221.47 30.0752 185.129C45.9482 155.471 68.0869 129.155 94.4027 108.27C133.25 75.6885 182.957 56.4739 233.918 53.5499Z" fill="#5741D9"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2500 2500" xmlns:v="https://vecta.io/nano"><path d="M830.3 1250.3l740.5 740.6 467.4-467.4c83.6-75.2 211.4-71.9 290.9 7.6s82.9 207.4 7.6 290.9l-616.8 616.9c-82.9 81.5-215.7 81.5-298.6 0l-889.8-890.1v529c0 116.8-94.6 211.4-211.4 211.4s-211.4-94.6-211.4-211.4V422c0-116.7 94.6-211.4 211.4-211.4S531.5 305.3 531.5 422v529l889.7-889.9c82.8-81.5 215.8-81.5 298.6 0L2337 677.9c75.2 83.6 71.9 211.4-7.6 290.9s-207.4 82.9-290.9 7.6L1571.1 509l-740.8 741.3h0zm740.8-211.7h0c-85.6 0-162.8 51.5-195.6 130.6s-14.7 170.1 45.8 230.7 151.6 78.7 230.7 46c79.1-32.8 130.7-109.9 130.7-195.6a211.87 211.87 0 0 0-61.9-149.7c-39.6-39.7-93.5-62-149.6-62h-.1 0z" fill-rule="evenodd" fill="#23af91"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2500 2500" xmlns:v="https://vecta.io/nano"><path d="M830.3 1250.3l740.5 740.6 467.4-467.4c83.6-75.2 211.4-71.9 290.9 7.6s82.9 207.4 7.6 290.9l-616.8 616.9c-82.9 81.5-215.7 81.5-298.6 0l-889.8-890.1v529c0 116.8-94.6 211.4-211.4 211.4s-211.4-94.6-211.4-211.4V422c0-116.7 94.6-211.4 211.4-211.4S531.5 305.3 531.5 422v529l889.7-889.9c82.8-81.5 215.8-81.5 298.6 0L2337 677.9c75.2 83.6 71.9 211.4-7.6 290.9s-207.4 82.9-290.9 7.6L1571.1 509l-740.8 741.3h0zm740.8-211.7h0c-85.6 0-162.8 51.5-195.6 130.6s-14.7 170.1 45.8 230.7 151.6 78.7 230.7 46c79.1-32.8 130.7-109.9 130.7-195.6a211.87 211.87 0 0 0-61.9-149.7c-39.6-39.7-93.5-62-149.6-62h-.1 0z" fill-rule="evenodd" fill="#01BC8D"/></svg>

Before

Width:  |  Height:  |  Size: 735 B

After

Width:  |  Height:  |  Size: 735 B

View File

@@ -1,30 +1,34 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
<defs>
<linearGradient id="a" x1="0" x2="1" y1="0" y2="0" gradientTransform="rotate(45.043 -14.606 34.73) scale(128.4643)" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#2e79ef"/>
<stop offset="1" stop-color="#389d93"/>
</linearGradient>
<linearGradient id="b" x1="0" x2="1" y1="0" y2="0" gradientTransform="rotate(-90 191.946 -57.554) scale(132.907)" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#fbb94b"/>
<stop offset="1" stop-color="#fc7e27"/>
</linearGradient>
<linearGradient id="c" x1="0" x2="1" y1="0" y2="0" gradientTransform="rotate(-62.181 250.835 -202.634) scale(119.902)" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#fdaf60"/>
<stop offset="1" stop-color="#ab82d5"/>
</linearGradient>
<linearGradient id="d" x1="0" x2="1" y1="0" y2="0" gradientTransform="rotate(45.043 168.839 476.151) scale(130.8827)" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#fc9aa2"/>
<stop offset="1" stop-color="#7269fe"/>
</linearGradient>
<linearGradient id="e" x1="0" x2="1" y1="0" y2="0" gradientTransform="translate(141.309 66.467) scale(66.239)" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#87b391"/>
<stop offset="1" stop-color="#dfb962"/>
</linearGradient>
</defs>
<path stroke="#000" d="M0 0h500v500H0z"/>
<path fill="url(#a)" d="M66.25.299c36.803.028 66.576 29.747 66.549 66.247-.027 36.606-29.845 66.183-66.549 66.155-36.796.071-66.577-29.648-66.549-66.254C-.272 29.947 29.553.272 66.25.299Z" transform="matrix(-.00052 .70126 .70126 .00052 74.86 203.507)"/>
<path fill="url(#b)" d="M216.401 0h66.197v133.099h-66.197z" transform="matrix(.70126 0 0 -.70126 75.035 296.669)"/>
<path fill="url(#c)" d="M291.5 66.599c0-36.704 29.598-66.5 66.197-66.5v133c-36.5 0-66.197-29.802-66.197-66.5Z" transform="matrix(.70126 0 0 -.70126 75.035 296.738)"/>
<path fill="url(#d)" d="M432.75.398c36.803-.071 66.577 29.648 66.549 66.254-.027 36.598-29.845 66.174-66.549 66.147-36.796-.027-66.576-29.747-66.549-66.246C366.228 29.947 396.053.371 432.75.398Z" transform="matrix(-.00052 .70126 .70126 .00052 332.064 -53.506)"/>
<path fill="url(#e)" d="M141.303 0h.222c36.325.12 65.856 29.755 65.975 66.277v.446C207.381 103.319 177.827 133 141.303 133V0Z" transform="matrix(.70126 0 0 -.70126 75.035 296.599)"/>
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_191_1018)">
<path d="M0.0492147 249.67C0.0499258 286.539 29.8004 316.388 66.3661 316.388C103.038 316.388 132.691 286.538 132.69 249.768C132.788 212.906 103.038 183.049 66.3658 183.05C29.8001 183.05 0.0494268 212.907 0.0492147 249.67Z" fill="url(#paint0_linear_191_1018)"/>
<path d="M216.841 316.39H283.157V183.051H216.841V316.39Z" fill="url(#paint1_linear_191_1018)"/>
<path d="M292.074 249.769C292.074 286.539 321.726 316.389 358.39 316.389V183.149C321.825 183.149 292.074 213.005 292.074 249.769Z" fill="url(#paint2_linear_191_1018)"/>
<path d="M367.311 249.669C367.213 286.538 396.963 316.388 433.635 316.387C470.299 316.387 499.95 286.537 499.951 249.767C499.951 212.905 470.199 183.049 433.635 183.049C396.963 183.049 367.311 212.906 367.311 249.669Z" fill="url(#paint3_linear_191_1018)"/>
<path d="M141.606 316.29H141.829C178.219 316.17 207.804 286.481 207.923 249.894V249.447C207.804 212.785 178.196 183.05 141.606 183.05V316.29Z" fill="url(#paint4_linear_191_1018)"/>
</g>
<defs>
<linearGradient id="paint0_linear_191_1018" x1="20.3472" y1="203.643" x2="111.35" y2="294.643" gradientUnits="userSpaceOnUse">
<stop stop-color="#2E79EF"/>
<stop offset="1" stop-color="#389D93"/>
</linearGradient>
<linearGradient id="paint1_linear_191_1018" x1="249.999" y1="181.755" x2="249.999" y2="314.902" gradientUnits="userSpaceOnUse">
<stop stop-color="#FBB94B"/>
<stop offset="1" stop-color="#FC7E27"/>
</linearGradient>
<linearGradient id="paint2_linear_191_1018" x1="313.603" y1="202.507" x2="369.66" y2="308.742" gradientUnits="userSpaceOnUse">
<stop stop-color="#FDAF60"/>
<stop offset="1" stop-color="#AB82D5"/>
</linearGradient>
<linearGradient id="paint3_linear_191_1018" x1="387.221" y1="203.334" x2="479.936" y2="296.048" gradientUnits="userSpaceOnUse">
<stop stop-color="#FC9AA2"/>
<stop offset="1" stop-color="#7269FE"/>
</linearGradient>
<linearGradient id="paint4_linear_191_1018" x1="141.612" y1="249.703" x2="207.971" y2="249.703" gradientUnits="userSpaceOnUse">
<stop stop-color="#87B391"/>
<stop offset="1" stop-color="#DFB962"/>
</linearGradient>
<clipPath id="clip0_191_1018">
<rect width="500" height="500" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -1,4 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 484.002 500">
<path d="M250 0c4.7 0 9.37.13 14.002.386V116.96a133.128 133.128 0 0 0-16.003-.958c-72.17 0-130.815 57.92-131.983 129.815l-.015 2.183v213.09C46.268 416.73.001 338.768.001 250 0 111.926 111.93 0 250 0Zm-2 159.997c4.918 0 9.743.406 14.44 1.183l1.562.27V248l.005 1.474c.313 28.493 9.651 54.814 25.294 76.251-12.314 6.556-26.373 10.276-41.302 10.276-48.597 0-87.997-39.4-87.997-88.002s39.4-88.002 87.997-88.002Z"/>
<path fill="#00E6A5" d="M159.997 346.387c23.355 20.901 54.193 33.61 88.002 33.61 27.425 0 52.896-8.363 74.001-22.678 21.104 14.315 46.575 22.678 74 22.678 31.386 0 60.212-10.953 82.87-29.244C440.121 438.641 352.223 500 250 500c-31.724 0-62.073-5.909-90.003-16.69V346.386ZM396 159.997c48.603 0 88.002 39.4 88.002 88.002S444.603 336.001 396 336.001c-14.924 0-28.983-3.72-41.297-10.276 15.91-21.802 25.3-48.67 25.3-77.726 0-29.056-9.39-55.924-25.305-77.726 12.32-6.556 26.378-10.276 41.302-10.276Zm-74 40.358c8.858 13.731 14.001 30.088 14.001 47.644 0 17.556-5.143 33.913-14 47.644-8.86-13.73-14.003-30.088-14.003-47.644 0-17.07 4.862-33.006 13.272-46.497l.73-1.147ZM308.003 6.765c74.407 17.673 135.933 68.61 168.007 136.233C453.806 126.058 426.08 116 396.001 116c-27.425 0-52.896 8.363-74 22.678a131.582 131.582 0 0 0-12.189-7.343l-1.808-.943V6.764Z"/>
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_191_1037)">
<g style="mix-blend-mode:difference">
<path d="M257.999 0C262.699 0 267.369 0.13 272.001 0.386V116.96C266.691 116.319 261.347 116 255.998 116.002C183.828 116.002 125.183 173.922 124.015 245.817L124 248V461.09C54.267 416.73 8 338.768 8 250C7.999 111.926 119.929 0 257.999 0ZM255.999 159.997C260.917 159.997 265.742 160.403 270.439 161.18L272.001 161.45V248L272.006 249.474C272.319 277.967 281.657 304.288 297.3 325.725C284.986 332.281 270.927 336.001 255.998 336.001C207.401 336.001 168.001 296.601 168.001 247.999C168.001 199.397 207.401 159.997 255.998 159.997H255.999Z" fill="white"/>
</g>
<path d="M167.996 346.387C191.351 367.288 222.189 379.997 255.998 379.997C283.423 379.997 308.894 371.634 329.999 357.319C351.103 371.634 376.574 379.997 403.999 379.997C435.385 379.997 464.211 369.044 486.869 350.753C448.12 438.641 360.222 500 257.999 500C226.275 500 195.926 494.091 167.996 483.31V346.386V346.387ZM403.999 159.997C452.602 159.997 492.001 199.397 492.001 247.999C492.001 296.601 452.602 336.001 403.999 336.001C389.075 336.001 375.016 332.281 362.702 325.725C378.612 303.923 388.002 277.055 388.002 247.999C388.002 218.943 378.612 192.075 362.697 170.273C375.017 163.717 389.075 159.997 403.999 159.997ZM329.999 200.355C338.857 214.086 344 230.443 344 247.999C344 265.555 338.857 281.912 330 295.643C321.14 281.913 315.997 265.555 315.997 247.999C315.997 230.929 320.859 214.993 329.269 201.502L329.999 200.355ZM316.002 6.76516C390.409 24.4382 451.935 75.3752 484.009 142.998C461.805 126.058 434.079 116 404 116C376.575 116 351.104 124.363 330 138.678C326.073 136.012 322.004 133.561 317.811 131.335L316.003 130.392V6.76416L316.002 6.76516Z" fill="#00E6A5"/>
</g>
<defs>
<clipPath id="clip0_191_1037">
<rect width="500" height="500" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -1,4 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 433.451">
<path d="M134.664 0c-10.257 0-19.193 1.837-27.87 5.518-8.421 3.682-15.784 8.678-22.36 15.255L250.4 202.779 416.102 20.773c-6.576-6.577-13.946-11.573-22.888-15.255C385.058 1.838 375.6 0 365.864 0c-10.257 0-19.986 2.108-28.664 6.054-8.942 3.94-16.312 9.729-23.146 16.563L250.4 93.105l-64.434-70.488c-6.576-6.834-13.945-12.624-23.152-16.563C154.664 2.108 144.922 0 134.664 0ZM250.4 230.4 84.434 412.678c6.576 6.312 13.939 11.566 22.36 15.254 8.677 3.681 17.627 5.519 27.355 5.519 10.787 0 19.987-2.366 28.665-6.055 9.207-4.203 17.091-9.729 23.667-16.562l63.92-70.488 63.911 70.488c6.576 6.833 13.946 12.359 22.888 16.562 8.678 3.689 18.142 6.055 28.665 6.055 9.735 0 19.193-1.838 27.349-5.519 8.942-3.688 16.312-8.942 22.888-15.254L250.4 230.4Z"/>
<path fill="#e57000" d="M54.705 54.712c-10.522.264-20.78 2.359-29.98 6.305C15.255 64.963 7.098 70.488 0 77.329l126.787 139.396L0 355.865c7.098 7.104 15.254 12.616 24.725 16.826 9.2 4.21 19.458 6.055 29.98 6.577 11.308-.522 21.844-2.36 31.573-7.092 9.736-4.474 18.142-10.529 25.24-18.163l124.936-137.288L111.52 79.695c-7.627-7.37-15.777-13.417-25.512-18.15-9.729-4.467-19.994-6.569-31.302-6.833Zm390.333 0c-11.309.264-21.309 2.366-31.045 6.834-9.728 4.732-18.149 10.78-25.512 18.149l-124.406 137.03L388.48 354.013c7.363 7.634 15.784 13.689 25.512 18.163 9.736 4.732 19.736 6.57 31.045 7.092 11.308-.522 21.037-2.367 30.244-6.577 9.993-4.21 17.62-9.722 24.718-16.827L373.492 216.725 500 77.33c-7.098-6.841-14.725-12.366-24.718-16.312-9.207-3.946-18.936-6.04-30.244-6.305Z"/>
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
<g style="mix-blend-mode:difference">
<path d="M134.664 33C124.407 33 115.471 34.837 106.794 38.518C98.3731 42.2 91.0101 47.196 84.4341 53.773L250.4 235.779L416.102 53.773C409.526 47.196 402.156 42.2 393.214 38.518C385.058 34.838 375.6 33 365.864 33C355.607 33 345.878 35.108 337.2 39.054C328.258 42.994 320.888 48.783 314.054 55.617L250.4 126.105L185.966 55.617C179.39 48.783 172.021 42.993 162.814 39.054C154.664 35.108 144.922 33 134.664 33ZM250.4 263.4L84.4341 445.678C91.0101 451.99 98.3731 457.244 106.794 460.932C115.471 464.613 124.421 466.451 134.149 466.451C144.936 466.451 154.136 464.085 162.814 460.396C172.021 456.193 179.905 450.667 186.481 443.834L250.401 373.346L314.312 443.834C320.888 450.667 328.258 456.193 337.2 460.396C345.878 464.085 355.342 466.451 365.865 466.451C375.6 466.451 385.058 464.613 393.214 460.932C402.156 457.244 409.526 451.99 416.102 445.678L250.4 263.4Z" fill="white"/>
</g>
<path d="M54.705 87.7119C44.183 87.9759 33.925 90.0709 24.725 94.0169C15.255 97.9629 7.098 103.488 0 110.329L126.787 249.725L0 388.865C7.098 395.969 15.254 401.481 24.725 405.691C33.925 409.901 44.183 411.746 54.705 412.268C66.013 411.746 76.549 409.908 86.278 405.176C96.014 400.702 104.42 394.647 111.518 387.013L236.454 249.725L111.52 112.695C103.893 105.325 95.743 99.2779 86.008 94.5449C76.279 90.0779 66.013 87.9759 54.705 87.7119ZM445.038 87.7119C433.729 87.9759 423.729 90.0779 413.993 94.5459C404.265 99.2779 395.844 105.326 388.481 112.695L264.075 249.725L388.48 387.013C395.843 394.647 404.264 400.702 413.992 405.176C423.728 409.908 433.728 411.746 445.037 412.268C456.345 411.746 466.074 409.901 475.281 405.691C485.274 401.481 492.901 395.969 499.999 388.864L373.492 249.725L500 110.33C492.902 103.489 485.275 97.9639 475.282 94.0179C466.075 90.0719 456.346 87.9769 445.038 87.7119Z" fill="#E57000"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-0.017335016280412674 1.0994987487792969 34.31733703613281 19.514122009277344">
<g id="Homepage_ver1" fill="#000000">
<path d="M30.7,1.3a0.5,0.5,0,0,0-.5.3L24.6,13.4,18.9,1.6a0.5,0.5,0,0,0-.5-0.3H15.3a0.3,0.3,0,0,0-.3.4l9.2,18.3a0.4,0.4,0,0,0,.6,0l0.6-1.2L31.1,7.8V20.2a0.4,0.4,0,0,0,.4.4h2.4a0.4,0.4,0,0,0,.4-0.4V1.7a0.4,0.4,0,0,0-.4-0.4H30.7Z" style="fill-rule:evenodd"></path>
<path d="M14.3,7.5A6.4,6.4,0,0,0,8,1.1H0.3a0.3,0.3,0,0,0-.3.4L1.1,3.6a0.6,0.6,0,0,0,.5.3H8a3.5,3.5,0,0,1,3.5,3.5A3.5,3.5,0,0,1,8,11.1H5.2a0.2,0.2,0,0,0-.2.3l4.4,8.8a0.7,0.7,0,0,0,.6.4h2.6a0.3,0.3,0,0,0,.3-0.5L9.7,13.7A6.5,6.5,0,0,0,14.3,7.5Z" style="fill-rule:evenodd"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 730 B

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,12 @@
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_176_150)">
<path d="M397.756 276.664C389.302 276.867 380.894 275.355 373.04 272.219C365.186 269.083 358.049 264.389 352.059 258.419C346.069 252.449 341.351 245.328 338.188 237.484C335.026 229.641 333.486 221.238 333.661 212.783C333.661 177.106 360.315 146.907 397.71 146.83C435.06 146.83 460.011 177.06 460.011 212.768C460.011 248.475 435.152 276.664 397.787 276.664H397.756ZM402.559 111C369.568 111 347.747 123.076 333.369 141.414V115.036H293.349V389.173H333.369V281.989C347.747 300.127 369.568 312.433 402.559 312.433C457.725 312.433 500 272.137 500 212.614C500 153.076 457.725 111 402.559 111Z" fill="#5A2989"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M87.5582 218.706C104.475 206.796 118.215 190.921 127.578 172.472V224C127.578 256.071 145.148 274.608 174.871 274.608C204.594 274.608 229.468 256.102 229.468 224V115.128H269.565V308.612H229.315V284.168C222.839 294.065 204.471 312.556 168.702 312.556C115.747 312.556 87.6809 279.488 87.6809 232.517L87.6042 218.676L87.5582 218.706Z" fill="#5A2989"/>
<path d="M0.0459128 202.026V240.849C33.7489 240.844 66.0975 227.583 90.1054 203.929C101.927 192.322 111.318 178.477 117.73 163.201C124.143 147.926 127.449 131.526 127.455 114.959H88.2027C88.1725 126.409 85.8733 137.74 81.4379 148.297C77.0025 158.853 70.5189 168.426 62.3618 176.462C45.7426 192.849 23.3393 202.033 -0.00012207 202.026H0.0459128Z" fill="#5A2989"/>
</g>
<defs>
<clipPath id="clip0_176_150">
<rect width="500" height="500" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -1,6 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
<path fill="none" d="m253.612 18.751 155.225 68.671 72.412 162.926-66.105 160.531-164.763 70.372-158.672-64.375-72.959-163.45L88.562 86.485l165.05-67.734Z"/>
<path d="m261.198 1.604 155.225 68.672a18.746 18.746 0 0 1 9.548 9.532l72.413 162.924a18.752 18.752 0 0 1 .203 14.755l-66.106 160.532a18.755 18.755 0 0 1-9.973 10.103l-164.762 70.372a18.751 18.751 0 0 1-14.414.131L84.66 434.251a18.749 18.749 0 0 1-10.073-9.732L1.628 261.068a18.751 18.751 0 0 1-.177-14.877l69.814-166.94a18.744 18.744 0 0 1 10.18-10.112L246.493 1.405a18.741 18.741 0 0 1 14.705.199Zm-7.862 37.527-150.471 61.752-63.69 152.301 66.579 149.156 144.442 58.602 150.53-64.293 60.13-146.019-66.217-148.985-141.303-62.512v-.002Z"/>
<path fill="none" d="M350.853 168.751v161.156h-24.737L250.3 257.213l-76.228 72.694h-23.957V168.751"/>
<path d="m168.865 308.963 68.495-65.319c7.258-6.921 18.677-6.906 25.916.035l68.828 65.992v-140.92c0-10.349 8.4-18.75 18.75-18.75 10.347 0 18.75 8.401 18.75 18.75v161.156c0 10.355-8.396 18.75-18.75 18.75h-24.739a18.757 18.757 0 0 1-12.977-5.216l-62.874-60.285-63.252 60.32a18.75 18.75 0 0 1-12.94 5.181h-23.957c-10.355 0-18.75-8.395-18.75-18.75V168.751c0-10.349 8.402-18.75 18.75-18.75 10.349 0 18.75 8.401 18.75 18.75v140.212Z"/>
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_191_1078)">
<g style="mix-blend-mode:difference">
<path d="M261.198 1.60387L416.423 70.2759C420.678 72.1581 424.082 75.5557 425.971 79.8079L498.384 242.732C499.414 245.05 499.963 247.552 499.998 250.089C500.033 252.625 499.553 255.142 498.587 257.487L432.481 418.019C430.609 422.563 427.028 426.191 422.508 428.122L257.746 498.494C255.471 499.465 253.026 499.977 250.552 500C248.078 500.022 245.624 499.555 243.332 498.625L84.66 434.251C80.1712 432.43 76.5614 428.942 74.587 424.519L1.628 261.068C0.585027 258.731 0.0312788 256.206 0.000838817 253.648C-0.0296012 251.089 0.463911 248.551 1.451 246.191L71.265 79.2509C72.2146 76.9794 73.6024 74.9172 75.3491 73.1822C77.0958 71.4472 79.1672 70.0732 81.445 69.1389L246.493 1.40487C248.831 0.444804 251.339 -0.0324825 253.866 0.00171599C256.393 0.0359145 258.887 0.580891 261.198 1.60387ZM253.336 39.1309L102.865 100.883L39.175 253.184L105.754 402.34L250.196 460.942L400.726 396.649L460.856 250.63L394.639 101.645L253.336 39.1329V39.1309Z" fill="white"/>
</g>
<g style="mix-blend-mode:difference">
<path d="M168.865 308.963L237.36 243.644C244.618 236.723 256.037 236.738 263.276 243.679L332.104 309.671V168.751C332.104 158.402 340.504 150.001 350.854 150.001C361.201 150.001 369.604 158.402 369.604 168.751V329.907C369.604 340.262 361.208 348.657 350.854 348.657H326.115C321.279 348.656 316.629 346.788 313.138 343.441L250.264 283.156L187.012 343.476C183.525 346.802 178.891 348.657 174.072 348.657H150.115C139.76 348.657 131.365 340.262 131.365 329.907V168.751C131.365 158.402 139.767 150.001 150.115 150.001C160.464 150.001 168.865 158.402 168.865 168.751V308.963Z" fill="white"/>
</g>
</g>
<defs>
<clipPath id="clip0_191_1078">
<rect width="500" height="500" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -1,5 +0,0 @@
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
<g style="mix-blend-mode:difference">
<path d="M296.617 211.716L479.03 0H435.804L277.414 183.83L150.909 0H5L196.301 277.983L5 500H48.2286L215.492 305.869L349.091 500H495L296.606 211.716H296.617ZM237.409 280.432L218.026 252.752L63.8045 32.492H130.201L254.66 210.249L274.043 237.929L435.824 468.986H369.428L237.409 280.443V280.432Z" fill="white"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 458 B

View File

@@ -67,7 +67,7 @@
"pleaseWait": "Моля изчакайте...",
"generatingEncryptionKeysTitle": "Генерират се ключове за шифроване...",
"recreatePassword": "Създайте отново парола",
"recreatePasswordMessage": "Текущото устройство не е достатъчно мощно, за да потвърди паролата Ви, така че трябва да го генерираме отново веднъж по начин, който работи с всички устройства. \n\nВлезте с Вашия ключ за възстановяване и генерирайте отново паролата си (можете да използвате същата отново, ако желаете).",
"recreatePasswordMessage": "Текущото устройство не е достатъчно мощно, за да потвърди паролата Ви, така че трябва да го генерираме отново веднъж по начин, който работи с всички устройства. \n\nМоля, влезте с Вашия ключ за възстановяване и генерирайте отново паролата си (можете да използвате същата отново, ако желаете).",
"useRecoveryKey": "Използвайте ключ за възстановяване",
"incorrectPasswordTitle": "Грешна парола",
"welcomeBack": "Добре дошли отново!",
@@ -130,7 +130,61 @@
"faq_q_3": "Как мога да изтрия кодове?",
"faq_a_3": "Можете да изтриете код, като плъзнете наляво върху него.",
"faq_q_4": "Как мога да подкрепя този проект?",
"faq_a_4": "Можете да подкрепите развитието на този проект, като се абонирате за нашето приложение за снимки @ ente.io.",
"faq_q_5": "Как мога да активирам заключване чрез FaceID в Auth",
"faq_a_5": "Можете да активирате заключване чрез FaceID в Настройки → Сигурност → Заключен екран.",
"somethingWentWrongMessage": "Нещо се обърка, моля опитайте отново",
"leaveFamily": "Напуснете семейството",
"leaveFamilyMessage": "Сигурни ли сте, че искате да напуснете семейния план?",
"inFamilyPlanMessage": "Вие сте на семеен план!",
"swipeHint": "Плъзнете наляво, за да редактирате или премахнете кодове",
"scan": "Сканиране",
"scanACode": "Скениране на код",
"verify": "Потвърждаване",
"verifyEmail": "Потвърдете имейла",
"enterCodeHint": "Въведете 6-цифрения код от\nВашето приложение за удостоверяване",
"lostDeviceTitle": "Загубено устройство?",
"twoFactorAuthTitle": "Двуфакторно удостоверяване",
"passkeyAuthTitle": "Удостоверяване с ключ за парола",
"verifyPasskey": "Потвърдете ключ за парола",
"recoverAccount": "Възстановяване на акаунт",
"enterRecoveryKeyHint": "Въведете Вашия ключ за възстановяване",
"recover": "Възстановяване",
"contactSupportViaEmailMessage": "Моля, изпратете имейл до {email} от Вашия регистриран имейл адрес",
"@contactSupportViaEmailMessage": {
"placeholders": {
"email": {
"type": "String"
}
}
},
"invalidQRCode": "Невалиден QR код",
"noRecoveryKeyTitle": "Няма ключ за възстановяване?",
"enterEmailHint": "Въведете Вашият имейл адрес",
"invalidEmailTitle": "Невалиден имейл адрес",
"invalidEmailMessage": "Моля, въведете валиден имейл адрес.",
"deleteAccount": "Изтриване на акаунта",
"deleteAccountQuery": "Ще съжаляваме да си тръгнете. Изправени ли сте пред някакъв проблем?",
"yesSendFeedbackAction": "Да, изпращане на обратна връзка",
"noDeleteAccountAction": "Не, изтриване на акаунта",
"initiateAccountDeleteTitle": "Моля, удостоверете се, за да инициирате изтриването на акаунта",
"sendEmail": "Изпратете имейл",
"createNewAccount": "Създаване на нов акаунт",
"weakStrength": "Слаба",
"strongStrength": "Силна",
"moderateStrength": "Умерена",
"confirmPassword": "Потвърждаване на паролата",
"close": "Затваряне",
"oopsSomethingWentWrong": "Ами сега, нещо се обърка.",
"selectLanguage": "Изберете език",
"language": "Език",
"social": "Социални мрежи",
"security": "Сигурност",
"lockscreen": "Заключен екран",
"authToChangeLockscreenSetting": "Моля, удостоверете се, за да промените настройката за заключен екран",
"deviceLockEnablePreSteps": "За да активирате заключването на устройството, моля, задайте парола за устройството или заключване на екрана в системните настройки.",
"viewActiveSessions": "Вижте активните сесии",
"authToViewYourActiveSessions": "Моля, удостоверете се, за да видите Вашите активни сесии",
"searchHint": "Търсене...",
"search": "Търсене",
"sorryUnableToGenCode": "За съжаление не може да се генерира код за {issuerName}",
@@ -183,46 +237,118 @@
"insecureDevice": "Несигурно устройство",
"sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "За съжаление не можахме да генерираме защитени ключове на това устройство.\n\nМоля, регистрирайте се от друго устройство.",
"howItWorks": "Как работи",
"ackPasswordLostWarning": "Разбирам, че ако загубя паролата си, може да загубя данните си, тъй като данните ми са <underline>шифровани от край до край</underline>.",
"loginTerms": "С натискането на вход, се съгласявам с <u-terms>условията за ползване</u-terms> и <u-policy>политиката за поверителност</u-policy>",
"logInLabel": "Вход",
"logout": "Изход",
"areYouSureYouWantToLogout": "Наистина ли искате да излезете от профила си?",
"yesLogout": "Да, излез",
"exit": "Изход",
"verifyingRecoveryKey": "Проверка на ключа за възстановяване...",
"recoveryKeyVerified": "Ключът за възстановяване е проверен",
"recoveryKeySuccessBody": "Страхотно! Вашият ключ за възстановяване е валиден. Благодарим Ви за проверката.\n\nМоля, не забравяйте да запазите безопасно архивирания си ключ за възстановяване.",
"invalidRecoveryKey": "Въведеният от Вас ключ за възстановяване не е валиден. Моля, уверете се, че съдържа 24 думи и проверете правописа на всяка.\n\nАко сте въвели по-стар код за възстановяване, уверете се, че е дълъг 64 знака и проверете всеки от тях.",
"recreatePasswordTitle": "Създайте отново парола",
"recreatePasswordBody": "Текущото устройство не е достатъчно мощно, за да потвърди паролата Ви, но можем да я регенерираме по начин, който работи с всички устройства.\n\nМоля, влезте с Вашия ключ за възстановяване и генерирайте отново паролата си (можете да използвате същата отново, ако желаете).",
"invalidKey": "Невалиден ключ",
"tryAgain": "Опитайте отново",
"viewRecoveryKey": "Вижте ключа за възстановяване",
"confirmRecoveryKey": "Потвърдете ключа за възстановяване",
"recoveryKeyVerifyReason": "Вашият ключ за възстановяване е единственият начин да възстановите Вашите снимки, ако забравите паролата си. Можете да намерите своя ключ за възстановяване в Настройки > Акаунт.\n\nМоля, въведете Вашия ключ за възстановяване тук, за да проверите дали сте го запазили правилно.",
"confirmYourRecoveryKey": "Потвърдете Вашия ключ за възстановяване",
"confirm": "Потвърждаване",
"emailYourLogs": "Изпратете Вашата история на действията на имейл",
"pleaseSendTheLogsTo": "Моля, изпратете историята на действията на \n{toEmail}",
"copyEmailAddress": "Копиране на имейл адрес",
"exportLogs": "Експорт на файловете с историята",
"enterYourRecoveryKey": "Въведете Вашия ключ за възстановяване",
"tempErrorContactSupportIfPersists": "Изглежда нещо се обърка. Моля, опитайте отново след известно време. Ако грешката продължава, моля, свържете се с нашия екип за поддръжка.",
"networkHostLookUpErr": "Не може да се свърже с Ente, моля, проверете мрежовите си настройки и се свържете с поддръжката, ако проблемът продължава.",
"networkConnectionRefusedErr": "Не може да се свърже с Ente, моля, опитайте отново след известно време. Ако проблемът продължава, моля, свържете се с поддръжката.",
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Изглежда нещо се обърка. Моля, опитайте отново след известно време. Ако грешката продължава, моля, свържете се с нашия екип за поддръжка.",
"about": "Относно",
"weAreOpenSource": "Ние сме с отворен код!",
"privacy": "Поверителност",
"terms": "Условия",
"checkForUpdates": "Провери за актуализации",
"checkStatus": "Проверка на състоянието",
"downloadUpdate": "Изтегляне",
"criticalUpdateAvailable": "Налична е критична актуализация",
"updateAvailable": "Налична актуализация",
"update": "Актуализиране",
"checking": "Извършва се проверка...",
"youAreOnTheLatestVersion": "Вие сте с най-новата версия",
"warning": "Предупреждение",
"exportWarningDesc": "Експортираният файл съдържа поверителна информация. Моля, съхранявайте го безопасно.",
"iUnderStand": "Разбрах",
"@iUnderStand": {
"description": "Text for the button to confirm the user understands the warning"
},
"authToExportCodes": "Моля, удостоверете се, за да експортирате Вашите кодове",
"importSuccessTitle": "Ура!",
"importSuccessDesc": "Импортирахте {count} кода!",
"@importSuccessDesc": {
"placeholders": {
"count": {
"description": "The number of codes imported",
"type": "int",
"example": "1"
}
}
},
"sorry": "Съжаляваме",
"importFailureDesc": "Неуспешен анализ на избрания файл.\nМоля, пишете на support@ente.io, ако имате нужда от помощ!",
"pendingSyncs": "Предупреждение",
"pendingSyncsWarningBody": "Някои от вашите кодове не са архивирани.\n\nМоля, уверете се, че имате резервно копие на тези кодове, преди да излезете.",
"checkInboxAndSpamFolder": "Моля, проверете входящата си поща (и спама), за да завършите проверката",
"tapToEnterCode": "Докоснете, за да въведете код",
"resendEmail": "Повторно изпращане на имейл",
"weHaveSendEmailTo": "Изпратихме имейл до <green>{email}</green>",
"@weHaveSendEmailTo": {
"description": "Text to indicate that we have sent a mail to the user",
"placeholders": {
"email": {
"description": "The email address of the user",
"type": "String",
"example": "example@ente.io"
}
}
},
"activeSessions": "Активни сесии",
"somethingWentWrongPleaseTryAgain": "Нещо се обърка, моля опитайте отново",
"thisWillLogYouOutOfThisDevice": "Това ще Ви изкара от профила на това устройство!",
"thisWillLogYouOutOfTheFollowingDevice": "Това ще Ви изкара от профила на следното устройство:",
"terminateSession": "Прекратяване на сесията?",
"terminate": "Прекратяване",
"thisDevice": "Това устройство",
"toResetVerifyEmail": "За да нулирате паролата си, моля, първо потвърдете своя имейл.",
"thisEmailIsAlreadyInUse": "Този имейл вече се използва",
"verificationFailedPleaseTryAgain": "Неуспешно проверка, моля опитайте отново",
"yourVerificationCodeHasExpired": "Вашият код за потвърждение е изтекъл",
"incorrectCode": "Неправилен код",
"sorryTheCodeYouveEnteredIsIncorrect": "За съжаление кодът, който сте въвели, е неправилен",
"emailChangedTo": "Имейлът е променен на {newEmail}",
"authenticationFailedPleaseTryAgain": "Неуспешно удостоверяване, моля опитайте отново",
"authenticationSuccessful": "Успешно удостоверяване!",
"twofactorAuthenticationSuccessfullyReset": "Двуфакторното удостоверяване бе успешно нулирано",
"incorrectRecoveryKey": "Неправилен ключ за възстановяване",
"theRecoveryKeyYouEnteredIsIncorrect": "Въведеният от Вас ключ за възстановяване е неправилен",
"enterPassword": "Въведете парола",
"selectExportFormat": "Изберете формат за експортиране",
"exportDialogDesc": "Шифрованите експорти ще бъдат защитени с парола по Ваш избор.",
"encrypted": "Шифровано",
"plainText": "Обикновен текст",
"passwordToEncryptExport": "Парола за шифроване на експортирането",
"export": "Експортиране",
"useOffline": "Използвайте без резервни копия",
"signInToBackup": "Влезте, за да архивирате Вашите кодове",
"singIn": "Вход",
"sigInBackupReminder": "Моля, експортирайте Вашите кодове, за да сте сигурни, че имате резервно копие, от което можете да ги възстановите.",
"offlineModeWarning": "Избрахте да продължите без резервни копия. Моля, направете ръчни резервни копия, за да сте сигурни, че Вашите кодове са в безопасност.",
"showLargeIcons": "Показване на големи икони",
"shouldHideCode": "Скриване на кодове",
"doubleTapToViewHiddenCode": "Можете да докоснете два пъти върху запис, за да видите кода",
"focusOnSearchBar": "Фокусиране на търсенето при стартиране на приложението",
"confirmUpdatingkey": "Сигурни ли сте, че искате да актуализирате секретния ключ?",
"minimizeAppOnCopy": "Минимизиране на приложението при копиране",
"editCodeAuthMessage": "Удостоверете се, за да редактирате кода",

View File

@@ -72,7 +72,7 @@
"incorrectPasswordTitle": "Falsches Passwort",
"welcomeBack": "Willkommen zurück!",
"madeWithLoveAtPrefix": "gemacht mit ❤️ bei ",
"supportDevs": "Bei <bold-green>ente</bold-green> registrieren um das Projekt zu unterstützen.",
"supportDevs": "Bei <bold-green>ente</bold-green> registrieren, um das Projekt zu unterstützen",
"supportDiscount": "Benutze den Rabattcode \"AUTH\" für 10% Rabatt im ersten Jahr",
"changeEmail": "E-Mail ändern",
"changePassword": "Passwort ändern",
@@ -182,6 +182,7 @@
"security": "Sicherheit",
"lockscreen": "Sperrbildschirm",
"authToChangeLockscreenSetting": "Bitte authentifizieren um die Einstellungen des Sperrbildschirms zu ändern",
"deviceLockEnablePreSteps": "Um die Gerätesperre zu aktivieren, richte bitte einen Gerätepasscode oder eine Bildschirmsperre in den Systemeinstellungen ein.",
"viewActiveSessions": "Aktive Sitzungen anzeigen",
"authToViewYourActiveSessions": "Bitte authentifizieren um, die aktiven Sitzungen zu sehen",
"searchHint": "Suchen...",
@@ -441,5 +442,29 @@
"deleteTagTitle": "Tag löschen?",
"deleteTagMessage": "Sind Sie sicher, dass Sie diesen Code löschen wollen? Diese Aktion ist unumkehrbar.",
"somethingWentWrongParsingCode": "Wir konnten {x} Codes nicht parsen.",
"updateNotAvailable": "Update ist nicht verfügbar"
"updateNotAvailable": "Update ist nicht verfügbar",
"viewRawCodes": "Rohcodes anzeigen",
"rawCodes": "Rohcodes",
"rawCodeData": "Rohcode Daten",
"appLock": "App-Sperre",
"noSystemLockFound": "Keine Systemsperre gefunden",
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Um die App-Sperre zu aktivieren, konfiguriere bitte den Gerätepasscode oder die Bildschirmsperre in den Systemeinstellungen.",
"autoLock": "Automatisches Sperren",
"immediately": "Sofort",
"reEnterPassword": "Passwort erneut eingeben",
"reEnterPin": "PIN erneut eingeben",
"next": "Weiter",
"tooManyIncorrectAttempts": "Zu viele fehlerhafte Versuche",
"tapToUnlock": "Zum Entsperren antippen",
"setNewPassword": "Neues Passwort festlegen",
"deviceLock": "Gerätesperre",
"hideContent": "Inhalte verstecken",
"hideContentDescriptionAndroid": "Versteckt Inhalte der App beim Wechseln zwischen Apps und deaktiviert Screenshots",
"hideContentDescriptioniOS": "Versteckt Inhalte der App beim Wechseln zwischen Apps",
"autoLockFeatureDescription": "Zeit, nach der die App gesperrt wird, nachdem sie in den Hintergrund verschoben wurde",
"appLockDescription": "Wähle zwischen dem Standard-Sperrbildschirm deines Gerätes und einem eigenen Sperrbildschirm mit PIN oder Passwort.",
"pinLock": "PIN-Sperre",
"enterPin": "PIN eingeben",
"setNewPin": "Neue PIN festlegen",
"importFailureDescNew": "Die ausgewählte Datei konnte nicht verarbeitet werden."
}

View File

@@ -182,6 +182,7 @@
"security": "Ασφάλεια",
"lockscreen": "Οθόνη κλειδώματος",
"authToChangeLockscreenSetting": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να αλλάξετε τις ρυθμίσεις οθόνης κλειδώματος",
"deviceLockEnablePreSteps": "Για να ενεργοποιήσετε το κλείδωμα της συσκευής, παρακαλώ ρυθμίστε τον κωδικό πρόσβασης της συσκευής ή το κλείδωμα οθόνης στις ρυθμίσεις του συστήματός σας.",
"viewActiveSessions": "Προβολή ενεργών συνεδριών",
"authToViewYourActiveSessions": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να δείτε τις ενεργές συνεδρίες σας",
"searchHint": "Αναζήτηση...",
@@ -458,6 +459,10 @@
"setNewPassword": "Ορίστε νέο κωδικό πρόσβασης",
"deviceLock": "Κλείδωμα συσκευής",
"hideContent": "Απόκρυψη περιεχομένου",
"hideContentDescriptionAndroid": "Απόκρυψη περιεχομένου εφαρμογής στην εναλλαγή εφαρμογών και απενεργοποίηση στιγμιότυπων οθόνης",
"hideContentDescriptioniOS": "Απόκρυψη περιεχομένου εφαρμογών στην εναλλαγή εφαρμογών",
"autoLockFeatureDescription": "Χρόνος μετά τον οποίο η εφαρμογή κλειδώνει μετά την τοποθέτηση στο παρασκήνιο",
"appLockDescription": "Επιλέξτε ανάμεσα στην προεπιλεγμένη οθόνη κλειδώματος της συσκευής σας και σε μια προσαρμοσμένη οθόνη κλειδώματος με ένα PIN ή έναν κωδικό πρόσβασης.",
"pinLock": "Κλείδωμα καρφιτσωμάτων",
"enterPin": "Εισαγωγή PIN",
"setNewPin": "Ορίστε νέο PIN",

View File

@@ -19,7 +19,7 @@
"pleaseVerifyDetails": "Veuillez vérifier vos informations et réessayez",
"codeIssuerHint": "Émetteur",
"codeSecretKeyHint": "Clé secrète",
"codeAccountHint": "Compte (vous@exemple.com)",
"codeAccountHint": "Compte (nom@exemple.com)",
"codeTagHint": "Tag",
"accountKeyType": "Type de clé",
"sessionExpired": "Session expirée",
@@ -118,7 +118,7 @@
"existingUser": "Utilisateur existant",
"newUser": "Nouveau dans Ente",
"delete": "Supprimer",
"enterYourPasswordHint": "Saisir votre mot de passe",
"enterYourPasswordHint": "Entrez votre mot de passe",
"forgotPassword": "Mot de passe oublié",
"oops": "Oups",
"suggestFeatures": "Suggérer des fonctionnalités",
@@ -135,14 +135,14 @@
"faq_a_5": "Vous pouvez activer le verrouillage FaceID dans Paramètres → Sécurité → Écran de verrouillage.",
"somethingWentWrongMessage": "Quelque chose s'est mal passé, veuillez recommencer",
"leaveFamily": "Quitter le plan familial",
"leaveFamilyMessage": "Êtes-vous certains de vouloir quitter le plan familial?",
"leaveFamilyMessage": "Êtes-vous sûr de vouloir quitter le plan familial ?",
"inFamilyPlanMessage": "Vous êtes sur un plan familial !",
"swipeHint": "Glisser vers la gauche pour modifier ou supprimer des codes",
"scan": "Analyser",
"scanACode": "Scanner un code",
"verify": "Vérifier",
"verifyEmail": "Vérifier l'e-mail",
"enterCodeHint": "Saisir le code à 6 caractères de votre appli d'authentification",
"enterCodeHint": "Entrez le code à 6 chiffres de votre application d'authentification",
"lostDeviceTitle": "Appareil perdu ?",
"twoFactorAuthTitle": "Authentification à deux facteurs",
"passkeyAuthTitle": "Vérification du code d'accès",
@@ -446,7 +446,9 @@
"viewRawCodes": "Afficher les codes bruts",
"rawCodes": "Codes bruts",
"rawCodeData": "Données de code brut",
"appLock": "Verrouillage d'application",
"noSystemLockFound": "Aucun verrou système trouvé",
"toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Pour activer le verrouillage d'application, veuillez configurer un code d'accès ou le verrouillage de l'écran dans les paramètres de votre appareil.",
"autoLock": "Verrouillage automatique",
"immediately": "Immédiatement",
"reEnterPassword": "Ressaisir le mot de passe",
@@ -457,6 +459,9 @@
"setNewPassword": "Définir un nouveau mot de passe",
"deviceLock": "Verrouillage de l'appareil",
"hideContent": "Masquer le contenu",
"autoLockFeatureDescription": "Délai après lequel l'application se verrouille une fois qu'elle a été mise en arrière-plan",
"appLockDescription": "Choisissez entre l'écran de verrouillage par défaut de votre appareil et un écran de verrouillage par code PIN ou mot de passe personnalisé.",
"pinLock": "Verrouillage par code PIN",
"enterPin": "Saisir le code PIN",
"setNewPin": "Définir un nouveau code PIN",
"importFailureDescNew": "Impossible de lire le fichier sélectionné."

View File

@@ -20,10 +20,11 @@
"@sessionExpired": {
"description": "Title of the dialog when the users current session is invalid/expired"
},
"pleaseLoginAgain": "Vänligen logga in igen",
"pleaseLoginAgain": "Logga in igen",
"loggingOut": "Loggar ut...",
"saveAction": "Spara",
"nextTotpTitle": "nästa",
"deleteCodeTitle": "Radera kod?",
"deleteCodeMessage": "Vill du ta bort den här koden? Det går inte att ångra den här åtgärden.",
"viewLogsAction": "Visa loggar",
"emailLogsTitle": "E-posta loggar",
@@ -63,6 +64,7 @@
"importCodes": "Importera koder",
"exportCodes": "Exportera koder",
"importLabel": "Importera",
"ok": "OK",
"cancel": "Avbryt",
"yes": "Ja",
"no": "Nej",
@@ -109,8 +111,21 @@
"recoveryKeyOnForgotPassword": "Om du glömmer ditt lösenord är det enda sättet du kan återställa dina data med denna nyckel.",
"saveKey": "Spara nyckel",
"save": "Spara",
"send": "Skicka",
"back": "Tillbaka",
"createAccount": "Skapa konto",
"passwordStrength": "Lösenordsstyrka: {passwordStrengthValue}",
"@passwordStrength": {
"description": "Text to indicate the password strength",
"placeholders": {
"passwordStrengthValue": {
"description": "The strength of the password as a string",
"type": "String",
"example": "Weak or Moderate or Strong"
}
},
"message": "Password Strength: {passwordStrengthText}"
},
"password": "Lösenord",
"privacyPolicyTitle": "Integritetspolicy",
"termsOfServicesTitle": "Villkor",
@@ -151,6 +166,7 @@
"incorrectRecoveryKey": "Felaktig återställningsnyckel",
"enterPassword": "Ange lösenord",
"export": "Exportera",
"signInToBackup": "Logga in för att säkerhetskopiera dina koder",
"singIn": "Logga in",
"shouldHideCode": "Dölj koder",
"androidCancelButton": "Avbryt",
@@ -163,7 +179,11 @@
},
"noInternetConnection": "Ingen internetanslutning",
"pleaseCheckYourInternetConnectionAndTryAgain": "Kontrollera din internetanslutning och försök igen.",
"signOutOtherDevices": "Logga ut andra enheter",
"loginSessionExpiredDetails": "Din session har upphört. Logga in igen.",
"create": "Skapa",
"editTag": "Redigera tagg",
"deleteTagTitle": "Radera tagg?",
"immediately": "Omedelbart",
"reEnterPassword": "Ange lösenord igen",
"reEnterPin": "Ange PIN-kod igen",

View File

@@ -0,0 +1 @@
{}

View File

@@ -21,12 +21,13 @@
"codeSecretKeyHint": "Khóa bí mật",
"codeAccountHint": "Tài khoản (bạn@miền.com)",
"codeTagHint": "Thẻ",
"accountKeyType": "Loại khóa",
"sessionExpired": "Phiên làm việc đã hết hạn",
"@sessionExpired": {
"description": "Title of the dialog when the users current session is invalid/expired"
},
"pleaseLoginAgain": "Vui lòng đăng nhập lại",
"loggingOut": "Đang thoát...",
"loggingOut": "Đang đăng xuất...",
"timeBasedKeyType": "Dựa trên thời gian (TOTP)",
"counterBasedKeyType": "Dựa trên bộ đếm (HOTP)",
"saveAction": "Lưu",
@@ -74,7 +75,7 @@
"supportDevs": "Đăng ký <bold-green>ente</bold-green> để hỗ trợ dự án này.",
"supportDiscount": "Sử dụng mã giảm giá \"AUTH\" để được giảm 10% trong năm đầu tiên",
"changeEmail": "Thay đổi email",
"changePassword": "Thay đổi mật khẩu",
"changePassword": "Đổi mật khẩu",
"data": "Dữ liệu",
"importCodes": "Nhập mã",
"importTypePlainText": "Văn bản thuần",
@@ -131,7 +132,7 @@
"faq_a_4": "Bạn có thể hỗ trợ sự phát triển của dự án này bằng cách đăng ký ứng dụng Ảnh @ ente.io của chúng tôi.",
"faq_q_5": "Làm sao để tôi bật FaceID trong ente",
"faq_a_5": "Bạn có thể bật khóa FaceID trong Cài đặt → Bảo mật → Màn hình khóa.",
"somethingWentWrongMessage": "Phát hiện có lỗi, xin thử lại",
"somethingWentWrongMessage": "Đã xảy ra lỗi, xin thử lại",
"leaveFamily": "Rời khỏi gia đình",
"leaveFamilyMessage": "Bạn có chắc chắn muốn thoát khỏi gói dành cho gia đình không?",
"inFamilyPlanMessage": "Bạn đang sử dụng gói dành cho gia đình!",
@@ -141,7 +142,7 @@
"verify": "Xác minh",
"verifyEmail": "Xác nhận địa chỉ Email",
"enterCodeHint": "Nhập mã gồm 6 chữ số từ ứng dụng xác thực của bạn",
"lostDeviceTitle": "Bạn đã mất thiết bị?",
"lostDeviceTitle": "Mất thiết bị?",
"twoFactorAuthTitle": "Xác thực hai yếu tố",
"recoverAccount": "Khôi phục tài khoản",
"enterRecoveryKeyHint": "Nhập khóa khôi phục của bạn",
@@ -154,6 +155,7 @@
}
}
},
"invalidQRCode": "Mã QR không hợp lệ",
"noRecoveryKeyTitle": "Không có khóa khôi phục?",
"enterEmailHint": "Nhập địa chỉ email của bạn",
"invalidEmailTitle": "Địa chỉ email không hợp lệ",
@@ -177,6 +179,7 @@
"security": "Bảo mật",
"lockscreen": "Màn hình khoá",
"authToChangeLockscreenSetting": "Vui lòng xác thực để thay đổi cài đặt màn hình khóa",
"deviceLockEnablePreSteps": "Để bật khoá thiết bị, vui lòng thiết lập mật khẩu thiết bị hoặc khóa màn hình trong cài đặt hệ thống của bạn.",
"viewActiveSessions": "Xem danh sách phiên làm việc hiện tại",
"authToViewYourActiveSessions": "Vui lòng xác thực để xem danh sách phiên làm việc của bạn",
"searchHint": "Tìm kiếm...",
@@ -195,6 +198,8 @@
"recoveryKeySaveDescription": "Chúng tôi không lưu trữ khóa này, vui lòng lưu khóa 24 từ này ở nơi an toàn.",
"doThisLater": "Để sau",
"saveKey": "Lưu khóa",
"save": "Lưu",
"send": "Gửi",
"back": "Quay lại",
"createAccount": "Tạo tài khoản",
"passwordStrength": "Độ mạnh mật khẩu: {passwordStrengthValue}",
@@ -253,6 +258,8 @@
"exportLogs": "Xuất nhật ký",
"enterYourRecoveryKey": "Nhập khóa khôi phục của bạn",
"tempErrorContactSupportIfPersists": "Có vẻ như đã xảy ra sự cố. Vui lòng thử lại sau một thời gian. Nếu lỗi vẫn tiếp diễn, vui lòng liên hệ với nhóm hỗ trợ của chúng tôi.",
"networkHostLookUpErr": "Không thể kết nối đến Ente, vui lòng kiểm tra lại kết nối mạng. Nếu vẫn còn lỗi, xin vui lòng liên hệ hỗ trợ.",
"networkConnectionRefusedErr": "Không thể kết nối đến Ente, vui lòng thử lại sau. Nếu vẫn còn lỗi, xin vui lòng liên hệ hỗ trợ.",
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Có vẻ như đã xảy ra sự cố. Vui lòng thử lại sau một thời gian. Nếu lỗi vẫn tiếp diễn, vui lòng liên hệ với nhóm hỗ trợ của chúng tôi.",
"about": "Về chúng tôi",
"weAreOpenSource": "Chúng tôi có mã nguồn mở!",
@@ -342,6 +349,7 @@
"deleteCodeAuthMessage": "Xác minh để xóa mã",
"showQRAuthMessage": "Xác minh để hiển thị mã QR",
"confirmAccountDeleteTitle": "Xác nhận xóa tài khoản",
"confirmAccountDeleteMessage": "Tài khoản này được liên kết với các ứng dụng Ente trên các nền tảng khác, nếu bạn có sử dụng.\n\nDữ liệu đã tải lên của bạn, trên mọi nền tảng, sẽ bị lên lịch xóa và tài khoản của bạn sẽ bị xóa vĩnh viễn.",
"androidBiometricHint": "Xác định danh tính",
"@androidBiometricHint": {
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
@@ -402,11 +410,37 @@
"doNotSignOut": "Không được đăng xuất",
"hearUsWhereTitle": "Bạn biết đến Ente bằng cách nào? (không bắt buộc)",
"hearUsExplanation": "Chúng tôi không theo dõi lượt cài đặt ứng dụng. Sẽ rất hữu ích nếu bạn cho chúng tôi biết nơi bạn tìm thấy chúng tôi!",
"recoveryKeySaved": "Đã lưu khoá dự phòng vào thư mục Tải về!",
"waitingForVerification": "Đang chờ xác thực",
"loginSessionExpired": "Phiên làm việc hết hạn",
"loginSessionExpiredDetails": "Phiên làm việc hết hạn. Vui lòng đăng nhập lại.",
"developerSettings": "Cài đặt cho nhà phát triển",
"customEndpoint": "Đã kết nối đến",
"pinText": "Ghim",
"unpinText": "Bỏ ghim",
"tags": "Thẻ",
"createNewTag": "Tạo thẻ mới",
"tag": "Thẻ",
"create": "Tạo",
"editTag": "Sửa thẻ",
"deleteTagTitle": "Xóa thẻ?",
"deleteTagMessage": "Bạn có chắc chắn muốn xóa thẻ này không? Hành động này không thể đảo ngược.",
"updateNotAvailable": "Cập nhật không khả dụng",
"viewRawCodes": "Xem mã nguồn",
"rawCodes": "Mã nguồn",
"appLock": "Khóa ứng dụng",
"autoLock": "Tự động khóa",
"immediately": "Tức thì",
"reEnterPassword": "Nhập lại mật khẩu",
"reEnterPin": "Nhập lại mã PIN",
"next": "Tiếp",
"tooManyIncorrectAttempts": "Quá nhiều lần thử không chính xác",
"tapToUnlock": "Nhấn để mở khóa",
"setNewPassword": "Đặt lại mật khẩu",
"deviceLock": "Khóa thiết bị",
"hideContent": "Ẩn nội dung",
"hideContentDescriptionAndroid": "Ẩn nội dung khi chuyển ứng dụng và chặn chụp màn hình",
"hideContentDescriptioniOS": "Ẩn nội dung khi chuyển ứng dụng",
"pinLock": "Mã PIN",
"enterPin": "Nhập mã PIN",
"setNewPin": "Đổi mã PIN"

View File

@@ -27,15 +27,15 @@
"description": "Title of the dialog when the users current session is invalid/expired"
},
"pleaseLoginAgain": "请重新登录",
"loggingOut": "正在退出登录...",
"timeBasedKeyType": "基于时间 (TOTP)",
"counterBasedKeyType": "基于计数器(HOTP)",
"loggingOut": "正在登出...",
"timeBasedKeyType": "基于时间 (TOTP)",
"counterBasedKeyType": "基于计数器 (HOTP)",
"saveAction": "保存",
"nextTotpTitle": "下一个",
"deleteCodeTitle": "要删除代码吗?",
"deleteCodeMessage": "您确定要删除此代码吗?此操作不可逆。",
"deleteCodeMessage": "您确定要删除此代码吗?此操作不可逆。",
"viewLogsAction": "查看日志",
"sendLogsDescription": "这将跨日志发送以帮助我们调试您的问题。 虽然我们采取预防措施确保不记录敏感信息,但我们鼓励您在共享这些日志之前先查看它们。",
"sendLogsDescription": "这将发送日志以帮助我们调试您的问题。虽然我们采取预防措施确保不记录敏感信息,但我们建议您在共享这些日志之前先查看它们。",
"preparingLogsTitle": "正在准备日志...",
"emailLogsTitle": "电子邮件日志",
"emailLogsMessage": "请将日志发送至 {email}",
@@ -67,13 +67,13 @@
"pleaseWait": "请稍候...",
"generatingEncryptionKeysTitle": "正在生成加密密钥...",
"recreatePassword": "重新创建密码",
"recreatePasswordMessage": "当前设备的强度不足以验证您的密码, 所以我们需要以一种能够与所有设备一起运行的方式重新生成它。 \n\n请使用您的恢复密钥登录并重新生成您的密码 (如果您愿意,可以再次使用相同密钥)。",
"recreatePasswordMessage": "当前设备的功能不足以验证您的密码,因此我们需要以一种适用于所有设备的方式重新生成一次密码。\n\n请使用您的恢复密钥登录并重新生成您的密码如果您愿意,可以再次使用相同的密码)。",
"useRecoveryKey": "使用恢复密钥",
"incorrectPasswordTitle": "密码错误",
"welcomeBack": "欢迎回来!",
"madeWithLoveAtPrefix": "用❤️制成 ",
"supportDevs": "订阅 <bold-green>ente</bold-green> 以支持此项目。",
"supportDiscount": "使用优惠券号码“AUTH”获得第一年优惠10%折扣",
"supportDiscount": "使用优惠码“AUTH”可享受首年 10% 折扣",
"changeEmail": "修改邮箱",
"changePassword": "修改密码",
"data": "数据",
@@ -83,29 +83,29 @@
"passwordForDecryptingExport": "用来解密导出的密码",
"passwordEmptyError": "密码不能为空",
"importFromApp": "从 {appName} 导入代码",
"importGoogleAuthGuide": "使用“转移户”选项将您的户从 Google 身份验证器导出到二维码。然后使用另一台设备扫描二维码。\n\n提示您可以使用笔记本电脑的网络摄像头拍摄二维码的照片。",
"importGoogleAuthGuide": "使用“转移户”选项将您的户从 Google Authenticator 导出到二维码。然后使用另一台设备扫描二维码。\n\n提示您可以使用笔记本电脑的摄像头拍摄二维码的照片。",
"importSelectJsonFile": "选择 JSON 文件",
"importSelectAppExport": "选择 {appName} 的导出文件",
"importEnteEncGuide": "选择从 Ente 导出的 JSON 加密文件",
"importRaivoGuide": "使用 Raivo 设置中的“将 OTP 导出到 Zip 存档”选项。\n\n解压 zip 文件并导入 JSON 文件。",
"importBitwardenGuide": "使用 Bitwarden 工具中的“导出保管库”选项并导入未加密的 JSON 文件。",
"importAegisGuide": "Aegis设置中使用\"导出密码库\"选项。\n\n如果您的密码库已加密需要输入密码才能解密密码库。",
"import2FasGuide": "使用 2FAS 中的“设置 -> 备份 - 导出”选项。\n\n如果您的备份已加密,则需要输入密码才能解密备份",
"importBitwardenGuide": "使用 Bitwarden 工具中的“导出密码库”选项并导入未加密的 JSON 文件。",
"importAegisGuide": "使用 Aegis 设置中的“导出密码库选项。\n\n如果您的密码库已加密需要输入密码库密码才能解密密码库。",
"import2FasGuide": "使用 2FAS 中的“设置 -> 备份 -> 导出”选项。\n\n如果您的备份已加密则需要输入密码解密备份",
"importLastpassGuide": "使用 Lastpass Authenticator 设置中的“转移账户”选项,然后按“将账户导出到文件”。导入下载的 JSON。",
"exportCodes": "导出代码",
"importLabel": "导入",
"importInstruction": "请以以下格式选择包含代码列表的文件",
"importInstruction": "请选择一个包含以下格式的代码列表的文件",
"importCodeDelimiterInfo": "代码可以用逗号或新行分隔。",
"selectFile": "选择文件",
"emailVerificationToggle": "电子邮件验证",
"emailVerificationEnableWarning": "如果您将 2FA 存储到我们的电子邮件中,则打开电子邮件验证可能会导致僵局。如果您被一项服务锁定,您可能无法登录另一项服务。",
"emailVerificationEnableWarning": "为避免被锁在您的账户之外,请在启用电子邮件验证之前确保在 Ente Auth 之外存储电子邮件双重验证的副本。",
"authToChangeEmailVerificationSetting": "请进行身份验证以更改电子邮件验证",
"authToViewYourRecoveryKey": "请验证以查看您的恢复密钥",
"authToChangeYourEmail": "请验证以更改您的电子邮件",
"authToChangeYourPassword": "请验证以更改密码",
"authToViewSecrets": "请进行身份验证以查看您的密",
"authToViewSecrets": "请进行身份验证以查看您的密",
"authToInitiateSignIn": "请进行身份验证以启动登录进行备份。",
"ok": "好的",
"ok": "确定",
"cancel": "取消",
"yes": "是",
"no": "否",
@@ -125,8 +125,8 @@
"faq": "常见问题",
"faq_q_1": "Auth 的安全性如何?",
"faq_a_1": "您通过 Auth 备份的所有代码均以端到端加密方式存储。这意味着只有您可以访问您的代码。我们的应用程序是开源的并且我们的加密技术已经过外部审计。",
"faq_q_2": "我可以在桌面上访问我的代码吗?",
"faq_a_2": "您可以在 web @auth.ente.io 上访问您的代码。",
"faq_q_2": "我可以在桌面设备上访问我的代码吗?",
"faq_a_2": "您可以在网页 auth.ente.io 上访问您的代码。",
"faq_q_3": "我如何删除代码?",
"faq_a_3": "您可以通过向左滑动该项目来删除该代码。",
"faq_q_4": "我该如何支持该项目?",
@@ -240,9 +240,9 @@
"ackPasswordLostWarning": "我明白,如果我丢失密码,我可能会丢失我的数据,因为我的数据是 <underline>端到端加密的</underline>。",
"loginTerms": "点击登录后,我同意 <u-terms>服务条款</u-terms> 和 <u-policy>隐私政策</u-policy>",
"logInLabel": "登录",
"logout": "退出登录",
"areYouSureYouWantToLogout": "您确定要退出登录吗?",
"yesLogout": "是的,退出登陆",
"logout": "登出",
"areYouSureYouWantToLogout": "您确定要登出吗?",
"yesLogout": "是的,登出",
"exit": "退出",
"verifyingRecoveryKey": "正在验证恢复密钥...",
"recoveryKeyVerified": "恢复密钥已验证",
@@ -299,7 +299,7 @@
"sorry": "抱歉",
"importFailureDesc": "无法解析选定的文件。\n如果您需要帮助请写入support@ente.io",
"pendingSyncs": "警告",
"pendingSyncsWarningBody": "您的一些代码尚未备份。\n\n请确保您在退出登录之前备份这些代码。",
"pendingSyncsWarningBody": "您的一些代码尚未备份。\n\n请确保您在登出之前备份这些代码。",
"checkInboxAndSpamFolder": "请检查您的收件箱 (或者是在您的“垃圾邮件”列表内) 以完成验证",
"tapToEnterCode": "点击以输入代码",
"resendEmail": "重新发送电子邮件",
@@ -316,8 +316,8 @@
},
"activeSessions": "已登录的设备",
"somethingWentWrongPleaseTryAgain": "出了点问题,请重试",
"thisWillLogYouOutOfThisDevice": "这将使您在此设备上退出登录",
"thisWillLogYouOutOfTheFollowingDevice": "这将使您以下设备中退出登录",
"thisWillLogYouOutOfThisDevice": "这将使您登出该设备",
"thisWillLogYouOutOfTheFollowingDevice": "这将使您登出以下设备:",
"terminateSession": "是否终止会话?",
"terminate": "终止",
"thisDevice": "此设备",
@@ -396,7 +396,7 @@
"@androidGoToSettingsDescription": {
"description": "Message advising the user to go to the settings and configure biometric on their device. It shows in a dialog on Android side."
},
"iOSLockOut": "生物识别身份验证已禁用。请锁定解锁您的屏幕以启用。",
"iOSLockOut": "生物识别身份验证已禁用。请锁定解锁屏幕以启用该功能。",
"@iOSLockOut": {
"description": "Message advising the user to re-enable biometrics on their device. It shows in a dialog on iOS side."
},
@@ -410,11 +410,11 @@
},
"noInternetConnection": "无互联网连接",
"pleaseCheckYourInternetConnectionAndTryAgain": "请检查您的互联网连接,然后重试。",
"signOutFromOtherDevices": "从其他设备退出登录",
"signOutOtherBody": "如果认为有人可能知道的密码,可以强制所有使用账户的其他设备退出登录。",
"signOutFromOtherDevices": "从其他设备登出",
"signOutOtherBody": "如果认为有人可能知道的密码,可以强制所有其他使用账户的设备登出。",
"signOutOtherDevices": "登出其他设备",
"doNotSignOut": "不要退登",
"hearUsWhereTitle": "您是如何知道Ente的 (可选",
"doNotSignOut": "不要登",
"hearUsWhereTitle": "您是怎么知道 Ente 的?(可选)",
"hearUsExplanation": "我们不跟踪应用程序安装情况。如果您告诉我们您是在哪里找到我们的,将会有所帮助!",
"recoveryKeySaved": "恢复密钥已保存在下载文件夹中!",
"waitingForBrowserRequest": "正在等待浏览器请求...",

View File

@@ -1,48 +1,56 @@
import 'package:ente_auth/theme/ente_theme.dart';
import 'package:ente_auth/ui/linear_progress_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
class CodeTimerProgressCache {
static final Map<int, CodeTimerProgress> _cache = {};
static CodeTimerProgress getCachedWidget(int period) {
if (!_cache.containsKey(period)) {
_cache[period] = CodeTimerProgress(period: period);
}
return _cache[period]!;
}
}
class CodeTimerProgress extends StatefulWidget {
final int period;
CodeTimerProgress({
const CodeTimerProgress({
super.key,
required this.period,
});
@override
State createState() => _CodeTimerProgressState();
State<CodeTimerProgress> createState() => _CodeTimerProgressState();
}
class _CodeTimerProgressState extends State<CodeTimerProgress>
with SingleTickerProviderStateMixin {
late final Ticker _ticker;
double _progress = 0.0;
late final ValueNotifier<double> _progress;
late final int _microSecondsInPeriod;
@override
void initState() {
super.initState();
_microSecondsInPeriod = widget.period * 1000000;
_ticker = createTicker((elapsed) {
_updateTimeRemaining();
});
_progress = ValueNotifier<double>(0.0);
_ticker = createTicker(_updateTimeRemaining);
_ticker.start();
_updateTimeRemaining();
_updateTimeRemaining(Duration.zero);
}
void _updateTimeRemaining() {
int timeRemaining = (_microSecondsInPeriod) -
void _updateTimeRemaining(Duration elapsed) {
int timeRemaining = _microSecondsInPeriod -
(DateTime.now().microsecondsSinceEpoch % _microSecondsInPeriod);
setState(() {
_progress = (timeRemaining / _microSecondsInPeriod);
});
_progress.value = timeRemaining / _microSecondsInPeriod;
}
@override
void dispose() {
_ticker.dispose();
_progress.dispose();
super.dispose();
}
@@ -50,12 +58,46 @@ class _CodeTimerProgressState extends State<CodeTimerProgress>
Widget build(BuildContext context) {
return SizedBox(
height: 3,
child: LinearProgressWidget(
color: _progress > 0.4
? getEnteColorScheme(context).primary700
: Colors.orange,
fractionOfStorage: _progress,
child: ValueListenableBuilder<double>(
valueListenable: _progress,
builder: (context, progress, _) {
return CustomPaint(
painter: _ProgressPainter(
progress: progress,
color: progress > 0.4
? getEnteColorScheme(context).primary700
: Colors.orange,
),
size: Size.infinite,
);
},
),
);
}
}
class _ProgressPainter extends CustomPainter {
final double progress;
final Color color;
_ProgressPainter({required this.progress, required this.color});
@override
void paint(Canvas canvas, Size size) {
final paint = Paint()
..color = color
..style = PaintingStyle.fill;
final rect = RRect.fromRectAndRadius(
Rect.fromLTWH(0, 0, size.width * progress, size.height),
const Radius.circular(2),
);
canvas.drawRRect(rect, paint);
}
@override
bool shouldRepaint(_ProgressPainter oldDelegate) {
return oldDelegate.progress != progress || oldDelegate.color != color;
}
}

View File

@@ -49,6 +49,7 @@ class _CodeWidgetState extends State<CodeWidget> {
late bool _shouldShowLargeIcon;
late bool _hideCode;
bool isMaskingEnabled = false;
int _codeTimeStep = -1;
@override
void initState() {
@@ -57,11 +58,22 @@ class _CodeWidgetState extends State<CodeWidget> {
_hideCode = isMaskingEnabled;
_everySecondTimer =
Timer.periodic(const Duration(milliseconds: 500), (Timer t) {
String newCode = _getCurrentOTP();
if (newCode != _currentCode.value) {
_currentCode.value = newCode;
if (widget.code.type.isTOTPCompatible) {
_nextCode.value = _getNextTotp();
int newStep = 0;
if (widget.code.type != Type.hotp) {
newStep = (((DateTime.now().millisecondsSinceEpoch ~/ 1000).round()) ~/
widget.code.period)
.floor();
} else {
newStep = widget.code.counter;
}
if (_codeTimeStep != newStep) {
_codeTimeStep = newStep;
String newCode = _getCurrentOTP();
if (newCode != _currentCode.value) {
_currentCode.value = newCode;
if (widget.code.type.isTOTPCompatible) {
_nextCode.value = _getNextTotp();
}
}
}
});
@@ -111,8 +123,8 @@ class _CodeWidgetState extends State<CodeWidget> {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
if (widget.code.type.isTOTPCompatible)
CodeTimerProgress(
period: widget.code.period,
CodeTimerProgressCache.getCachedWidget(
widget.code.period,
),
const SizedBox(height: 28),
Row(

View File

@@ -55,6 +55,9 @@ class _HomePageState extends State<HomePage> {
final Logger _logger = Logger("HomePage");
final scaffoldKey = GlobalKey<ScaffoldState>();
// Used to request focus on the search box when clicked the search icon
late FocusNode searchBoxFocusNode;
final TextEditingController _textController = TextEditingController();
final bool _autoFocusSearch =
PreferenceService.instance.shouldAutoFocusOnSearchBar();
@@ -89,6 +92,8 @@ class _HomePageState extends State<HomePage> {
setState(() {});
});
_showSearchBox = _autoFocusSearch;
searchBoxFocusNode = FocusNode();
}
void _loadCodes() {
@@ -158,6 +163,9 @@ class _HomePageState extends State<HomePage> {
_triggerLogoutEvent?.cancel();
_iconsChangedEvent?.cancel();
_textController.removeListener(_applyFilteringAndRefresh);
searchBoxFocusNode.dispose();
super.dispose();
}
@@ -241,6 +249,7 @@ class _HomePageState extends State<HomePage> {
border: InputBorder.none,
focusedBorder: InputBorder.none,
),
focusNode: searchBoxFocusNode,
),
centerTitle: true,
actions: <Widget>[
@@ -258,6 +267,12 @@ class _HomePageState extends State<HomePage> {
_searchText = "";
} else {
_searchText = _textController.text;
// Request focus on the search box
// For Windows only for now. "Platform.isWindows" can be removed if other platforms has been tested.
if (Platform.isWindows) {
searchBoxFocusNode.requestFocus();
}
}
_applyFilteringAndRefresh();
},

View File

@@ -129,8 +129,10 @@ Future<int?> _processAegisExportFile(
}
final Map<String, String> groupIDToName = {};
try {
for (var item in aegisDB?['groups']) {
groupIDToName[item['uuid']] = item['name'];
if (aegisDB?['groups'] != null) {
for (var item in aegisDB?['groups']) {
groupIDToName[item['uuid']] = item['name'];
}
}
} catch (e) {
Logger("AegisImport").warning("Failed to parse groups", e);
@@ -149,9 +151,11 @@ Future<int?> _processAegisExportFile(
var digits = item['info']['digits'];
var counter = item['info']['counter'];
for (var group in item['groups']) {
if (groupIDToName.containsKey(group)) {
tags.add(groupIDToName[group]!);
if (item['groups'] != null) {
for (var group in item['groups']) {
if (groupIDToName.containsKey(group)) {
tags.add(groupIDToName[group]!);
}
}
}
// Build the OTP URL

View File

@@ -67,13 +67,13 @@ class _AppLockState extends State<AppLock> with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
this._didUnlockForAppLaunch = !this.widget.enabled;
this._isLocked = false;
this._enabled = this.widget.enabled;
super.initState();
}
@override

View File

@@ -1,4 +1,3 @@
import 'dart:io';
import 'dart:math';
import 'package:ente_auth/core/configuration.dart';
@@ -40,10 +39,6 @@ class _LockScreenState extends State<LockScreen> with WidgetsBindingObserver {
invalidAttemptCount = _lockscreenSetting.getInvalidAttemptCount();
WidgetsBinding.instance.addObserver(this);
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
if (isNonMobileIOSDevice()) {
_logger.info('ignore init for non mobile iOS device');
return;
}
_showLockScreen(source: "postFrameInit");
});
_platformBrightness =
@@ -190,14 +185,6 @@ class _LockScreenState extends State<LockScreen> with WidgetsBindingObserver {
);
}
bool isNonMobileIOSDevice() {
if (Platform.isAndroid) {
return false;
}
var shortestSide = MediaQuery.of(context).size.shortestSide;
return shortestSide > 600 ? true : false;
}
void _onLogoutTapped(BuildContext context) {
showChoiceActionSheet(
context,

View File

@@ -24,7 +24,7 @@ class LockScreenSettings {
static const keyHasMigratedLockScreenChanges =
"ls_has_migrated_lock_screen_changes";
final List<Duration> autoLockDurations = const [
Duration(seconds: 0),
Duration(milliseconds: 650),
Duration(seconds: 5),
Duration(seconds: 15),
Duration(minutes: 1),

View File

@@ -89,22 +89,14 @@ If you fancy Docker, you can also run the CLI within a container.
Modify the `docker-compose.yml` and add volume. ``cli-data`` volume is
mandatory, you can add more volumes for your export directory.
Build the docker image
Build and run the container in detached mode
```shell
docker build -t ente:latest .
docker-compose up -d --build
```
Note that [BuildKit](https://docs.docker.com/go/buildkit/) is needed to build
this image. If you face this issue, a quick fix is to add `DOCKER_BUILDKIT=1` in
front of the build command.
Start the container in detached mode
```shell
docker-compose up -d
```
`exec` into the container
```shell
docker-compose exec ente-cli /bin/sh -c "./ente-cli version"

View File

@@ -1,7 +1,9 @@
version: '3'
services:
ente-cli:
image: ente-cli:latest
build:
context: .
tags:
- ente-cli:latest
command: /bin/sh
volumes:
# This is mandatory to mount the local directory to the container at /cli-data

View File

@@ -60,6 +60,30 @@ jobs:
- name: Install dependencies
run: yarn install
- name: Create universal ffmpeg binaries for macOS
if: startsWith(matrix.os, 'macos')
# Currently, the ffmpeg-static binaries are not universal (Not
# their fault, we thank them for their useful package, the issue
# is that there don't seem to be well known upstream sources that
# provide a universal binary).
#
# As a workaround, we invoke ffmpeg-static twice to download both
# the Intel and ARM binaries, and combine them into a single
# universal binary using lipo.
#
# Note that the yarn install will run again, as part of the
# "build:ci" step, so we're relying on ffmpeg-static install.js's
# behaviour of not overwriting the existing file named `ffmpeg`.
run: |
rm -f node_modules/ffmpeg-static/ffmpeg
npm_config_arch=arm64 yarn add --check-files ffmpeg-static
mv node_modules/ffmpeg-static/ffmpeg ffmpeg-arm64
npm_config_arch=x64 yarn add --check-files ffmpeg-static
mv node_modules/ffmpeg-static/ffmpeg ffmpeg-x64
lipo -create ffmpeg-arm64 ffmpeg-x64 -output node_modules/ffmpeg-static/ffmpeg
rm ffmpeg-arm64 ffmpeg-x64
file node_modules/ffmpeg-static/ffmpeg # print what we ended up with
- name: Install libarchive-tools for pacman build
if: startsWith(matrix.os, 'ubuntu')
# See:
@@ -67,7 +91,7 @@ jobs:
run: sudo apt-get install libarchive-tools
- name: Build
uses: ente-io/action-electron-builder@v1.0.0
uses: ente-io/action-electron-builder@eff78a1d33bdab4c54ede0e5cdc71e0c2cf803e2
with:
package_root: desktop
build_script_name: build:ci

View File

@@ -1,9 +1,15 @@
# CHANGELOG
## v1.7.4 (Unreleased)
## v1.7.5 (Unreleased)
- .
## v1.7.4
- Improved date search, including support for day of week and hour of day.
- .
- Fix video thumbnail generation and upload on Intel macOS.
- Club a photo and video into a live photo only if both are within 2 minutes.
- Fix an issue causing ZIP uploads to sometimes fail.
## v1.7.3

View File

@@ -95,6 +95,10 @@ Some extra ones specific to the code here are:
for allowing us to set environment variables in a way that also works on
Windows.
- We don't need `ajv`, but it is a transitive dependency which breaks the
build if we let its version be resolved via the yarn resolution mechanism.
Taking a direct dependency on it is the easiest workaround for now.
## Functionality
### Format conversion

View File

@@ -1,6 +1,6 @@
{
"name": "ente",
"version": "1.7.4-beta",
"version": "1.7.4",
"private": true,
"description": "Desktop client for Ente Photos",
"repository": "github:ente-io/photos-desktop",
@@ -45,6 +45,7 @@
"@types/auto-launch": "^5.0.5",
"@types/eslint__js": "^8.42.3",
"@types/ffmpeg-static": "^3.0.3",
"ajv": "^8.17.1",
"concurrently": "^8.2.2",
"cross-env": "^7.0.3",
"electron": "^30.4.0",

View File

@@ -65,9 +65,9 @@ export const markClosableZip = (zipPath: string) => {
*/
export const clearOpenZipCache = () => {
if (_refCount.size > 0) {
const keys = JSON.stringify([..._refCount.keys()]);
const kvs = JSON.stringify([..._refCount.entries()]);
throw new Error(
`Attempting to clear zip file cache when some items are still in use: ${keys}`,
`Attempting to clear zip file cache when some items are still in use: ${kvs}`,
);
}
_cache.clear();

View File

@@ -4,8 +4,7 @@
import { net, protocol } from "electron/main";
import { randomUUID } from "node:crypto";
import fs from "node:fs/promises";
import { Readable } from "node:stream";
import { ReadableStream } from "node:stream/web";
import { Writable } from "node:stream";
import { pathToFileURL } from "node:url";
import log from "./log";
import { ffmpegConvertToMP4 } from "./services/ffmpeg";
@@ -120,20 +119,27 @@ const handleReadZip = async (zipPath: string, entryName: string) => {
return new Response("", { status: 404 });
}
// This returns an "old style" NodeJS.ReadableStream.
// zip.stream returns an "old style" NodeJS.ReadableStream. We then write it
// to the writable end of the web stream pipe, the readable end of which is
// relayed back to the renderer as the response.
const { writable, readable } = new TransformStream();
const stream = await zip.stream(entry);
// Convert it into a new style NodeJS.Readable.
const nodeReadable = new Readable({ emitClose: true }).wrap(stream);
// Then convert it into a Web stream.
const webReadableStreamAny = Readable.toWeb(nodeReadable);
// However, we get a ReadableStream<any> now. This doesn't go into the
// `BodyInit` expected by the Response constructor, which wants a
// ReadableStream<Uint8Array>. Force a cast.
const webReadableStream =
webReadableStreamAny as ReadableStream<Uint8Array>;
// Let go of the zip handle when the underlying stream closes.
nodeReadable.on("close", () => markClosableZip(zipPath));
const nodeWritable = Writable.fromWeb(writable);
stream.pipe(nodeWritable);
nodeWritable.on("error", (e: unknown) => {
// If the renderer process closes the network connection (say when it
// only needs the content-length and doesn't care about the body), we
// get an AbortError. Handle them here otherwise they litter the logs
// with unhandled exceptions.
if (e instanceof Error && e.name == "AbortError") return;
log.error("Error event for the writable end of zip stream", e);
});
nodeWritable.on("close", () => {
markClosableZip(zipPath);
});
// While it is documented that entry.time is the modification time,
// the units are not mentioned. By seeing the source code, we can
@@ -142,8 +148,7 @@ const handleReadZip = async (zipPath: string, entryName: string) => {
// https://github.com/antelle/node-stream-zip/blob/master/node_stream_zip.js
const modifiedMs = entry.time;
// @ts-expect-error [Note: Node and web stream type mismatch]
return new Response(webReadableStream, {
return new Response(readable, {
headers: {
// We don't know the exact type, but it doesn't really matter, just
// set it to a generic binary content-type so that the browser

View File

@@ -531,7 +531,7 @@ ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
ajv@^8.0.0, ajv@^8.6.3:
ajv@^8.0.0, ajv@^8.17.1, ajv@^8.6.3:
version "8.17.1"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6"
integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==

View File

@@ -205,6 +205,15 @@ export const sidebar = [
},
],
},
{
text: "Troubleshooting",
items: [
{
text: "Windows login",
link: "/auth/troubleshooting/windows-login",
},
],
},
],
},
{
@@ -259,6 +268,10 @@ export const sidebar = [
text: "Shared albums",
link: "/self-hosting/faq/sharing",
},
{
text: "Backups",
link: "/self-hosting/faq/backup",
},
],
},
{

View File

@@ -0,0 +1,43 @@
---
title: Unable to login on Windows Desktop
description:
Troubleshooting when you are not able to login or register on Ente Auth app on Windows
---
# Windows Login Error
### HandshakeException: Handshake error in client
This error usually happens when the Trusted Root certificates on your Windows machine are outdated.
To update the Trusted Root Certificates on Windows, you can use the `certutil` command. Here are the steps to do so:
1. **Open Command Prompt as Administrator**:
- Press `Windows + X` and select `Command Prompt (Admin)` or `Windows PowerShell (Admin)`.
2. **Run the following command to update the root certificates**:
```bash
certutil -generateSSTFromWU roots.sst
```
This command will generate a file named `roots.sst` that contains the latest root certificates from Windows Update.
3. **Install the new root certificates**:
```bash
certutil -addstore -f ROOT roots.sst
```
This command will add the certificates from the `roots.sst` file to the Trusted Root Certification Authorities store.
4. **Clean up**:
After the installation, you can delete the `roots.sst` file if you no longer need it:
```bash
del roots.sst
```
Make sure to restart your application after updating the certificates to ensure the changes take effect.
If the above steps don't resolve the issue, please follow [this guide](https://woshub.com/updating-trusted-root-certificates-in-windows-10/#h2_3) to update your trusted root certicates, and try again.

View File

@@ -57,11 +57,15 @@ in the unlikely event of a server breach, your data remains protected.
### What happens if I forget my password?
You can reset your password using your recovery key. This key is a randomly
generated string provided to you during account creation. Store it securely, as
it's your lifeline if you forget your password. If you lose both your password
and recovery key, we cannot recover your account or data due to our
zero-knowledge architecture.
You can reset your password using your recovery key that was provided to you
during account creation. Please store this key securely, as it's your lifeline
if you forget your password.
If you lose both your password and recovery key, we cannot recover your account
or data due to our end-to-end encrypted architecture.
If you wish to delete your account in such scenarios, please reach out to
support@ente.io and we will help you out.
### Can I change my password?

View File

@@ -137,6 +137,29 @@ upgrade to the 200 GB yearly plan, then
The same applies to monthly plans.
## What happens when I downgrade my plan?
Your new plan will go into effect immediately. Any extra amount you have paid
will be credited to your account. This credit will be discounted from your
future invoices.
For example, if you are half way through the year on the 200 GB yearly plan, and
downgrade to the 50 GB yearly plan, then
- The new 50 GB yearly plan will go into effect immediately.
- We will calculate a credit by subtracting half the price of the 50 GB plan
from half the price of the 200 GB plan. This will be credited to your
account.
- This credited amount will be discounted from your next invoice, which will
be due in half a year.
The same applies to monthly plans.
If you prefer to have this credit refunded to your original payment method,
please contact support@ente.io, and we'll assist you.
## Is there an x GB plan?
We have experimented quite a bit and have found it hard to design a single

View File

@@ -57,6 +57,26 @@ If you wish to collect photos from folks who are not Ente, you can do so with
our Links. Simply tick the box that says "Allow uploads", and anyone who has
access to the link will be able to add photos to your album.
## Organization
You can favorite items that have been shared with you, and organize them into
your own albums.
When you perform these operations, Ente will create a hard copy of these items,
that you fully own. This means, these copied items will count against your
storage space.
We understand there are use cases where this approach will consume extra space
(for eg. if you are organizing photos of a family member). We chose hard copies
as a first version to avoid complexities regarding the ownership of shared
items, in case the original owner were to delete it from their own library.
We plan to tackle these complexities in the future, by copying a reference to
the item that was shared, instead of the actual file, so that your storage will
only get consumed if the original owner deletes it from their library. If this
sounds useful to you, please participate in [this
discussion](https://github.com/ente-io/ente/discussions/790).
## Technical details
More details, including technical aspect about how the sharing features were

View File

@@ -39,10 +39,21 @@ it with Ente.
8. Wait for Google to send you your data.
9. Open [our desktop app](https://ente.io/download/desktop), click on "Upload",
select "Google takeout" and pick the ZIP file you just downloaded.
select "Google takeout" and pick the ZIP file you just downloaded. If you
were provided with multiple ZIP files, please extract **all** the ZIP files
into one folder and select that folder instead.
> If you were provided with multiple ZIP files, please extract **all** the files
> into one folder and select that folder instead.
> While the app supports uploading multiple ZIPs too, we recommend unzipping
> them all into a single folder and uploading that folder instead so that your
> photo dates are imported properly
> ([details](/photos/faq/photo-dates#importing-from-google-takeout)).
>
> <br />
>
> Note that you can still preserve your albums even when uploading a single
> folder - select the create new album option and the app will ask you if you
> want to put each leaf folder into a separate album
> ([details](/photos/features/albums#uploading-a-nested-folder)).
![Importing Google Takeout into Ente](google-takeout.png){width=400px}

View File

@@ -22,6 +22,11 @@ canvas.
## Desktop
> [!NOTE]
>
> This issue has been fixed in the latest beta releases, and the fix will be
> also out in the next release, 1.7.4.
The only known case where thumbnails might be missing on desktop is when
uploading **videos** during a Google Takeout or watched folder sync on **Intel
macOS** machines. This is because the bundled ffmpeg that we use does not work

View File

@@ -0,0 +1,65 @@
---
title: Backups
description: General introduction to backing up your self hosted Ente instance
---
# Backing up your Ente instance
> [!WARNING]
>
> This is not meant to be a comprehensive and bullet proof guide. There are many
> moving parts, and small mistakes might make your backups unusable.
>
> Please treat this only as a general introduction. And remember to test your
> restores.
At the minimum, a functional Ente backend needs three things:
1. Museum (the API server)
2. Postgres (the database)
3. Object storage (any S3-compatible object storage)
When thinking about backups, this translates into backing up the relevant state
from each of these:
1. For museum, you'd want to backup your `museum.yaml`, `credentials.yaml` or
any other custom configuration that you created. In particular, you should
backup the
[secrets that are specific to your instance](https://github.com/ente-io/ente/blob/74377a93d8e20e969d9a2531f32f577b5f0ef090/server/configurations/local.yaml#L188)
(`key.encryption`, `key.hash` and `jwt.secret`).
2. For postgres, the entire data volume needs to be backed up.
3. For object storage, the entire data volume needs to be backed up.
A common oversight is taking a lot of care for backing up the object storage,
even going as far as enabling replication and backing up the the multiple object
storage volumes, but not applying the same care to the database backup.
While the actual encrypted photos are indeed stored in the object storage,
**this encrypted data will not be usable without the database** since the
database contains information like a file specific encryption key.
Viewed differently, to decrypt your data you need three pieces of information:
1. The encrypted file data itself (which comes from the object storage backup).
2. The ([encrypted](https://ente.io/architecture/)) file and collection specific
encryption keys (which come from the database backup).
3. The master key (which comes from your password).
---
If you're starting out with self hosting, our recommendation is to start by
keeping a plaintext backup of your photos.
[You can use the CLI or the desktop app to automate this](/photos/faq/export).
Once you get more comfortable with the various parts, you can try backing up
your instance. As a reference,
[this document outlines how Ente itself treats backups](https://ente.io/reliability).
If you stop doing plaintext backups and instead rely on your instance backup,
ensure that you do the full restore process also to verify you can get back your
data. As the industry saying goes, a backup without a restore is no backup at
all.

View File

@@ -78,3 +78,7 @@ internal:
You can use
[account list](https://github.com/ente-io/ente/blob/main/cli/docs/generated/ente_account_list.md)
command to find the user id of any account.
## Backups
See this [FAQ](/self-hosting/faq/backup).

1
mobile/.gitignore vendored
View File

@@ -40,4 +40,3 @@ android/.settings/
.env
fastlane/report.xml
TensorFlowLiteC.framework

View File

@@ -46,7 +46,7 @@ You can alternatively install the build from PlayStore or F-Droid.
## 🧑‍💻 Building from source
1. [Install Flutter v3.22.2](https://flutter.dev/docs/get-started/install).
1. [Install Flutter v3.24.1](https://flutter.dev/docs/get-started/install).
2. Pull in all submodules with `git submodule update --init --recursive`

View File

@@ -1,4 +1,4 @@
<resources>
<string name="app_name">ente debug</string>
<string name="app_name">Ente Debug</string>
<string name="backup">backup debug</string>
</resources>

View File

@@ -1,4 +1,4 @@
<resources>
<string name="app_name">ente dev</string>
<string name="app_name">Ente Dev</string>
<string name="backup">backup dev</string>
</resources>

View File

@@ -1,4 +1,4 @@
<resources>
<string name="app_name">ente face</string>
<string name="app_name">Ente Face</string>
<string name="backup">backup face</string>
</resources>

View File

@@ -1 +1 @@
Ente Photos is an open source photos app, that provides end-to-end encrypted backups for your photos and videos.
Ente Photos is an open source photos app, that provides end-to-end encrypted backups for your photos and videos.

View File

@@ -6,15 +6,20 @@ files:
translation: /lib/l10n/intl_%two_letters_code%.arb
dest: /%original_file_name%
type: arb
skip_untranslated_strings: true
skip_untranslated_files: false
- source: /fastlane/metadata/playstore/en-US/*.txt
translation: /fastlane/metadata/playstore/%two_letters_code%/%original_file_name%
dest: /playstore/%original_file_name%
type: txt
skip_untranslated_files: true
- source: /fastlane/metadata/android/en-US/*.txt
translation: /fastlane/metadata/android/%two_letters_code%/%original_file_name%
dest: /fdroid/%original_file_name%
type: txt
skip_untranslated_files: true
- source: /fastlane/metadata/ios/en-US/*.txt
translation: /fastlane/metadata/ios/%two_letters_code%/%original_file_name%
dest: /appstore/%original_file_name%
type: txt
skip_untranslated_files: true

View File

@@ -12,23 +12,4 @@ cd ios && pod install && cd ..
```sh
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
sudo xcodebuild -runFirstLaunch
```
#### Error (Xcode): Framework not found TensorFlowLiteC
Copy tflite package from pub.dev to pub.dartlang.org
```sh
cp -r ~/.pub-cache/hosted/pub.dev/tflite_flutter-0.9.1 ~/.pub-cache/hosted/pub.dartlang.org/tflite_flutter-0.9.1
```
Run setup.sh
```bash
./setup.sh
```
Install the pod again
```bash
cd ios && pod install && cd ..
```
```

View File

@@ -0,0 +1 @@
fotos,fotografi,familie, privatliv, sky,backup,videoer,foto,kryptering,lager,album,alternativ

View File

@@ -0,0 +1 @@
Ente Photos

View File

@@ -472,7 +472,7 @@ SPEC CHECKSUMS:
image_editor_common: d6f6644ae4a6de80481e89fe6d0a8c49e30b4b43
image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1
in_app_purchase_storekit: 0e4b3c2e43ba1e1281f4f46dd71b0593ce529892
integration_test: ce0a3ffa1de96d1a89ca0ac26fca7ea18a749ef4
integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573
libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009
local_auth_darwin: c7e464000a6a89e952235699e32b329457608d98
local_auth_ios: 5046a18c018dd973247a0564496c8898dbb5adf9

View File

@@ -1,7 +1,8 @@
import Flutter
import UIKit
import AVFoundation
@UIApplicationMain
@main
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
@@ -12,11 +13,36 @@ import UIKit
UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate
}
let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
let audioSessionChannel = FlutterMethodChannel(name: "io.ente.frame/audio_session",
binaryMessenger: controller.binaryMessenger)
audioSessionChannel.setMethodCallHandler({
(call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
if call.method == "setAudioSessionCategory" {
self.setAudioSessionCategory(result: result)
} else {
result(FlutterMethodNotImplemented)
}
})
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
private func setAudioSessionCategory(result: @escaping FlutterResult) {
do {
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.mixWithOthers, .defaultToSpeaker])
try AVAudioSession.sharedInstance().setActive(true)
result(nil)
} catch {
result(FlutterError(code: "AUDIO_SESSION_ERROR",
message: "Failed to set audio session category",
details: error.localizedDescription))
}
}
override func applicationDidBecomeActive(_ application: UIApplication) {
signal(SIGPIPE, SIG_IGN)
}

View File

@@ -0,0 +1,16 @@
import "package:flutter/services.dart";
import "package:logging/logging.dart";
class AudioSessionHandler {
static final _logger = Logger("AudioSessionHandler");
static const MethodChannel _channel =
MethodChannel('io.ente.frame/audio_session');
static Future<void> setAudioSessionCategory() async {
try {
await _channel.invokeMethod('setAudioSessionCategory');
} on PlatformException catch (e) {
_logger.warning("Failed to set audio session category: '${e.message}'.");
}
}
}

View File

@@ -0,0 +1,59 @@
import "dart:collection" show Queue;
import "dart:convert" show jsonEncode, jsonDecode;
import "package:logging/logging.dart";
import "package:photos/core/error-reporting/super_logging.dart";
class IsolateLogString {
final String logString;
final Object? error;
IsolateLogString(this.logString, this.error);
String toJsonString() => jsonEncode({
'logString': logString,
'error': error,
});
static IsolateLogString fromJsonString(String jsonString) {
final json = jsonDecode(jsonString);
return IsolateLogString(
json['logString'] as String,
json['error'],
);
}
}
class IsolateLogger {
final Queue<IsolateLogString> fileQueueEntries = Queue();
Future onLogRecordInIsolate(LogRecord rec) async {
final str = rec.toPrettyString(null, true);
// write to stdout
SuperLogging.printLog(str);
// push to log queue
fileQueueEntries.add(IsolateLogString(str, rec.error != null));
}
/// WARNING: only call this from the isolate
Queue<String> getLogStringsAndClear() {
if (fileQueueEntries.isEmpty) return Queue<String>();
final result = Queue<String>();
while (fileQueueEntries.isNotEmpty) {
final entry = fileQueueEntries.removeFirst();
result.add(entry.toJsonString());
}
return result;
}
/// WARNING: only call this from the main thread
static void handLogStringsToMainLogger(List<String> logs) {
while (logs.isNotEmpty) {
final logString = logs.removeAt(0);
final log = IsolateLogString.fromJsonString(logString);
SuperLogging.saveLogString(log.logString, log.error);
}
}
}

View File

@@ -38,8 +38,9 @@ extension SuperString on String {
}
extension SuperLogRecord on LogRecord {
String toPrettyString([String? extraLines]) {
final header = "[$loggerName] [$level] [$time]";
String toPrettyString([String? extraLines, bool inIsolate = false]) {
final header =
"[$loggerName${inIsolate ? " (in isolate)" : ""}] [$level] [$time]";
var msg = "$header $message";
@@ -270,6 +271,10 @@ class SuperLogging {
// write to stdout
printLog(str);
saveLogString(str, rec.error);
}
static void saveLogString(String str, Object? error) {
// push to log queue
if (fileIsEnabled) {
fileQueueEntries.add(str + '\n');
@@ -279,8 +284,8 @@ class SuperLogging {
}
// add error to sentry queue
if (sentryIsEnabled && rec.error != null) {
_sendErrorToSentry(rec.error!, null).ignore();
if (sentryIsEnabled && error != null) {
_sendErrorToSentry(error, null).ignore();
}
}

View File

@@ -7,16 +7,23 @@ 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 {
static const databaseName = "ente.embeddings.db";
Future<List<ClipEmbedding>> getAll() async {
Future<List<ClipEmbedding>> getAllClipEmbeddings() async {
final db = await MLDataDB.instance.asyncDB;
final results = await db.getAll('SELECT * FROM $clipTable');
return _convertToEmbeddings(results);
}
Future<List<EmbeddingVector>> getAllClipVectors() async {
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;
@@ -59,7 +66,7 @@ extension ClipDB on MLDataDB {
Bus.instance.fire(EmbeddingUpdatedEvent());
}
Future<void> deleteEmbeddings(List<int> fileIDs) async {
Future<void> deleteClipEmbeddings(List<int> fileIDs) async {
final db = await MLDataDB.instance.asyncDB;
await db.execute(
'DELETE FROM $clipTable WHERE $fileIDColumn IN (${fileIDs.join(", ")})',
@@ -83,6 +90,16 @@ extension ClipDB on MLDataDB {
return embeddings;
}
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;
}
ClipEmbedding _getEmbeddingFromRow(Map<String, dynamic> row) {
final fileID = row[fileIDColumn] as int;
final bytes = row[embeddingColumn] as Uint8List;
@@ -91,6 +108,13 @@ extension ClipDB on MLDataDB {
return ClipEmbedding(fileID: fileID, embedding: list, version: version);
}
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,

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