{"jobs":[{"id":"b88d464110b3","src_filename":"0902(1).mp4","state":"running","progress":70.89783281733746,"message":"rendering 600/1292","created_at":1788360437.7466092,"started_at":1788360437.7472303,"finished_at":null,"error":null,"config":{"lens_count":3,"out_w":1920,"out_h":1080,"min_hold_sec":0.6},"output_meta":{}},{"id":"2a5fe5fb814e","src_filename":"0902(1).mp4","state":"error","progress":48.455598455598455,"message":"failed","created_at":1788360127.0729098,"started_at":1788360127.073615,"finished_at":1788360367.7617807,"error":"Object of type int64 is not JSON serializable\n12/json/__init__.py\", line 179, in dump\n    for chunk in iterable:\n                 ^^^^^^^^\n  File \"/root/.local/share/uv/python/cpython-3.12.14-linux-x86_64-gnu/lib/python3.12/json/encoder.py\", line 430, in _iterencode\n    yield from _iterencode_list(o, _current_indent_level)\n  File \"/root/.local/share/uv/python/cpython-3.12.14-linux-x86_64-gnu/lib/python3.12/json/encoder.py\", line 326, in _iterencode_list\n    yield from chunks\n  File \"/root/.local/share/uv/python/cpython-3.12.14-linux-x86_64-gnu/lib/python3.12/json/encoder.py\", line 406, in _iterencode_dict\n    yield from chunks\n  File \"/root/.local/share/uv/python/cpython-3.12.14-linux-x86_64-gnu/lib/python3.12/json/encoder.py\", line 439, in _iterencode\n    o = _default(o)\n        ^^^^^^^^^^^\n  File \"/root/.local/share/uv/python/cpython-3.12.14-linux-x86_64-gnu/lib/python3.12/json/encoder.py\", line 180, in default\n    raise TypeError(f'Object of type {o.__class__.__name__} '\nTypeError: Object of type int64 is not JSON serializable\n","config":{"lens_count":3,"out_w":1920,"out_h":1080,"min_hold_sec":0.6},"output_meta":{}},{"id":"c3eeeb1b4e5e","src_filename":"0902(1).mp4","state":"done","progress":100.0,"message":"done","created_at":1788359837.1630964,"started_at":1788359837.1637325,"finished_at":1788360000.168099,"error":null,"config":{"lens_count":3,"out_w":1920,"out_h":1080,"min_hold_sec":0.6},"output_meta":{"frames_analyzed":260,"schedule":"/opt/sj88-autozoom/data/work/c3eeeb1b4e5e/schedule.json","lens_distribution":{"medium":26.2,"wide":73.8},"source_meta":{"width":2160,"height":3840,"fps":30.0,"frame_count":1292,"duration":43.072993,"codec":"h264","pix_fmt":"yuv420p"}}},{"id":"842a19e27c15","src_filename":"0902(1).mp4","state":"error","progress":50.0,"message":"failed","created_at":1788359712.521002,"started_at":1788359712.5216866,"finished_at":1788359788.1745455,"error":"reformat() got an unexpected keyword argument 'src_x'\n^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/sj88-autozoom/app/autozoom.py\", line 762, in run\n    self.render(src, out_path, analyses, work_dir)\n  File \"/opt/sj88-autozoom/app/autozoom.py\", line 577, in render\n    self._render_perframe(src, out_path, analyses, fps, total, work_dir)\n  File \"/opt/sj88-autozoom/app/autozoom.py\", line 628, in _render_perframe\n    self._render_pyav_perframe(src, out_path, analyses, fps, total, work_dir)\n  File \"/opt/sj88-autozoom/app/autozoom.py\", line 713, in _render_pyav_perframe\n    cropped = frame.reformat(width=self.cfg.out_w, height=self.cfg.out_h,\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"av/video/frame.py\", line 760, in av.video.frame.VideoFrame.reformat\n    return self.reformatter.reformat(self, *args, **kwargs)\n    ^^^^^^^^^^^\n  File \"av/video/reformatter.py\", line 169, in av.video.reformatter.VideoReformatter.reformat\n    def reformat(\n    ^^^^^^^^^^^\nTypeError: reformat() got an unexpected keyword argument 'src_x'\n","config":{"lens_count":3,"out_w":1920,"out_h":1080,"min_hold_sec":0.6},"output_meta":{}},{"id":"4cb7c2e5fbc7","src_filename":"0902(1).mp4","state":"running","progress":0.5,"message":"analyzing video","created_at":1788359696.8517842,"started_at":1788359696.852475,"finished_at":null,"error":null,"config":{"lens_count":3,"out_w":1920,"out_h":1080,"min_hold_sec":0.6},"output_meta":{}},{"id":"63af2210338a","src_filename":"0902(1).mp4","state":"error","progress":50.0,"message":"failed","created_at":1788359494.8265903,"started_at":1788359494.8273597,"finished_at":1788359571.1642718,"error":"'float' object has no attribute 'numerator'\nir)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/sj88-autozoom/app/autozoom.py\", line 730, in run\n    self.render(src, out_path, analyses, work_dir)\n  File \"/opt/sj88-autozoom/app/autozoom.py\", line 547, in render\n    self._render_perframe(src, out_path, analyses, fps, total, work_dir)\n  File \"/opt/sj88-autozoom/app/autozoom.py\", line 598, in _render_perframe\n    self._render_pyav_perframe(src, out_path, analyses, fps, total, work_dir)\n  File \"/opt/sj88-autozoom/app/autozoom.py\", line 660, in _render_pyav_perframe\n    out_stream = out_container.add_stream(v_enc, rate=fps)\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"av/container/output.py\", line 140, in av.container.output.OutputContainer.add_stream\n    to_avrational(rate or 24, cython.address(ctx.framerate))\n    ^^^^^^^^^^^\n  File \"av/utils.py\", line 58, in av.utils.to_avrational\n    input.num = frac.numerator\n    ^^^^^^^^^^^\nAttributeError: 'float' object has no attribute 'numerator'\n","config":{"lens_count":3,"out_w":1920,"out_h":1080,"min_hold_sec":0.6},"output_meta":{}},{"id":"b14dcbb5fc91","src_filename":"test_4k.mp4","state":"done","progress":100.0,"message":"done","created_at":1788359232.9807625,"started_at":1788359232.9814436,"finished_at":1788359240.391922,"error":null,"config":{"lens_count":3,"out_w":1920,"out_h":1080,"min_hold_sec":0.6},"output_meta":{"frames_analyzed":31,"schedule":"/opt/sj88-autozoom/data/work/b14dcbb5fc91/schedule.json","lens_distribution":{"medium":100.0},"source_meta":{"width":3840,"height":2160,"fps":30.0,"frame_count":150,"duration":5.0,"codec":"h264","pix_fmt":"yuv420p"}}}]}