Skip to content

Commit 5d59f64

Browse files
committed
release: v1.3.1
1 parent 4203f9e commit 5d59f64

4 files changed

Lines changed: 17 additions & 12 deletions

File tree

CHANGELOG.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
Changelog
22
=========
33

4+
**1.3.1 (Jul 15, 2026)**
5+
6+
* Renamed the misleadingly-named ``_route`` method on the ffmpeg engine to
7+
``_gif_route``.
8+
49
**1.3.0 (Jul 13, 2026)**
510

611
* Fixed: animated-gif transcodes no longer exhaust memory on large inputs.

src/thumbor_video_engine/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from thumbor.config import Config
22

33

4-
__version__ = "1.3.0"
4+
__version__ = "1.3.1"
55

66

77
Config.define(

src/thumbor_video_engine/engines/ffmpeg.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ def load(self, buffer, extension):
186186

187187
self.probe()
188188

189-
def _route(self, label, method, src_file, *args):
189+
def _gif_route(self, label, method, src_file, *args):
190190
"""Dispatch to a gif-transcode route (``method``), labelled for
191191
observability. Override to record per-route metrics/traces. Defaults
192192
to simply calling the method."""
@@ -317,7 +317,7 @@ def transcode_to_gif(self, src_file):
317317
if (self.context.config.FFMPEG_GIF_PIPELINE == 'gifski'
318318
and self._gifski_path() is not None):
319319
return self._transcode_to_gif_gifski(src_file)
320-
return self._route('legacy', self._gif_legacy, src_file)
320+
return self._gif_route('legacy', self._gif_legacy, src_file)
321321

322322
def _gifski_path(self):
323323
configured = self.context.config.GIFSKI_PATH
@@ -343,29 +343,29 @@ def _transcode_to_gif_gifski(self, src_file):
343343
# Animated webp input (or an unparseable gif that PIL could
344344
# still open): per-frame timing is unknown to us, so use the
345345
# timing-exact legacy path.
346-
return self._route('legacy', self._gif_legacy, src_file)
346+
return self._gif_route('legacy', self._gif_legacy, src_file)
347347
# Video source: constant frame rate from ffprobe
348-
return self._route(
348+
return self._gif_route(
349349
'y4m', self._gifski_y4m, src_file, self._video_fps(), "0")
350350

351351
if not info.is_uniform_delay:
352352
# Variable frame delays can't be represented in a constant frame
353353
# rate y4m stream; the legacy path preserves them exactly.
354-
return self._route('legacy', self._gif_legacy, src_file)
354+
return self._gif_route('legacy', self._gif_legacy, src_file)
355355

356356
repeat = "-1" if info.loop_count is None else str(info.loop_count)
357357
if self._gif_visibly_transparent(info):
358-
return self._route(
358+
return self._gif_route(
359359
'png', self._gifski_png_frames, src_file, info.uniform_fps, repeat)
360-
return self._route(
360+
return self._gif_route(
361361
'y4m', self._gifski_y4m, src_file, info.uniform_fps, repeat)
362362

363363
def _gifski_oversized_target(self, src_file):
364364
"""Chosen when the target output exceeds ``GIFSKI_MAX_TARGET_PIXELS``
365365
(gifski's quantizer memory grows with output size). Override to serve
366366
something faster (e.g. a quick low-quality pass with a background
367367
re-encode). Defaults to the bounded-memory legacy path."""
368-
return self._route('legacy_large', self._gif_legacy, src_file)
368+
return self._gif_route('legacy_large', self._gif_legacy, src_file)
369369

370370
def _gif_visibly_transparent(self, info):
371371
"""GCE transparency flags over-approximate: optimized opaque GIFs

tests/engines/test_extension_hooks.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ def test_route_hook_labels_each_gifski_route(context, storage_path, mocker):
1717
routes = []
1818

1919
class RecordingEngine(FFmpegEngine):
20-
def _route(self, label, method, src_file, *args):
20+
def _gif_route(self, label, method, src_file, *args):
2121
routes.append(label)
22-
return super()._route(label, method, src_file, *args)
22+
return super()._gif_route(label, method, src_file, *args)
2323

2424
context.config.FFMPEG_GIF_PIPELINE = "gifski"
2525
engine = RecordingEngine(context)
@@ -36,7 +36,7 @@ def test_route_hook_used_for_legacy(context, storage_path, mocker):
3636
routes = []
3737

3838
class RecordingEngine(FFmpegEngine):
39-
def _route(self, label, method, src_file, *args):
39+
def _gif_route(self, label, method, src_file, *args):
4040
routes.append(label)
4141
return b"gif"
4242

0 commit comments

Comments
 (0)