jellyfin / jellyfin-androidtv

Android TV Client for Jellyfin
https://jellyfin.org
GNU General Public License v2.0
2.69k stars 461 forks source link

Websocket closes after a while and never reopens #3461

Closed chadkouse closed 1 month ago

chadkouse commented 6 months ago

Describe the bug

Note: while diagnosing this I sideloaded an apk built from unmodified source a71c2c8cb . This behavior is also observed in the official play store version.

Nothing I can do except force-quitting the app, waiting for it to be killed by android, or power cycling the android tv will bring the websocket back.

I've tried poking around at various places in the jellyfin-androidtv code to try to find the right place (and method) to force that websocket to re-initialize, but I have been unsuccessful. I considered that it may be a bug in the SDK but other clients seem to work (like the android client on my phone) - and I assume they use the same SDK.

Expected: The websocket closes itself when the application is in the background (for some period?) and reopens itself when the application is brought back to the foreground. When the socket connection is interrupted it should be able to reconnect it successfully.

Logs

Client log from adb logcat | grep -i jellyfin -- some redundant parts removed for brevity -- ask me for the whole log if needed


03-22 10:17:26.460  4061  4061 D MediaPlayerList: onActiveSessionsChanged: controller: org.jellyfin.androidtv
03-22 10:17:26.460  4061  4061 D MediaPlayerList: Already have a controller for the player: org.jellyfin.androidtv, updating instead
03-22 10:17:26.487  6589  6589 I jellyfin-apiclient: Response received from: http://10.0.1.100:8096/Videos/2b04a038-089b-8ebe-59d1-defe943e9c41/2b04a038089b8ebe59d1defe943e9c41/Subtitles/0/0/Stream.JSON?format=json
03-22 10:17:26.487  6589  6589 D jellyfin-apiclient: Received response from http://10.0.1.100:8096/Videos/2b04a038-089b-8ebe-59d1-defe943e9c41/2b04a038089b8ebe59d1defe943e9c41/Subtitles/0/0/Stream.JSON?format=json
03-22 10:17:26.528  6589  6589 I jellyfin-apiclient: Response received from: http://10.0.1.100:8096/Sessions/Playing/Progress
03-22 10:17:29.382  6589  6589 D jellyfin-apiclient: Adding request to queue: http://10.0.1.100:8096/Sessions/Playing/Progress
03-22 10:17:29.690  6589  6589 I jellyfin-apiclient: Response received from: http://10.0.1.100:8096/Sessions/Playing/Progress
03-22 10:17:32.391  6589  6589 D jellyfin-apiclient: Adding request to queue: http://10.0.1.100:8096/Sessions/Playing/Progress
03-22 10:17:32.591  6589  6589 I jellyfin-apiclient: Response received from: http://10.0.1.100:8096/Sessions/Playing/Progress
03-22 10:17:33.114  6589  7234 I org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: Receiving (raw) message {"MessageType":"GeneralCommand","MessageId":"2622bf4dd20a49fdb385502f7743cf5e","Data":{"Name":"DisplayMessage","ControllingUserId":"00000000000000000000000000000000","Arguments":{"Header":"","Text":"Intro skipped","TimeoutMs":"2000"}}}
03-22 10:17:33.114  6589  7234 I org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: Receiving (raw) message {"MessageType":"Playstate","MessageId":"e3729b712c034966987a3e1dc7c447c6","Data":{"Command":"Seek","SeekPositionTicks":280000000,"ControllingUserId":"ed9d9bffd1e940358f674e846c44122a"}}
03-22 10:17:33.134  6589  6589 D jellyfin-apiclient: Adding request to queue: http://10.0.1.100:8096/Sessions/Playing/Progress
03-22 10:17:33.426  6589  6589 I jellyfin-apiclient: Response received from: http://10.0.1.100:8096/Sessions/Playing/Progress
03-22 10:17:36.135  6589  6589 D jellyfin-apiclient: Adding request to queue: http://10.0.1.100:8096/Sessions/Playing/Progress
03-22 10:17:36.384  6589  6589 I jellyfin-apiclient: Response received from: http://10.0.1.100:8096/Sessions/Playing/Progress
03-22 10:17:37.286  3902  6934 W NotificationService: Toast already killed. pkg=org.jellyfin.androidtv token=android.os.BinderProxy@b8ea5c2
03-22 10:17:38.978  3902  6934 I MediaFocusControl: abandonAudioFocus() from uid/pid 10107/6589 clientId=android.media.AudioManager@f92f282org.jellyfin.androidtv.ui.playback.CustomPlaybackOverlayFragment$6@a010d93
03-22 10:17:38.984  3902  6934 I MediaFocusControl: abandonAudioFocus() from uid/pid 10107/6589 clientId=android.media.AudioManager@f92f282org.jellyfin.androidtv.ui.playback.CustomPlaybackOverlayFragment$6@a010d93
03-22 10:17:38.990  6589  6589 I jellyfin-apiclient: ReportPlaybackStopped: Item 2b04a038-089b-8ebe-59d1-defe943e9c41, Ticks: 332660000
03-22 10:17:38.991  6589  6589 D jellyfin-apiclient: Adding request to queue: http://10.0.1.100:8096/Sessions/Playing/Stopped
03-22 10:17:39.082  6589  6589 D jellyfin-apiclient: Adding request to queue: http://10.0.1.100:8096/Users/ed9d9bff-d1e9-4035-8f67-4e846c44122a/Items/2b04a038-089b-8ebe-59d1-defe943e9c41?format=json
03-22 10:17:39.147  6589  6589 I jellyfin-apiclient: Response received from: http://10.0.1.100:8096/Users/ed9d9bff-d1e9-4035-8f67-4e846c44122a/Items/2b04a038-089b-8ebe-59d1-defe943e9c41?format=json
03-22 10:17:39.208  6589  6589 D jellyfin-apiclient: Adding request to queue: http://10.0.1.100:8096/Shows/33076d91eed90ef78b5636bc48960a34/Episodes?AdjacentTo=2b04a038089b8ebe59d1defe943e9c41&UserId=ed9d9bff-d1e9-4035-8f67-4e846c44122a&format=json
03-22 10:17:39.216  6589  6589 D jellyfin-apiclient: Adding request to queue: http://10.0.1.100:8096/Users/ed9d9bff-d1e9-4035-8f67-4e846c44122a/Items?ParentId=d38c764b1d97e59a8cda075babf0c325&StartIndex=1&recursive=false&Fields=PrimaryImageAspectRatio%2COverview%2CItemCounts%2CDisplayPreferencesId%2CChildCount&Limit=20&IncludeItemTypes=Episode&format=json
03-22 10:17:39.325  6589  6589 I jellyfin-apiclient: Response received from: http://10.0.1.100:8096/Shows/33076d91eed90ef78b5636bc48960a34/Episodes?AdjacentTo=2b04a038089b8ebe59d1defe943e9c41&UserId=ed9d9bff-d1e9-4035-8f67-4e846c44122a&format=json
03-22 10:17:39.328  6589  6589 I jellyfin-apiclient: Response received from: http://10.0.1.100:8096/Users/ed9d9bff-d1e9-4035-8f67-4e846c44122a/Items?ParentId=d38c764b1d97e59a8cda075babf0c325&StartIndex=1&recursive=false&Fields=PrimaryImageAspectRatio%2COverview%2CItemCounts%2CDisplayPreferencesId%2CChildCount&Limit=20&IncludeItemTypes=Episode&format=json
03-22 10:17:39.850  6589  6589 D jellyfin-apiclient: Adding request to queue: http://10.0.1.100:8096/Users/ed9d9bff-d1e9-4035-8f67-4e846c44122a/Items/2b04a038-089b-8ebe-59d1-defe943e9c41?format=json
03-22 10:17:39.869  6589  6589 I jellyfin-apiclient: Response received from: http://10.0.1.100:8096/Users/ed9d9bff-d1e9-4035-8f67-4e846c44122a/Items/2b04a038-089b-8ebe-59d1-defe943e9c41?format=json
03-22 10:17:39.923  6589  6589 D jellyfin-apiclient: Adding request to queue: http://10.0.1.100:8096/Shows/33076d91eed90ef78b5636bc48960a34/Episodes?AdjacentTo=2b04a038089b8ebe59d1defe943e9c41&UserId=ed9d9bff-d1e9-4035-8f67-4e846c44122a&format=json
03-22 10:17:39.932  6589  6589 D jellyfin-apiclient: Adding request to queue: http://10.0.1.100:8096/Users/ed9d9bff-d1e9-4035-8f67-4e846c44122a/Items?ParentId=d38c764b1d97e59a8cda075babf0c325&StartIndex=1&recursive=false&Fields=PrimaryImageAspectRatio%2COverview%2CItemCounts%2CDisplayPreferencesId%2CChildCount&Limit=20&IncludeItemTypes=Episode&format=json
03-22 10:17:40.013  6589  6589 I jellyfin-apiclient: Response received from: http://10.0.1.100:8096/Shows/33076d91eed90ef78b5636bc48960a34/Episodes?AdjacentTo=2b04a038089b8ebe59d1defe943e9c41&UserId=ed9d9bff-d1e9-4035-8f67-4e846c44122a&format=json
03-22 10:17:40.015  6589  6589 I jellyfin-apiclient: Response received from: http://10.0.1.100:8096/Users/ed9d9bff-d1e9-4035-8f67-4e846c44122a/Items?ParentId=d38c764b1d97e59a8cda075babf0c325&StartIndex=1&recursive=false&Fields=PrimaryImageAspectRatio%2COverview%2CItemCounts%2CDisplayPreferencesId%2CChildCount&Limit=20&IncludeItemTypes=Episode&format=json
03-22 10:17:40.550  6589  7279 I org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: Sending (raw) message {"MessageType":"KeepAlive","Data":{}}
03-22 10:17:40.565  6589  7234 I org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: Receiving (raw) message {"MessageType":"KeepAlive","MessageId":"a182d7ac0c164e4eb1532088187ec108"}
03-22 10:17:40.729  6589  6589 I jellyfin-apiclient: Response received from: http://10.0.1.100:8096/Sessions/Playing/Stopped
03-22 10:17:41.201  6589  6589 D jellyfin-apiclient: Adding request to queue: http://10.0.1.100:8096/Users/ed9d9bff-d1e9-4035-8f67-4e846c44122a/Items/33076d91-eed9-0ef7-8b56-36bc48960a34?format=json
03-22 10:17:41.218  6589  6589 I jellyfin-apiclient: Response received from: http://10.0.1.100:8096/Users/ed9d9bff-d1e9-4035-8f67-4e846c44122a/Items/33076d91-eed9-0ef7-8b56-36bc48960a34?format=json
03-22 10:17:41.221  6589  7234 I org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: Receiving (raw) message {"MessageType":"UserDataChanged","MessageId":"f9b90a9ad8fa46c584d32c4009cb4c27","Data":{"UserId":"ed9d9bffd1e940358f674e846c44122a","UserDataList":[{"PlaybackPositionTicks":0,"PlayCount":41,"IsFavorite":false,"LastPlayedDate":"2024-03-22T14:17:24.904458Z","Played":false,"Key":"75897012001","ItemId":"2b04a038089b8ebe59d1defe943e9c41"},{"UnplayedItemCount":14,"PlaybackPositionTicks":0,"PlayCount":0,"IsFavorite":false,"Played":false,"Key":"75897012","ItemId":"d38c764b1d97e59a8cda075babf0c325"}]}}
03-22 10:17:41.281  6589  6589 D jellyfin-apiclient: Adding request to queue: http://10.0.1.100:8096/Shows/NextUp?Fields=PrimaryImageAspectRatio%2CChildCount&SeriesId=33076d91eed90ef78b5636bc48960a34&UserId=ed9d9bff-d1e9-4035-8f67-4e846c44122a&format=json
03-22 10:17:41.282  6589  6589 D jellyfin-apiclient: Adding request to queue: http://10.0.1.100:8096/Shows/33076d91eed90ef78b5636bc48960a34/Seasons?Fields=PrimaryImageAspectRatio%2CDisplayPreferencesId%2CChildCount&UserId=ed9d9bff-d1e9-4035-8f67-4e846c44122a&format=json
03-22 10:17:41.282  6589  6589 D jellyfin-apiclient: Adding request to queue: http://10.0.1.100:8096/Shows/Upcoming?Fields=PrimaryImageAspectRatio%2CChildCount&UserId=ed9d9bff-d1e9-4035-8f67-4e846c44122a&format=json
03-22 10:17:41.285  6589  6589 D jellyfin-apiclient: Adding request to queue: http://10.0.1.100:8096/Items/33076d91eed90ef78b5636bc48960a34/Similar?Fields=PrimaryImageAspectRatio%2CDisplayPreferencesId%2CChildCount&UserId=ed9d9bff-d1e9-4035-8f67-4e846c44122a&Limit=20&format=json
03-22 10:17:41.330  6589  6589 I jellyfin-apiclient: Response received from: http://10.0.1.100:8096/Shows/NextUp?Fields=PrimaryImageAspectRatio%2CChildCount&SeriesId=33076d91eed90ef78b5636bc48960a34&UserId=ed9d9bff-d1e9-4035-8f67-4e846c44122a&format=json
03-22 10:17:41.335  6589  6589 D jellyfin-apiclient: Adding request to queue: http://10.0.1.100:8096/Users/ed9d9bff-d1e9-4035-8f67-4e846c44122a/Items?ParentId=d38c764b-1d97-e59a-8cda-075babf0c325&StartIndex=1&recursive=false&Fields=PrimaryImageAspectRatio%2COverview%2CItemCounts%2CDisplayPreferencesId%2CChildCount&format=json
03-22 10:17:41.369  6589  6589 I jellyfin-apiclient: Response received from: http://10.0.1.100:8096/Shows/Upcoming?Fields=PrimaryImageAspectRatio%2CChildCount&UserId=ed9d9bff-d1e9-4035-8f67-4e846c44122a&format=json
03-22 10:17:41.401  6589  6589 I jellyfin-apiclient: Response received from: http://10.0.1.100:8096/Shows/33076d91eed90ef78b5636bc48960a34/Seasons?Fields=PrimaryImageAspectRatio%2CDisplayPreferencesId%2CChildCount&UserId=ed9d9bff-d1e9-4035-8f67-4e846c44122a&format=json
03-22 10:17:41.411  6589  6589 I jellyfin-apiclient: Response received from: http://10.0.1.100:8096/Users/ed9d9bff-d1e9-4035-8f67-4e846c44122a/Items?ParentId=d38c764b-1d97-e59a-8cda-075babf0c325&StartIndex=1&recursive=false&Fields=PrimaryImageAspectRatio%2COverview%2CItemCounts%2CDisplayPreferencesId%2CChildCount&format=json
03-22 10:17:41.428  6589  6589 I jellyfin-apiclient: Response received from: http://10.0.1.100:8096/Items/33076d91eed90ef78b5636bc48960a34/Similar?Fields=PrimaryImageAspectRatio%2CDisplayPreferencesId%2CChildCount&UserId=ed9d9bff-d1e9-4035-8f67-4e846c44122a&Limit=20&format=json
03-22 10:17:42.527  6589  6589 D ACRA    : onActivityPaused class org.jellyfin.androidtv.ui.browsing.MainActivity
03-22 10:17:43.145  6589  6589 D ACRA    : onActivityStopped class org.jellyfin.androidtv.ui.browsing.MainActivity
03-22 10:17:43.148  6589  6589 D ACRA    : onActivitySaveInstanceState class org.jellyfin.androidtv.ui.browsing.MainActivity
03-22 10:18:10.551  6589  7279 I org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: Sending (raw) message {"MessageType":"KeepAlive","Data":{}}
03-22 10:18:10.555  6589  7234 I org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: Receiving (raw) message {"MessageType":"KeepAlive","MessageId":"053ef96eb98040ec9338f2328f406891"}
03-22 10:18:40.591  6589  7226 I org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: Sending (raw) message {"MessageType":"KeepAlive","Data":{}}
03-22 10:18:40.605  6589  7234 I org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: Receiving (raw) message {"MessageType":"KeepAlive","MessageId":"51cb27bb0bee40fcb7cd4638c84ae762"}
03-22 10:19:10.631  6589  7226 I org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: Sending (raw) message {"MessageType":"KeepAlive","Data":{}}

