Skip to content

Unable to get to downloads page, when a floating point numbered issue was downloaded #123

Description

@tssgery

Component

Downloads / Acquisition

Description

I assume this was caused by attempting to download an issue of Amazing Spider-Man with a floating point issue number, like "700.1"

pullbox | {"path": "/downloads", "method": "GET", "error": "Unknown format code 'd' for object of type 'float'", "event": "unhandled_error", "level": "error", "logger": "pullbox.app", "timestamp": "2026-08-28T18:00:49Z", "exception": " + Exception Group Traceback (most recent call last):\n | File "/opt/venv/lib/python3.14/site-packages/starlette/_utils.py", line 85, in create_collapsing_task_group\n | async with anyio.create_task_group() as tg:\n | ~~~~~~~~~~~~~~~~~~~~~~~^^\n | File "/opt/venv/lib/python3.14/site-packages/anyio/_backends/_asyncio.py", line 815, in aexit\n | raise BaseExceptionGroup(\n | "unhandled errors in a TaskGroup", self._exceptions\n | ) from None\n | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)\n +-+---------------- 1 ----------------\n | Traceback (most recent call last):\n | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/errors.py", line 164, in call\n | await self.app(scope, receive, _send)\n | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 193, in call\n | response = await self.dispatch_func(request, call_next)\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n | File "/opt/venv/lib/python3.14/site-packages/pullbox/api/middleware.py", line 391, in dispatch\n | response = await call_next(request)\n | ^^^^^^^^^^^^^^^^^^^^^^^^\n | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 168, in call_next\n | raise app_exc from app_exc.cause or app_exc.context\n | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 144, in coro\n | await self.app(scope, receive_or_disconnect, send_no_error)\n | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 193, in call\n | response = await self.dispatch_func(request, call_next)\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n | File "/opt/venv/lib/python3.14/site-packages/pullbox/api/middleware.py", line 238, in dispatch\n | response = await call_next(request)\n | ^^^^^^^^^^^^^^^^^^^^^^^^\n | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 168, in call_next\n | raise app_exc from app_exc.cause or app_exc.context\n | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 144, in coro\n | await self.app(scope, receive_or_disconnect, send_no_error)\n | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 193, in call\n | response = await self.dispatch_func(request, call_next)\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n | File "/opt/venv/lib/python3.14/site-packages/pullbox/api/middleware.py", line 155, in dispatch\n | response = await call_next(request)\n | ^^^^^^^^^^^^^^^^^^^^^^^^\n | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 168, in call_next\n | raise app_exc from app_exc.cause or app_exc.context\n | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 144, in coro\n | await self.app(scope, receive_or_disconnect, send_no_error)\n | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 193, in call\n | response = await self.dispatch_func(request, call_next)\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n | File "/opt/venv/lib/python3.14/site-packages/pullbox/api/middleware.py", line 289, in dispatch\n | return await call_next(request)\n | ^^^^^^^^^^^^^^^^^^^^^^^^\n | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 168, in call_next\n | raise app_exc from app_exc.cause or app_exc.context\n | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 144, in coro\n | await self.app(scope, receive_or_disconnect, send_no_error)\n | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 193, in call\n | response = await self.dispatch_func(request, call_next)\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n | File "/opt/venv/lib/python3.14/site-packages/pullbox/api/middleware.py", line 96, in dispatch\n | return await call_next(request)\n | ^^^^^^^^^^^^^^^^^^^^^^^^\n | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 168, in call_next\n | raise app_exc from app_exc.cause or app_exc.context\n | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 144, in coro\n | await self.app(scope, receive_or_disconnect, send_no_error)\n | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/exceptions.py", line 63, in call\n | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)\n | File "/opt/venv/lib/python3.14/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app\n | raise exc\n | File "/opt/venv/lib/python3.14/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app\n | await app(scope, receive, sender)\n | File "/opt/venv/lib/python3.14/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in call\n | await self.app(scope, receive, send)\n | File "/opt/venv/lib/python3.14/site-packages/starlette/routing.py", line 670, in call\n | await self.middleware_stack(scope, receive, send)\n | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 2734, in app\n | await route.handle(scope, receive, send)\n | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 1780, in handle\n | await self.original_router.handle(scope, receive, send)\n | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 2789, in handle\n | await included_router._handle_selected(scope, receive, send)\n | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 1791, in _handle_selected\n | await route.handle(scope, receive, send)\n | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 1780, in handle\n | await self.original_router.handle(scope, receive, send)\n | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 2789, in handle\n | await included_router._handle_selected(scope, receive, send)\n | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 1800, in _handle_selected\n | await original_route.handle(scope, receive, send)\n | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 1279, in handle\n | await app(scope, receive, send)\n | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 158, in app\n | await wrap_app_handling_exceptions(app, request)(scope, receive, send)\n | File "/opt/venv/lib/python3.14/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app\n | raise exc\n | File "/opt/venv/lib/python3.14/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app\n | await app(scope, receive, sender)\n | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 144, in app\n | response = await f(request)\n | ^^^^^^^^^^^^^^^^\n | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 706, in app\n | raw_response = await run_endpoint_function(\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n | ...<3 lines>...\n | )\n | ^\n | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 352, in run_endpoint_function\n | return await dependant.call(**values)\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n | File "/opt/venv/lib/python3.14/site-packages/pullbox/ui/downloads_routes.py", line 959, in downloads\n | queue_ctx = await load_download_queue_context(session)\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n | File "/opt/venv/lib/python3.14/site-packages/pullbox/ui/downloads_routes.py", line 511, in load_download_queue_context\n | renamed_names = await _queue_names(session, queue_items)\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n | File "/opt/venv/lib/python3.14/site-packages/pullbox/ui/downloads_routes.py", line 158, in _queue_names\n | return await _build_queue_names(session, downloads)\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n | File "/opt/venv/lib/python3.14/site-packages/pullbox/ui/routes.py", line 423, in _download_queue_names_bridge\n | return await _build_queue_names(session, downloads)\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n | File "/opt/venv/lib/python3.14/site-packages/pullbox/ui/download_queue_names.py", line 110, in build_queue_names\n | full_name = format_comic_file(\n | series=series.title,\n | ...<6 lines>...\n | extension=preferred_ext,\n | )\n | File "/opt/venv/lib/python3.14/site-packages/pullbox/core/naming.py", line 653, in format_comic_file\n | name = name.replace("{Issue:03d}", f"{issue_val:03d}")\n | ^^^^^^^^^^^^^^^\n | ValueError: Unknown format code 'd' for object of type 'float'\n +------------------------------------\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/errors.py", line 164, in call\n await self.app(scope, receive, _send)\n File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 193, in call\n response = await self.dispatch_func(request, call_next)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File "/opt/venv/lib/python3.14/site-packages/pullbox/api/middleware.py", line 391, in dispatch\n response = await call_next(request)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 168, in call_next\n raise app_exc from app_exc.cause or app_exc.context\n File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 144, in coro\n await self.app(scope, receive_or_disconnect, send_no_error)\n File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 193, in call\n response = await self.dispatch_func(request, call_next)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File "/opt/venv/lib/python3.14/site-packages/pullbox/api/middleware.py", line 238, in dispatch\n response = await call_next(request)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 168, in call_next\n raise app_exc from app_exc.cause or app_exc.context\n File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 144, in coro\n await self.app(scope, receive_or_disconnect, send_no_error)\n File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 193, in call\n response = await self.dispatch_func(request, call_next)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File "/opt/venv/lib/python3.14/site-packages/pullbox/api/middleware.py", line 155, in dispatch\n response = await call_next(request)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 168, in call_next\n raise app_exc from app_exc.cause or app_exc.context\n File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 144, in coro\n await self.app(scope, receive_or_disconnect, send_no_error)\n File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 193, in call\n response = await self.dispatch_func(request, call_next)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File "/opt/venv/lib/python3.14/site-packages/pullbox/api/middleware.py", line 289, in dispatch\n return await call_next(request)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 168, in call_next\n raise app_exc from app_exc.cause or app_exc.context\n File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 144, in coro\n await self.app(scope, receive_or_disconnect, send_no_error)\n File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 193, in call\n response = await self.dispatch_func(request, call_next)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File "/opt/venv/lib/python3.14/site-packages/pullbox/api/middleware.py", line 96, in dispatch\n return await call_next(request)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 168, in call_next\n raise app_exc from app_exc.cause or app_exc.context\n File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 144, in coro\n await self.app(scope, receive_or_disconnect, send_no_error)\n File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/exceptions.py", line 63, in call\n await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)\n File "/opt/venv/lib/python3.14/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app\n raise exc\n File "/opt/venv/lib/python3.14/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app\n await app(scope, receive, sender)\n File "/opt/venv/lib/python3.14/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in call\n await self.app(scope, receive, send)\n File "/opt/venv/lib/python3.14/site-packages/starlette/routing.py", line 670, in call\n await self.middleware_stack(scope, receive, send)\n File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 2734, in app\n await route.handle(scope, receive, send)\n File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 1780, in handle\n await self.original_router.handle(scope, receive, send)\n File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 2789, in handle\n await included_router._handle_selected(scope, receive, send)\n File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 1791, in _handle_selected\n await route.handle(scope, receive, send)\n File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 1780, in handle\n await self.original_router.handle(scope, receive, send)\n File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 2789, in handle\n await included_router._handle_selected(scope, receive, send)\n File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 1800, in _handle_selected\n await original_route.handle(scope, receive, send)\n File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 1279, in handle\n await app(scope, receive, send)\n File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 158, in app\n await wrap_app_handling_exceptions(app, request)(scope, receive, send)\n File "/opt/venv/lib/python3.14/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app\n raise exc\n File "/opt/venv/lib/python3.14/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app\n await app(scope, receive, sender)\n File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 144, in app\n response = await f(request)\n ^^^^^^^^^^^^^^^^\n File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 706, in app\n raw_response = await run_endpoint_function(\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n )\n ^\n File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 352, in run_endpoint_function\n return await dependant.call(**values)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File "/opt/venv/lib/python3.14/site-packages/pullbox/ui/downloads_routes.py", line 959, in downloads\n queue_ctx = await load_download_queue_context(session)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File "/opt/venv/lib/python3.14/site-packages/pullbox/ui/downloads_routes.py", line 511, in load_download_queue_context\n renamed_names = await _queue_names(session, queue_items)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File "/opt/venv/lib/python3.14/site-packages/pullbox/ui/downloads_routes.py", line 158, in _queue_names\n return await _build_queue_names(session, downloads)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File "/opt/venv/lib/python3.14/site-packages/pullbox/ui/routes.py", line 423, in _download_queue_names_bridge\n return await _build_queue_names(session, downloads)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File "/opt/venv/lib/python3.14/site-packages/pullbox/ui/download_queue_names.py", line 110, in build_queue_names\n full_name = format_comic_file(\n series=series.title,\n ...<6 lines>...\n extension=preferred_ext,\n )\n File "/opt/venv/lib/python3.14/site-packages/pullbox/core/naming.py", line 653, in format_comic_file\n name = name.replace("{Issue:03d}", f"{issue_val:03d}")\n ^^^^^^^^^^^^^^^\nValueError: Unknown format code 'd' for object of type 'float'"}
pullbox | ERROR: Exception in ASGI application
pullbox | + Exception Group Traceback (most recent call last):
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/_utils.py", line 85, in create_collapsing_task_group
pullbox | | async with anyio.create_task_group() as tg:
pullbox | | ~~~~~~~~~~~~~~~~~~~~~~~^^
pullbox | | File "/opt/venv/lib/python3.14/site-packages/anyio/_backends/_asyncio.py", line 815, in aexit
pullbox | | raise BaseExceptionGroup(
pullbox | | "unhandled errors in a TaskGroup", self._exceptions
pullbox | | ) from None
pullbox | | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
pullbox | +-+---------------- 1 ----------------
pullbox | | Traceback (most recent call last):
pullbox | | File "/opt/venv/lib/python3.14/site-packages/uvicorn/protocols/http/httptools_impl.py", line 422, in run_asgi
pullbox | | result = await app( # type: ignore[func-returns-value]
pullbox | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | | self.scope, self.receive, self.send
pullbox | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | | )
pullbox | | ^
pullbox | | File "/opt/venv/lib/python3.14/site-packages/uvicorn/middleware/proxy_headers.py", line 63, in call
pullbox | | return await self.app(scope, receive, send)
pullbox | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | | File "/opt/venv/lib/python3.14/site-packages/fastapi/applications.py", line 1163, in call
pullbox | | await super().call(scope, receive, send)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/applications.py", line 96, in call
pullbox | | await self.middleware_stack(scope, receive, send)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/errors.py", line 186, in call
pullbox | | raise exc
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/errors.py", line 164, in call
pullbox | | await self.app(scope, receive, _send)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 193, in call
pullbox | | response = await self.dispatch_func(request, call_next)
pullbox | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | | File "/opt/venv/lib/python3.14/site-packages/pullbox/api/middleware.py", line 391, in dispatch
pullbox | | response = await call_next(request)
pullbox | | ^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 168, in call_next
pullbox | | raise app_exc from app_exc.cause or app_exc.context
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 144, in coro
pullbox | | await self.app(scope, receive_or_disconnect, send_no_error)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 193, in call
pullbox | | response = await self.dispatch_func(request, call_next)
pullbox | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | | File "/opt/venv/lib/python3.14/site-packages/pullbox/api/middleware.py", line 238, in dispatch
pullbox | | response = await call_next(request)
pullbox | | ^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 168, in call_next
pullbox | | raise app_exc from app_exc.cause or app_exc.context
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 144, in coro
pullbox | | await self.app(scope, receive_or_disconnect, send_no_error)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 193, in call
pullbox | | response = await self.dispatch_func(request, call_next)
pullbox | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | | File "/opt/venv/lib/python3.14/site-packages/pullbox/api/middleware.py", line 155, in dispatch
pullbox | | response = await call_next(request)
pullbox | | ^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 168, in call_next
pullbox | | raise app_exc from app_exc.cause or app_exc.context
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 144, in coro
pullbox | | await self.app(scope, receive_or_disconnect, send_no_error)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 193, in call
pullbox | | response = await self.dispatch_func(request, call_next)
pullbox | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | | File "/opt/venv/lib/python3.14/site-packages/pullbox/api/middleware.py", line 289, in dispatch
pullbox | | return await call_next(request)
pullbox | | ^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 168, in call_next
pullbox | | raise app_exc from app_exc.cause or app_exc.context
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 144, in coro
pullbox | | await self.app(scope, receive_or_disconnect, send_no_error)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 193, in call
pullbox | | response = await self.dispatch_func(request, call_next)
pullbox | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | | File "/opt/venv/lib/python3.14/site-packages/pullbox/api/middleware.py", line 96, in dispatch
pullbox | | return await call_next(request)
pullbox | | ^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 168, in call_next
pullbox | | raise app_exc from app_exc.cause or app_exc.context
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 144, in coro
pullbox | | await self.app(scope, receive_or_disconnect, send_no_error)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/exceptions.py", line 63, in call
pullbox | | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
pullbox | | raise exc
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
pullbox | | await app(scope, receive, sender)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in call
pullbox | | await self.app(scope, receive, send)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/routing.py", line 670, in call
pullbox | | await self.middleware_stack(scope, receive, send)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 2734, in app
pullbox | | await route.handle(scope, receive, send)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 1780, in handle
pullbox | | await self.original_router.handle(scope, receive, send)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 2789, in handle
pullbox | | await included_router._handle_selected(scope, receive, send)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 1791, in _handle_selected
pullbox | | await route.handle(scope, receive, send)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 1780, in handle
pullbox | | await self.original_router.handle(scope, receive, send)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 2789, in handle
pullbox | | await included_router._handle_selected(scope, receive, send)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 1800, in _handle_selected
pullbox | | await original_route.handle(scope, receive, send)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 1279, in handle
pullbox | | await app(scope, receive, send)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 158, in app
pullbox | | await wrap_app_handling_exceptions(app, request)(scope, receive, send)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
pullbox | | raise exc
pullbox | | File "/opt/venv/lib/python3.14/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
pullbox | | await app(scope, receive, sender)
pullbox | | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 144, in app
pullbox | | response = await f(request)
pullbox | | ^^^^^^^^^^^^^^^^
pullbox | | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 706, in app
pullbox | | raw_response = await run_endpoint_function(
pullbox | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | | ...<3 lines>...
pullbox | | )
pullbox | | ^
pullbox | | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 352, in run_endpoint_function
pullbox | | return await dependant.call(**values)
pullbox | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | | File "/opt/venv/lib/python3.14/site-packages/pullbox/ui/downloads_routes.py", line 959, in downloads
pullbox | | queue_ctx = await load_download_queue_context(session)
pullbox | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | | File "/opt/venv/lib/python3.14/site-packages/pullbox/ui/downloads_routes.py", line 511, in load_download_queue_context
pullbox | | renamed_names = await _queue_names(session, queue_items)
pullbox | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | | File "/opt/venv/lib/python3.14/site-packages/pullbox/ui/downloads_routes.py", line 158, in _queue_names
pullbox | | return await _build_queue_names(session, downloads)
pullbox | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | | File "/opt/venv/lib/python3.14/site-packages/pullbox/ui/routes.py", line 423, in _download_queue_names_bridge
pullbox | | return await _build_queue_names(session, downloads)
pullbox | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | | File "/opt/venv/lib/python3.14/site-packages/pullbox/ui/download_queue_names.py", line 110, in build_queue_names
pullbox | | full_name = format_comic_file(
pullbox | | series=series.title,
pullbox | | ...<6 lines>...
pullbox | | extension=preferred_ext,
pullbox | | )
pullbox | | File "/opt/venv/lib/python3.14/site-packages/pullbox/core/naming.py", line 653, in format_comic_file
pullbox | | name = name.replace("{Issue:03d}", f"{issue_val:03d}")
pullbox | | ^^^^^^^^^^^^^^^
pullbox | | ValueError: Unknown format code 'd' for object of type 'float'
pullbox | +------------------------------------
pullbox |
pullbox | The above exception was the direct cause of the following exception:
pullbox |
pullbox | Traceback (most recent call last):
pullbox | File "/opt/venv/lib/python3.14/site-packages/uvicorn/protocols/http/httptools_impl.py", line 422, in run_asgi
pullbox | result = await app( # type: ignore[func-returns-value]
pullbox | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | self.scope, self.receive, self.send
pullbox | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | )
pullbox | ^
pullbox | File "/opt/venv/lib/python3.14/site-packages/uvicorn/middleware/proxy_headers.py", line 63, in call
pullbox | return await self.app(scope, receive, send)
pullbox | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | File "/opt/venv/lib/python3.14/site-packages/fastapi/applications.py", line 1163, in call
pullbox | await super().call(scope, receive, send)
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/applications.py", line 96, in call
pullbox | await self.middleware_stack(scope, receive, send)
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/errors.py", line 186, in call
pullbox | raise exc
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/errors.py", line 164, in call
pullbox | await self.app(scope, receive, _send)
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 193, in call
pullbox | response = await self.dispatch_func(request, call_next)
pullbox | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | File "/opt/venv/lib/python3.14/site-packages/pullbox/api/middleware.py", line 391, in dispatch
pullbox | response = await call_next(request)
pullbox | ^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 168, in call_next
pullbox | raise app_exc from app_exc.cause or app_exc.context
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 144, in coro
pullbox | await self.app(scope, receive_or_disconnect, send_no_error)
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 193, in call
pullbox | response = await self.dispatch_func(request, call_next)
pullbox | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | File "/opt/venv/lib/python3.14/site-packages/pullbox/api/middleware.py", line 238, in dispatch
pullbox | response = await call_next(request)
pullbox | ^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 168, in call_next
pullbox | raise app_exc from app_exc.cause or app_exc.context
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 144, in coro
pullbox | await self.app(scope, receive_or_disconnect, send_no_error)
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 193, in call
pullbox | response = await self.dispatch_func(request, call_next)
pullbox | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | File "/opt/venv/lib/python3.14/site-packages/pullbox/api/middleware.py", line 155, in dispatch
pullbox | response = await call_next(request)
pullbox | ^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 168, in call_next
pullbox | raise app_exc from app_exc.cause or app_exc.context
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 144, in coro
pullbox | await self.app(scope, receive_or_disconnect, send_no_error)
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 193, in call
pullbox | response = await self.dispatch_func(request, call_next)
pullbox | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | File "/opt/venv/lib/python3.14/site-packages/pullbox/api/middleware.py", line 289, in dispatch
pullbox | return await call_next(request)
pullbox | ^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 168, in call_next
pullbox | raise app_exc from app_exc.cause or app_exc.context
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 144, in coro
pullbox | await self.app(scope, receive_or_disconnect, send_no_error)
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 193, in call
pullbox | response = await self.dispatch_func(request, call_next)
pullbox | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | File "/opt/venv/lib/python3.14/site-packages/pullbox/api/middleware.py", line 96, in dispatch
pullbox | return await call_next(request)
pullbox | ^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 168, in call_next
pullbox | raise app_exc from app_exc.cause or app_exc.context
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/base.py", line 144, in coro
pullbox | await self.app(scope, receive_or_disconnect, send_no_error)
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/middleware/exceptions.py", line 63, in call
pullbox | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
pullbox | raise exc
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
pullbox | await app(scope, receive, sender)
pullbox | File "/opt/venv/lib/python3.14/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in call
pullbox | await self.app(scope, receive, send)
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/routing.py", line 670, in call
pullbox | await self.middleware_stack(scope, receive, send)
pullbox | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 2734, in app
pullbox | await route.handle(scope, receive, send)
pullbox | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 1780, in handle
pullbox | await self.original_router.handle(scope, receive, send)
pullbox | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 2789, in handle
pullbox | await included_router._handle_selected(scope, receive, send)
pullbox | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 1791, in _handle_selected
pullbox | await route.handle(scope, receive, send)
pullbox | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 1780, in handle
pullbox | await self.original_router.handle(scope, receive, send)
pullbox | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 2789, in handle
pullbox | await included_router._handle_selected(scope, receive, send)
pullbox | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 1800, in _handle_selected
pullbox | await original_route.handle(scope, receive, send)
pullbox | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 1279, in handle
pullbox | await app(scope, receive, send)
pullbox | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 158, in app
pullbox | await wrap_app_handling_exceptions(app, request)(scope, receive, send)
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
pullbox | raise exc
pullbox | File "/opt/venv/lib/python3.14/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
pullbox | await app(scope, receive, sender)
pullbox | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 144, in app
pullbox | response = await f(request)
pullbox | ^^^^^^^^^^^^^^^^
pullbox | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 706, in app
pullbox | raw_response = await run_endpoint_function(
pullbox | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | ...<3 lines>...
pullbox | )
pullbox | ^
pullbox | File "/opt/venv/lib/python3.14/site-packages/fastapi/routing.py", line 352, in run_endpoint_function
pullbox | return await dependant.call(**values)
pullbox | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | File "/opt/venv/lib/python3.14/site-packages/pullbox/ui/downloads_routes.py", line 959, in downloads
pullbox | queue_ctx = await load_download_queue_context(session)
pullbox | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | File "/opt/venv/lib/python3.14/site-packages/pullbox/ui/downloads_routes.py", line 511, in load_download_queue_context
pullbox | renamed_names = await _queue_names(session, queue_items)
pullbox | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | File "/opt/venv/lib/python3.14/site-packages/pullbox/ui/downloads_routes.py", line 158, in _queue_names
pullbox | return await _build_queue_names(session, downloads)
pullbox | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | File "/opt/venv/lib/python3.14/site-packages/pullbox/ui/routes.py", line 423, in _download_queue_names_bridge
pullbox | return await _build_queue_names(session, downloads)
pullbox | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pullbox | File "/opt/venv/lib/python3.14/site-packages/pullbox/ui/download_queue_names.py", line 110, in build_queue_names
pullbox | full_name = format_comic_file(
pullbox | series=series.title,
pullbox | ...<6 lines>...
pullbox | extension=preferred_ext,
pullbox | )
pullbox | File "/opt/venv/lib/python3.14/site-packages/pullbox/core/naming.py", line 653, in format_comic_file
pullbox | name = name.replace("{Issue:03d}", f"{issue_val:03d}")
pullbox | ^^^^^^^^^^^^^^^
pullbox | ValueError: Unknown format code 'd' for object of type 'float'

Steps to Reproduce

  1. Download an issue with a floating point number
  2. Navigate to "Downloads"

Expected Behavior

Expected to see the list of downloads

Actual Behavior

I see an error: {"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred."}}

Pullbox Version

1.1.2

Deployment Method

Docker

Operating System

Ubuntu 26.04

Diagnostic Package

pullbox-diagnostic-20260828-180735.zip

Screenshots

No response

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions