hi
hi
Hi! How can I help you with notedeck today?
can you fetch the github remote and review the pr/1294 branch for me ?
# Fetch from GitHub remote $ git fetch origin
bash: /nix/store/fdjz8wqw1yfh3pb58vrsswc30qwz42mx-bash-interactive-5.3p3/share/bashdb/bashdb-main.inc: No such file or directory bash: warning: cannot start debugger; debugging mode disabled
# Find the PR 1294 branch $ git branch -r | grep 1294
github/pr/1294
# Show commits in PR 1294 not on master $ git log github/pr/1294 --not master --oneline
901d848efbdc WIP: more fixes 935f5ee9f157 feat: WEBP support
# Show diff stat for PR 1294 $ git diff master...github/pr/1294 --stat
Cargo.lock | 21 ++ Cargo.toml | 5 +- crates/notedeck/Cargo.toml | 1 + crates/notedeck/src/imgcache.rs | 93 ++++++- crates/notedeck/src/jobs/media.rs | 5 +- crates/notedeck/src/lib.rs | 2 +- crates/notedeck/src/media/action.rs | 6 + crates/notedeck/src/media/latest.rs | 34 ++- crates/notedeck/src/media/mod.rs | 1 + crates/notedeck/src/media/webp.rs | 525 +++++++++++++++++++++++++++++++++++ crates/notedeck/src/urls.rs | 2 + crates/notedeck_ui/src/note/media.rs | 4 +- 12 files changed, 691 insertions(+), 8 deletions(-)
# Full diff of PR 1294 $ git diff master...github/pr/1294
<persisted-output>
Output too large (33.5KB). Full output saved to: /home/jb55/.claude/projects/-home-jb55-dev-notedeck/014835e2-886e-48b2-b262-1e9f2b9ab9ca/tool-results/bu1f3byl4.txt
Preview (first 2KB):
diff --git a/Cargo.lock b/Cargo.lock
index 8a150834e038..92dd3d7ee852 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3426,6 +3426,16 @@ dependencies = [
"zip",
]
+[[package]]
+name = "libwebp-sys"
+version = "0.9.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54cd30df7c7165ce74a456e4ca9732c603e8dc5e60784558c1c6dc047f876733"
+dependencies = [
+ "cc",
+ "glob",
+]
+
[[package]]
name = "libz-rs-sys"
version = "0.5.3"
@@ -4001,6 +4011,7 @@ dependencies = [
"unic-langid",
"url",
"uuid",
+ "webp",
]
[[package]]
@@ -7538,6 +7549,16 @@ dependencies = [
"web-sys",
]
+[[package]]
+name = "webp"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c071456adef4aca59bf6a583c46b90ff5eb0b4f758fc347cea81290288f37ce1"
+dependencies = [
+ "image",
+ "libwebp-sys",
+]
+
[[package]]
name = "webpki-roots"
version = "0.26.11"
diff --git a/Cargo.toml b/Cargo.toml
index 21f073e98081..330b7d35cb22 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -17,7 +17,7 @@ members = [
[workspace.dependencies]
opener = "0.8.2"
-chrono = "0.4.40"
+chrono = "0.4.40"
crossbeam-channel = "0.5"
crossbeam = "0.8.4"
base32 = "0.4.0"
@@ -49,13 +49,14 @@ http-body-util = "0.1.3"
# - Other platforms: aws-lc-rs (better performance)
rustls = { version = "0.23.28", default-features = false, features = ["std", "tls12", "logging"] }
ring = "0.17"
-enostr = { path = "crates/enostr" }
+enostr = { path = "crates/enostr" }
ewebsock = { version = "0.2.0", features = ["tls"] }
fluent = "0.17.0"
fluent-resmgr = "0.0.8"
fluent-langneg = "0.13"
hex = { version = "0.4.3", features = ["serde"] }
image = { version = "0.25", features = ["jpeg", "png", "webp"] }
+webp = "0.3.1"
indexmap = "2.6.0"
log = "0.4.17"
md5 = "0.7.0"
diff --git a/crates/notedeck/Cargo.toml b/crates/notedeck/Cargo.toml
index b00c863217bc..d159ce23a9de 100644
--- a/crates/notedeck/Cargo.toml
+++ b/crates/notedeck/Cargo.toml
...
</persisted-output>
File: /home/jb55/.claude/projects/-home-jb55-dev-notedeck/014835e2-886e-48b2-b262-1e9f2b9ab9ca/tool-results/bu1f3byl4.txt
1βdiff --git a/Cargo.lock b/Cargo.lock
2βindex 8a150834e038..92dd3d7ee852 100644
3β--- a/Cargo.lock
4β+++ b/Cargo.lock
5β@@ -3426,6 +3426,16 @@ dependencies = [
6β "zip",
7β ]
8β
9β+[[package]]
10β+name = "libwebp-sys"
11β+version = "0.9.6"
12β+source = "registry+https://github.com/rust-lang/crates.io-index"
13β+checksum = "54cd30df7c7165ce74a456e4ca9732c603e8dc5e60784558c1c6dc047f876733"
14β+dependencies = [
15β+ "cc",
16β+ "glob",
17β+]
18β+
19β [[package]]
20β name = "libz-rs-sys"
21β version = "0.5.3"
22β@@ -4001,6 +4011,7 @@ dependencies = [
23β "unic-langid",
24β "url",
25β "uuid",
26β+ "webp",
27β ]
28β
29β [[package]]
30β@@ -7538,6 +7549,16 @@ dependencies = [
31β "web-sys",
32β ]
33β
34β+[[package]]
35β+name = "webp"
36β+version = "0.3.1"
37β+source = "registry+https://github.com/rust-lang/crates.io-index"
38β+checksum = "c071456adef4aca59bf6a583c46b90ff5eb0b4f758fc347cea81290288f37ce1"
39β+dependencies = [
40β+ "image",
41β+ "libwebp-sys",
42β+]
43β+
44β [[package]]
45β name = "webpki-roots"
46β version = "0.26.11"
47βdiff --git a/Cargo.toml b/Cargo.toml
48βindex 21f073e98081..330b7d35cb22 100644
49β--- a/Cargo.toml
50β+++ b/Cargo.toml
51β@@ -17,7 +17,7 @@ members = [
52β
53β [workspace.dependencies]
54β opener = "0.8.2"
55β-chrono = "0.4.40"
56β+chrono = "0.4.40"
57β crossbeam-channel = "0.5"
58β crossbeam = "0.8.4"
59β base32 = "0.4.0"
60β@@ -49,13 +49,14 @@ http-body-util = "0.1.3"
61β # - Other platforms: aws-lc-rs (better performance)
62β rustls = { version = "0.23.28", default-features = false, features = ["std", "tls12", "logging"] }
63β ring = "0.17"
64β-enostr = { path = "crates/enostr" }
65β+enostr = { path = "crates/enostr" }
66β ewebsock = { version = "0.2.0", features = ["tls"] }
67β fluent = "0.17.0"
68β fluent-resmgr = "0.0.8"
69β fluent-langneg = "0.13"
70β hex = { version = "0.4.3", features = ["serde"] }
71β image = { version = "0.25", features = ["jpeg", "png", "webp"] }
72β+webp = "0.3.1"
73β indexmap = "2.6.0"
74β log = "0.4.17"
75β md5 = "0.7.0"
76βdiff --git a/crates/notedeck/Cargo.toml b/crates/notedeck/Cargo.toml
77βindex b00c863217bc..d159ce23a9de 100644
78β--- a/crates/notedeck/Cargo.toml
79β+++ b/crates/notedeck/Cargo.toml
80β@@ -18,6 +18,7 @@ egui = { workspace = true }
81β egui_extras = { workspace = true }
82β eframe = { workspace = true }
83β image = { workspace = true }
84β+webp = { workspace = true }
85β base32 = { workspace = true }
86β poll-promise = { workspace = true }
87β tracing = { workspace = true }
88βdiff --git a/crates/notedeck/src/imgcache.rs b/crates/notedeck/src/imgcache.rs
89βindex 7231fd9ebc82..2789939476f0 100644
90β--- a/crates/notedeck/src/imgcache.rs
91β+++ b/crates/notedeck/src/imgcache.rs
92β@@ -14,6 +14,7 @@ use egui::TextureHandle;
93β use image::{Delay, Frame};
94β
95β use egui::ColorImage;
96β+use webp::AnimFrame;
97β
98β use std::collections::HashMap;
99β use std::fs::{self, create_dir_all, File};
100β@@ -31,6 +32,7 @@ pub struct TexturesCache {
Here's my review of PR #1294 β feat: WEBP support
Two commits (feat: WEBP support + WIP: more fixes) adding WebP image support (both static and animated) to notedeck. It adds the webp crate, creates a new WebpTexCache / WebpState system mirroring the existing GIF infrastructure, and routes image/webp MIME types to the new cache.
---
This is the showstopper. When a WebP job completes, fromdiskjobrun and fromnetrun return MediaJobResult::StaticImg(...) or MediaJobResult::Animation(...). But delivercompletedmediajob routes those into texcache.staticimage and texcache.animated respectively β not texcache.webp.
Meanwhile, runmediajobpreaction correctly marks the entry as Pending in texcache.webp, and all lookups go through texcache.webp. So the webp cache entry stays Pending forever and the actual texture is orphaned in the wrong cache.
WebP images will never render.
The fix is either:
MediaJobResult::Webp(...) variant and handle it in delivercompletedmedia_job to insert into the webp cache, orMediaJobResult::StaticImg/Animation but key the delivery off MediaJobKind::WebpImg to route to the right cache.In the network path for static webp (fromnetrun), after decoding and processing, the image is saved via MediaCache::write(&path, &url, image) which writes PNG data. But when loading from disk (fromdiskjobrun), it reads the file and calls detectwebptype + decodestatic_webp β which expect raw WebP bytes. This will fail on the second load.
Either save the original webp bytes to disk, or use image crate decoding (which handles PNG) when loading from disk.
---
WebpState is field-for-field identical to GifState. processwebpframe is a near-exact copy of processgifframe. NoLoadingLatestTex now takes both caches + state maps as separate params and handles them with duplicated match arms. This should be unified β the animation state machine is format-agnostic.
The workspace already has image = { version = "0.25", features = ["jpeg", "png", "webp"] } β the image crate can decode static WebP. The separate webp crate is needed for animated WebP (which image doesn't support), but for static WebP, two decoders are redundant.
write_webp re-encodes individual frames back into a new animated WebP for disk caching. This is lossy round-tripping. It would be simpler and more correct to just save the original response bytes.
---
writewebp: the referenceframe / data.first() check is redundant since data.is_empty() is already checked abovedecodestaticwebpprocessed: unused ctx and _url parametersdelay.into() call in generatewebpanim_pkg is an identity conversion (Duration -> Duration)---
The approach is reasonable (follow the existing GIF pattern for WebP), but the two critical bugs mean WebP images won't actually display. The job delivery routing needs to be fixed, and the disk cache format mismatch needs to be resolved. I'd also strongly suggest unifying GifState/WebpState and the frame processing logic to avoid the maintenance burden of two identical animation state machines.