---- repeats ----

03-22 10:39:12.198  6589  7803 I org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: Sending (raw) message {"MessageType":"KeepAlive","Data":{}}
03-22 10:39:12.204  6589  7234 I org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: Receiving (raw) message {"MessageType":"KeepAlive","MessageId":"db0f0f02e7814f01a1dd0844fc355979"}
03-22 10:39:42.230  6589  7806 I org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: Sending (raw) message {"MessageType":"KeepAlive","Data":{}}
03-22 10:39:42.239  6589  7234 I org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: Receiving (raw) message {"MessageType":"KeepAlive","MessageId":"fdd01edb9d7f48679a14ff4b5946e6ee"}
03-22 10:39:46.928  6589  7234 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: WebSocket has failed
03-22 10:39:46.928  6589  7234 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: java.net.SocketException: Software caused connection abort
03-22 10:39:46.928  6589  7234 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.SocketInputStream.socketRead0(Native Method)
03-22 10:39:46.928  6589  7234 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.SocketInputStream.socketRead(SocketInputStream.java:119)
03-22 10:39:46.928  6589  7234 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.SocketInputStream.read(SocketInputStream.java:176)
03-22 10:39:46.928  6589  7234 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.SocketInputStream.read(SocketInputStream.java:144)
03-22 10:39:46.928  6589  7234 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okio.InputStreamSource.read(JvmOkio.kt:93)
03-22 10:39:46.928  6589  7234 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okio.AsyncTimeout$source$1.read(AsyncTimeout.kt:153)
03-22 10:39:46.928  6589  7234 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okio.RealBufferedSource.request(RealBufferedSource.kt:210)
03-22 10:39:46.928  6589  7234 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okio.RealBufferedSource.require(RealBufferedSource.kt:203)
03-22 10:39:46.928  6589  7234 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okio.RealBufferedSource.readByte(RealBufferedSource.kt:213)
03-22 10:39:46.928  6589  7234 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.ws.WebSocketReader.readHeader(WebSocketReader.kt:119)
03-22 10:39:46.928  6589  7234 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.ws.WebSocketReader.processNextFrame(WebSocketReader.kt:102)
03-22 10:39:46.928  6589  7234 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.ws.RealWebSocket.loopReader(RealWebSocket.kt:293)
03-22 10:39:46.928  6589  7234 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:195)
03-22 10:39:46.928  6589  7234 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
03-22 10:39:46.928  6589  7234 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
03-22 10:39:46.928  6589  7234 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
03-22 10:39:46.928  6589  7234 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.lang.Thread.run(Thread.java:920)
03-22 10:39:46.938  6589  7803 I org.jellyfin.sdk.api.sockets.helper.ReconnectHelper: Reconnect scheduled in 600ms (error=true)
03-22 10:39:47.571  6589  7803 D org.jellyfin.sdk.api.sockets.SocketInstance: Reconnect requested
03-22 10:39:47.571  6589  7803 I org.jellyfin.sdk.api.sockets.SocketInstance: Reconnecting
03-22 10:39:47.590  6589  7803 D org.jellyfin.sdk.api.sockets.helper.ReconnectHelper: Notified about reconnect, attempts=1
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: WebSocket has failed
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: java.net.SocketTimeoutException: failed to connect to /10.0.1.100 (port 8096) from /10.0.1.199 (port 43362) after 6000ms
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at libcore.io.IoBridge.connectErrno(IoBridge.java:236)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at libcore.io.IoBridge.connect(IoBridge.java:180)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.Socket.connect(Socket.java:621)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.platform.Platform.connectSocket(Platform.kt:128)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.kt:295)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealConnection.connect(RealConnection.kt:207)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:226)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:106)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:74)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealCall.initExchange$okhttp(RealCall.kt:255)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:32)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:95)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:517)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
03-22 10:39:53.672  6589  8054 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.lang.Thread.run(Thread.java:920)
03-22 10:39:53.674  6589  7806 I org.jellyfin.sdk.api.sockets.helper.ReconnectHelper: Reconnect scheduled in 6s (error=true)
03-22 10:39:59.713  6589  7803 D org.jellyfin.sdk.api.sockets.SocketInstance: Reconnect requested
03-22 10:39:59.713  6589  7803 I org.jellyfin.sdk.api.sockets.SocketInstance: Reconnecting
03-22 10:39:59.714  6589  7803 D org.jellyfin.sdk.api.sockets.helper.ReconnectHelper: Notified about reconnect, attempts=2
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: WebSocket has failed
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: java.net.SocketTimeoutException: failed to connect to /10.0.1.100 (port 8096) from /10.0.1.199 (port 43364) after 6000ms
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at libcore.io.IoBridge.connectErrno(IoBridge.java:236)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at libcore.io.IoBridge.connect(IoBridge.java:180)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.Socket.connect(Socket.java:621)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.platform.Platform.connectSocket(Platform.kt:128)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.kt:295)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealConnection.connect(RealConnection.kt:207)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:226)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:106)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:74)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealCall.initExchange$okhttp(RealCall.kt:255)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:32)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:95)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:517)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
03-22 10:40:05.757  6589  8055 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.lang.Thread.run(Thread.java:920)
03-22 10:40:05.759  6589  7803 I org.jellyfin.sdk.api.sockets.helper.ReconnectHelper: Reconnect scheduled in 15s (error=true)
03-22 10:40:20.799  6589  7806 D org.jellyfin.sdk.api.sockets.SocketInstance: Reconnect requested
03-22 10:40:20.800  6589  7806 I org.jellyfin.sdk.api.sockets.SocketInstance: Reconnecting
03-22 10:40:20.800  6589  7806 D org.jellyfin.sdk.api.sockets.helper.ReconnectHelper: Notified about reconnect, attempts=3
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: WebSocket has failed
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: java.net.SocketTimeoutException: failed to connect to /10.0.1.100 (port 8096) from /10.0.1.199 (port 43366) after 6000ms
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at libcore.io.IoBridge.connectErrno(IoBridge.java:236)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at libcore.io.IoBridge.connect(IoBridge.java:180)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.Socket.connect(Socket.java:621)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.platform.Platform.connectSocket(Platform.kt:128)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.kt:295)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealConnection.connect(RealConnection.kt:207)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:226)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:106)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:74)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealCall.initExchange$okhttp(RealCall.kt:255)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:32)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:95)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:517)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
03-22 10:40:26.871  6589  8058 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.lang.Thread.run(Thread.java:920)
03-22 10:40:26.875  6589  7806 I org.jellyfin.sdk.api.sockets.helper.ReconnectHelper: Reconnect scheduled in 30s (error=true)
03-22 10:40:56.911  6589  7806 D org.jellyfin.sdk.api.sockets.SocketInstance: Reconnect requested
03-22 10:40:56.912  6589  7806 I org.jellyfin.sdk.api.sockets.SocketInstance: Reconnecting
03-22 10:40:56.913  6589  7806 D org.jellyfin.sdk.api.sockets.helper.ReconnectHelper: Notified about reconnect, attempts=4
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: WebSocket has failed
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: java.net.SocketTimeoutException: failed to connect to /10.0.1.100 (port 8096) from /10.0.1.199 (port 43368) after 6000ms
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at libcore.io.IoBridge.connectErrno(IoBridge.java:236)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at libcore.io.IoBridge.connect(IoBridge.java:180)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.Socket.connect(Socket.java:621)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.platform.Platform.connectSocket(Platform.kt:128)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.kt:295)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealConnection.connect(RealConnection.kt:207)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:226)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:106)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:74)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealCall.initExchange$okhttp(RealCall.kt:255)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:32)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:95)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:517)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
03-22 10:41:02.976  6589  8060 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.lang.Thread.run(Thread.java:920)
03-22 10:41:02.980  6589  7806 I org.jellyfin.sdk.api.sockets.helper.ReconnectHelper: Reconnect scheduled in 45s (error=true)
03-22 10:41:47.995  6589  7803 D org.jellyfin.sdk.api.sockets.SocketInstance: Reconnect requested
03-22 10:41:47.996  6589  7803 I org.jellyfin.sdk.api.sockets.SocketInstance: Reconnecting
03-22 10:41:47.997  6589  7803 D org.jellyfin.sdk.api.sockets.helper.ReconnectHelper: Notified about reconnect, attempts=5
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: WebSocket has failed
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: java.net.SocketTimeoutException: failed to connect to /10.0.1.100 (port 8096) from /10.0.1.199 (port 43370) after 6000ms
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at libcore.io.IoBridge.connectErrno(IoBridge.java:236)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at libcore.io.IoBridge.connect(IoBridge.java:180)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.Socket.connect(Socket.java:621)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.platform.Platform.connectSocket(Platform.kt:128)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.kt:295)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealConnection.connect(RealConnection.kt:207)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:226)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:106)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:74)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealCall.initExchange$okhttp(RealCall.kt:255)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:32)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:95)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:517)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
03-22 10:41:54.060  6589  8066 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.lang.Thread.run(Thread.java:920)
03-22 10:41:54.063  6589  7806 I org.jellyfin.sdk.api.sockets.helper.ReconnectHelper: Reconnect scheduled in 1m (error=true)

