Sailfin - a Jellyfin client for Sailfish OS thread

I can attest that Sailfin hasn’t been working lately for me either, I just see the empty homescreen.

For now I’ve been watching Jellyfin via the web interface in the default browser, which is actually not a bad experience especially with the 12.0 update.

Sailfin works for me. I am, however, on Jellyfin 10.11. Which I thought was the latest version. Is 12.x considered stable?

Yes. Version 12 betas / release candidates have been in the works since June, it is now released and stable. See Releases · jellyfin/jellyfin · GitHub

I tried Sailfin yesterday, from OpenRepos. I saw a video without problem, but after finishing watching it, it wasn’t marked as watched.

I also miss being able to fast-forward a few seconds with a button or a double tap, or skip between chapters.

I haven’t tested Sailfin for 12 yet, it seems like they introduced some breaking API changes. On first sight, none of them should be of any concern. But sometimes, things break in unexpected ways.

Anyhow, these lines seem problematic:

```

[D] unknown:0 - POST QUrl("https://mydomain.tld/jellyfin/Users/authenticatebyname") [D] expression for onNetworkError:58 - ConnectingPage: popping page!
[D] unknown:0 - Got reply with status code 400

Sailfin is clearly sending a wrong request here. Are the Jellyfin logs (Dashboards → Logs) giving any extra information?

I have created an issue in the bug tracker for the Jellyfin 12 breakage here: Jellyfin 12 breakage · Issue #61 · heartfin/harbour-sailfin · GitHub

1 Like

Workaround (untested) for now is to set EnableLegacyAuthorization to true in system.xml until the next update.

I’ll try to push an update later this week which fixes it. Thanks @ilpianista for submitting the fix!

Update: v0.6.0 with Jellyfin 12 support has been released: Sailfin - a Jellyfin client for Sailfish OS thread - #34 by ahappyhuman. The workaround above is no longer necessary.

6 Likes

This is what I meant with “sailjail problem”.
Most probably on Xperia 10 device?

@ahappyhuman
Sailfin runs in sailjail env, right?
I had the same trouble with Defender (all those library not found), only after allowing tons of lib dirs it worked for 10 series, wirkarounfmd for JP2601 was only a tenth of that, none for XA2 and earlier.

Jellyfin 12 deprecated some of the legacy authentication methods. Sailfin probably uses these and needs to be updated.

Yes, though not one running Jolla’s port.

I started the app on my Xperia 10 III by executing harbour-sailfin in a Terminal

At the time error 302 is shown on Sailfin, the Jellyfin server writes the following in its log:

[2026-09-18 00:57:25.102 +02:00] [ERR] Error processing request. URL "POST" "/Users/authenticatebyname".
System.ArgumentNullException: Value cannot be null. (Parameter 'request.App')
at System.ArgumentNullException.Throw(String paramName)
at System.ArgumentNullException.ThrowIfNull(Object argument, String paramName)
at System.ArgumentException.ThrowNullOrEmptyException(String argument, String paramName)
at System.ArgumentException.ThrowIfNullOrEmpty(String argument, String paramName)
at Emby.Server.Implementations.Session.SessionManager.AuthenticateNewSessionInternal(AuthenticationRequest request, Boolean enforcePassword)
at Jellyfin.Api.Controllers.UserController.AuthenticateUserByName(AuthenticateUserByName request)
at lambda_method2947(Closure, Object)
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(ActionContext actionContext, IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Jellyfin.Api.Middleware.ServerStartupMessageMiddleware.Invoke(HttpContext httpContext, IServerApplicationHost serverApplicationHost, ILocalizationManager localizationManager)
at Jellyfin.Api.Middleware.WebSocketHandlerMiddleware.Invoke(HttpContext httpContext, IWebSocketManager webSocketManager)
at Jellyfin.Api.Middleware.IPBasedAccessValidationMiddleware.Invoke(HttpContext httpContext, INetworkManager networkManager)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Jellyfin.Api.Middleware.QueryStringDecodingMiddleware.Invoke(HttpContext httpContext)
at Swashbuckle.AspNetCore.ReDoc.ReDocMiddleware.Invoke(HttpContext httpContext)
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Jellyfin.Api.Middleware.RobotsRedirectionMiddleware.Invoke(HttpContext httpContext)
at Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.ResponseCompression.ResponseCompressionMiddleware.InvokeCore(HttpContext context)
at Jellyfin.Api.Middleware.ResponseTimeMiddleware.Invoke(HttpContext context, IServerConfigurationManager serverConfigurationManager)
at Jellyfin.Api.Middleware.ExceptionMiddleware.Invoke(HttpContext context)
1 Like

thank you, this restores the login in the meantime.

Version 0.6.0

This is a quick release to fix v0.6.0 compatibility, with some other unreleased features that have been implemented a while ago. Sadly, I could not test everything at the moment, but at least logging in, media browsing and playback works. Also, armv7 builds are broken at the moment. I’m not sure whether there are armv7 devices on 5.1, but if so, I may try to upload fixed builds later.

Release notes:

  • New features:
    • Added a page that shows a list of Live TV channels with details about currently running
      programs.
  • Changes:
    • TV Channels on the main page are now sorted by channel number, instead of recently added
  • Bug fixes
6 Likes

Sony Xperia 10 and Sony Xperia XA2 are running armv7 version of SFOS and they are still officially supported by Jolla.

1 Like

Thank you so much for all your work on this project! It is surely appreciated.

One question, though.

Bug fixes

  • Jellyfin 12 compatibility

Does this mean that after installing this update I will no longer be able to connect to my Jellyfin 10.8.13 server? I remained at this version due to certain usability issues I had with all of the versions thereafter.

I could connect.to my testing environment running an older version of Jellyfin.
Also works very nicely with version 12.

Is it still true that you cannot watch any live TV?

You should be able to do it, although the UI may be a bit unfinished. I haven’t tested it yet with Jellyfin 12 at the moment

It works indeed, thanks a lot!: )

1 Like