Hello!
Feishin (https://github.com/jeffvli/feishin) no longer seems to work after updating to the V2 alpha (RC8). Looking in the logs, it seems like the requests that Feishin makes are causing Funkwhale to produce 500 errors.
I am not familiar enough with either Funkwhale or Feishin to seriously diagnose this issue myself, but if there is anything I can do to help please let me know. I've deployed Funkwhale using Docker (updating from a non-V2-apha version).
One of the exceptions in the logs, that happens with requests being made on the home page of Feishin:
front-1 | 172.18.0.1 - - [05/Jan/2026:11:32:46 +0000] "POST /rest/getAlbumList2.view HTTP/1.1" 500 145 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) feishin/1.2.0 Chrome/142.0.7444.235 Electron/39.2.7 Safari/537.36" "[REDACTED]"
api-1 | 2026-01-05 11:32:48,859 django.request ERROR Internal Server Error: /api/subsonic/rest/getAlbumList2.view
api-1 | Traceback (most recent call last):
api-1 | File "/venv/lib/python3.12/site-packages/asgiref/sync.py", line 518, in thread_handler
api-1 | raise exc_info[1]
api-1 | File "/venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 42, in inner
api-1 | response = await get_response(request)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/asgiref/sync.py", line 518, in thread_handler
api-1 | raise exc_info[1]
api-1 | File "/venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 253, in _get_response_async
api-1 | response = await wrapped_callback(
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/asgiref/sync.py", line 468, in __call__
api-1 | ret = await asyncio.shield(exec_coro)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/asgiref/current_thread_executor.py", line 40, in run
api-1 | result = self.fn(*self.args, **self.kwargs)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/asgiref/sync.py", line 522, in thread_handler
api-1 | return func(*args, **kwargs)
api-1 | ^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/usr/lib/python3.12/contextlib.py", line 81, in inner
api-1 | return func(*args, **kwds)
api-1 | ^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/django/views/decorators/csrf.py", line 65, in _view_wrapper
api-1 | return view_func(request, *args, **kwargs)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/rest_framework/viewsets.py", line 124, in view
api-1 | return self.dispatch(request, *args, **kwargs)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/app/funkwhale_api/subsonic/views.py", line 141, in dispatch
api-1 | return super().dispatch(request, *args, **kwargs)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/rest_framework/views.py", line 509, in dispatch
api-1 | response = self.handle_exception(exc)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/app/funkwhale_api/subsonic/views.py", line 154, in handle_exception
api-1 | return super().handle_exception(exc)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/rest_framework/views.py", line 469, in handle_exception
api-1 | self.raise_uncaught_exception(exc)
api-1 | File "/venv/lib/python3.12/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
api-1 | raise exc
api-1 | File "/venv/lib/python3.12/site-packages/rest_framework/views.py", line 506, in dispatch
api-1 | response = handler(request, *args, **kwargs)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/app/funkwhale_api/subsonic/views.py", line 609, in get_album_list2
api-1 | data = {"albumList2": {"album": serializers.get_album_list2_data(queryset)}}
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/app/funkwhale_api/subsonic/serializers.py", line 275, in get_album_list2_data
api-1 | return [get_album2_data(a) for a in albums]
api-1 | ^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/django/db/models/query.py", line 400, in __iter__
api-1 | self._fetch_all()
api-1 | File "/venv/lib/python3.12/site-packages/django/db/models/query.py", line 1928, in _fetch_all
api-1 | self._result_cache = list(self._iterable_class(self))
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/django/db/models/query.py", line 91, in __iter__
api-1 | results = compiler.execute_sql(
api-1 | ^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 1561, in execute_sql
api-1 | sql, params = self.as_sql()
api-1 | ^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 775, in as_sql
api-1 | self.compile(self.where) if self.where is not None else ("", [])
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 557, in compile
api-1 | sql, params = node.as_sql(self, self.connection)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/django/db/models/sql/where.py", line 151, in as_sql
api-1 | sql, params = compiler.compile(child)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 557, in compile
api-1 | sql, params = node.as_sql(self, self.connection)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/django/db/models/lookups.py", line 705, in as_sql
api-1 | start, finish = self.year_lookup_bounds(connection, self.rhs)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/django/db/models/lookups.py", line 690, in year_lookup_bounds
api-1 | bounds = connection.ops.year_lookup_bounds_for_date_field(
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/django/db/backends/base/operations.py", line 615, in year_lookup_bounds_for_date_field
api-1 | first = datetime.date(value, 1, 1)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | ValueError: year 0 is out of range
Copy-as-curl from that request:
curl 'https://[funkwhaleinstance]/rest/getAlbumList2.view' \
-H 'accept: application/json, text/plain, */*' \
-H 'accept-language: en-US' \
-H 'content-type: application/x-www-form-urlencoded' \
-b '__cf_bm=[REDACTED]' \
-H 'priority: u=1, i' \
-H 'sec-ch-ua: "Not_A Brand";v="99", "Chromium";v="142"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "Windows"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: cross-site' \
-H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) feishin/1.2.0 Chrome/142.0.7444.235 Electron/39.2.7 Safari/537.36' \
--data-raw 'c=Feishin&f=json&v=1.13.0&u=zegevlier&s=[REDACTED]&t=[REDACTED]&fromYear=2026&offset=0&size=20&toYear=0&type=byYear'
And another, from requests being made when on the albums page:
front-1 | 172.18.0.1 - - [05/Jan/2026:11:35:12 +0000] "POST /rest/search3.view HTTP/1.1" 200 229687 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) feishin/1.2.0 Chrome/142.0.7444.235 Electron/39.2.7 Safari/537.36" "[REDACTED]"
api-1 | 2026-01-05 11:35:13,704 django.request ERROR Internal Server Error: /api/subsonic/rest/getAlbumList2.view
api-1 | Traceback (most recent call last):
api-1 | File "/venv/lib/python3.12/site-packages/asgiref/sync.py", line 518, in thread_handler
api-1 | raise exc_info[1]
api-1 | File "/venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 42, in inner
api-1 | response = await get_response(request)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/asgiref/sync.py", line 518, in thread_handler
api-1 | raise exc_info[1]
api-1 | File "/venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 253, in _get_response_async
api-1 | response = await wrapped_callback(
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/asgiref/sync.py", line 468, in __call__
api-1 | ret = await asyncio.shield(exec_coro)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/asgiref/current_thread_executor.py", line 40, in run
api-1 | result = self.fn(*self.args, **self.kwargs)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/asgiref/sync.py", line 522, in thread_handler
api-1 | return func(*args, **kwargs)
api-1 | ^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/usr/lib/python3.12/contextlib.py", line 81, in inner
api-1 | return func(*args, **kwds)
api-1 | ^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/django/views/decorators/csrf.py", line 65, in _view_wrapper
api-1 | return view_func(request, *args, **kwargs)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/rest_framework/viewsets.py", line 124, in view
api-1 | return self.dispatch(request, *args, **kwargs)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/app/funkwhale_api/subsonic/views.py", line 141, in dispatch
api-1 | return super().dispatch(request, *args, **kwargs)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/rest_framework/views.py", line 509, in dispatch
api-1 | response = self.handle_exception(exc)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/app/funkwhale_api/subsonic/views.py", line 154, in handle_exception
api-1 | return super().handle_exception(exc)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/rest_framework/views.py", line 469, in handle_exception
api-1 | self.raise_uncaught_exception(exc)
api-1 | File "/venv/lib/python3.12/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
api-1 | raise exc
api-1 | File "/venv/lib/python3.12/site-packages/rest_framework/views.py", line 506, in dispatch
api-1 | response = handler(request, *args, **kwargs)
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/app/funkwhale_api/subsonic/views.py", line 558, in get_album_list2
api-1 | queryset = queryset.order_by("artist__title")
api-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
api-1 | File "/venv/lib/python3.12/site-packages/django/db/models/query.py", line 1701, in order_by
api-1 | obj.query.add_ordering(*field_names)
api-1 | File "/venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 2249, in add_ordering
api-1 | self.names_to_path(item.split(LOOKUP_SEP), self.model._meta)
api-1 | File "/venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1768, in names_to_path
api-1 | raise FieldError(
api-1 | django.core.exceptions.FieldError: Cannot resolve keyword 'artist' into field. Choices are: _tracks_count, artist_credit, attachment_cover, attachment_cover_id, attributed_to, attributed_to_id, body_text, creation_date, description, description_id, duration, fetches, fid, from_activity, from_activity_id, id, mbid, release_date, release_group_id, tagged_items, title, tracks, type, uuid
And this request's copy-as-curl:
curl 'https://[funkwhaleinstance]/rest/getAlbumList2.view' \
-H 'accept: application/json, text/plain, */*' \
-H 'accept-language: en-US' \
-H 'content-type: application/x-www-form-urlencoded' \
-b '__cf_bm=[REDACTED]' \
-H 'priority: u=1, i' \
-H 'sec-ch-ua: "Not_A Brand";v="99", "Chromium";v="142"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "Windows"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: cross-site' \
-H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) feishin/1.2.0 Chrome/142.0.7444.235 Electron/39.2.7 Safari/537.36' \
--data-raw 'c=Feishin&f=json&v=1.13.0&u=zegevlier&s=[REDACTED]&t=[REDACTED]&offset=0&size=500&type=alphabeticalByName'
I can avoid using Feishin, so I will leave it on the V2.0.0-RC8 version. Like I said, please let me know if I can do anything to help get this resolved.