---- repeats ----

03-22 10:56:40.144  6589  7806 D org.jellyfin.sdk.api.sockets.helper.ReconnectHelper: Notified about reconnect, attempts=16
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: WebSocket has failed
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession: java.net.SocketTimeoutException: failed to connect to /10.0.1.100 (port 8096) from /10.0.1.199 (port 43398) after 6000ms
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at libcore.io.IoBridge.connectErrno(IoBridge.java:236)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at libcore.io.IoBridge.connect(IoBridge.java:180)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.net.Socket.connect(Socket.java:621)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.platform.Platform.connectSocket(Platform.kt:128)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.kt:295)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealConnection.connect(RealConnection.kt:207)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:226)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:106)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:74)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealCall.initExchange$okhttp(RealCall.kt:255)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:32)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:95)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:517)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
03-22 10:56:46.184  6589  8173 W org.jellyfin.sdk.api.sockets.OkHttpWebsocketSession:   at java.lang.Thread.run(Thread.java:920)
03-22 10:56:46.188  6589  7803 D org.jellyfin.sdk.api.sockets.helper.ReconnectHelper: Reconnect schedule failed: exceeded maximum retry attempts of 16

Related server log:


[2024-03-22 10:36:40.933 -04:00] [INF] [67] Jellyfin.Networking.Manager.NetworkManager: Using LAN addresses: "[10.0.1.0/24]"
[2024-03-22 10:38:15.339 -04:00] [INF] [67] Jellyfin.Networking.Manager.NetworkManager: Defined LAN addresses : "[10.0.1.0/24]"
[2024-03-22 10:38:15.339 -04:00] [INF] [67] Jellyfin.Networking.Manager.NetworkManager: Defined LAN exclusions : "[]"
[2024-03-22 10:38:15.339 -04:00] [INF] [67] Jellyfin.Networking.Manager.NetworkManager: Using LAN addresses: "[10.0.1.0/24]"
[2024-03-22 10:39:46.922 -04:00] [WRN] [71] Emby.Server.Implementations.HttpServer.WebSocketConnection: WS "10.0.1.199" error receiving data: "The remote party closed the WebSocket connection without completing the close handshake."
[2024-03-22 10:39:46.927 -04:00] [INF] [71] Emby.Server.Implementations.HttpServer.WebSocketManager: WS "10.0.1.199" closed
[2024-03-22 10:40:14.713 -04:00] [INF] [96] Jellyfin.Networking.Manager.NetworkManager: Defined LAN addresses : "[10.0.1.0/24]"
[2024-03-22 10:40:14.713 -04:00] [INF] [96] Jellyfin.Networking.Manager.NetworkManager: Defined LAN exclusions : "[]"
[2024-03-22 10:40:14.713 -04:00] [INF] [96] Jellyfin.Networking.Manager.NetworkManager: Using LAN addresses: "[10.0.1.0/24]"

