Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
774 commits
Select commit Hold shift + click to select a range
e990d83
update news
ajslater Apr 22, 2025
51842d5
fix os.walk scanning too many directories. write my own version with …
ajslater Apr 24, 2025
ea053a9
use set not assign for config
ajslater Apr 24, 2025
9f395db
fix ignore to construct a regex. fixes wildcards and is faster.
ajslater Apr 24, 2025
c371309
add new ignore options to config default
ajslater Apr 24, 2025
70d0d4a
bump news for ignore options
ajslater Apr 24, 2025
38b6baa
Squashed commit of the following:
ajslater Apr 24, 2025
23aa9aa
make sure case_insensitive is a requiured param for PathInfo. reorgan…
ajslater Apr 24, 2025
d5846da
reorganize handlers hierarchically
ajslater Apr 25, 2025
6762a97
simplify container optimize_contents structure. should save memory. s…
ajslater Apr 25, 2025
5001a01
add webp animated handler
ajslater Apr 25, 2025
73d07be
zip rewrite in place
ajslater Apr 25, 2025
0073323
reduce complexity if parse ignore config
ajslater Apr 25, 2025
0be3159
update deps
ajslater Apr 25, 2025
d81d4d1
update deps
ajslater Apr 25, 2025
3a777e3
ArchiveInfo gains a rename method
ajslater Apr 25, 2025
1d42bf7
pathinfo gains a rename method
ajslater Apr 25, 2025
c2139a4
remove useless test
ajslater Apr 25, 2025
3955f60
skipper consolidates printing to one method. gains archive awareness
ajslater Apr 25, 2025
47daa2f
spacing and comments to make handle init less difficult to read
ajslater Apr 26, 2025
cdf1d1a
Skip code moves from walk into archive
ajslater Apr 26, 2025
63a0e3d
fix FBT lints
ajslater Apr 26, 2025
51ff482
fix FBT linting. Make factory handle info param
ajslater Apr 26, 2025
8296f6d
change method name to not be confusing
ajslater Apr 26, 2025
3a7662d
adjust container test numbers
ajslater Apr 26, 2025
491dd51
add delete_stored test
ajslater Apr 26, 2025
a99741b
pathinfo copy constructor
ajslater Apr 26, 2025
0aead82
compression is not idempotent :o
ajslater Apr 26, 2025
920eafc
moving skipper and _do_repack into container from archive simplifies …
ajslater Apr 26, 2025
42d79dc
simplify walk_container
ajslater Apr 26, 2025
995cce2
more fuzziness for container test sizes
ajslater Apr 26, 2025
de3584a
messenger class for printing dots
ajslater Apr 26, 2025
03a2cf8
move messeger to own file
ajslater Apr 26, 2025
7e1577f
turn off optimize in place on disk for archives within archives
ajslater Apr 26, 2025
a039c8c
fix missing container_path_history in containers. add newlines before…
ajslater Apr 26, 2025
d875018
captilize news items
ajslater Apr 26, 2025
3638a7f
forgot to add printer.py
ajslater Apr 26, 2025
f858eaf
add uml & cycle make tasks
ajslater Apr 27, 2025
fd8be5c
fix zipfile patching atomicity
ajslater Apr 28, 2025
883fe8c
move delete_files into zip. rename _convert to _convert_children
ajslater Apr 28, 2025
84b0f78
move _optimize_in_place_on_disk and _bytes_in to zip
ajslater Apr 28, 2025
ab9ffe3
rename variable
ajslater Apr 28, 2025
d62875c
forgot to commit uml script
ajslater Apr 28, 2025
2417ab1
break up handler base class
ajslater Apr 28, 2025
1ce5b3e
Fix container Repacking...done printing. Make non-packing container r…
ajslater Apr 28, 2025
dcb9c60
move handler_factory & detect_format back into walk. move _messenger …
ajslater Apr 28, 2025
8329e3b
rename stats to report
ajslater Apr 28, 2025
ac18fad
rename Messenger to Printer. Use Printer in Reports
ajslater Apr 28, 2025
7d6d61c
consolidate more prints into printer
ajslater Apr 28, 2025
9014569
save original name of path_info
ajslater Apr 28, 2025
92bb0bb
delete original name from archive not changed
ajslater Apr 28, 2025
db4ba40
printer takes pathinfo instead of string
ajslater Apr 29, 2025
35e2966
flush prints immediately for progress
ajslater Apr 29, 2025
ecd36b6
update deps
ajslater Apr 29, 2025
fb2923f
reduce complexity
ajslater Apr 29, 2025
47caf32
change colors, bump version to alpha
ajslater Apr 29, 2025
34aca28
keep the color tester
ajslater Apr 29, 2025
0bf307c
v5.0.0-a0 (#87)
ajslater May 1, 2025
31cde36
v5.0.0
ajslater May 1, 2025
698f4b9
Merge branch 'main' into develop
ajslater May 1, 2025
152d2d1
move to basedpyright. much linting
ajslater May 4, 2025
a67c150
distribute with typing-extensions
ajslater May 5, 2025
af564fb
add pyright option
ajslater May 5, 2025
db47fd6
use tarfile isdir()
ajslater May 15, 2025
8261a0f
update deps. update py7zr-rc3. use 'x' mode in py7zr. remove unused p…
ajslater May 15, 2025
e1d28ef
update deps
ajslater Jun 10, 2025
67edc16
lint
ajslater Jun 10, 2025
c05b2cd
fix bad durations in gifs
ajslater Jun 10, 2025
07d7f66
Merge branch 'main' into develop
ajslater Jun 10, 2025
4df737d
Squashed commit of the following:
ajslater Jun 11, 2025
6008984
update deps
ajslater Jun 11, 2025
7607cdd
Squashed commit of the following:
ajslater Jun 12, 2025
c298e40
update deps. version 5.1.0
ajslater Jun 12, 2025
b4993a8
move sharp_yuv to webp out of base. gif2webp doesn't have it
ajslater Jun 12, 2025
a7db646
different gif size for linux
ajslater Jun 12, 2025
c183c95
Merge branch 'main' into develop
ajslater Jun 12, 2025
05634e2
update deps. lint for ruff 0.12.0
ajslater Jun 18, 2025
03125fa
fix verbosity
ajslater Jun 18, 2025
db895de
bump version
ajslater Jun 18, 2025
0102b47
Merge branch 'main' into develop
ajslater Jun 18, 2025
a793e0b
update deps
ajslater Jun 26, 2025
f15c80c
Squashed commit of the following:
ajslater Jun 26, 2025
12a4d6d
bump news
ajslater Jun 26, 2025
87dd6d2
remove mozjpeg from build.Dockerfile
ajslater Jun 26, 2025
9c696c8
Merge branch 'main' into develop
ajslater Jun 26, 2025
2d75c4c
mkdocs
ajslater Jul 18, 2025
b791de8
use dry run lockfile for updated
ajslater Jul 18, 2025
8ea942c
configure mkdocs properly
ajslater Jul 18, 2025
0205bfa
tilde versions for deps
ajslater Jul 18, 2025
13aa16a
add html section to readme
ajslater Jul 18, 2025
42db67c
update deps
ajslater Jul 25, 2025
3f60ea5
update deps
ajslater Jul 30, 2025
c9c6821
revise project urls
ajslater Jul 30, 2025
6b3785b
update deps add ty. typecheck with ty
ajslater Aug 6, 2025
2056625
uv_build
ajslater Aug 9, 2025
f8573fd
update scripts, pyproject, eslint, depts, fix lints
ajslater Aug 24, 2025
ce762d9
update deps
ajslater Aug 24, 2025
f2db131
update deps ane eslint config
ajslater Sep 13, 2025
757069f
update deps
ajslater Oct 9, 2025
74dcf7c
doesn't work with python 3.14
ajslater Oct 10, 2025
34a2990
fix builder dockerfile
ajslater Oct 10, 2025
49bb2de
copy debian sources on build properly for ci
ajslater Oct 10, 2025
6f70ef8
format
ajslater Oct 10, 2025
a79df7b
fix tests for new versions of external programs on darwin and somewha…
ajslater Oct 10, 2025
617bab3
fix formatting and use python 3.13 for build
ajslater Oct 10, 2025
0fb68a8
format
ajslater Oct 11, 2025
d821573
fix linux test file sizes
ajslater Oct 11, 2025
c336fa9
more test size changes for linux
ajslater Oct 11, 2025
8062c1f
remove test subdirs
ajslater Oct 11, 2025
0a2c35b
fix webp sizes in tests for linux
ajslater Oct 11, 2025
dbadc02
try to fix pre optimized webp on linux again
ajslater Oct 11, 2025
56ec580
fix sizes again
ajslater Oct 11, 2025
daa53df
one more size
ajslater Oct 11, 2025
aeadb55
Merge branch 'main' into develop
ajslater Oct 11, 2025
c0089a3
update deps
ajslater Oct 15, 2025
81bf34f
update deps
ajslater Oct 15, 2025
d00fa0f
add ty to makefile
ajslater Oct 15, 2025
640a7e1
delete deprecated pillow code
ajslater Oct 27, 2025
59f0670
support python 3.14, remove old pyright ignores
ajslater Oct 27, 2025
a0a5de1
bump version and news
ajslater Oct 27, 2025
fb66fbe
Merge branch 'main' into develop
ajslater Oct 27, 2025
1bfdde5
update deps
ajslater Nov 3, 2025
0d5fe8a
update deps
ajslater Nov 6, 2025
93515ed
update deps
ajslater Nov 8, 2025
104e02b
try to get duration info from detect format and PIL
ajslater Nov 8, 2025
b90d616
use webpmux for webp animated
ajslater Nov 8, 2025
9563570
update deps, update pytest config
ajslater Nov 9, 2025
cba2a31
change container test names
ajslater Nov 9, 2025
951fe2c
fix PIL jpeg conversion size for mpo test
ajslater Nov 9, 2025
1d67030
replace old test animated webp with one without dropped frames
ajslater Nov 9, 2025
449e7cd
enable im2webpanimatedlossless permanently enable webpumx, adjust fil…
ajslater Nov 9, 2025
35dd24c
fix adding info to correct handler clases constructor
ajslater Nov 9, 2025
a9e2371
add icecream importer
ajslater Nov 9, 2025
f1a9feb
bump news and version
ajslater Nov 9, 2025
4463b60
more news
ajslater Nov 9, 2025
d377684
simplify run_ext_fs for webp no longer needing output_path. compact a…
ajslater Nov 9, 2025
d5c891e
change webp arg order
ajslater Nov 9, 2025
0528786
use python secure tmpdir for webp temporary files
ajslater Nov 9, 2025
c9f4948
fix news version number
ajslater Nov 9, 2025
a028fad
fix test webp sizesfor linux
ajslater Nov 9, 2025
801fcd6
Merge branch 'main' into develop
ajslater Nov 9, 2025
71bcf40
update deps
ajslater Nov 23, 2025
d798acb
fix method and variable speling
ajslater Dec 1, 2025
8c22066
type checking fixes
ajslater Dec 1, 2025
0b13666
reduct complexity
ajslater Dec 1, 2025
d659d5d
complexipy & dep groups
ajslater Dec 19, 2025
ae0842d
reduce complexity of create handler even more
ajslater Dec 19, 2025
f484521
clean now cleans all caches
ajslater Dec 19, 2025
dbbc9be
update deps
ajslater Dec 19, 2025
2df0862
fix image format detection
ajslater Dec 20, 2025
296d77e
isolate handler external command tuples for debugging
ajslater Dec 20, 2025
d42dc18
fix extracting info from images
ajslater Dec 20, 2025
d4a314a
fix conversion to 7zr
ajslater Jan 13, 2026
eba8708
update deps
ajslater Jan 13, 2026
1cdec72
remove unused ty ignores
ajslater Jan 13, 2026
4dcd6b1
ty ignores
ajslater Jan 13, 2026
f063a91
update deps
ajslater Jan 21, 2026
0a248ee
update deps
ajslater Jan 26, 2026
98b1eb2
update deps
ajslater Jan 26, 2026
aa12963
update deps
ajslater Jan 29, 2026
1a56304
turn some const sets into tuples for type compatibility
ajslater Jan 30, 2026
a6b9589
use tuple instead of list
ajslater Jan 30, 2026
7361176
type get_config method. remove useless warning raise
ajslater Jan 30, 2026
ca8f27f
update deps
ajslater Jan 31, 2026
fa4194f
fix attrdict type
ajslater Jan 31, 2026
a423013
update deps
ajslater Feb 1, 2026
00e9fed
fix mpo test
ajslater Feb 1, 2026
ab0b41e
bump version and pin confuse, bump news
ajslater Feb 1, 2026
58cc71e
fix test script with test dependency group
ajslater Feb 1, 2026
76c2cb7
fix lint script with group
ajslater Feb 1, 2026
f7ec6bd
Merge branch 'main' into develop
ajslater Feb 1, 2026
f27c5aa
change confuse version specifier
ajslater Feb 1, 2026
0e309c9
use dockerfmt. update deps. ruff converts inline ifs to ors
ajslater Feb 10, 2026
178636b
update build dockerfile
ajslater Feb 10, 2026
6197292
update deps and add eslint plugins
ajslater Feb 10, 2026
b6e95cb
add mbake
ajslater Feb 10, 2026
494e171
remove unused ruff noqas
ajslater Feb 13, 2026
cf2ec87
Add types with pyre-check
ajslater Feb 13, 2026
a8fd71b
infer types. bump version and news. add py.typed
ajslater Feb 14, 2026
6e21b1a
Squashed commit of the following:
ajslater Feb 15, 2026
52f507f
update devenv and deps
ajslater Feb 15, 2026
7446ce1
update devenv
ajslater Feb 16, 2026
af8f417
update devs and devenv
ajslater Feb 16, 2026
a22eadb
update devenv
ajslater Feb 16, 2026
3ec7ade
add option for ignore archive entry mtimes
ajslater Feb 16, 2026
2866691
change option name
ajslater Feb 17, 2026
b8c0518
update devenv add missing ci script
ajslater Feb 17, 2026
dd08d8f
fix script hashbang
ajslater Feb 17, 2026
cf62dcc
move docker-compose to compose remove ignored version
ajslater Feb 17, 2026
2a6983c
try running script with simpler sh
ajslater Feb 17, 2026
739d518
add debug command for circlecir persist
ajslater Feb 17, 2026
56a9c39
chown dist before store
ajslater Feb 17, 2026
24fa5e6
speling
ajslater Feb 17, 2026
d384d30
Merge branch 'main' into develop
ajslater Feb 17, 2026
16d9325
update devenv
ajslater Feb 25, 2026
3963900
remove cruft
ajslater Feb 25, 2026
00cc86a
update makefile
ajslater Feb 25, 2026
7f574a7
update deps
ajslater Feb 26, 2026
b2f0c27
update devenv
ajslater Mar 2, 2026
87ef503
update devenv
ajslater Mar 12, 2026
9132a50
update devenv
ajslater Mar 14, 2026
a3fd72c
update devenv
ajslater Mar 14, 2026
0d66974
update devevn
ajslater Mar 15, 2026
ca108f9
update devenv
ajslater Mar 22, 2026
ddbe5af
update devenv & deps
ajslater Mar 31, 2026
101a9c6
update deps
ajslater Apr 1, 2026
26ee70f
update devevn & deps
ajslater Apr 8, 2026
6b5e88b
Squashed commit of the following:
ajslater Apr 8, 2026
036638b
dockerfile becomes builder
ajslater Apr 8, 2026
ba48a21
update devenv
ajslater Apr 8, 2026
84757ef
Squashed commit of the following:
ajslater Apr 10, 2026
9b12ef5
add cancelled if to gha steps
ajslater Apr 10, 2026
9a18e57
fix gha file cancelled() function
ajslater Apr 10, 2026
dbf52cd
install tool for tests
ajslater Apr 10, 2026
9212076
update devenv
ajslater Apr 10, 2026
73bb1df
Merge branch 'main' into develop
ajslater Apr 10, 2026
3242a0c
remove circleci remnamnts
ajslater Apr 10, 2026
13d110b
format dockerfile
ajslater Apr 10, 2026
86ee7e4
add a set_do_repack() method for the upcoming scheduler to use
ajslater Apr 10, 2026
456d0d2
for safety have buffered objects write to the tempfile before replaci…
ajslater Apr 10, 2026
275ce8b
Scheduler (#103)
ajslater Apr 12, 2026
b534686
Merge branch 'main' into develop
ajslater Apr 12, 2026
ad78506
treestamps 3.0
ajslater Apr 13, 2026
31ee42f
bump version and news
ajslater Apr 13, 2026
ea1d70d
Merge branch 'main' into develop
ajslater Apr 13, 2026
1756b57
update devenv. convert to bun
ajslater Apr 16, 2026
96d1a1b
Righttyper typing & corrections (#106)
ajslater Apr 16, 2026
413bf20
fix bun install on docker and gha compose
ajslater Apr 19, 2026
1091b2e
remove package-lock.json
ajslater Apr 19, 2026
f6404e4
update devenv
ajslater Apr 19, 2026
3ebaeb2
only copy bun deps first for dockerfile
ajslater Apr 19, 2026
95cf1d8
update devenv
ajslater Apr 19, 2026
edcae13
update devenv
ajslater Apr 19, 2026
e3dd03d
Fix BufferedReader pickling error when timestamps file exists (#107)
ajslater Apr 20, 2026
d86fcc7
print exception traces
ajslater Apr 20, 2026
34c626a
update deps
ajslater Apr 20, 2026
a15203b
bump news and version
ajslater Apr 20, 2026
6bad1b5
install poppler utils in docker for pdf tests
ajslater Apr 20, 2026
c682b2a
update deps
ajslater Apr 20, 2026
79d5389
format dockerfile
ajslater Apr 20, 2026
93f101a
add bunx support
ajslater Apr 20, 2026
b8a0a8c
bump version and news to v6.2.0
ajslater Apr 20, 2026
923bc72
try with svgo in packages
ajslater Apr 21, 2026
4abe8d8
Merge branch 'main' into develop
ajslater Apr 21, 2026
4188151
Squashed commit of the following:
ajslater Apr 29, 2026
ffccaf2
fix pyright warnings
ajslater Apr 29, 2026
34b22a0
ty ignore
ajslater Apr 29, 2026
e3e725f
update treestamps
ajslater Apr 29, 2026
6b2f6fd
Merge branch 'main' into develop
ajslater Apr 29, 2026
cc0187e
fix MPO error for 6.3.1
ajslater Apr 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# 📰 Picopt News

## v6.3.1

- Fix frame duration erroneously extracted for MPO format, causing an error.

## v6.3.0

- New progress and logging
Expand Down
38 changes: 27 additions & 11 deletions picopt/walk/detect_format.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
from contextlib import suppress
from typing import TYPE_CHECKING, Any, BinaryIO

from loguru import logger
from PIL import Image, ImageSequence, UnidentifiedImageError

from picopt import plugins as registry
Expand All @@ -41,18 +42,40 @@
if TYPE_CHECKING:
from collections.abc import Mapping

import PIL.ImageFile
from PIL.ImageFile import ImageFile

from picopt.path import PathInfo

# PIL format-string constants. Hardcoded so this module doesn't have to
# import the per-format PIL ImageFile subclasses just to read a string.
_WEBP_FORMAT_STR = "WEBP"
_MPO_FORMAT_STR = "MPO"
_TIFF_FORMAT_STR = "TIFF"
_WEBP_FORMAT_STR = "WEBP"


def _extract_animated_durations(image: ImageFile, info: dict[str, Any]):
durations = {}
if image.format == _MPO_FORMAT_STR:
return durations

# PIL frequently fails to populate per-frame durations on WebP
if image.format != _WEBP_FORMAT_STR and info.get("durations"):
return durations

try:
for frame_index, frame in enumerate(ImageSequence.Iterator(image), start=1):
duration = frame.info.get("duration", None)
if duration is not None:
durations[frame_index] = duration
except Exception as exc:
msg = "Error extracting animated frame duration"
logger.warning(msg)
logger.exception(exc)
return durations


def _extract_image_info_from_image(
image: PIL.ImageFile.ImageFile, info: dict[str, Any], *, keep_metadata: bool
image: ImageFile, info: dict[str, Any], *, keep_metadata: bool
) -> None:
image_format_str = image.format
if not image_format_str:
Expand All @@ -67,14 +90,7 @@ def _extract_image_info_from_image(
info["animated"] = animated
if animated and (n_frames := getattr(image, "n_frames", 0)):
info["n_frames"] = n_frames
# PIL frequently fails to populate per-frame durations on WebP, so
# walk the sequence ourselves.
durations = {}
for frame_index, frame in enumerate(ImageSequence.Iterator(image), start=1):
duration = frame.info.get("duration", None)
if duration is not None:
durations[frame_index] = duration
if durations:
if durations := _extract_animated_durations(image, info):
info["durations"] = durations
with suppress(AttributeError):
info["mpinfo"] = image.mpinfo # pyright: ignore[reportAttributeAccessIssue] # ty: ignore[unresolved-attribute]
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ readme = "README.md"
requires-python = ">=3.10"
license = { text = "GPL-3.0-only" }
name = "picopt"
version = "6.3.0"
version = "6.3.1"
[[project.authors]]
name = "AJ Slater"
email = "aj@slater.net"
Expand Down
2 changes: 1 addition & 1 deletion uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.