diff --git a/app/modules/jellyfin/jellyfin.py b/app/modules/jellyfin/jellyfin.py index cb7df87fa..2f2b0f81f 100644 --- a/app/modules/jellyfin/jellyfin.py +++ b/app/modules/jellyfin/jellyfin.py @@ -904,7 +904,7 @@ class Jellyfin: playback_position_ticks = message.get('PlaybackPositionTicks') runtime_ticks = message.get('RunTimeTicks') - if playback_position_ticks is not None and runtime_ticks is not None: + if playback_position_ticks is not None and runtime_ticks: eventItem.percentage = playback_position_ticks / runtime_ticks * 100 # 获取消息图片 diff --git a/tests/test_webhook_media_identity.py b/tests/test_webhook_media_identity.py index 7e53d2c5c..d0140ceb5 100644 --- a/tests/test_webhook_media_identity.py +++ b/tests/test_webhook_media_identity.py @@ -155,3 +155,19 @@ def test_emby_series_identity_requests_provider_ids(monkeypatch) -> None: "http://emby.local/emby/Users/user-1/Items/series-item-1", {"api_key": "test-key", "Fields": "ProviderIds"}, ) + + +def test_jellyfin_webhook_ignores_zero_runtime_percentage() -> None: + """时长为 0 的条目(如 strm)不应因计算播放进度而中断 webhook 解析。""" + client = Jellyfin.__new__(Jellyfin) + event = client.get_webhook_message(json.dumps({ + "NotificationType": "PlaybackStart", + "ItemType": "Movie", + "Name": "测试电影", + "Year": 2026, + "PlaybackPositionTicks": 0, + "RunTimeTicks": 0, + })) + + assert event is not None + assert event.percentage is None