From 0b4e923037ea94b2f477b9759fd1b18212c3785d Mon Sep 17 00:00:00 2001 From: DYefremov Date: Thu, 16 Jan 2020 14:08:34 +0300 Subject: [PATCH] added callbacks to the player --- app/tools/media.py | 16 +++++++++++++--- app/ui/main_app_window.py | 18 +++++++++++++++++- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/app/tools/media.py b/app/tools/media.py index 3479b29c..9ef94dca 100644 --- a/app/tools/media.py +++ b/app/tools/media.py @@ -1,11 +1,12 @@ import sys + from app.commons import run_task, log class Player: __VLC_INSTANCE = None - def __init__(self, rewind_callback, position_callback): + def __init__(self, rewind_callback, position_callback, error_callback, playing_callback): try: from app.tools import vlc from app.tools.vlc import EventType @@ -28,10 +29,19 @@ class Player: lambda et, p: position_callback(p.get_time()), self._player) + if error_callback: + ev_mgr.event_attach(EventType.MediaPlayerEncounteredError, + lambda et, p: error_callback(), + self._player) + if playing_callback: + ev_mgr.event_attach(EventType.MediaPlayerPlaying, + lambda et, p: playing_callback(), + self._player) + @classmethod - def get_instance(cls, rewind_callback=None, position_callback=None): + def get_instance(cls, rewind_callback=None, position_callback=None, error_callback=None, playing_callback=None): if not cls.__VLC_INSTANCE: - cls.__VLC_INSTANCE = Player(rewind_callback, position_callback) + cls.__VLC_INSTANCE = Player(rewind_callback, position_callback, error_callback, playing_callback) return cls.__VLC_INSTANCE @run_task diff --git a/app/ui/main_app_window.py b/app/ui/main_app_window.py index ddc9866c..927a4934 100644 --- a/app/ui/main_app_window.py +++ b/app/ui/main_app_window.py @@ -270,6 +270,8 @@ class Application(Gtk.Application): self._player_box.bind_property("visible", builder.get_object("download_header_button"), "visible", 4) self._player_box.bind_property("visible", builder.get_object("left_header_separator"), "visible", 4) self._player_box.bind_property("visible", self._profile_combo_box, "sensitive", 4) + self._fav_view.bind_property("sensitive", self._player_prev_button, "sensitive") + self._fav_view.bind_property("sensitive", self._player_next_button, "sensitive") # Enabling events for the drawing area self._player_drawing_area.set_events(Gdk.ModifierType.BUTTON1_MASK) self._player_frame = builder.get_object("player_frame") @@ -1615,7 +1617,9 @@ class Application(Gtk.Application): if not self._player: try: self._player = Player.get_instance(rewind_callback=self.on_player_duration_changed, - position_callback=self.on_player_time_changed) + position_callback=self.on_player_time_changed, + error_callback=self.on_player_error, + playing_callback=self.set_playback_elms_active) except (ImportError, NameError, AttributeError): self.show_error_dialog("No VLC is found. Check that it is installed!") return @@ -1626,6 +1630,7 @@ class Application(Gtk.Application): self._player_box.set_size_request(w * 0.6, -1) self._player_box.set_visible(True) + self._fav_view.set_sensitive(False) GLib.idle_add(self._player.play, url, priority=GLib.PRIORITY_LOW) def on_player_stop(self, item=None): @@ -1661,6 +1666,8 @@ class Application(Gtk.Application): def on_player_close(self, item=None): if self._player: self._player.stop() + + self.set_playback_elms_active() GLib.idle_add(self._player_box.set_visible, False, priority=GLib.PRIORITY_LOW) @lru_cache(maxsize=1) @@ -1675,6 +1682,15 @@ class Application(Gtk.Application): if not self._full_screen and self._player_rewind_box.get_visible(): GLib.idle_add(self._player_current_time_label.set_text, self.get_time_str(t), priority=GLib.PRIORITY_LOW) + def on_player_error(self): + self.set_playback_elms_active() + self.show_error_dialog("Can't Playback!") + + @run_idle + def set_playback_elms_active(self): + self._fav_view.set_sensitive(True) + self._fav_view.do_grab_focus(self._fav_view) + def get_time_str(self, duration): """ returns a string representation of time from duration in milliseconds """ m, s = divmod(duration // 1000, 60)