Lightweight unofficial Python bindings for Tencent libpag, focused on encoding WebP frame sequences and embedding audio into PAG files.
Project description
pylibpag
Lightweight unofficial Python bindings for Tencent libpag, focused on encoding WebP frame sequences and embedding audio into PAG files.
This repository is a source fork of the official libpag project. The Python layer is kept in the separate python/
directory so upstream libpag updates can be rebased without modifying its existing source files.
This is an unofficial project and is not affiliated with or endorsed by Tencent.
Features
- Encode one or more already-encoded WebP frames into a bitmap PAG animation
- Preserve WebP alpha data for transparent animations
- Optionally embed AAC audio stored in an MPEG-4 container, normally M4A bytes
- Run independent encode calls concurrently from Python threads without a global conversion lock
- Use one native wheel on both regular CPython 3.14 and free-threaded CPython 3.14t
- Avoid a CPython extension ABI by exposing a small C interface through
ctypes.CDLL
The initial wheel target is Linux amd64 using the manylinux_2_28_x86_64 platform tag.
Installation
After a release is published:
python -m pip install pylibpag
To install a locally built wheel:
python -m pip install dist/pylibpag-*.whl
Python 3.14 or newer is required.
Usage
from pathlib import Path
import pylibpag
frames = [
Path("frame-001.webp").read_bytes(),
Path("frame-002.webp").read_bytes(),
]
pag_bytes = pylibpag.encode_webp_frames(
frames,
width=512,
height=512,
frame_rate=30.0,
)
Path("animation.pag").write_bytes(pag_bytes)
Transparent frames
Pass WebP frames that already contain alpha. pylibpag stores the encoded frame bytes in a PAG bitmap sequence; it does
not decode, resize, or otherwise convert the source images.
Audio
libpag expects composition audio to be AAC in an MPEG-4 container. An M4A file can be passed directly as bytes:
pag_bytes = pylibpag.encode_webp_frames(
frames,
width=512,
height=512,
frame_rate=30.0,
audio=Path("audio.m4a").read_bytes(),
audio_start_frame=0,
)
The native layer embeds audio bytes without transcoding or validating the codec. Convert MP3, WAV, PCM, raw AAC, or other inputs to AAC-in-MP4 in your Python media pipeline first. Embedded audio does not automatically extend the visual frame duration.
Threading
Independent calls can run concurrently:
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=8) as executor:
pag_files = list(
executor.map(
lambda frame_group: pylibpag.encode_webp_frames(
frame_group,
width=512,
height=512,
),
frame_groups,
)
)
Each call creates its own libpag composition, frame objects, input copies, error state, and output buffer. Do not share or mutate an input buffer while a call is using it.
API
pylibpag.encode_webp_frames(
frames,
*,
width,
height,
frame_rate=30.0,
audio=None,
audio_start_frame=0,
) -> bytes
frames: ordered iterable of encoded WebP bufferswidthandheight: positive composition dimensionsframe_rate: finite positive frames per secondaudio: optional AAC-in-MP4/M4A bufferaudio_start_frame: signed frame offset for the first audio frame
Native encode failures raise pylibpag.PAGEncodeError.
Building the wheel
Docker is the only local build requirement:
python3 scripts/build_wheel.py
The script:
- Starts the official PyPA manylinux amd64 image with
docker run --rm - Mounts this repository read-only and copies it into the temporary container
- Synchronizes the exact libpag dependencies declared by
DEPS - Builds a modern PEP 517 wheel with scikit-build-core
- Repairs the platform tag and bundled libraries with auditwheel
- Installs and tests the same wheel using regular CPython 3.14 and free-threaded CPython 3.14t
- Writes the final wheel to
dist/
All dependency and compiler files remain inside the disposable container. Only the wheel in dist/ is retained.
Scope
pylibpag deliberately does not provide media conversion or PAG playback. Convert PNG, video, APNG, or other source
formats to WebP frames in Python, then pass those bytes to this package. This keeps the compiled binding small and the
upstream integration easy to maintain.
Development
For upstream libpag SDK development and platform build instructions, see the official libpag development guide. Python wheel development is described in Building the wheel.
License
Licensed under the Apache License 2.0. libpag is developed by Tencent. This unofficial Python package preserves the upstream license and attribution.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pylibpag-4.5.75-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: pylibpag-4.5.75-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 2.0 MB
- Tags: Python 3, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2802f60e605d25ad16b9dc0ce094b91b39a8c7aee3dd60dd1806fbe537b582ed
|
|
| MD5 |
9f6be5b6cc6340cd2908716bc06398c4
|
|
| BLAKE2b-256 |
7f2bfd7663db63dc578c9635bfac48217a7f5cb383e7d8ded0c344234bf0a6e9
|
Provenance
The following attestation bundles were made for pylibpag-4.5.75-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:
Publisher:
release.yml on gordonhwc/pylibpag
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pylibpag-4.5.75-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl -
Subject digest:
2802f60e605d25ad16b9dc0ce094b91b39a8c7aee3dd60dd1806fbe537b582ed - Sigstore transparency entry: 2180606541
- Sigstore integration time:
-
Permalink:
gordonhwc/pylibpag@d3621cbb5a92714cd8aa98d5c9526fcdee559c9b -
Branch / Tag:
refs/tags/pylibpag-v4.5.75 - Owner: https://github.com/gordonhwc
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d3621cbb5a92714cd8aa98d5c9526fcdee559c9b -
Trigger Event:
release
-
Statement type: