From eef1ec658513abdd78d9ec5bcf82b01c8581da2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Hamal=20Dvo=C5=99=C3=A1k?= <mordae@anilinux.org> Date: Sat, 8 Mar 2025 22:15:32 +0100 Subject: [PATCH] Allow disabling subtitles --- lazy_player/__init__.py | 50 ++++++++++++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/lazy_player/__init__.py b/lazy_player/__init__.py index 4816c10..68645e1 100644 --- a/lazy_player/__init__.py +++ b/lazy_player/__init__.py @@ -72,12 +72,12 @@ class MainWindow(Gtk.ApplicationWindow): overlay_box.set_name("black-overlay") overlay_box.set_vexpand(True) overlay_box.set_hexpand(True) - + # Create an overlay container overlay = Gtk.Overlay() overlay.set_child(self.video_widget) overlay.add_overlay(self.overlay_label) - + overlay_box.append(overlay) # Setup GStreamer pipeline @@ -234,7 +234,7 @@ class MainWindow(Gtk.ApplicationWindow): elif keyval == Gdk.keyval_from_name("Down"): self._seek_relative(-60) return True - + elif keyval == Gdk.keyval_from_name("j"): self._cycle_subtitles() return True @@ -276,13 +276,28 @@ class MainWindow(Gtk.ApplicationWindow): Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT, new_pos ) + def _get_subtitle_info(self, track_index: int) -> str: + """Get subtitle track info including language if available""" + playbin = self.pipeline.get_by_name("playbin") + if not playbin: + return str(track_index) + + # Query the subtitle track's tags + caps: Gst.TagList | None = playbin.emit("get-text-tags", track_index) + if not caps: + return str(track_index) + + found, lang = caps.get_string("language-code") + return f"{track_index} ({lang})" if found else str(track_index) + def _cycle_subtitles(self) -> None: - """Cycle through available subtitle tracks""" + """Cycle through available subtitle tracks, including off state""" playbin = self.pipeline.get_by_name("playbin") if not playbin: return - # Get current subtitle track + # Get current flags and subtitle track + flags = playbin.get_property("flags") current = playbin.get_property("current-text") n_text = playbin.get_property("n-text") @@ -290,12 +305,27 @@ class MainWindow(Gtk.ApplicationWindow): self.show_overlay_text("No subtitles available") return - # Cycle to next track, wrapping around - next_track = (current + 1) % n_text + # If subtitles are disabled, enable them and set to first track + if not (flags & 0x00000004): # TEXT flag + flags |= 0x00000004 + playbin.set_property("flags", flags) + playbin.set_property("current-text", 0) + track_info = self._get_subtitle_info(0) + self.show_overlay_text(f"Subtitle track: {track_info}") + return + + # If we're on the last track, disable subtitles + if current >= n_text - 1: + flags &= ~0x00000004 # TEXT flag + playbin.set_property("flags", flags) + self.show_overlay_text("Subtitles: Off") + return + + # Otherwise cycle to next track + next_track = current + 1 playbin.set_property("current-text", next_track) - - # Show the new track number - self.show_overlay_text(f"Subtitle track: {next_track}") + track_info = self._get_subtitle_info(next_track) + self.show_overlay_text(f"Subtitle track: {track_info}") def show_overlay_text(self, text: str, timeout_seconds: float = 1.0) -> None: """Show text in a centered overlay that disappears after timeout"""