added callbacks to the player

This commit is contained in:
DYefremov
2020-01-16 14:08:34 +03:00
parent c2d2361de9
commit 0b4e923037
2 changed files with 30 additions and 4 deletions

View File

@@ -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

View File

@@ -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)