Tool: black

This commit is contained in:
Odd Stråbø 2026-02-11 00:25:51 +01:00
commit 0bd2e18c47
4 changed files with 68 additions and 24 deletions

View file

@ -65,11 +65,13 @@ class SkipDialog(xbmcgui.WindowXMLDialog):
button_label = "Skip {0} ({1})".format(segment_label, duration_text) button_label = "Skip {0} ({1})".format(segment_label, duration_text)
# Use setProperty so it's available to the skin # Use setProperty so it's available to the skin
self.setProperty('skip_label', button_label) self.setProperty("skip_label", button_label)
self.setProperty('segment_type', segment_type or '') self.setProperty("segment_type", segment_type or "")
self.setProperty('duration', duration_text) self.setProperty("duration", duration_text)
LOG.debug("SkipDialog: set_skip_info segment=%s, label=%s", segment_type, button_label) LOG.debug(
"SkipDialog: set_skip_info segment=%s, label=%s", segment_type, button_label
)
def onInit(self): def onInit(self):
"""Initialize the dialog controls.""" """Initialize the dialog controls."""
@ -78,7 +80,7 @@ class SkipDialog(xbmcgui.WindowXMLDialog):
# Try to set button label directly as well # Try to set button label directly as well
try: try:
button = self.getControl(SKIP_BUTTON) button = self.getControl(SKIP_BUTTON)
label = self.getProperty('skip_label') label = self.getProperty("skip_label")
if label: if label:
button.setLabel(label) button.setLabel(label)
LOG.debug("SkipDialog.onInit: set button label to '%s'", label) LOG.debug("SkipDialog.onInit: set button label to '%s'", label)
@ -90,7 +92,12 @@ class SkipDialog(xbmcgui.WindowXMLDialog):
action_id = action.getId() action_id = action.getId()
LOG.debug("SkipDialog.onAction: action_id=%s", action_id) LOG.debug("SkipDialog.onAction: action_id=%s", action_id)
if action_id in (ACTION_BACK, ACTION_PARENT_DIR, ACTION_PREVIOUS_MENU, ACTION_NAV_BACK): if action_id in (
ACTION_BACK,
ACTION_PARENT_DIR,
ACTION_PREVIOUS_MENU,
ACTION_NAV_BACK,
):
self.cancel_requested = True self.cancel_requested = True
self.close() self.close()

View file

@ -166,7 +166,9 @@ class PlayUtils(object):
def is_strm(self, source): def is_strm(self, source):
if source.get("Container") == "strm" or self.item.get("Path", "").endswith(".strm"): if source.get("Container") == "strm" or self.item.get("Path", "").endswith(
".strm"
):
LOG.info("strm detected") LOG.info("strm detected")
return True return True

View file

