Skip to content

release: cuems-utils 0.1.0rc15 - #15

Merged
ibiltari merged 10 commits into
debian/bookwormfrom
release/0.1.0rc15
Oct 6, 2026
Merged

ibiltari merged 10 commits into
debian/bookwormfrom
release/0.1.0rc15

Conversation

@ibiltari

@ibiltari ibiltari commented Oct 6, 2026

Copy link
Copy Markdown
Member

Release packaging for cuems-utils 0.1.0rc15 (869fat84r): merges the upstream branch into debian/bookworm and finalizes the changelog. See debian/changelog for the contents.

Built on casas from this branch (clean environment); the deb's package tree equals this branch's source. utils: identical to the cuemsutils 0.1.0rc15 wheel on PyPI. editor: cuemsutils 0.1.0rc15 resolved from PyPI. engine: no longer ships cffi-gen-src.

Do not merge yet: the debs are under test on test2 and need Ion's explicit approval before rc1_packages and this merge (a pre-merge tag goes on debian/bookworm first).

Details: cuems-RELATIONS Plans/2026-10-01-engine-late-go-media-probe.md §8.9.

ibiltari added 10 commits August 3, 2026 13:31
Both cost real time and neither had any build-time signal:

1. dh_virtualenv --python python3 resolved through PATH, so building on a box
   with pyenv active baked the builder's private interpreter into the package.
   On the target /usr/lib/cuems/bin/python is then a broken symlink and every
   CUEMS Python component fails to start — only visible after dpkg -i on a
   node, and even then not until the next restart. debian/rules now pins the
   absolute path; documented with the pre-ship verification command.

2. The .deb's site-packages copy precedes any .pth-appended path in sys.path,
   so an "editable install" is silently ignored while the package is present.
   That is why earlier editable deploys did nothing and source got rsync'd
   over site-packages instead (leaving rc13 files under an rc12 dist-info).

Refs ClickUp 869ed00ya
The frontend (8d67d08) now submits gradient-motiond's own CurveFactory
names — its "exponential"/"logarithmic" labels send ease_in/ease_out,
which are the implemented accelerating/decelerating shapes. But the
FadeCurveType Python enum and the script.xsd enumeration only knew
linear|exponential|logarithmic|sigmoid, so the first save of a
non-linear fade from the new UI would fail validation.

Add ease_in and ease_out to both; keep the legacy names accepted so
projects authored by older editors still load (the frontend heals them
to ease_in/ease_out on next save). Round-trip + legacy tests added.
Media gains optional pixel_width / pixel_height / file_size, appended to
MediaType after regions, so the engine stops running ffprobe on the arm path.
Covers the setters, the writer (schema order whatever the dict order, no empty
element for None) and the parse path, which never calls the setters.
…t (869fat84r)

MediaType gains three optional elements after regions: pixel_width and
pixel_height (the original size of the file's first video stream, as ffprobe
reports it) and file_size (bytes, when they were measured). The editor
measures them at upload, as it does the duration, so the node engine no longer
runs ffprobe while arming a video cue under the command lock: a GO sent right
after a cue selection started up to 400 ms late on that probe.

- script.xsd: xs:positiveInteger, minOccurs=0; absent means unknown.
- Media: pixel_width / pixel_height / file_size properties. A positive int or
  a string of digits is stored as int; None removes the key; anything else
  raises ValueError.
- MediaXmlBuilder writes Media in schema order whatever the dict order (the
  editor appends the values after what the frontend sent, and the parsers keep
  arrival order) and writes no element for a None dimension (an empty
  <pixel_width/> fails the schema).

Older utils lines reject a project carrying these elements; they are made to
accept it by replacing only script.xsd (their parsers keep unknown Media keys
as plain ints and their code never reads them).

Design: cuems-RELATIONS Plans/2026-10-01-engine-late-go-media-probe.md
…4r D18) (red)

The file's MD5 identifies it unambiguously, for integrity checks: a corrupt or
partial copy can have the right size. It is the MD5 the upload already carries.
file_size and file_md5 apply to every media type; the pixel size stays
VideoCue-only. An MD5 shaped like a number (all digits, or digits with one 'e')
must survive the parser, which coerces such strings to int/float.
…at84r D18)

- script.xsd: optional file_md5 (Md5Type, 32 lowercase hex) after file_size;
  the comment states that file_size and file_md5 apply to every media type.
- Media.file_md5: any case in, lowercase stored; None removes it; anything that
  is not 32 hex digits raises ValueError.
- MediaXmlBuilder: file_md5 in the schema order, no element for None.
- Parsers.STRING_TYPED_KEYS gains file_md5: str_to_value turned an all-digit
  MD5 into an int and digits-with-one-e into a float (about one MD5 in a
  million), which would then fail the schema on the next save.

Design: cuems-RELATIONS Plans/2026-10-01-engine-late-go-media-probe.md D18
Ships the stored media metadata (869fat84r): pixel_width / pixel_height
(VideoCues) and file_size / file_md5 (every media type) in MediaType; and,
from main, 9c17418: the engine-native fade curve names ease_in / ease_out.
All are additive schema changes.

Refs ClickUp 869fat84r
feat(media): store a media file's pixel size, size and MD5 in the project (rc15, 869fat84r)
@codecov

codecov Bot commented Oct 6, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@ibiltari
ibiltari merged commit 0b277da into debian/bookworm Oct 6, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant