Add audio track selection

This commit is contained in:
Jan Hamal Dvořák 2025-03-09 23:16:00 +01:00
parent 85c0a60ec4
commit 6695e6b07f
3 changed files with 49 additions and 5 deletions

View file

@ -157,6 +157,7 @@ class MainWindow(Gtk.ApplicationWindow):
file_item.full_path,
position,
file_item.saved_subtitle_track,
file_item.saved_audio_track,
)
self.last_position_save = self.now
@ -359,11 +360,24 @@ class MainWindow(Gtk.ApplicationWindow):
self.show_overlay_text(f"Subtitles #{index} ({lang})")
else:
self.show_overlay_text("Subtitles turned off")
self.selection.saved_subtitle_track = index - 1
else:
self.show_overlay_text("No subtitles available")
return True
elif keyval == Gdk.keyval_from_name("a"):
has_audio, index, lang = self.video_player.cycle_audio()
if has_audio:
self.show_overlay_text(f"Audio #{index} ({lang})")
self.selection.saved_audio_track = index - 1
else:
self.show_overlay_text("No audio tracks available")
return True
return False
def _toggle_watched_status(self) -> None:

View file

@ -60,6 +60,15 @@ class FileItem(GObject.Object):
self._save_attribute("subtitle_track", value if value >= -1 else None)
self.notify("saved-subtitle-track")
@GObject.Property(type=int)
def saved_audio_track(self):
return self._load_attribute("audio_track", 0)
@saved_audio_track.setter
def set_saved_audio_track(self, value: int):
self._save_attribute("audio_track", value if value > 0 else None)
self.notify("saved-audio-track")
@GObject.Property(type=bool, default=False)
def has_thumbnail(self):
return self._has_thumbnail

View file

@ -41,7 +41,13 @@ class VideoPlayer(GObject.Object):
paintable = video_sink.get_property("paintable")
picture.set_paintable(paintable)
def play(self, file_path: Path | str, position: int = 0, subtitle_track: int = -2) -> None:
def play(
self,
file_path: Path | str,
position: int = 0,
subtitle_track: int = -2,
audio_track: int = 0,
) -> None:
"""Start playing a video file"""
self.playbin.set_property("uri", Gst.filename_to_uri(str(file_path)))
@ -56,6 +62,8 @@ class VideoPlayer(GObject.Object):
flags &= ~0x00000004 # TEXT flag
self.playbin.set_property("flags", flags)
self.playbin.set_property("current-audio", audio_track)
# Pause and wait for it to complete
self.pipeline.set_state(Gst.State.PAUSED)
self.pipeline.get_state(Gst.CLOCK_TIME_NONE)
@ -147,7 +155,7 @@ class VideoPlayer(GObject.Object):
flags |= 0x00000004
self.playbin.set_property("flags", flags)
self.playbin.set_property("current-text", 0)
return True, 1, self._get_subtitle_lang(0)
return True, 1, self._get_track_lang("text", 0)
if current >= n_text - 1:
flags &= ~0x00000004 # TEXT flag
@ -156,10 +164,23 @@ class VideoPlayer(GObject.Object):
next_track = current + 1
self.playbin.set_property("current-text", next_track)
return True, next_track + 1, self._get_subtitle_lang(next_track)
return True, next_track + 1, self._get_track_lang("text", next_track)
def _get_subtitle_lang(self, track_index: int) -> str:
caps: Gst.TagList | None = self.playbin.emit("get-text-tags", track_index)
def cycle_audio(self) -> tuple[bool, int, str]:
"""Cycle through available audio tracks"""
current = self.playbin.get_property("current-audio")
n_audio = self.playbin.get_property("n-audio")
if n_audio == 0:
return False, 0, ""
next_track = (current + 1) % n_audio
self.playbin.set_property("current-audio", next_track)
return True, next_track + 1, self._get_track_lang("audio", next_track)
def _get_track_lang(self, track_type: str, track_index: int) -> str:
caps: Gst.TagList | None = self.playbin.emit(f"get-{track_type}-tags", track_index)
if not caps:
return str(track_index)