Add audio track selection
This commit is contained in:
parent
85c0a60ec4
commit
6695e6b07f
3 changed files with 49 additions and 5 deletions
lazy_player
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Reference in a new issue