diff --git a/lazy_player/file_model.py b/lazy_player/file_model.py index 0dffe59..a3e23c3 100644 --- a/lazy_player/file_model.py +++ b/lazy_player/file_model.py @@ -1,5 +1,6 @@ from __future__ import annotations +import errno import os import sys from enum import Enum, auto @@ -97,7 +98,8 @@ class FileItem(GObject.Object, Watcher): self.full_path, f"user.lazy_player.{name}", str(value).encode("utf8") ) except OSError as err: - print(err, file=sys.stderr) + if err.errno != errno.ENOTSUP: + print(err, file=sys.stderr) class FileListModel(GObject.Object, Gio.ListModel): diff --git a/lazy_player/main_window.py b/lazy_player/main_window.py index f1f9d37..be7f01f 100644 --- a/lazy_player/main_window.py +++ b/lazy_player/main_window.py @@ -222,7 +222,7 @@ class MainWindow(Gtk.ApplicationWindow, Watcher): # Start playing the video self.player.play( - file_item.full_path, + file_item, position, file_item.saved_subtitle_track.value, file_item.saved_audio_track.value, diff --git a/lazy_player/video_player.py b/lazy_player/video_player.py index bd37c76..8c25b03 100644 --- a/lazy_player/video_player.py +++ b/lazy_player/video_player.py @@ -1,10 +1,10 @@ from __future__ import annotations -from pathlib import Path from time import time from gi.repository import GObject, Gst, Gtk +from .file_model import FileItem from .reactive import Ref SEEK_FORWARD = Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT | Gst.SeekFlags.SNAP_AFTER @@ -19,6 +19,7 @@ class VideoPlayer(GObject.Object): __gtype_name__ = "VideoPlayer" + file_item: Ref[FileItem | None] is_playing: Ref[bool] is_paused: Ref[bool] @@ -29,6 +30,7 @@ class VideoPlayer(GObject.Object): self.picture = picture + self.file_item = Ref(None) self.is_playing = Ref(False) self.is_paused = Ref(True) self.last_user_input = Ref(time()) @@ -54,14 +56,17 @@ class VideoPlayer(GObject.Object): def play( self, - file_path: Path | str, + file_item: FileItem, 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))) + uri = Gst.filename_to_uri(str(file_item.full_path)) + assert uri is not None + + self.playbin.set_property("uri", uri) if subtitle_track >= 0: flags = self.playbin.get_property("flags") @@ -93,6 +98,7 @@ class VideoPlayer(GObject.Object): """Stop playback and release resources""" self.pipeline.set_state(Gst.State.NULL) + self.file_item.value = None self.is_playing.value = True self.is_paused.value = False @@ -160,11 +166,14 @@ class VideoPlayer(GObject.Object): def cycle_subtitles(self) -> tuple[bool, int, str]: """Cycle through available subtitle tracks, including off state""" + if not self.file_item.value: + return False, 0, "" + flags = self.playbin.get_property("flags") current = self.playbin.get_property("current-text") n_text = self.playbin.get_property("n-text") - if n_text == 0: + if not n_text: return False, 0, "" if not (flags & 0x00000004): # TEXT flag @@ -198,7 +207,7 @@ class VideoPlayer(GObject.Object): 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) + return str("???") found, lang = caps.get_string("language-code") return lang if found else "???"