Application version

0.16.6

Where did you install the app from?

None

Device information

Google chromecast with android tv

Android version

Android TV OS Version 12

Jellyfin server version

10.8.13

nielsvanvelzen commented 6 months ago

The app keeps the WebSocket alive when it is in the background. Your logs indicate it loses the connection with your server (could be because the server is turned off, no idea). The WebSocket will thus disconnect and attempt reconnection. It will only try this 16 times in total, after which it will not try to reconnect again.

chadkouse commented 6 months ago

@nielsvanvelzen right - however the server stays up -- you can tell from the server logs (not to mention I was literally watching a show on my computer while I was tailing adb logcat and there were no issues).

Other clients (web, android, ios) continue working and the jellyfin-androidtv app keeps working otherwise as far as media browsing and playback. What's happening is that the websocket never reconnects until the app exits and restarts. You can see in my logs that it tried to reconnect 16 times over the course of about 17 minutes.. the whole time the server was up.

Is there a mechanism to reset the websocket? I've tried socketInstance.reconnect() and socketInstance.updateCredentials() in a few places without success.

nielsvanvelzen commented 6 months ago

My best guess is that Android disables networking for the app when it is put to the background. Ideally we'd stop the WebSocket connection when that happens but we don't have a good way to do that now (we need to make changes to the SDK for that).

If you re-open the app it should try to reconnect, no need to force kill it. But it might be better to move that logic to the onResume method of the MainActivity, so it is called more often.

chadkouse commented 6 months ago

@nielsvanvelzen thanks for the reply - can you provide the logic to reconnect? I'm happy to implement / test / pr but I've tried a few things mentioned above (in onResume even) and didn't have success. I wonder if there's something in the SDK that's preventing the reconnect from being attempted again after the 16 retry max?

jellyfin-bot commented 2 months ago

This issue has gone 120 days without comment. To avoid abandoned issues, it will be closed in 21 days if there are no new comments.

If you're the original submitter of this issue, please comment confirming if this issue still affects you in the latest release or master branch, or close the issue if it has been fixed. If you're another user also affected by this bug, please comment confirming so. Either action will remove the stale label.

This bot exists to prevent issues from becoming stale and forgotten. Jellyfin is always moving forward, and bugs are often fixed as side effects of other changes. We therefore ask that bug report authors remain vigilant about their issues to ensure they are closed if fixed, or re-confirmed - perhaps with fresh logs or reproduction examples - regularly. If you have any questions you can reach us on Matrix or Social Media.