@ -545,15 +545,23 @@ class Player(xbmc.Player):
} }
return segments if segments else None return segments if segments else None
def _process_segment(self, item_id, segment_type, segment, current_position, skip_mode): def _process_segment(
self, item_id, segment_type, segment, current_position, skip_mode
):
"""Check if current position is within segment bounds. Returns (start, end) tuple, None if outside bounds, or False if invalid.""" """Check if current position is within segment bounds. Returns (start, end) tuple, None if outside bounds, or False if invalid."""
start = segment.get("Start") start = segment.get("Start")
end = segment.get("End") end = segment.get("End")
if start is None or end is None or end <= start: if start is None or end is None or end <= start:
return False return False
LOG.debug("Skip check: pos=%.1f, %s start=%.1f end=%.1f, in_segment=%s", LOG.debug(
current_position, segment_type, start, end, start <= current_position <= end) "Skip check: pos=%.1f, %s start=%.1f end=%.1f, in_segment=%s",
current_position,
segment_type,
start,
end,
start <= current_position <= end,
)
if not (start <= current_position <= end): if not (start <= current_position <= end):
return None return None
@ -571,19 +579,26 @@ class Player(xbmc.Player):
if skip_mode == 0: # Off if skip_mode == 0: # Off
continue continue
bounds = self._process_segment(item_id, segment_type, segment, current_position, skip_mode) bounds = self._process_segment(
item_id, segment_type, segment, current_position, skip_mode
)
if not bounds: if not bounds:
continue continue
start, end = bounds start, end = bounds
segment_key = "%s:%s" % (item_id, segment_type) segment_key = "%s:%s" % (item_id, segment_type)
LOG.debug("Skip check: IN WINDOW! segment_key=%s, already_prompted=%s", LOG.debug(
segment_key, segment_key in self.skip_prompted) "Skip check: IN WINDOW! segment_key=%s, already_prompted=%s",
segment_key,
segment_key in self.skip_prompted,
)
if segment_key in self.skip_prompted: if segment_key in self.skip_prompted:
continue continue
self.skip_prompted.add(segment_key) self.skip_prompted.add(segment_key)
LOG.debug("Skip check: Triggering _handle_skip_segment for %s", segment_type) LOG.debug(
"Skip check: Triggering _handle_skip_segment for %s", segment_type
)
if segment_type == "Credits" and not self.up_next: if segment_type == "Credits" and not self.up_next:
self.up_next = True self.up_next = True
@ -607,22 +622,37 @@ class Player(xbmc.Player):
return int(settings(setting_key) or 0) return int(settings(setting_key) or 0)
def _handle_skip_segment(self, segment_type, start, end, mode): def _handle_skip_segment(self, segment_type, start, end, mode):
LOG.debug("_handle_skip_segment: type=%s, mode=%d, start=%.1f, end=%.1f", LOG.debug(
segment_type, mode, start, end) "_handle_skip_segment: type=%s, mode=%d, start=%.1f, end=%.1f",
segment_type,
mode,
start,
end,
)
if mode == 1: # Auto skip if mode == 1: # Auto skip
self.seekTime(end) self.seekTime(end)
LOG.info("Auto-skipped %s to %.1f", segment_type, end) LOG.info("Auto-skipped %s to %.1f", segment_type, end)
# Show notification # Show notification
message = "Skipped %s" % segment_type message = "Skipped %s" % segment_type
dialog("notification", heading="Jellyfin", message=message, icon="{jellyfin}", time=3000) dialog(
"notification",
heading="Jellyfin",
message=message,
icon="{jellyfin}",
time=3000,
)
elif mode == 2: # Show skip button elif mode == 2: # Show skip button
self._show_skip_button(segment_type, end - start, end) self._show_skip_button(segment_type, end - start, end)
def _show_skip_button(self, segment_type, duration, end_time): def _show_skip_button(self, segment_type, duration, end_time):
LOG.debug("_show_skip_button: type=%s, duration=%.1f, end_time=%.1f", LOG.debug(
segment_type, duration, end_time) "_show_skip_button: type=%s, duration=%.1f, end_time=%.1f",
segment_type,
duration,
end_time,
)
try: try:
import xbmcaddon import xbmcaddon
from .dialogs.skip import SkipDialog from .dialogs.skip import SkipDialog
@ -674,7 +704,10 @@ class Player(xbmc.Player):
try: try:
current_pos = self.getTime() current_pos = self.getTime()
if current_pos >= self._skip_end_time: if current_pos >= self._skip_end_time:
LOG.debug("_monitor_skip_dialog: passed end_time %.1f, closing", self._skip_end_time) LOG.debug(
"_monitor_skip_dialog: passed end_time %.1f, closing",
self._skip_end_time,
)
break break
except Exception: except Exception:
break break

View file

@ -13,14 +13,14 @@ class TestMediaSegmentsConversion:
"ItemId": "test-item-id", "ItemId": "test-item-id",
"Type": "Intro", "Type": "Intro",
"StartTicks": 425000000, "StartTicks": 425000000,
"EndTicks": 1220000000 "EndTicks": 1220000000,
}, },
{ {
"ItemId": "test-item-id", "ItemId": "test-item-id",
"Type": "Outro", "Type": "Outro",
"StartTicks": 24580000000, "StartTicks": 24580000000,
"EndTicks": 25200000000 "EndTicks": 25200000000,
} },
] ]
} }
@ -71,7 +71,9 @@ class TestSegmentDetection:
(100.0, 42.5, 122.0, False), (100.0, 42.5, 122.0, False),
], ],
) )
def test_segment_detection_window(self, current_position, segment_start, segment_end, expected_in_window): def test_segment_detection_window(
self, current_position, segment_start, segment_end, expected_in_window
):
in_window = segment_start <= current_position <= segment_start + 5 in_window = segment_start <= current_position <= segment_start + 5
assert in_window == expected_in_window assert in_window == expected_in_window