added rewind support to the player

This commit is contained in:
DYefremov
2019-10-02 14:44:58 +03:00
parent 8d6b1303dc
commit f62f104c8d
3 changed files with 114 additions and 30 deletions

View File

@@ -1,13 +1,25 @@
from app.commons import run_task
from app.tools import vlc
from app.tools.vlc import EventType
class Player:
_VLC_INSTANCE = None
def __init__(self):
def __init__(self, rewind_callback=None, position_callback=None):
self._is_playing = False
self._player = self.get_vlc_instance()
ev_mgr = self._player.event_manager()
if rewind_callback:
# TODO look other EventType options
ev_mgr.event_attach(EventType.MediaPlayerBuffering,
lambda e, p: rewind_callback(p.get_media().get_duration()),
self._player)
if position_callback:
ev_mgr.event_attach(EventType.MediaPlayerTimeChanged,
lambda e, p: position_callback(p.get_time()),
self._player)
@staticmethod
def get_vlc_instance():
@@ -32,6 +44,9 @@ class Player:
def pause(self):
self._player.pause()
def set_time(self, time):
self._player.set_time(time)
@run_task
def release(self):
if self._player:

View File

@@ -138,6 +138,7 @@ class Application(Gtk.Application):
"on_player_stop": self.on_player_stop,
"on_player_previous": self.on_player_previous,
"on_player_next": self.on_player_next,
"on_player_rewind": self.on_player_rewind,
"on_player_close": self.on_player_close,
"on_player_press": self.on_player_press,
"on_full_screen": self.on_full_screen,
@@ -239,6 +240,10 @@ class Application(Gtk.Application):
self._filter_only_free_button = builder.get_object("filter_only_free_button")
# Player
self._player_box = builder.get_object("player_box")
self._player_scale = builder.get_object("player_scale")
self._player_full_time_label = builder.get_object("player_full_time_label")
self._player_current_time_label = builder.get_object("player_current_time_label")
self._player_rewind_box = builder.get_object("player_rewind_box")
self._player_drawing_area = builder.get_object("player_drawing_area")
self._player_tool_bar = builder.get_object("player_tool_bar")
self._player_prev_button = builder.get_object("player_prev_button")
@@ -1528,7 +1533,8 @@ class Application(Gtk.Application):
def play(self, url):
if not self._player:
try:
self._player = Player()
self._player = Player(rewind_callback=self.on_player_duration_changed,
position_callback=self.on_player_time_changed)
except (NameError, AttributeError):
self.show_error_dialog("No VLC is found. Check that it is installed!")
return
@@ -1560,6 +1566,9 @@ class Application(Gtk.Application):
if self._fav_view.do_move_cursor(self._fav_view, Gtk.MovementStep.DISPLAY_LINES, 1):
self.on_play_stream()
def on_player_rewind(self, scale, scroll_type, value):
self._player.set_time(int(value))
def update_player_buttons(self):
if self._player:
path, column = self._fav_view.get_cursor()
@@ -1573,6 +1582,24 @@ class Application(Gtk.Application):
self._player = None
GLib.idle_add(self._player_box.set_visible, False, priority=GLib.PRIORITY_LOW)
@lru_cache(maxsize=1)
def on_player_duration_changed(self, duration):
self._player_scale.set_value(0)
self._player_scale.get_adjustment().set_upper(duration)
GLib.idle_add(self._player_rewind_box.set_visible, duration > 0)
GLib.idle_add(self._player_current_time_label.set_text, "0")
GLib.idle_add(self._player_full_time_label.set_text, self.get_time_str(duration))
def on_player_time_changed(self, t):
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 get_time_str(self, duration):
""" returns a string representation of time from duration in milliseconds """
m, s = divmod(duration // 1000, 60)
h, m = divmod(m, 60)
return "{}{:02d}:{:02d}".format(str(h) + ":" if h else "", m, s)
def on_drawing_area_realize(self, widget):
self._drawing_area_xid = widget.get_window().get_xid()
self._player.set_xwindow(self._drawing_area_xid)

View File

@@ -612,6 +612,11 @@ Author: Dmitriy Yefremov
<property name="can_focus">False</property>
<property name="stock">gtk-new</property>
</object>
<object class="GtkAdjustment" id="player_scale_adjustment">
<property name="upper">100</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<object class="GtkImage" id="remova_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
@@ -1367,17 +1372,20 @@ Author: Dmitriy Yefremov
<object class="GtkToolbar" id="player_tool_bar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">15</property>
<property name="margin_right">15</property>
<child>
<object class="GtkToolItem" id="player_item">
<object class="GtkToolButton" id="player_prev_button">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
<property name="tooltip_text" translatable="yes">Previous stream in the list</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-media-previous</property>
<signal name="clicked" handler="on_player_previous" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="homogeneous">True</property>
<property name="expand">False</property>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
@@ -1390,7 +1398,7 @@ Author: Dmitriy Yefremov
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
@@ -1404,21 +1412,7 @@ Author: Dmitriy Yefremov
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolButton" id="player_prev_button">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Previous stream in the list</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-media-previous</property>
<signal name="clicked" handler="on_player_previous" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
@@ -1432,15 +1426,64 @@ Author: Dmitriy Yefremov
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
<object class="GtkToolItem" id="player_item_2">
<object class="GtkToolItem" id="player_item">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<placeholder/>
<object class="GtkBox" id="player_rewind_box">
<property name="can_focus">False</property>
<property name="margin_left">15</property>
<property name="margin_right">15</property>
<property name="spacing">2</property>
<child>
<object class="GtkLabel" id="player_current_time_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScale" id="player_scale">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="adjustment">player_scale_adjustment</property>
<property name="restrict_to_fill_level">False</property>
<property name="fill_level">0</property>
<property name="round_digits">1</property>
<property name="draw_value">False</property>
<property name="has_origin">False</property>
<signal name="change-value" handler="on_player_rewind" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="player_full_time_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
@@ -1459,7 +1502,7 @@ Author: Dmitriy Yefremov
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
@@ -1467,14 +1510,13 @@ Author: Dmitriy Yefremov
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Close</property>
<property name="margin_right">15</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-close</property>
<signal name="clicked" handler="on_player_close" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
<property name="homogeneous">False</property>
</packing>
</child>
</object>