Allow disabling subtitles
This commit is contained in:
parent
8944fdc291
commit
eef1ec6585
1 changed files with 40 additions and 10 deletions
|
@ -72,12 +72,12 @@ class MainWindow(Gtk.ApplicationWindow):
|
||||||
overlay_box.set_name("black-overlay")
|
overlay_box.set_name("black-overlay")
|
||||||
overlay_box.set_vexpand(True)
|
overlay_box.set_vexpand(True)
|
||||||
overlay_box.set_hexpand(True)
|
overlay_box.set_hexpand(True)
|
||||||
|
|
||||||
# Create an overlay container
|
# Create an overlay container
|
||||||
overlay = Gtk.Overlay()
|
overlay = Gtk.Overlay()
|
||||||
overlay.set_child(self.video_widget)
|
overlay.set_child(self.video_widget)
|
||||||
overlay.add_overlay(self.overlay_label)
|
overlay.add_overlay(self.overlay_label)
|
||||||
|
|
||||||
overlay_box.append(overlay)
|
overlay_box.append(overlay)
|
||||||
|
|
||||||
# Setup GStreamer pipeline
|
# Setup GStreamer pipeline
|
||||||
|
@ -234,7 +234,7 @@ class MainWindow(Gtk.ApplicationWindow):
|
||||||
elif keyval == Gdk.keyval_from_name("Down"):
|
elif keyval == Gdk.keyval_from_name("Down"):
|
||||||
self._seek_relative(-60)
|
self._seek_relative(-60)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
elif keyval == Gdk.keyval_from_name("j"):
|
elif keyval == Gdk.keyval_from_name("j"):
|
||||||
self._cycle_subtitles()
|
self._cycle_subtitles()
|
||||||
return True
|
return True
|
||||||
|
@ -276,13 +276,28 @@ class MainWindow(Gtk.ApplicationWindow):
|
||||||
Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT, new_pos
|
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:
|
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")
|
playbin = self.pipeline.get_by_name("playbin")
|
||||||
if not playbin:
|
if not playbin:
|
||||||
return
|
return
|
||||||
|
|
||||||
# Get current subtitle track
|
# Get current flags and subtitle track
|
||||||
|
flags = playbin.get_property("flags")
|
||||||
current = playbin.get_property("current-text")
|
current = playbin.get_property("current-text")
|
||||||
n_text = playbin.get_property("n-text")
|
n_text = playbin.get_property("n-text")
|
||||||
|
|
||||||
|
@ -290,12 +305,27 @@ class MainWindow(Gtk.ApplicationWindow):
|
||||||
self.show_overlay_text("No subtitles available")
|
self.show_overlay_text("No subtitles available")
|
||||||
return
|
return
|
||||||
|
|
||||||
# Cycle to next track, wrapping around
|
# If subtitles are disabled, enable them and set to first track
|
||||||
next_track = (current + 1) % n_text
|
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)
|
playbin.set_property("current-text", next_track)
|
||||||
|
track_info = self._get_subtitle_info(next_track)
|
||||||
# Show the new track number
|
self.show_overlay_text(f"Subtitle track: {track_info}")
|
||||||
self.show_overlay_text(f"Subtitle track: {next_track}")
|
|
||||||
|
|
||||||
def show_overlay_text(self, text: str, timeout_seconds: float = 1.0) -> None:
|
def show_overlay_text(self, text: str, timeout_seconds: float = 1.0) -> None:
|
||||||
"""Show text in a centered overlay that disappears after timeout"""
|
"""Show text in a centered overlay that disappears after timeout"""
|
||||||
|
|
Loading…
Reference in a new issue